Skip to main content
Glama
@nightsquawktech/gohighlevel-mcp-server

@nightsquawktech/gohighlevel-mcp-server

by NightSquawk

GoHighLevel MCP Server

npm version npm downloads OpenSSF Scorecard License: AGPL-3.0 Node

An MCP (Model Context Protocol) server for GoHighLevel, connecting your CRM to AI tools. 56 curated tools over the GoHighLevel API v2, built to fill the gaps the official HighLevel MCP leaves open: full custom-field CRUD, contact delete, and a guarded duplicate-contact merge.

Quick start

Claude

Download for Claude Desktop

bash (macOS/Linux):

GHL_API_TOKEN="pit-your-private-integration-token"
GHL_LOCATION_ID="your-location-id"

claude mcp add gohighlevel \
  --env GHL_API_TOKEN="$GHL_API_TOKEN" \
  --env GHL_LOCATION_ID="$GHL_LOCATION_ID" \
  -- npx -y @nightsquawktech/gohighlevel-mcp-server

PowerShell (Windows):

$GHL_API_TOKEN = "pit-your-private-integration-token"
$GHL_LOCATION_ID = "your-location-id"

claude mcp add gohighlevel `
  --env "GHL_API_TOKEN=$GHL_API_TOKEN" `
  --env "GHL_LOCATION_ID=$GHL_LOCATION_ID" `
  -- npx -y @nightsquawktech/gohighlevel-mcp-server

Cursor

Add to Cursor

Or put the mcp.json block in .cursor/mcp.json, then verify with:

agent mcp list

(The Cursor CLI manages configured servers but has no mcp add; install is via the button or mcp.json.)

VS Code

Install in VS Code

bash (macOS/Linux):

GHL_API_TOKEN="pit-your-private-integration-token"
GHL_LOCATION_ID="your-location-id"

code --add-mcp '{"name":"gohighlevel","command":"npx","args":["-y","@nightsquawktech/gohighlevel-mcp-server"],"env":{"GHL_API_TOKEN":"'"$GHL_API_TOKEN"'","GHL_LOCATION_ID":"'"$GHL_LOCATION_ID"'"}}'

PowerShell (Windows):

$GHL_API_TOKEN = "pit-your-private-integration-token"
$GHL_LOCATION_ID = "your-location-id"

$config = @{
  name = "gohighlevel"
  command = "npx"
  args = @("-y", "@nightsquawktech/gohighlevel-mcp-server")
  env = @{
    GHL_API_TOKEN = $GHL_API_TOKEN
    GHL_LOCATION_ID = $GHL_LOCATION_ID
  }
} | ConvertTo-Json -Compress

code --add-mcp $config

Codex

bash (macOS/Linux):

GHL_API_TOKEN="pit-your-private-integration-token"
GHL_LOCATION_ID="your-location-id"

codex mcp add gohighlevel \
  --env GHL_API_TOKEN="$GHL_API_TOKEN" \
  --env GHL_LOCATION_ID="$GHL_LOCATION_ID" \
  -- npx -y @nightsquawktech/gohighlevel-mcp-server

PowerShell (Windows):

$GHL_API_TOKEN = "pit-your-private-integration-token"
$GHL_LOCATION_ID = "your-location-id"

codex mcp add gohighlevel `
  --env "GHL_API_TOKEN=$GHL_API_TOKEN" `
  --env "GHL_LOCATION_ID=$GHL_LOCATION_ID" `
  -- npx -y @nightsquawktech/gohighlevel-mcp-server

Or add it to ~/.codex/config.toml under [mcp_servers.gohighlevel].

mcp.json

Every environment variable the server reads, with recommended values:

{
  "mcpServers": {
    "gohighlevel": {
      "command": "npx",
      "args": ["-y", "@nightsquawktech/gohighlevel-mcp-server"],
      "env": {
        "GHL_API_TOKEN": "pit-your-private-integration-token",
        "GHL_LOCATION_ID": "your-location-id",
        "GHL_BASE_URL": "https://services.leadconnectorhq.com",
        "GHL_API_VERSION": "2021-07-28",
        "GHL_TIMEOUT_MS": "30000"
      }
    }
  }
}

File locations: .mcp.json in your project root (Claude Code), claude_desktop_config.json (Claude Desktop), .cursor/mcp.json (Cursor).

Related MCP server: ghl-mcp

Configuration

Variable

Required

