@nightsquawktech/gohighlevel-mcp-server
An MCP server that gives AI tools read/write access to GoHighLevel CRM (API v2) through 56 curated tools, with confirm gates on destructive actions.
Custom fields (v1 + V2 + folders): list, get, create, update, delete fields and folders
Custom values: list, get, create, update, delete location custom values
Contacts: search, get, create, update, upsert, delete, and a guarded duplicate-merge tool
Contact sub-resources: add/remove tags, add/remove from workflows, list/create notes, list/create tasks
Tags: list, get, create, rename, delete location tags
Opportunities & pipelines: search, list pipelines/stages, get, create, update, set status, delete
Conversations: search conversations, list messages, send outbound SMS/email (confirm-gated)
Calendars & appointments: list calendars, list events, get free slots, create/update/delete appointments
Locations & users: get location details, list location users
Read tools support
markdown/jsonoutput plus locallimit/offsetslicing; writes gated behindconfirm: truefor destructive operations
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@nightsquawktech/gohighlevel-mcp-server List all custom fields for this location"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
GoHighLevel MCP Server
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
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-serverPowerShell (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-serverCursor
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
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 $configCodex
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-serverPowerShell (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-serverOr 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 |
| yes | Private Integration token ( | |
| yes | Default GoHighLevel sub-account/location ID; individual calls can override it | |
| no |
| GoHighLevel API v2 base URL |
| no |
|
|
| no |
| 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_loserpreviews 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.
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 locationAll 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 |
|
|
GET |
|
|
POST |
|
|
PUT |
|
|
DELETE |
|
|
GET |
|
|
GET |
|
|
POST |
|
|
PUT |
|
|
DELETE |
|
|
POST |
|
|
PUT |
|
|
DELETE |
|
|
Method | Path | Tool |
GET |
|
|
GET |
|
|
POST |
|
|
PUT |
|
|
DELETE |
|
|
Method | Path | Tool |
POST |
|
|
GET |
|
|
POST |
|
|
PUT |
|
|
POST |
|
|
DELETE |
|
|
GET, DELETE, PUT |
|
|
POST |
|
|
DELETE |
|
|
POST |
|
|
DELETE |
|
|
GET |
|
|
POST |
|
|
GET |
|
|
POST |
|
|
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 |
|
|
GET |
|
|
POST |
|
|
PUT |
|
|
DELETE |
|
|
Method | Path | Tool |
GET |
|
|
GET |
|
|
GET |
|
|
POST |
|
|
PUT |
|
|
PUT |
|
|
DELETE |
|
|
Method | Path | Tool |
GET |
|
|
GET |
|
|
POST |
|
|
Method | Path | Tool |
GET |
|
|
GET |
|
|
GET |
|
|
POST |
|
|
PUT |
|
|
DELETE |
|
|
Method | Path | Tool |
GET |
|
|
GET |
|
|
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.
Copyright
For copyright concerns or takedown requests, contact hello@nightsquawk.tech.
Available Tools
56 toolsghl_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 AppointmentADestructive
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 ContactADestructive
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 FieldADestructive
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 FolderADestructive
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 V2ADestructive
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 ValueADestructive
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 OpportunityADestructive
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 TagADestructive
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 EventsBRead-onlyIdempotent
List calendar events with GET /calendars/events.
Inputs: limit, offset, endTime, groupId, +6 more.
ghl_get_contactGet GoHighLevel ContactBRead-onlyIdempotent
Get one GoHighLevel contact from /contacts/{contactId}.
Inputs: contact_id (required), response_format.
ghl_get_contact_notesGet GoHighLevel Contact NotesBRead-onlyIdempotent
List notes for a contact from /contacts/{contactId}/notes.
Inputs: contact_id (required), limit, offset, response_format.
ghl_get_contact_tasksGet GoHighLevel Contact TasksARead-onlyIdempotent
List tasks for a contact from /contacts/{contactId}/tasks.
Inputs: contact_id (required), limit, offset, response_format.
ghl_get_conversation_messagesGet GoHighLevel Conversation MessagesARead-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 FieldARead-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 V2ARead-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 ValueBRead-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 SlotsBRead-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 LocationARead-onlyIdempotent
Get one GoHighLevel location/sub-account with GET /locations/{locationId}.
Inputs: location_id, response_format.
ghl_get_opportunityGet GoHighLevel OpportunityARead-onlyIdempotent
Get one opportunity with GET /opportunities/{id}.
Inputs: opportunity_id (required), response_format.
ghl_get_pipelinesGet GoHighLevel PipelinesARead-onlyIdempotent
List opportunity pipelines with GET /opportunities/pipelines?locationId={locationId}.
Inputs: limit, offset, location_id, response_format.
ghl_get_tagGet GoHighLevel TagCRead-onlyIdempotent
Get one tag from /locations/{locationId}/tags/{id}.
Inputs: tag_id (required), location_id, response_format.
ghl_list_calendarsList GoHighLevel CalendarsBRead-onlyIdempotent
List calendars with GET /calendars/?locationId={locationId}.
Inputs: limit, offset, location_id, response_format.
ghl_list_custom_fieldsList GoHighLevel Custom FieldsBRead-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 KeyARead-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 ValuesBRead-onlyIdempotent
List custom values for a GoHighLevel location from /locations/{locationId}/customValues.
Inputs: limit, offset, location_id, response_format.
ghl_list_tagsList GoHighLevel TagsARead-onlyIdempotent
List tags for a GoHighLevel location from /locations/{locationId}/tags.
Inputs: limit, offset, location_id, response_format.
ghl_list_usersList GoHighLevel UsersBRead-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 LoserADestructive
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 WorkflowADestructive
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 TagsADestructive
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 ContactsARead-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 ConversationsCRead-onlyIdempotent
Search conversations with GET /conversations/search.
Inputs: limit, offset, contactId, assignedTo, +4 more.
ghl_search_opportunitiesSearch GoHighLevel OpportunitiesBRead-onlyIdempotent
Search opportunities with GET /opportunities/search using GoHighLevel server-side filters.
Inputs: q, id, date, page, +15 more.
ghl_send_messageSend GoHighLevel MessageBDestructive
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 AppointmentAIdempotent
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 ContactAIdempotent
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 FieldAIdempotent
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 FolderAIdempotent
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 V2CIdempotent
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 ValueAIdempotent
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 OpportunityAIdempotent
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 StatusAIdempotent
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 TagAIdempotent
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 ContactCIdempotent
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
Scored across 56 tools
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.
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.
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.
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
Related MCP Connectors
Unofficial remote MCP server for Less Annoying CRM: OAuth 2.1, read-only grants, 10 tools.
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
Cross-product MCP server for CRM, LeadKit, ProjectKit, Bookio. 10 action types, MIT open spec.
API-first CRM for LLMs - contacts, companies, deals and activities over a native MCP server.
Related MCP Servers
- AlicenseAqualityDmaintenanceLocal-first MCP server for Quo/OpenPhone automation across messaging, calls, contacts, users, phone numbers, and webhooks via a clean stdio tool surface.212AGPL 3.0
- AlicenseBqualityDmaintenanceMCP 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.501MIT
- AlicenseCqualityBmaintenanceA 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.500115 npm1MIT
- AlicenseNot gradedqualityBmaintenanceProvides 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