@nightsquawktech/gohighlevel-mcp-server
Stdio MCP server for curated GoHighLevel API v2 coverage, enabling create, update, and delete operations on custom fields, contacts, opportunities, tags, conversations, calendars, and more, with safe guarded destructive tools requiring explicit confirmation.
README
@nightsquawktech/gohighlevel-mcp-server
Stdio MCP server for curated GoHighLevel API v2 coverage. It is intended to run beside the official hosted HighLevel MCP and fill the gaps that server does not expose:
- create, update, and delete custom fields
- delete contacts
- guarded duplicate-contact merge workaround for records that are safe to hard-delete
This implementation covers all phases in SCOPE.md: custom fields, custom values, contacts, opportunities, tags, conversations, calendars, locations/users, contact notes/tasks, and Custom Fields V2/folders. Destructive and outbound tools (deletes, merges, message sends) require an explicit confirm: true parameter and should only be run with explicit human approval.
Custom Field API Fork
The P1 custom-field write tools use the current location-scoped endpoints:
PUT /locations/{locationId}/customFields/{id}DELETE /locations/{locationId}/customFields/{id}
The newer /custom-fields/{id} V2 API is documented separately and says it only supports Custom Objects and Company/Business today. It is implemented as separate V2/folder tools instead of replacing the location-scoped contact/opportunity custom-field tools.
Setup
Configure your MCP client to run the server with npx:
{
"mcpServers": {
"gohighlevel": {
"command": "npx",
"args": ["-y", "@nightsquawktech/gohighlevel-mcp-server"],
"env": {
"GHL_API_TOKEN": "pit-...",
"GHL_LOCATION_ID": "<location id>",
"GHL_API_VERSION": "2021-07-28"
}
}
}
}
Environment
GHL_API_TOKENrequired. Private Integration Token or OAuth sub-account access token.GHL_LOCATION_IDrequired. Default sub-account/location ID.GHL_BASE_URLoptional, defaulthttps://services.leadconnectorhq.com.GHL_API_VERSIONoptional, default2021-07-28.GHL_TIMEOUT_MSoptional, default30000.
Required Private Integration scopes for the full server roadmap:
locations/customFields.readonly,locations/customFields.writelocations/customValues.readonly,locations/customValues.writecontacts.readonly,contacts.writeopportunities.readonly,opportunities.writeconversations.readonly,conversations.writeconversations/message.readonly,conversations/message.writecalendars.readonly,calendars.writecalendars/events.readonly,calendars/events.writelocations.readonly,locations.writeworkflows.readonly
Tools
ghl_list_custom_fieldsghl_get_custom_fieldghl_create_custom_fieldghl_update_custom_fieldghl_delete_custom_fieldrequiresconfirm: trueghl_list_custom_valuesghl_get_custom_valueghl_create_custom_valueghl_update_custom_valueghl_delete_custom_valuerequiresconfirm: trueghl_search_contactsghl_get_contactghl_create_contactghl_update_contactghl_upsert_contactghl_delete_contactrequiresconfirm: trueghl_merge_contacts_delete_loserpreviews by default; requiresconfirm: true, deletes the loser only after zero-history preflight checks, then updates the survivor emailghl_add_contact_tagsghl_remove_contact_tagsrequiresconfirm: trueghl_add_contact_to_workflowghl_remove_contact_from_workflowrequiresconfirm: trueghl_get_contact_notesghl_create_contact_noteghl_get_contact_tasksghl_create_contact_taskghl_search_opportunitiesghl_get_pipelinesghl_get_opportunityghl_create_opportunityghl_update_opportunityghl_update_opportunity_statusghl_delete_opportunityrequiresconfirm: trueghl_list_tagsghl_get_tagghl_create_tagghl_update_tagghl_delete_tagrequiresconfirm: trueghl_search_conversationsghl_get_conversation_messagesghl_send_messagerequiresconfirm: trueghl_list_calendarsghl_get_calendar_eventsghl_get_free_slotsghl_create_appointmentghl_update_appointmentghl_delete_appointmentrequiresconfirm: trueghl_get_locationghl_list_usersghl_list_custom_fields_v2ghl_get_custom_field_v2ghl_create_custom_field_v2ghl_update_custom_field_v2ghl_delete_custom_field_v2requiresconfirm: trueghl_create_custom_field_folderghl_update_custom_field_folderghl_delete_custom_field_folderrequiresconfirm: true
All tools return both text content and structuredContent. Read tools support response_format: "markdown" | "json".
Verification
Read-only smoke tests:
$h = @{
Authorization = "Bearer $env:GHL_API_TOKEN"
Version = $env:GHL_API_VERSION ?? "2021-07-28"
Accept = "application/json"
}
Invoke-RestMethod "https://services.leadconnectorhq.com/locations/$env:GHL_LOCATION_ID/customFields" -Headers $h
Invoke-RestMethod "https://services.leadconnectorhq.com/locations/$env:GHL_LOCATION_ID/customValues" -Headers $h
Invoke-RestMethod "https://services.leadconnectorhq.com/locations/$env:GHL_LOCATION_ID/tags" -Headers $h
Invoke-RestMethod "https://services.leadconnectorhq.com/contacts/search" -Method Post -Headers $h -ContentType "application/json" -Body (@{ locationId = $env:GHL_LOCATION_ID; pageLimit = 1 } | ConvertTo-Json)
Invoke-RestMethod "https://services.leadconnectorhq.com/opportunities/pipelines?locationId=$env:GHL_LOCATION_ID" -Headers $h
Invoke-RestMethod "https://services.leadconnectorhq.com/calendars/?locationId=$env:GHL_LOCATION_ID" -Headers $h
Invoke-RestMethod "https://services.leadconnectorhq.com/users/?locationId=$env:GHL_LOCATION_ID" -Headers $h
Owner-approved write/delete test plan:
- Create a disposable custom value, read it back, update its
value, then delete it withconfirm: true. - Create a disposable custom field named with a clear test prefix, read it back, update its placeholder, then delete it with
confirm: true. - Pick or create a disposable contact, add a disposable tag, remove the tag with
confirm: true, then delete the contact withconfirm: trueonly if the owner approves contact deletion. - Add a disposable contact to a safe test workflow, then remove it with
confirm: true. - Create/update/upsert a disposable contact, then verify no production contact was modified.
- Create a disposable opportunity in a test pipeline/stage, update it, update its status, then delete it with
confirm: true. - Send a message only to an owner-approved test contact/channel with
confirm: true. - Create/update/delete a disposable appointment on a test calendar with
confirm: truefor delete. - Create/update/delete a disposable Custom Fields V2 field and folder only under an owner-approved test object key, with
confirm: truefor deletes. - Create a disposable contact note and task only on an owner-approved test contact.
- For each destructive tool, first call it without
confirm: trueand verify it returns an MCP error without calling GoHighLevel. - For
ghl_merge_contacts_delete_loser, first runconfirm: falseagainst an owner-approved duplicate pair and verify the preview shows the loser email, survivor email, and zero notes/tasks/conversations/opportunities/history-check errors. For the destructive test, use only disposable contacts: create a survivor and loser, set the loser's email, verify no history exists, run withconfirm: true, verify the loser is gone and the survivor has the copied email. Separately verify the guard by adding a note/task to a disposable loser and confirming the merge is skipped without deletion.
Use stderr only for logs. Never commit .env or real tokens.
Development
npm install
npm run dev
npm run build
License
Licensed under the GNU AGPL v3.0. Free for personal and open-source use.
Organizations that cannot comply with the AGPL can purchase a commercial license. See COMMERCIAL.md or contact hello@nightsquawk.tech.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.