Default

Purpose

GHL_API_TOKEN

yes

Private Integration token (pit-...) from Settings > Private Integrations, or an OAuth sub-account access token

GHL_LOCATION_ID

yes

Default GoHighLevel sub-account/location ID; individual calls can override it

GHL_BASE_URL

no

https://services.leadconnectorhq.com

GoHighLevel API v2 base URL

GHL_API_VERSION

no

2021-07-28

Version header sent on every request

GHL_TIMEOUT_MS

no

30000

HTTP timeout for API requests, minimum 1000

Security & write safety

GoHighLevel credentials: create a dedicated Private Integration in Settings > Private Integrations and grant only the scopes you need (for example contacts.readonly, contacts.write, locations/customFields.write, opportunities.readonly). Dropping a .write scope from the token makes that domain hard read-only no matter what the tools attempt.

This server is a read/write CRM surface: of its 56 tools, 22 are read-only, 22 create or update records, and 12 are destructive (deletes, tag/workflow removal, contact merge, outbound message send).

  • Every destructive tool refuses to call the API unless the request includes confirm: true; without it the tool returns an error and nothing is sent to GoHighLevel.

  • ghl_send_message (outbound SMS/email to real contacts) is confirm-gated for the same reason.

  • ghl_merge_contacts_delete_loser previews by default: it reads both contacts, checks the loser for notes, tasks, conversations, and opportunities, and refuses to delete a loser with any history even when confirmed.

  • Create and update tools execute directly (no confirm flag); their descriptions instruct the model not to run against live data without explicit approval, but the API call itself is not blocked. Scope the token accordingly.

  • All requests go directly from your machine to your GoHighLevel instance; nothing passes through third parties.

IMPORTANT

Theconfirm: true gate is a guardrail, not a security boundary. The env vars in your MCP config are real credentials, and an AI agent with shell access can bypass the MCP tools and call the GoHighLevel API directly with them. If you need hard read-only, enforce it at the source: grant the Private Integration token only .readonly scopes.

Tools

ghl_list_custom_fields             List custom fields for a location
ghl_get_custom_field               Get one custom field
ghl_create_custom_field            Create a custom field
ghl_update_custom_field            Update a custom field
ghl_delete_custom_field            Delete a custom field (confirm: true)
ghl_list_custom_fields_v2          List Custom Fields V2 fields/folders by object key
ghl_get_custom_field_v2            Get a Custom Fields V2 field or folder by ID
ghl_create_custom_field_v2         Create a Custom Fields V2 field
ghl_update_custom_field_v2         Update a Custom Fields V2 field
ghl_delete_custom_field_v2         Delete a Custom Fields V2 field (confirm: true)
ghl_create_custom_field_folder     Create a Custom Fields V2 folder
ghl_update_custom_field_folder     Rename a Custom Fields V2 folder
ghl_delete_custom_field_folder     Delete a Custom Fields V2 folder (confirm: true)

ghl_list_custom_values             List custom values for a location
ghl_get_custom_value               Get one custom value
ghl_create_custom_value            Create a custom value
ghl_update_custom_value            Update a custom value
ghl_delete_custom_value            Delete a custom value (confirm: true)

ghl_search_contacts                Search contacts with server-side filters
ghl_get_contact                    Get one contact
ghl_create_contact                 Create a contact
ghl_update_contact                 Update a contact
ghl_upsert_contact                 Create or update a contact in one call
ghl_delete_contact                 Delete a contact (confirm: true)
ghl_merge_contacts_delete_loser    Guarded duplicate merge: preview, then delete loser and copy its email to survivor (confirm: true)
ghl_add_contact_tags               Add tags to a contact
ghl_remove_contact_tags            Remove tags from a contact (confirm: true)
ghl_add_contact_to_workflow        Add a contact to a workflow
ghl_remove_contact_from_workflow   Remove a contact from a workflow (confirm: true)
ghl_get_contact_notes              List notes on a contact
ghl_create_contact_note            Create a note on a contact
ghl_get_contact_tasks              List tasks on a contact
ghl_create_contact_task            Create a task on a contact

ghl_list_tags                      List tags for a location
ghl_get_tag                        Get one tag
ghl_create_tag                     Create a location tag
ghl_update_tag                     Rename a location tag
ghl_delete_tag                     Delete a location tag (confirm: true)

