Uxie Ghl
БесплатноНе проверенMCP server for the entire GoHighLevel API — all 413 endpoints across 35 categories
Описание
MCP server for the entire GoHighLevel API — all 413 endpoints across 35 categories
README
MCP server for the entire GoHighLevel API — all 1207 endpoints across 83 categories (GHL API v2 + v3).
The official GHL MCP server only covers 36 tools across 9 categories. This one covers everything.
API v3 support (since 2026-07-11): GHL published its API v3 spec set on 2026-06-19 as a parallel surface — same host, selected per request via the Version: v3 header. The catalog carries both: categories ending in -v3 (e.g. opportunities-v3) are the current v3 API, and the unsuffixed twins are the legacy v2 specs kept for compatibility. This includes the long-requested pipeline create/update/delete endpoints (added by GHL on 2026-06-26), plus the new chat-widget category, calendar service bookings, location-scoped email campaigns/templates, social-planner category queues, and brand voices. See docs/api-v3/ for the full story.
How it works
Instead of registering 1207 individual tools (which would flood the LLM's context window), this server uses a search + execute pattern:
| Tool | What it does |
|---|---|
list_categories |
Browse all 83 API categories with action counts |
search_actions |
Find actions by natural language, or enumerate every action in one category with include_all=true |
execute_action |
Run any action by ID with params, preview writes with dry_run, confirm high-risk actions, and shape responses via result_filter, result_fields, result_offset, and result_limit |
Your MCP client searches for what it needs, gets the action ID and parameter schema, then executes it. Works for all 1207 endpoints with just 3 tools.
This server is tuned for LLM usage:
search_actionssurfaces known GHL public-API gaps directly so the model does not keep searching for UI-only features.execute_actionpasses through undocumented but valid body keys to GHL so spec mismatches do not block working requests.execute_actionreturns structured MCP output and requires confirmation for high-risk sends, deletes, publishes, cancels, and billing/payment actions.result_filtersearches nested strings inside arrays and objects, which makes tags and similar fields much easier to work with.
Categories covered
v2 (legacy): ad-manager, affiliate-manager, agent-studio, associations, blogs, brand-boards, businesses, calendars, campaigns, companies, contacts, conversation-ai, conversations, courses, custom-fields, custom-menus, email-isv, emails, forms, funnels, invoices, knowledge-base, links, locations, marketplace, medias, oauth, objects, opportunities, payments, phone-system, products, proposals, saas-api, snapshots, social-media-posting, store, surveys, users, voice-ai, workflows
v3 (current): the same domains as -v3 categories (e.g. contacts-v3, opportunities-v3), with ad-publishing-v3, social-planner-v3, and saas-v3 replacing ad-manager, social-media-posting, and saas-api, plus the new chat-widget-v3.
Setup
Option A: Remote (Cloudflare Workers)
No installation needed.
Add it to Claude Code:
claude mcp add uxie-ghl-mcp --transport http https://ghl-mcp-server.xanderjohnrazonroque.workers.dev/mcp --header "X-GHL-Token: pit-YOUR-TOKEN-HERE"
Add it to Codex CLI:
codex mcp add uxie-ghl-mcp --url https://ghl-mcp-server.xanderjohnrazonroque.workers.dev/mcp --bearer-token-env-var GHL_API_TOKEN
codex mcp add writes to Codex's global config. If you want Codex to load this MCP only inside one local project, add a .codex/config.toml file in that project instead:
[mcp_servers.uxie_ghl]
url = "https://ghl-mcp-server.xanderjohnrazonroque.workers.dev/mcp"
bearer_token_env_var = "GHL_API_TOKEN"
Then set your token in the shell before starting Codex:
export GHL_API_TOKEN=pit-YOUR-TOKEN-HERE
This is project-local. Codex will load this MCP only in the local repo that contains that .codex/config.toml file. GHL_API_TOKEN must already exist in the environment when the Codex session starts; if you add or change it later, start a fresh Codex session.
If you want that project-local setup to feel automatic, pair it with direnv:
brew install direnv
Add a repo-local .envrc:
export GHL_API_TOKEN='pit-YOUR-TOKEN-HERE'
Then allow it once:
direnv allow .
Recommended pattern:
- Keep
.codex/config.tomlin the project root so Codex loads the MCP only for that repo. - Keep the token in a repo-local
.envrcso entering the repo loadsGHL_API_TOKEN. - Add
.envrcto.gitignoreif you are storing a real token there.
Important parent/child folder behavior:
- Parent folders do not inherit a child's
.envrc. - Child folders do inherit env vars from parent
.envrcfiles. - If a child folder has its own
.envrc, do not rely on implicit merging with the parent. - If the child defines
GHL_API_TOKEN, that child value wins for that child context. - A child
.envrcdoes not change the parent folder's environment.
If you want a child .envrc to extend the parent instead of replacing it, source the parent explicitly:
source_up
export SOME_OTHER_VAR='value'
Two practical gotchas:
- After editing
.envrc, rundirenv allow .again. AGENTS.mdcan tell Codex to prefer this MCP, but it does not load the MCP by itself. The MCP still needs.codex/config.tomlplusGHL_API_TOKENpresent when the Codex session starts.
Add it to opencode:
opencode is config-file based (there is no opencode mcp add command). Add the server under the mcp key in your opencode.json — either global at ~/.config/opencode/opencode.json or project-local in the repo root:
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"uxie-ghl": {
"type": "remote",
"url": "https://ghl-mcp-server.xanderjohnrazonroque.workers.dev/mcp",
"enabled": true,
"oauth": false,
"headers": {
"X-GHL-Token": "{env:GHL_API_TOKEN}"
}
}
}
}
oauth: false is required: opencode tries OAuth on remote servers by default, but this Worker is a BYO-token proxy, not an OAuth resource server. The {env:GHL_API_TOKEN} placeholder pulls the token from your environment, so set it before launching opencode (or hardcode the pit-... value directly in the header):
export GHL_API_TOKEN=pit-YOUR-TOKEN-HERE
Authorization: Bearer {env:GHL_API_TOKEN} works too — the Worker accepts either header.
For Claude Desktop / Claude.ai: Settings → Connectors → Add custom connector → paste the URL.
Each user passes their own GHL Private Integration Token via the X-GHL-Token header or Authorization: Bearer <token>. The Worker forwards that token to GHL for the current MCP request/session and does not persist it in Durable Object storage.
Production/security note
The remote Worker is currently a BYO GHL token MCP proxy. It validates that callers provide a GHL Private Integration Token, forwards requests to the public GHL API, and does not implement first-party MCP OAuth/resource-server authorization yet. For higher-trust production use, put this behind real MCP OAuth/resource-server auth and issue scoped user/session credentials instead of accepting raw PITs directly from clients.
Option B: Local (stdio)
Run on your machine — your token never leaves your device.
git clone https://github.com/uxieee/uxie-ghl-mcp-server.git
cd uxie-ghl-mcp-server
npm install
Then add to Claude Code:
claude mcp add uxie-ghl-mcp -e GHL_API_TOKEN=pit-YOUR-TOKEN-HERE -- npx tsx src/stdio.ts
Or add to Codex CLI:
codex mcp add uxie-ghl-mcp --env GHL_API_TOKEN=pit-YOUR-TOKEN-HERE -- npx tsx src/stdio.ts
Or add to opencode (opencode.json, run from the cloned repo so the relative path resolves):
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"uxie-ghl": {
"type": "local",
"command": ["npx", "tsx", "src/stdio.ts"],
"enabled": true,
"environment": {
"GHL_API_TOKEN": "pit-YOUR-TOKEN-HERE"
}
}
}
}
Getting your GHL token
- Log into GoHighLevel
- Go to Settings → Private Integrations
- Create a new Private Integration Token (PIT)
- Enable the scopes you need (contacts, calendars, conversations, etc.)
- Copy the token — it starts with
pit-
Usage examples
Once connected, just ask Claude, Codex, or opencode naturally:
- "List all my GHL contacts"
- "Create a new contact named John Doe with email [email protected]"
- "Show me all pipelines and opportunities"
- "Send an SMS to contact ID abc123"
- "List all invoices from this month"
- "Get my calendar events for today"
Your MCP client will automatically search for the right action, get the parameters, and execute it.
If you need every action inside a category instead of ranked matches, use search_actions with category plus include_all=true.
Known Public-API Gaps
These are GHL platform limitations, not bugs in this MCP server. The server now tries to surface them explicitly in search results and action notes so an LLM can stop early instead of repeatedly hunting for endpoints that do not exist.
- Workflow internals:
workflows__get-workflowis a minimal read-only list. Workflow triggers, steps, conditions, and AI-agent usage remain UI-only. - Pipelines and stages:
opportunities__get-pipelinesis read-only. Creating or editing pipeline containers and stages still has to be done in the GHL UI. - SMS/email template creation: the public API can list or delete templates, but template creation is still UI-only.
- Contact/opportunity custom-field folders: folder containers must be created in the GHL UI. Once a folder exists, fields can be assigned or moved with
parentIdonlocations__create-custom-fieldandlocations__update-custom-field. - Sub-account security settings: sender domains, A2P registration, and webhook signing keys are UI-only.
Helpful Usage Notes
- Conversation history for a contact: use
conversations__search-conversationto find the thread, thenconversations__get-messageswith the returnedconversationId. - Custom-field option lists: for location custom-field create/update, use
options: ["A", "B"]for SINGLE_OPTIONS, MULTIPLE_OPTIONS, RADIO, and CHECKBOX fields. The upstream OpenAPI spec may still mentiontextBoxListOptions, but GHL validatesoptions. - Commerce setup: use GHL's
products__*andpayments__*endpoints as the source of truth. Stripe IDs may appear in payloads, but direct Stripe API access is usually not needed for normal GHL sub-account setup. - Full category enumeration: if ranked search is too narrow, call
search_actionswithcategoryplusinclude_all=trueto page through every action in that category.
Self-hosting
Want to deploy your own instance? Fork this repo and:
npm install
npx wrangler deploy
You'll need a Cloudflare account (free tier is enough — 100k requests/day).
Update account_id in wrangler.jsonc to your own Cloudflare account ID.
Updating the API catalog
When GHL adds new API endpoints:
npm run build-catalog # Downloads latest OpenAPI specs from GHL's GitHub (raw CDN, no API rate limit)
npx wrangler deploy # Redeploy with updated catalog
The build is configurable via environment variables:
| Env var | Default | Purpose |
|---|---|---|
GHL_DOCS_REF |
main |
Branch/ref of highlevel-api-docs to build from. Point it at a preview branch to adopt new specs early, e.g. GHL_DOCS_REF=latest_specs_sync npm run build-catalog. |
GHL_DOCS_REPO |
GoHighLevel/highlevel-api-docs |
Source repo (use a fork if needed). |
GHL_BASE_URL |
https://services.leadconnectorhq.com |
API host baked into the catalog and used by the executor. |
API versioning & v3 readiness
The GHL API is currently v2 (host services.leadconnectorhq.com, date version headers 2021-07-28 / 2021-04-15). HighLevel is rolling out a breaking v3 revision (camelCase params, kebab-case paths, required Version headers, new *V3 schemas, location-scoped paths), but as of 2026-06-14 v3 is not yet in the public OpenAPI specs this catalog builds from. The server is built to adopt v3 with a single npm run build-catalog once GHL publishes it.
See docs/api-v3/ for the full audit, the per-domain v3 change breakdown, and the migration playbook.
Architecture
Claude / Codex / opencode ──MCP──► Cloudflare Worker ──HTTPS──► GHL API
│
├── search_actions (keyword search over 1207-action catalog)
├── execute_action (builds HTTP request, calls GHL, returns response)
└── list_categories (browse available categories)
- Catalog: Auto-generated from GHL's official OpenAPI specs (1207 actions across 83 categories: v2 specs in apps/ plus the v3 specs GHL published to apps/v3/ on 2026-06-19)
- Catalog overrides: Runtime patches correct a few high-value spec mismatches such as
parentId/optionson location custom fields - Search: Pre-computed keyword index built at startup
- Auth: Per-user tokens via
X-GHL-TokenorAuthorization: Bearer <token>(remote), orGHL_API_TOKENenv var (local) - Rate limiting: 60 execute calls per minute per session
- Error handling: GHL errors sanitized before returning to LLM
- Security: SSRF protection, body size limits, input validation, method allowlisting
Security
- No tokens stored server-side — each user provides their own
- GHL error responses are sanitized (no internal details leaked)
- Request body size capped at 1MB
- HTTP methods allowlisted (GET, POST, PUT, PATCH, DELETE only)
- SSRF protection on catalog paths
- Rate limited to prevent API abuse
- 15-second timeout on all outbound requests
Project structure
src/
index.ts Cloudflare Worker entry point (remote HTTP)
stdio.ts Local stdio entry point
tools.ts Shared tool registration (search, execute, list)
catalog-overrides.ts Runtime fixes for known OpenAPI/catalog mismatches
executor.ts HTTP request builder + GHL API caller
search.ts Pre-computed keyword search index
rate-limiter.ts Fixed-window rate limiter
types.ts TypeScript types
scripts/
build-catalog.ts Downloads GHL OpenAPI specs → catalog.json
test-all-endpoints.ts Full endpoint test suite
data/
catalog.json Auto-generated action catalog (1207 actions)
tests/
ghl-mcp-server.test.ts Regression tests for MCP behavior and LLM-facing guidance
License
MIT
Установка Uxie Ghl
У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.
▸ github.com/uxieee/uxie-ghl-mcp-serverFAQ
Uxie Ghl MCP бесплатный?
Да, Uxie Ghl MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для Uxie Ghl?
Нет, Uxie Ghl работает без API-ключей и переменных окружения.
Uxie Ghl — hosted или self-hosted?
Self-hosted: сервер запускается локально на твоей машине командой из раздела установки.
Как установить Uxie Ghl в Claude Desktop, Claude Code или Cursor?
Открой Uxie Ghl на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
GitHub
PRs, issues, code search, CI status
автор: GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
автор: mcpdotdirectCompare Uxie Ghl with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории development
