GHL MCP Server
Enables sending WhatsApp messages to contacts via GoHighLevel conversations.
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., "@GHL MCP Server search for contacts tagged 'potential'"
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.
GHL MCP Server
GoHighLevel MCP Server for Claude, N8N, and Custom AI Agents Built by Saurabh K Shah (https://saurabhshah.com)
A comprehensive Model Context Protocol (MCP) server that connects AI assistants directly to your GoHighLevel CRM. Supports 60+ tools across contacts, conversations, calendars, pipelines, payments, invoices, workflows, custom fields, social media, and more.
Features
Contacts: Search, create, update, delete, upsert, tags, notes, tasks, workflow management
Conversations & Messaging: SMS, Email, WhatsApp, search threads, send messages, schedule sends
Calendars & Appointments: List calendars, get free slots, create/update/delete events
Opportunities & Pipelines: Full deal management, stage transitions, pipeline listing
Payments & Invoices: Orders, transactions, subscriptions, create/send/void invoices
Workflows: List all workflows, add/remove contacts from workflows
Custom Fields: List, create custom fields for contacts
Locations: Sub-account details, tags management
Users: Search team members
Forms & Surveys: List forms/surveys, get submissions
Campaigns: List all campaigns
Social Media: List/create posts, view connected accounts
Funnels & Blogs: List funnels, blogs
Products: List products and prices
Related MCP server: GoHighLevel MCP Server
Quick Start
1. Get Your GHL Credentials
Log into GoHighLevel → Settings → Private Integrations
Click Create New Integration
Name it (e.g., "Claude MCP Server")
Select all scopes you need (contacts, conversations, calendars, payments, etc.)
Copy the Private Integration Token
Note your Location ID (visible in the URL when viewing any sub-account)
2. Install & Configure
git clone https://github.com/northrosetech/ghl-mcp-server.git
cd ghl-mcp-server
npm install
cp .env.example .envEdit .env:
GHL_API_KEY=your_private_integration_token_here
GHL_LOCATION_ID=your_location_id_hereBuild:
npm run build3. Connect to Claude Desktop
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on Mac):
{
"mcpServers": {
"ghl": {
"command": "node",
"args": ["/absolute/path/to/ghl-mcp-server/dist/index.js"],
"env": {
"GHL_API_KEY": "your_private_integration_token",
"GHL_LOCATION_ID": "your_location_id",
"TRANSPORT": "stdio"
}
}
}
}Restart Claude Desktop. You should see GHL tools available.
4. Connect to N8N (HTTP Mode)
Start the server in HTTP mode:
TRANSPORT=http PORT=3001 GHL_API_KEY=your_token GHL_LOCATION_ID=your_id node dist/index.jsIn N8N:
Add an MCP Client node
Set URL to
http://localhost:3001/mcpSet transport to HTTP Streamable
Use the GHL tools in your workflows
5. Connect to Claude Code
Add to your project's .mcp.json:
{
"mcpServers": {
"ghl": {
"command": "node",
"args": ["./ghl-mcp-server/dist/index.js"],
"env": {
"GHL_API_KEY": "your_token",
"GHL_LOCATION_ID": "your_id"
}
}
}
}Available Tools (60+)
Contacts (15 tools)
Tool | Description |
| Search contacts by query, tags, filters |
| Get contact by ID |
| Create new contact |
| Update existing contact |
| Delete contact |
| Create or update by email/phone |
| Add tags to contact |
| Remove tags from contact |
| Get contact notes |
| Add note to contact |
| Delete a note |
| Get contact tasks |
| Create task for contact |
| Update task |
| Add contact to workflow |
| Remove from workflow |
Conversations & Messaging (6 tools)
Tool | Description |
| Search conversation threads |
| Get conversation details |
| Get messages in a thread |
| Send SMS/Email/WhatsApp/etc. |
| Cancel scheduled message |
| Update conversation status |
Calendars & Appointments (8 tools)
Tool | Description |
| List all calendars |
| Get calendar details |
| Get available booking slots |
| Get appointments/events |
| Create appointment |
| Update appointment |
| Delete appointment |
| Create new calendar |
Opportunities & Pipelines (7 tools)
Tool | Description |
| Search deals |
| Get deal details |
| Create new deal |
| Update deal / move stages |
| Delete deal |
| Change deal status |
| List pipelines & stages |
Payments & Invoices (9 tools)
Tool | Description |
| List payment orders |
| Get order details |
| List transactions |
| List subscriptions |
| List invoices |
| Get invoice details |
| Create invoice |
| Email invoice to contact |
| Void an invoice |
Other Tools (15+ tools)
Tool | Description |
| List all workflows |
| List custom fields |
| Create custom field |
| Get location details |
| Get location tags |
| Create new tag |
| Search team members |
| List forms |
| Get form submissions |
| List surveys |
| List campaigns |
| List social posts |
| Create/schedule social post |
| List connected social accounts |
| List funnels/websites |
| List products |
| List blogs |
| List trigger links |
Architecture
ghl-mcp-server/
├── src/
│ ├── index.ts # Entry point (stdio + HTTP transport)
│ ├── constants.ts # All GHL API endpoints & config
│ ├── types.ts # TypeScript interfaces
│ ├── services/
│ │ └── api-client.ts # Auth, rate limiting, error handling
│ └── tools/
│ ├── contacts.ts # Contact management tools
│ ├── conversations.ts # Messaging tools
│ ├── calendars.ts # Calendar & appointment tools
│ ├── opportunities.ts # Pipeline & deal tools
│ └── business.ts # Payments, invoices, workflows, etc.
├── dist/ # Compiled JS
├── package.json
├── tsconfig.json
└── .env.exampleRate Limits
The server includes built-in rate limiting matching GHL's limits:
Burst: 100 requests per 10 seconds
Daily: 200,000 requests per day
The server automatically queues and retries when limits are approached.
Error Handling
All tools return actionable error messages with hints:
401: Check your API key (must be Private Integration Token)
403: Missing scopes — edit your Private Integration in GHL Settings
404: Resource not found — check the ID
422: Validation error with details
429: Rate limit — automatic retry
License
MIT — Built by Saurabh K Shah (https://saurabhshah.com)
Available Tools
64 toolsghl_add_contact_tagsAdd Tags to ContactAIdempotent
Add one or more tags to a contact.
Inputs: tags (required), contactId (required).
ghl_add_contact_to_workflowAdd Contact to WorkflowAIdempotent
Add a contact to a GHL workflow/automation.
Inputs: contactId (required), workflowId (required).
ghl_cancel_scheduled_messageCancel Scheduled MessageAIdempotent
Cancel a previously scheduled message.
Inputs: messageId (required).
ghl_create_calendarCreate GHL CalendarB
Create a new calendar in GoHighLevel.
Inputs: name (required), slug, locationId, description, +1 more.
ghl_create_contactCreate GHL ContactA
Create a new contact in GoHighLevel.
Args:
firstName, lastName, email, phone (strings): Basic contact info
tags (string[]): Tags to apply
source (string): Lead source
customFields (array): Custom field values as [{id, field_value}]
locationId (string): Location ID (uses default if omitted)
Returns: Created contact object with ID.
Inputs: dnd, city, name, tags, +14 more.
ghl_create_contact_noteCreate Contact NoteA
Add a note to a contact.
Inputs: body (required), contactId (required), userId.
ghl_create_contact_taskCreate Contact TaskC
Create a task for a contact.
Inputs: title (required), contactId (required), body, dueDate, +2 more.
ghl_create_custom_fieldCreate Custom FieldA
Create a new custom field for contacts.
Inputs: name (required), dataType (required), options, locationId, +1 more.
ghl_create_eventCreate Calendar EventA
Create a new appointment/event on a GHL calendar.
Inputs: endTime (required), contactId (required), startTime (required), calendarId (required), +7 more.
ghl_create_invoiceCreate InvoiceA
Create a new invoice for a contact.
Inputs: name (required), items (required), contactId (required), dueDate, +2 more.
ghl_create_location_tagCreate Location TagB
Create a new tag in the location.
Inputs: name (required), locationId.
ghl_create_opportunityCreate GHL OpportunityB
Create a new opportunity/deal in a pipeline.
Inputs: name (required), contactId (required), pipelineId (required), pipelineStageId (required), +6 more.
ghl_create_social_postCreate Social Media PostA
Schedule or publish a social media post.
Inputs: content (required), accountIds (required), mediaUrls, locationId, +1 more.
ghl_delete_contactDelete GHL ContactADestructive
Permanently delete a contact. This cannot be undone.
Inputs: contactId (required).
ghl_delete_contact_noteDelete Contact NoteADestructive
Delete a specific note from a contact.
Inputs: noteId (required), contactId (required).
ghl_delete_eventDelete Calendar EventBDestructive
Delete/cancel an appointment.
Inputs: eventId (required).
ghl_delete_opportunityDelete GHL OpportunityADestructive
Permanently delete an opportunity.
Inputs: opportunityId (required).
ghl_get_calendarGet GHL CalendarBRead-onlyIdempotent
Get details of a specific calendar.
Inputs: calendarId (required).
ghl_get_contactGet GHL ContactARead-onlyIdempotent
Get a single contact by ID with all details including custom fields, tags, and activity.
Inputs: contactId (required).
ghl_get_contact_notesGet Contact NotesBRead-onlyIdempotent
Get all notes for a contact.
Inputs: contactId (required).
ghl_get_contact_tasksGet Contact TasksARead-onlyIdempotent
Get all tasks for a contact.
Inputs: contactId (required).
ghl_get_conversationGet GHL ConversationARead-onlyIdempotent
Get a single conversation by ID with metadata.
Inputs: conversationId (required).
ghl_get_eventsGet Calendar EventsARead-onlyIdempotent
Get appointments/events for a location, optionally filtered by calendar, contact, or date range.
Inputs: userId, endTime, contactId, startTime, +2 more.
ghl_get_form_submissionsGet Form SubmissionsBRead-onlyIdempotent
Get submissions for forms in a location.
Inputs: limit, formId, locationId.
ghl_get_free_slotsGet Calendar Free SlotsARead-onlyIdempotent
Get available booking slots for a calendar within a date range.
Inputs: endDate (required), startDate (required), calendarId (required), timezone.
ghl_get_invoiceGet InvoiceARead-onlyIdempotent
Get details of a specific invoice.
Inputs: invoiceId (required).
ghl_get_locationGet Location DetailsARead-onlyIdempotent
Get details of a GHL location/sub-account including settings, address, and configuration.
Inputs: locationId.
ghl_get_location_tagsGet Location TagsARead-onlyIdempotent
Get all tags defined in a location.
Inputs: locationId.
ghl_get_messagesGet Conversation MessagesARead-onlyIdempotent
Get messages in a conversation thread. Returns SMS, email, and other message types.
Inputs: conversationId (required), type, limit.
ghl_get_opportunityGet GHL OpportunityARead-onlyIdempotent
Get details of a specific opportunity/deal.
Inputs: opportunityId (required).
ghl_get_orderGet Payment OrderARead-onlyIdempotent
Get details of a specific payment order.
Inputs: orderId (required).
ghl_list_blogsList BlogsBRead-onlyIdempotent
Get all blogs for a location.
Inputs: locationId.
ghl_list_calendarsList GHL CalendarsBRead-onlyIdempotent
Get all calendars for the location.
Inputs: locationId.
ghl_list_campaignsList CampaignsCRead-onlyIdempotent
Get all campaigns for a location.
Inputs: locationId.
ghl_list_custom_fieldsList Custom FieldsARead-onlyIdempotent
Get all custom fields for contacts in a location.
Inputs: locationId.
ghl_list_formsList FormsARead-onlyIdempotent
Get all forms for a location.
Inputs: locationId.
ghl_list_funnelsList FunnelsBRead-onlyIdempotent
Get all funnels/websites for a location.
Inputs: locationId.
ghl_list_invoicesList InvoicesBRead-onlyIdempotent
Get invoices for a location. Filter by status, contact, or date range.
Inputs: limit, status, contactId, locationId.
ghl_list_linksList Trigger LinksARead-onlyIdempotent
Get all trigger links for a location.
Inputs: locationId.
ghl_list_ordersList Payment OrdersCRead-onlyIdempotent
Get payment orders for a location.
Inputs: limit, offset, locationId.
ghl_list_pipelinesList GHL PipelinesARead-onlyIdempotent
Get all pipelines and their stages for a location.
Inputs: locationId.
ghl_list_productsList ProductsARead-onlyIdempotent
Get all products for a location.
Inputs: locationId.
ghl_list_social_accountsList Connected Social AccountsBRead-onlyIdempotent
Get all connected social media accounts (Facebook, Instagram, Google, etc.).
Inputs: locationId.
ghl_list_social_postsList Social Media PostsCRead-onlyIdempotent
Get scheduled and published social media posts.
Inputs: limit, locationId.
ghl_list_subscriptionsList SubscriptionsARead-onlyIdempotent
Get active subscriptions for a location.
Inputs: limit, locationId.
ghl_list_surveysList SurveysARead-onlyIdempotent
Get all surveys for a location.
Inputs: locationId.
ghl_list_transactionsList TransactionsBRead-onlyIdempotent
Get payment transactions for a location.
Inputs: limit, offset, locationId.
ghl_list_workflowsList GHL WorkflowsARead-onlyIdempotent
Get all workflows/automations for a location.
Inputs: locationId.
ghl_remove_contact_from_workflowRemove Contact from WorkflowAIdempotent
Remove a contact from a GHL workflow.
Inputs: contactId (required), workflowId (required).
ghl_remove_contact_tagsRemove Tags from ContactAIdempotent
Remove one or more tags from a contact.
Inputs: tags (required), contactId (required).
ghl_search_contactsSearch GHL ContactsARead-onlyIdempotent
Search contacts in GoHighLevel by query, tags, filters, or custom fields. Returns paginated results.
Args:
query (string): Search term (name, email, phone)
locationId (string): Location ID (uses default if omitted)
limit (number): Results per page (1-100, default 20)
filters (object): Advanced filters like tags, date ranges, custom fields
Returns: List of contacts with pagination metadata.
Inputs: limit, query, filters, locationId, +2 more.
ghl_search_conversationsSearch GHL ConversationsARead-onlyIdempotent
Search conversations by contact ID, query, or status. Returns threaded conversations with latest message info.
Inputs: limit, query, status, contactId, +1 more.
ghl_search_opportunitiesSearch GHL OpportunitiesCRead-onlyIdempotent
Search opportunities (deals) by pipeline, stage, status, contact, or monetary value.
Inputs: limit, query, status, contactId, +5 more.
ghl_search_usersSearch GHL UsersBRead-onlyIdempotent
Search for users/team members in a location.
Inputs: query, locationId.
ghl_send_invoiceSend InvoiceB
Send an invoice to the contact via email.
Inputs: invoiceId (required).
ghl_send_messageSend Message via GHLA
Send a message (SMS, Email, WhatsApp, or other) to a contact via GoHighLevel.
Args:
type: "SMS", "Email", "WhatsApp", "GMB", "IG", "FB", "Custom", "Live_Chat"
contactId: The recipient contact ID
message: The message body (text for SMS/WhatsApp, HTML for email)
subject: Email subject (required for Email type)
emailFrom: Sender email (for Email type)
html: HTML body (for Email type, alternative to message)
scheduledTimestamp: ISO timestamp to schedule future send
Returns: Sent message object with ID and status.
Inputs: type (required), contactId (required), html, message, +6 more.
ghl_update_contactUpdate GHL ContactAIdempotent
Update an existing contact. Only pass fields you want to change.
Inputs: contactId (required), dnd, city, tags, +12 more.
ghl_update_contact_taskUpdate Contact TaskAIdempotent
Update an existing task for a contact.
Inputs: taskId (required), contactId (required), body, title, +3 more.
ghl_update_conversationUpdate GHL ConversationAIdempotent
Update conversation status (starred, unread, etc.).
Inputs: conversationId (required), starred, unreadCount.
ghl_update_eventUpdate Calendar EventBIdempotent
Update an existing appointment/event.
Inputs: eventId (required), notes, title, status, +5 more.
ghl_update_opportunityUpdate GHL OpportunityAIdempotent
Update an existing opportunity — move stages, change value, update status, etc.
Inputs: opportunityId (required), name, source, status, +4 more.
ghl_update_opportunity_statusUpdate Opportunity StatusAIdempotent
Change the status of an opportunity (open, won, lost, abandoned).
Inputs: status (required), opportunityId (required).
ghl_upsert_contactUpsert GHL ContactAIdempotent
Create or update a contact by email/phone. If a match is found, updates; otherwise creates new.
Inputs: tags, email, phone, source, +5 more.
ghl_void_invoiceVoid InvoiceBDestructiveIdempotent
Void an existing invoice.
Inputs: invoiceId (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 64 tools
Most tools follow a clear resource+action pattern making them easy to distinguish, and the ghl_ prefix groups them coherently. The main overlap is ghl_update_opportunity and ghl_update_opportunity_status, since update_opportunity already claims to handle status changes, and the many list_* tools for similar marketing resources (forms, surveys, funnels, blogs) require careful attention.
Every tool uses the ghl_ prefix with a consistent snake_case verb_noun pattern (list, get, create, update, delete, search, send, add, remove). Verbs are used predictably across resource types, with no mixed casing or stylistic deviations.
64 tools is far beyond the range an agent can efficiently navigate, despite the breadth of the GoHighLevel domain. While each tool targets a distinct resource, the sheer size creates significant tool-selection overhead and makes the server unwieldy compared to well-scoped alternatives.
Core lifecycles are well covered: contacts have full CRUD plus tags/notes/tasks/workflow operations, opportunities have complete CRUD plus status updates, and invoices cover list/get/create/send/void. Minor gaps exist such as no delete for contact tasks, no update for contact notes, and list-only access to funnels/blogs/links/products, but agents can work around these.
Maintenance
Related MCP Connectors
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
AI agent platform: manage leads, conversations, bots, calendar and CRM via MCP.
Related MCP Servers
- 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
- AlicenseNot gradedqualityDmaintenanceConnects AI assistants to GoHighLevel CRM via MCP, enabling full sub-account automation with 269+ tools for contacts, messaging, sales, marketing, and more.15 npmISC
- AlicenseNot gradedqualityDmaintenanceAn MCP server for GoHighLevel with 82 live-tested tools, enabling CRM operations like contact management, appointments, invoices, and workflows via natural language.115 npmMIT
- FlicenseNot gradedqualityDmaintenanceMCP server for GoHighLevel sub-accounts, enabling management of CRM contacts, pipelines, calendars, invoices, and more via natural language.-