ghl_search_opportunities           Search opportunities with server-side filters
ghl_get_pipelines                  List opportunity pipelines and stages
ghl_get_opportunity                Get one opportunity
ghl_create_opportunity             Create an opportunity
ghl_update_opportunity             Update an opportunity
ghl_update_opportunity_status      Set opportunity status (open/won/lost/abandoned)
ghl_delete_opportunity             Delete an opportunity (confirm: true)

ghl_search_conversations           Search conversations
ghl_get_conversation_messages      List messages in a conversation
ghl_send_message                   Send an outbound SMS/email/message (confirm: true)

ghl_list_calendars                 List calendars for a location
ghl_get_calendar_events            List calendar events
ghl_get_free_slots                 Get free booking slots for a calendar
ghl_create_appointment             Create an appointment
ghl_update_appointment             Update an appointment
ghl_delete_appointment             Delete a calendar event (confirm: true)

ghl_get_location                   Get the location/sub-account details
ghl_list_users                     List users for a location

All tools return both text and structuredContent; read tools support response_format: "markdown" | "json" plus local limit/offset slicing. For contact search, use page or search_after for remote pagination, never both. Pass next_search_after verbatim when using a cursor. server_has_more describes remote pages; has_more describes only the returned page's local slice. Check unique IDs against server_total before treating an export as complete. The unsupported start_after_id field was removed.

API coverage

56 operations covered across the GoHighLevel API v2 (services.leadconnectorhq.com).

Category

Operations

Custom fields (v1 + V2 + folders)

13

Custom values

5

Contacts (incl. notes, tasks, tags, workflows, merge)

15

Tags

5

Opportunities & pipelines

7

Conversations & messages

3

Calendars & appointments

6

Locations & users

2

Method

Path

Tool

GET

/locations/{locationId}/customFields

ghl_list_custom_fields

GET

/locations/{locationId}/customFields/{id}

ghl_get_custom_field

POST

/locations/{locationId}/customFields

ghl_create_custom_field

PUT

/locations/{locationId}/customFields/{id}

ghl_update_custom_field

DELETE

/locations/{locationId}/customFields/{id}

ghl_delete_custom_field

GET

/custom-fields/object-key/{objectKey}

ghl_list_custom_fields_v2

GET

/custom-fields/{id}

ghl_get_custom_field_v2

POST

/custom-fields/

ghl_create_custom_field_v2

PUT

/custom-fields/{id}

ghl_update_custom_field_v2

DELETE

/custom-fields/{id}

ghl_delete_custom_field_v2

POST

/custom-fields/folder

ghl_create_custom_field_folder

PUT

/custom-fields/folder/{id}

ghl_update_custom_field_folder

DELETE

/custom-fields/folder/{id}

ghl_delete_custom_field_folder

Method

Path

Tool

GET

/locations/{locationId}/customValues

ghl_list_custom_values

GET

/locations/{locationId}/customValues/{id}

ghl_get_custom_value

POST

/locations/{locationId}/customValues

ghl_create_custom_value

PUT

/locations/{locationId}/customValues/{id}

ghl_update_custom_value

DELETE

/locations/{locationId}/customValues/{id}

ghl_delete_custom_value

Method

Path

Tool

POST

/contacts/search

ghl_search_contacts

GET

/contacts/{contactId}

ghl_get_contact

POST

/contacts/

ghl_create_contact

PUT

/contacts/{contactId}

ghl_update_contact

POST

/contacts/upsert

ghl_upsert_contact

DELETE

/contacts/{contactId}

ghl_delete_contact

GET, DELETE, PUT

/contacts/{contactId} (composite)

ghl_merge_contacts_delete_loser

POST

/contacts/{contactId}/tags

ghl_add_contact_tags

DELETE

/contacts/{contactId}/tags

ghl_remove_contact_tags

POST

/contacts/{contactId}/workflow/{workflowId}

ghl_add_contact_to_workflow

DELETE

/contacts/{contactId}/workflow/{workflowId}

ghl_remove_contact_from_workflow

GET

/contacts/{contactId}/notes

ghl_get_contact_notes

POST

/contacts/{contactId}/notes

ghl_create_contact_note

GET

/contacts/{contactId}/tasks

ghl_get_contact_tasks

POST

/contacts/{contactId}/tasks

ghl_create_contact_task

