Why connect Claude to GoHighLevel?
If you spend your day inside GoHighLevel — searching contacts, chasing opportunities, sending SMS, building workflows — connecting Claude to GHL via the Model Context Protocol (MCP) is the highest-leverage AI setup you can run right now. Once it's wired up, you can ask Claude things like "find every lead tagged 'demo-booked' that hasn't been contacted in 14 days and draft a follow-up SMS" and it will actually do it — not pretend, not hallucinate, not ask you to paste a CSV.
This guide walks through the full setup: what MCP is, how to install a GHL MCP server, how to configure Claude Desktop, and the prompts I run daily after shipping 120+ apps to the GHL Marketplace.
What is MCP, and why does it matter for GHL?
Model Context Protocol (MCP) is an open standard from Anthropic that lets Claude talk to external tools and data sources through a uniform interface. Think of it as USB-C for LLMs: every MCP server exposes a set of tools (functions Claude can call) and resources (data Claude can read), and Claude can use them inside any chat.
For GoHighLevel users, MCP turns Claude from a chatbot into an operator. Instead of copy-pasting CRM data or asking Claude to "imagine" your pipeline, Claude reads and writes directly to your GHL location through the official V2 API.
What you can do once it's connected
- Search contacts by tag, source, custom field, or pipeline stage
- Create, update, and delete contacts and opportunities
- Send SMS, email, and conversation messages from Claude
- Pull conversation history and summarize threads
- Trigger workflows and add contacts to campaigns
- Read calendars and book appointments
- Pull invoice, subscription, and order data
- Run cross-pipeline reports by source, tag, or owner
Anything the GHL V2 API can do, an MCP server can expose to Claude.
Prerequisites
- A GoHighLevel sub-account (or agency) with API access
- A Private Integration Token (PIT) — fastest path for personal use; OAuth if you're building this for clients
- Claude Desktop (claude.ai/download) or Claude Code
- Node.js 18+ or Python 3.10+, depending on which MCP server you run
Step 1 — Get your GHL credentials
In your sub-account, go to Settings → Private Integrations → Create New Integration. Name it "Claude MCP," select the scopes you actually need (start with contacts, conversations, opportunities, calendars, locations, workflows), and copy the generated PIT. Then grab your Location ID from Settings → Company.
Treat the PIT like a password. Anyone with it can fully act inside your GHL location.
Step 2 — Install a GHL MCP server
You have two paths.
Option A — Use an existing GHL MCP server
Several community-built GHL MCP servers exist on GitHub and npm. Pick one with active commits, broad endpoint coverage, and clean auth handling. Install with:
npx -y @your-chosen/ghl-mcp-server
Option B — Build your own with the MCP SDK (recommended)
The Anthropic MCP SDK (@modelcontextprotocol/sdk for TypeScript, fastmcp for Python) lets you wrap any subset of the GHL V2 API in ~150 lines. This is the path I recommend if you want fine-grained control over which tools Claude can call — and it's the only path that lets you publish your own MCP server on the GHL Marketplace later.
A minimal Node example exposing one tool:
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new Server({ name: "ghl-mcp", version: "0.1.0" });
server.tool("search_contacts", { query: z.string() }, async ({ query }) => {
const r = await fetch("https://services.leadconnectorhq.com/contacts/search", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.GHL_PIT}`,
Version: "2021-07-28",
"Content-Type": "application/json",
},
body: JSON.stringify({ locationId: process.env.GHL_LOCATION_ID, query }),
});
return { content: [{ type: "text", text: JSON.stringify(await r.json()) }] };
});
await server.connect(new StdioServerTransport());
Add one tool per endpoint you actually use. Start with search_contacts, get_contact, send_sms, and create_opportunity — that's 80% of daily CRM operations.
Step 3 — Configure Claude Desktop
Open Claude Desktop's config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Add your GHL MCP server:
{
"mcpServers": {
"gohighlevel": {
"command": "node",
"args": ["/absolute/path/to/ghl-mcp/dist/index.js"],
"env": {
"GHL_PIT": "pit-xxxx...",
"GHL_LOCATION_ID": "loc_xxxx..."
}
}
}
}
Save, fully quit Claude Desktop, and reopen. You should see the plug icon in the chat input showing your GHL tools are loaded.
Step 4 — Test it
Run these prompts in order:
- "Search my GHL contacts tagged 'demo-booked' created in the last 7 days."
- "Pull the last 5 conversations from contact ID xyz and summarize them."
- "Create a new opportunity in the 'Sales' pipeline for John Doe, value $2,500, stage 'Proposal Sent'."
- "Find every contact missing an email address and list them."
If Claude calls the tool and returns real GHL data, you're live.
Common errors and how to fix them
401 Unauthorized — PIT is wrong, expired, or missing the required scope. Regenerate with the right scopes.
404 on Location ID — You used the agency-level ID instead of the sub-account location ID. Use the sub-account one for most endpoints.
Claude doesn't see the tools — Bad JSON in the config, wrong absolute path, or you didn't fully quit before reopening. Check Help → View Logs in Claude Desktop.
Tools appear but error on call — Most often a missing Version: 2021-07-28 header on the GHL API call. Add it to every request.
What to build next
Once Claude is reading and writing to your GHL location, the real leverage comes from custom tools that match how you actually work — a find_stalled_deals tool that filters by stage age, a draft_followup tool that pulls conversation context and writes the next message, a weekly_pipeline_report resource Claude can read in one shot.
That's the gap between "I connected Claude to my CRM" and "Claude runs my CRM operations for me." It's also the gap I'll cover in the next post.