Guide

How to Connect Claude to GoHighLevel

Step-by-step setup for Claude Desktop, Claude Code, and Cursor — connector URL, Private Integration Token, and the first API call.

Last updated

Two ways to connect, and how to pick

You connect Claude to GoHighLevel by adding an MCP server URL to Claude's configuration and authorizing it with a GoHighLevel credential. There are two servers you can point at, and the setup steps are nearly identical for both — what differs is the URL and the credential.

RouteURLCredentialBest for
HighLevel's own serverservices.leadconnectorhq.com/mcp/anthropic/v2OAuth sign-in, or a Private Integration TokenConversational CRM work across the broadest operation catalog
Hyloapi.hylo.pro/mcp/Hylo connector credentials, plus your GoHighLevel token stored onceWriting code against the API, and bulk imports

They are not exclusive — MCP clients hold several servers at once and Claude picks per request. If you are only deciding where to start, start with HighLevel's; the comparison page sets out where each is stronger.

Step 1: create a Private Integration Token

A Private Integration Token (PIT) is GoHighLevel's long-lived API credential for a single sub-account. Per HighLevel's MCP documentation, create one from Settings → Private Integrations inside the location you want to use, click Create New Integration, select the scopes, and copy the generated token. It begins with pit-.

Scopes are the security boundary, so choose deliberately. Read and write are separate scopes per resource, and a token can never exceed what you ticked at creation time. A reasonable starting set for conversational CRM use covers contacts, conversations and conversation messages, opportunities, calendars and calendar events, custom fields, and locations — add write scopes only for the resources you actually intend Claude to change.

If you would rather not handle a token at all, HighLevel's v2 endpoint supports a one-click OAuth sign-in through its consent flow, which is the recommended path in HighLevel's multi-account article. Skip ahead and let Claude trigger the sign-in.

One token, one sub-account

A PIT is bound to the location it was created in. Agencies working across many sub-accounts want the OAuth route, where multiple locations are authorized once and selected per conversation.

Step 2a: Claude Desktop and claude.ai

Both take a URL rather than a config file. Open Settings → Connectors → Add custom connector and paste the endpoint.

For HighLevel's server that is https://services.leadconnectorhq.com/mcp/anthropic/v2. With no credential in the URL, the connector prompts you through HighLevel's OAuth consent screen on first use, and you choose which sub-accounts to authorize there.

For Hylo, create a connector in the dashboard under Connect Claude and paste the URL it returns, which carries its credentials as query parameters:

Hylo connector URL

https://api.hylo.pro/mcp/?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET

GoHighLevel connections already stored in the Hylo dashboard work immediately, with no setup inside the chat. Per-client setup notes live on the docs page.

Step 2b: Claude Code

Claude Code adds HTTP MCP servers from the command line, which writes the configuration for you:

Add HighLevel's server to Claude Code

# OAuth — Claude Code walks you through the consent flow
claude mcp add --transport http leadconnector \
  https://services.leadconnectorhq.com/mcp/anthropic/v2

# Or with a Private Integration Token instead
claude mcp add --transport http leadconnector \
  https://services.leadconnectorhq.com/mcp/ \
  --header "Authorization: Bearer pit-your-token" \
  --header "locationId: your-location-id"

The committed equivalent — what a project's .mcp.json looks like — is the same shape HighLevel publishes:

.mcp.json

{
  "mcpServers": {
    "leadconnector": {
      "type": "http",
      "url": "https://services.leadconnectorhq.com/mcp/anthropic/v2"
    }
  }
}

Add Hylo alongside it the same way, using the API key from your dashboard:

Add Hylo to Claude Code

claude mcp add hylo -e HYLO_API_KEY=hylo_sk_your_key_here -- npx -y hylo-mcp

Step 2c: Cursor and Windsurf

Both read an mcpServers object — ~/.cursor/mcp.json for Cursor. HighLevel lists dedicated per-client v2 endpoints for Cursor and Windsurf as planned rather than available, so use the general endpoint with a Private Integration Token:

~/.cursor/mcp.json

{
  "mcpServers": {
    "leadconnector": {
      "url": "https://services.leadconnectorhq.com/mcp/",
      "headers": {
        "Authorization": "Bearer pit-your-token",
        "locationId": "your-location-id"
      }
    },
    "hylo": {
      "command": "npx",
      "args": ["-y", "hylo-mcp"],
      "env": {
        "HYLO_API_KEY": "hylo_sk_your_key_here"
      }
    }
  }
}

The locationId header is optional on HighLevel's server — you can instead name the location in conversation and let the tool ask. Restart the editor after editing the file; neither client reloads MCP configuration in place.

Step 3: confirm the connection works

Check the connection at the protocol level rather than by asking the assistant, because a model will happily describe a connection it does not have. A tools/list call returns exactly what your credential reaches:

Verify from the command line

curl -s -X POST https://services.leadconnectorhq.com/mcp/ \
  -H "Authorization: Bearer pit-your-token" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

A healthy response is a server-sent event stream whose data: line carries a JSON tool list. Omitting the Accept header is the most common cause of a confusing failure here; sending no Authorization header at all returns HTTP 401 with {"error":"invalid_token"}.

Then ask Claude something read-only and specific — “how many contacts were created in the last seven days?” — so that a wrong answer is obvious. Save the first write for something reversible, such as adding a tag.

Troubleshooting

SymptomUsual cause
HTTP 401, invalid_tokenNo Authorization header, or the token was revoked. Tokens are shown once at creation — regenerate rather than guess.
Claude sees the server but no toolsThe Accept header is missing on a manual call, or the client has not restarted since the config changed.
Reads work, writes are refusedThe token carries read scopes only. Write is a separate scope per resource; recreate the token with them ticked.
422 on a calendar querycalendars/get-calendar-events needs startTime and endTime as Unix epoch milliseconds, plus exactly one of calendarId, userId, or groupId.
The wrong sub-account was touchedThe locationId header or the location named in your prompt does not match the token's location. A token is bound to the location it was created in.
An endpoint responds, but your assistant calls it deprecatedSome endpoints are superseded and still answer. See the deprecated endpoints guide.

For the last row, the deprecated endpoints guide lists every endpoint GoHighLevel's specification currently marks as superseded, with the documented replacement for each.

Common questions

Do I need a paid plan to connect Claude to GoHighLevel?

HighLevel's MCP documentation does not state a plan requirement for its own MCP server; access follows your account and the scopes on your token. Third-party servers set their own terms — Hylo's connector requires a Pro subscription.

Where do I find my GoHighLevel location ID?

Open the sub-account in GoHighLevel and read it from the browser URL, which contains /location/<locationId>/. You can also let the assistant ask: on the official v2 endpoint the list_locations tool enumerates the sub-accounts your grant can reach.

Can Claude connect to more than one GoHighLevel sub-account?

Yes. HighLevel's v2 endpoint supports authorizing multiple sub-accounts during setup and switching between them inside a single conversation. A Private Integration Token is bound to the location it was created in, so multiple locations means multiple tokens or an OAuth grant.

Why can Claude read my contacts but not update them?

Almost always the token's scopes. A Private Integration Token carries only the scopes ticked when it was created, and read and write are separate scopes for every resource. Recreate the token with the write scopes you need.

Is it safe to give an AI assistant write access to my CRM?

Treat the token as the control. Scope it to the minimum the task needs, use a token bound to a single sub-account rather than an agency-wide grant while testing, and start read-only. The scopes on the grant, not the assistant's instructions, are what actually bound what it can do.