The merge tool composes preflight reads (GET /contacts/{contactId} on both contacts, GET /contacts/{contactId}/notes, GET /contacts/{contactId}/tasks, GET /conversations/search, GET /opportunities/search) before DELETE /contacts/{loserId} and PUT /contacts/{survivorId}.

Method

Path

Tool

GET

/locations/{locationId}/tags

ghl_list_tags

GET

/locations/{locationId}/tags/{tagId}

ghl_get_tag

POST

/locations/{locationId}/tags

ghl_create_tag

PUT

/locations/{locationId}/tags/{tagId}

ghl_update_tag

DELETE

/locations/{locationId}/tags/{tagId}

ghl_delete_tag

Method

Path

Tool

GET

/opportunities/search

ghl_search_opportunities

GET

/opportunities/pipelines

ghl_get_pipelines

GET

/opportunities/{id}

ghl_get_opportunity

POST

/opportunities/

ghl_create_opportunity

PUT

/opportunities/{id}

ghl_update_opportunity

PUT

/opportunities/{id}/status

ghl_update_opportunity_status

DELETE

/opportunities/{id}

ghl_delete_opportunity

Method

Path

Tool

GET

/conversations/search

ghl_search_conversations

GET

/conversations/{conversationId}/messages

ghl_get_conversation_messages

POST

/conversations/messages

ghl_send_message

Method

Path

Tool

GET

/calendars/

ghl_list_calendars

GET

/calendars/events

ghl_get_calendar_events

GET

/calendars/{calendarId}/free-slots

ghl_get_free_slots

POST

/calendars/events/appointments

ghl_create_appointment

PUT

/calendars/events/appointments/{eventId}

ghl_update_appointment

DELETE

/calendars/events/{eventId}

ghl_delete_appointment

Method

Path

Tool

GET

/locations/{locationId}

ghl_get_location

GET

/users/

ghl_list_users

Contributing

Contributions and issues are welcome. Please open an issue first before submitting a PR.

License

AGPL-3.0: free for personal and open-source use. Organizations that cannot comply with the AGPL can purchase a commercial license, and hosted/managed versions are available. See COMMERCIAL.md or contact hello@nightsquawk.tech.

For copyright concerns or takedown requests, contact hello@nightsquawk.tech.

Available Tools

56 tools
ghl_add_contact_tagsAdd GoHighLevel Contact TagsB

Add tags to a contact with POST /contacts/{contactId}/tags. Write operation: do not run against live data without explicit approval.

Inputs: tags (required), contact_id (required), response_format.

ghl_add_contact_to_workflowAdd GoHighLevel Contact To WorkflowA

Add a contact to a workflow with POST /contacts/{contactId}/workflow/{workflowId}. Write operation: do not run against live data without explicit approval.

Inputs: contact_id (required), workflow_id (required), response_format.

ghl_create_appointmentCreate GoHighLevel AppointmentC

Create an appointment with POST /calendars/events/appointments. Write operation: do not run against live data without explicit approval.

Inputs: contactId (required), startTime (required), calendarId (required), extra, +9 more.

ghl_create_contactCreate GoHighLevel ContactA

Create a contact with POST /contacts/. Write operation: do not run against live data without explicit approval.

Inputs: dnd, city, name, tags, +16 more.

ghl_create_contact_noteCreate GoHighLevel Contact NoteA

Create a note for a contact with POST /contacts/{contactId}/notes. Write operation: do not run against live data without explicit approval.

Inputs: body (required), contact_id (required), extra, userId, +1 more.

ghl_create_contact_taskCreate GoHighLevel Contact TaskA

Create a task for a contact with POST /contacts/{contactId}/tasks. Write operation: do not run against live data without explicit approval.

Inputs: title (required), contact_id (required), body, extra, +4 more.

ghl_create_custom_fieldCreate GoHighLevel Custom FieldB

Create a custom field for a GoHighLevel location. Write operation: do not run against live data without explicit approval.

Inputs: name (required), dataType (required), model, options, +8 more.

ghl_create_custom_field_folderCreate GoHighLevel Custom Field FolderA

Create a Custom Fields V2 folder with POST /custom-fields/folder. Write operation: do not run against live data without explicit approval.

Inputs: name (required), objectKey (required), extra, parentId, +2 more.

ghl_create_custom_field_v2Create GoHighLevel Custom Field V2A

Create a Custom Fields V2 field with POST /custom-fields/. Write operation: do not run against live data without explicit approval.

Inputs: name (required), dataType (required), objectKey (required), extra, +10 more.

ghl_create_custom_valueCreate GoHighLevel Custom ValueB

Create a custom value for a GoHighLevel location. Write operation: do not run against live data without explicit approval.

Inputs: name (required), value (required), location_id, response_format.

ghl_create_opportunityCreate GoHighLevel OpportunityA

Create an opportunity with POST /opportunities/. Write operation: do not run against live data without explicit approval.

Inputs: name (required), contactId (required), pipelineId (required), pipelineStageId (required), +7 more.

ghl_create_tagCreate GoHighLevel TagA

Create a location tag. Write operation: do not run against live data without explicit approval.

Inputs: name (required), location_id, response_format.

ghl_delete_appointmentDelete GoHighLevel AppointmentA
Destructive

Delete a calendar event with DELETE /calendars/events/{id}. Requires confirm: true and owner approval before live execution.

Inputs: confirm (required), event_id (required), response_format.

ghl_delete_contactDelete GoHighLevel ContactA
Destructive

Delete one GoHighLevel contact from /contacts/{contactId}. Requires confirm: true and owner approval before live execution.

Inputs: confirm (required), contact_id (required), response_format.

ghl_delete_custom_fieldDelete GoHighLevel Custom FieldA
Destructive

Delete a custom field from /locations/{locationId}/customFields/{id}. Requires confirm: true and owner approval before live execution.

Inputs: confirm (required), field_id (required), location_id, response_format.

ghl_delete_custom_field_folderDelete GoHighLevel Custom Field FolderA
Destructive

Delete a Custom Fields V2 folder with DELETE /custom-fields/folder/{id}. Requires confirm: true and owner approval before live execution.

Inputs: confirm (required), folder_id (required), response_format.

ghl_delete_custom_field_v2Delete GoHighLevel Custom Field V2A
Destructive

Delete a Custom Fields V2 field with DELETE /custom-fields/{id}. Requires confirm: true and owner approval before live execution.

Inputs: id (required), confirm (required), response_format.

ghl_delete_custom_valueDelete GoHighLevel Custom ValueA
Destructive

Delete a custom value from /locations/{locationId}/customValues/{id}. Requires confirm: true and owner approval before live execution.

Inputs: confirm (required), custom_value_id (required), location_id, response_format.

ghl_delete_opportunityDelete GoHighLevel OpportunityA
Destructive

Delete an opportunity with DELETE /opportunities/{id}. Requires confirm: true and owner approval before live execution.

Inputs: confirm (required), opportunity_id (required), response_format.

ghl_delete_tagDelete GoHighLevel TagA
Destructive

Delete a location tag. Requires confirm: true and owner approval before live execution.

Inputs: tag_id (required), confirm (required), location_id, response_format.

ghl_get_calendar_eventsGet GoHighLevel Calendar EventsB
Read-onlyIdempotent

List calendar events with GET /calendars/events.

Inputs: limit, offset, endTime, groupId, +6 more.

ghl_get_contactGet GoHighLevel ContactB
Read-onlyIdempotent

Get one GoHighLevel contact from /contacts/{contactId}.

Inputs: contact_id (required), response_format.

ghl_get_contact_notesGet GoHighLevel Contact NotesB
Read-onlyIdempotent

List notes for a contact from /contacts/{contactId}/notes.

Inputs: contact_id (required), limit, offset, response_format.

ghl_get_contact_tasksGet GoHighLevel Contact TasksA
Read-onlyIdempotent

List tasks for a contact from /contacts/{contactId}/tasks.

Inputs: contact_id (required), limit, offset, response_format.

ghl_get_conversation_messagesGet GoHighLevel Conversation MessagesA
Read-onlyIdempotent

List messages for a conversation with GET /conversations/{conversationId}/messages.

Inputs: conversation_id (required), limit, offset, extra_query, +1 more.

ghl_get_custom_fieldGet GoHighLevel Custom FieldA
Read-onlyIdempotent

Get one custom field for a GoHighLevel location from /locations/{locationId}/customFields/{id}.

Inputs: field_id (required), location_id, response_format.

ghl_get_custom_field_v2Get GoHighLevel Custom Field Or Folder V2A
Read-onlyIdempotent

Get a Custom Fields V2 field or folder by ID with GET /custom-fields/{id}.

Inputs: id (required), response_format.

ghl_get_custom_valueGet GoHighLevel Custom ValueB
Read-onlyIdempotent

Get one custom value from /locations/{locationId}/customValues/{id}.

Inputs: custom_value_id (required), location_id, response_format.

ghl_get_free_slotsGet GoHighLevel Free SlotsB
Read-onlyIdempotent

Get free slots for a calendar with GET /calendars/{id}/free-slots.

Inputs: endDate (required), startDate (required), calendar_id (required), userId, +3 more.

ghl_get_locationGet GoHighLevel LocationA
Read-onlyIdempotent

Get one GoHighLevel location/sub-account with GET /locations/{locationId}.

Inputs: location_id, response_format.

ghl_get_opportunityGet GoHighLevel OpportunityA
Read-onlyIdempotent

Get one opportunity with GET /opportunities/{id}.

Inputs: opportunity_id (required), response_format.

ghl_get_pipelinesGet GoHighLevel PipelinesA
Read-onlyIdempotent

List opportunity pipelines with GET /opportunities/pipelines?locationId={locationId}.

Inputs: limit, offset, location_id, response_format.

ghl_get_tagGet GoHighLevel TagC
Read-onlyIdempotent

Get one tag from /locations/{locationId}/tags/{id}.

Inputs: tag_id (required), location_id, response_format.

ghl_list_calendarsList GoHighLevel CalendarsB
Read-onlyIdempotent

List calendars with GET /calendars/?locationId={locationId}.

Inputs: limit, offset, location_id, response_format.

ghl_list_custom_fieldsList GoHighLevel Custom FieldsB
Read-onlyIdempotent

List custom fields for a GoHighLevel location from /locations/{locationId}/customFields.

Inputs: limit, offset, location_id, response_format.

ghl_list_custom_fields_v2List GoHighLevel Custom Fields V2 By Object KeyA
Read-onlyIdempotent

List Custom Fields V2 fields/folders by object key with GET /custom-fields/object-key/{objectKey}. Supports Custom Objects and Company/Business per HighLevel docs.

Inputs: objectKey (required), limit, offset, location_id, +1 more.

ghl_list_custom_valuesList GoHighLevel Custom ValuesB
Read-onlyIdempotent

List custom values for a GoHighLevel location from /locations/{locationId}/customValues.

Inputs: limit, offset, location_id, response_format.

ghl_list_tagsList GoHighLevel TagsA
Read-onlyIdempotent

List tags for a GoHighLevel location from /locations/{locationId}/tags.

Inputs: limit, offset, location_id, response_format.

ghl_list_usersList GoHighLevel UsersB
Read-onlyIdempotent

List users for a location with GET /users/?locationId={locationId}.

Inputs: limit, offset, location_id, response_format.

ghl_merge_contacts_delete_loserMerge GoHighLevel Contacts By Deleting LoserA
Destructive

Preview or execute a guarded contact merge workaround: read both contacts, check loser history, delete loser, then update survivor with loser email. Requires confirm: true to execute.

Inputs: confirm (required), loser_contact_id (required), survivor_contact_id (required), response_format, +1 more.

ghl_remove_contact_from_workflowRemove GoHighLevel Contact From WorkflowA
Destructive

Remove a contact from a workflow with DELETE /contacts/{contactId}/workflow/{workflowId}. Requires confirm: true and owner approval before live execution.

Inputs: confirm (required), contact_id (required), workflow_id (required), response_format.

ghl_remove_contact_tagsRemove GoHighLevel Contact TagsA
Destructive

Remove tags from a contact with DELETE /contacts/{contactId}/tags. Requires confirm: true and owner approval before live execution.

Inputs: tags (required), confirm (required), contact_id (required), response_format.

ghl_search_contactsSearch GoHighLevel ContactsA
Read-onlyIdempotent

Search contacts with POST /contacts/search. This is the preferred read path over deprecated GET /contacts/.

Inputs: limit, query, offset, filters, +4 more.

ghl_search_conversationsSearch GoHighLevel ConversationsC
Read-onlyIdempotent

Search conversations with GET /conversations/search.

Inputs: limit, offset, contactId, assignedTo, +4 more.

ghl_search_opportunitiesSearch GoHighLevel OpportunitiesB
Read-onlyIdempotent

Search opportunities with GET /opportunities/search using GoHighLevel server-side filters.

Inputs: q, id, date, page, +15 more.

ghl_send_messageSend GoHighLevel MessageB
Destructive

Send an outward-facing message with POST /conversations/messages. Requires confirm: true and owner approval before live execution.

Inputs: type (required), confirm (required), message (required), extra, +7 more.

ghl_update_appointmentUpdate GoHighLevel AppointmentA
Idempotent

Update an appointment with PUT /calendars/events/appointments/{id}. Write operation: do not run against live data without explicit approval.

Inputs: appointment_id (required), extra, title, address, +10 more.

ghl_update_contactUpdate GoHighLevel ContactA
Idempotent

Update a contact with PUT /contacts/{contactId}. Write operation: do not run against live data without explicit approval.

Inputs: contact_id (required), dnd, city, name, +16 more.

ghl_update_custom_fieldUpdate GoHighLevel Custom FieldA
Idempotent

Update a custom field through the current location-scoped API: PUT /locations/{locationId}/customFields/{id}. Write operation: do not run against live data without explicit approval.

Inputs: field_id (required), name, model, options, +9 more.

ghl_update_custom_field_folderUpdate GoHighLevel Custom Field FolderA
Idempotent

Update a Custom Fields V2 folder name with PUT /custom-fields/folder/{id}. Write operation: do not run against live data without explicit approval.

Inputs: name (required), folder_id (required), response_format.

ghl_update_custom_field_v2Update GoHighLevel Custom Field V2C
Idempotent

Update a Custom Fields V2 field with PUT /custom-fields/{id}. Write operation: do not run against live data without explicit approval.

Inputs: id (required), name, extra, options, +11 more.

ghl_update_custom_valueUpdate GoHighLevel Custom ValueA
Idempotent

Update a custom value from /locations/{locationId}/customValues/{id}. Write operation: do not run against live data without explicit approval.

Inputs: custom_value_id (required), name, value, location_id, +1 more.

ghl_update_opportunityUpdate GoHighLevel OpportunityA
Idempotent

Update an opportunity with PUT /opportunities/{id}. Write operation: do not run against live data without explicit approval.

Inputs: opportunity_id (required), name, extra, source, +7 more.

ghl_update_opportunity_statusUpdate GoHighLevel Opportunity StatusA
Idempotent

Update opportunity status with PUT /opportunities/{id}/status. Write operation: do not run against live data without explicit approval.

Inputs: status (required), opportunity_id (required), response_format.

ghl_update_tagUpdate GoHighLevel TagA
Idempotent

Update a location tag. Write operation: do not run against live data without explicit approval.

Inputs: name (required), tag_id (required), location_id, response_format.

ghl_upsert_contactUpsert GoHighLevel ContactC
Idempotent

Create or update a contact with POST /contacts/upsert. Write operation: do not run against live data without explicit approval.

Inputs: dnd, city, name, tags, +16 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 56 tools

    Disambiguation4/5

    Most tools have clearly distinct purposes (e.g., get vs search, v1 vs v2 custom fields). However, the high number of tools (56) introduces some potential confusion between similar operations like 'get_contact' vs 'search_contacts', and between custom field variants.

    Naming Consistency5/5

    All tools follow a consistent pattern: 'ghl_' + verb_noun (e.g., ghl_get_contact, ghl_create_custom_field_v2). The naming is predictable and uniform across the entire set.

    Tool Count4/5

    With 56 tools covering contacts, custom fields, opportunities, conversations, calendars, and more, the count is on the higher side but still reasonable for a comprehensive CRM integration. It is not excessive given the breadth of API endpoints.

    Completeness4/5

    The toolset covers most CRUD operations and search for key entities like contacts, opportunities, and appointments. Minor gaps exist (e.g., no pipeline stage management, no webhooks), but the core workflows are well-supported.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      MCP server for GoHighLevel API v2 that provides 50+ tools for CRM, billing, marketing, and operations workflows, enabling natural language interaction with contacts, opportunities, conversations, and more.
      50
      1
      MIT
    • A
      license
      C
      quality
      B
      maintenance
      A comprehensive MCP server covering the full GoHighLevel API surface with 651 tools, enabling management of contacts, opportunities, calendars, invoices, and more through natural language, with multi-tenant support and read-only safety defaults.
      500
      115 npm
      1
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Provides MCP tools to interact with GoHighLevel CRM data, including contacts, conversations, call transcripts, broker lead overviews, pipelines/opportunities, and task creation. Supports both stdio and HTTP transports for local and remote use.
      ISC