ghl-mcp-remote
ghl-mcp-remote
Servidor MCP (Model Context Protocol) remoto para GoHighLevel — multi-tenant, accesible vía URL, para ser usado desde Claude o ChatGPT por cualquier agencia, sin que cada una necesite ejecutar nada localmente.
Este es un proyecto separado del ghl-mcp original (stdio, uso personal/local). Ninguno de los dos depende del otro.
Diferencia con el ghl-mcp original
|
| |
Transporte | stdio (proceso local) | HTTP ( |
Tenants | 1 agencia por instalación, credenciales en | Cualquier número de agencias, aisladas por |
«Login» |
| Pantalla de autorización de la propia GHL, disparada por Claude/ChatGPT |
Uso | Tú, localmente | Cualquier empresa, desde Claude.ai/ChatGPT, vía URL |
El código de negocio (las tools en src/tools/) es prácticamente idéntico en los dos — solo cambia la capa de autenticación/almacenamiento.
Related MCP server: GoHighLevel MCP Server
Arquitectura
Claude/ChatGPT ──(1) descobre──> GET /.well-known/oauth-authorization-server
──(2) registra───> POST /register (DCR, automático)
──(3) pede login─> GET /authorize ──redirect──> tela da GHL (o "login")
<──redirect── GET /oauth/ghl/callback
<──code+state───── (nosso próprio código de autorização)
──(4) troca──────> POST /token ──> access_token + refresh_token nossos
──(5) chama tool─> POST /mcp (Authorization: Bearer <access_token>)«Login» = autorizar la GHL. No existe cuenta/contraseña propia de este servicio. Cuando el admin de una agencia aprueba el acceso en la pantalla de la propia GHL, eso ya crea/actualiza su tenant (identificado por el
companyIdde la GHL) y completa el login del lado del MCP.Una única app de GHL Marketplace (mismo
GHL_CLIENT_ID/GHL_CLIENT_SECRET) atiende a cualquier agencia que la instale — no hace falta crear una app por cliente.Cada llamada de tool llega autenticada con un Bearer token emitido por este servidor; el middleware resuelve ese token al
companyIdcorrecto e inyecta eso en unAsyncLocalStorage(src/tenant-context.ts) — así es como el código de las tools (idéntico al del proyecto original) permanece «sin saber» de multi-tenancy.Implementado sobre lo que el propio
@modelcontextprotocol/sdkya trae para servidores OAuth (server/auth/router.ts,provider.ts) — versrc/auth/mcp-oauth-provider.ts.
Requisitos previos para ejecutar en cualquier lugar
App OAuth en GHL Marketplace (Developer > tu app), distribución «Agency» o «Agency & Sub-Account»:
Redirect URI registrada:
<PUBLIC_URL>/oauth/ghl/callback(debe ser la URL pública final de este servicio — HTTPS).Scopes: los mismos listados en
src/services/scopes.ts.
Postgres (cualquiera — Supabase, Neon, RDS, el Postgres gestionado por la propia plataforma de hosting, etc.). Ejecutar
db/schema.sqlen él una vez.Node.js 20+ (o la imagen Docker de este proyecto, que ya lo incluye).
Variables de entorno
Ver .env.example. Resumen:
Variable | Descripción |
| De la app OAuth de GHL Marketplace |
| URL pública final de este servicio, sin barra al final |
| Puerto en el que escucha el proceso (muchas plataformas lo sobrescriben solas) |
| Connection string de Postgres |
| 32 bytes en base64 — |
Ejecutar localmente (dev)
npm install
npm run build
npm startVerificaciones posibles sin ningún dominio público:
curl localhost:8080/healthz
curl localhost:8080/.well-known/oauth-authorization-serverEl flujo completo de OAuth (autorizar de verdad en la GHL, obtener token, llamar a una tool) solo funciona con una PUBLIC_URL real (HTTPS) en el aire, porque la GHL necesita poder redirigir el navegador del admin de la agencia de vuelta hacia aquí — y esa misma URL debe estar registrada como redirect URI en la app de GHL.
Despliegue
Este proyecto no asume ninguna plataforma de hosting específica — solo incluye un Dockerfile genérico. Cualquier plataforma que ejecute una imagen Docker (o node dist/index.js directamente) sirve, siempre que:
Exponga una URL pública HTTPS estable → eso se convierte en
PUBLIC_URL.Inyecte las variables de entorno de la tabla anterior.
El Postgres apuntado por
DATABASE_URLya haya ejecutadodb/schema.sql.El redirect URI de la app de GHL Marketplace se actualice a
<PUBLIC_URL>/oauth/ghl/callbacken cuanto se conozca la URL final.
Conectar en Claude / ChatGPT
Una vez alojado:
Claude.ai / Claude Desktop: Configuración → Connectors → Add custom connector → URL:
https://<seu-dominio>/mcp. Claude te llevará al flujo de autorización automáticamente.ChatGPT: en workspaces con soporte para Connectors/MCP remoto (varía según el plan — Team, Enterprise, o «Developer mode»), añadir un connector apuntando a
https://<seu-dominio>/mcp.
Advertencia sobre ChatGPT: el soporte para conectores MCP remotos con OAuth en ChatGPT varía según el plan/workspace, y algunas superficies (p. ej. Deep Research) restringen qué formatos de tool aceptan (a veces solo tools en formato «search»/«fetch»). Este servidor sigue la spec de autorización del MCP al pie de la letra (la misma que usa Claude), lo que maximiza la compatibilidad — pero vale la pena probarlo de verdad una vez esté alojado, ya que el comportamiento del lado de ChatGPT escapa a nuestro control.
Estructura
src/
index.ts App Express: monta o router de OAuth, POST/GET/DELETE /mcp,
GET /oauth/ghl/callback, GET /healthz, CORS.
server.ts createMcpServer() — registra as tools (idêntico ao projeto original).
tenant-context.ts AsyncLocalStorage que carrega o companyId durante cada request.
db/
pool.ts Pool do `pg` a partir de DATABASE_URL.
crypto.ts AES-256-GCM (tokens da GHL em repouso) + SHA-256 (hash dos nossos tokens).
agencies.ts Tokens de agência da GHL por companyId (substitui o antigo token-store.ts).
oauth-store.ts Clients MCP, pending auth, authorization codes, access/refresh tokens.
auth/
ghl-oauth.ts Troca/refresh de tokens com a GHL — equivalente ao oauth-flow.ts original,
mas web-based e por tenant em vez de CLI + arquivo único.
location-tokens.ts Cache de location tokens, agora chaveado por companyId.
mcp-oauth-provider.ts Implementa OAuthServerProvider do SDK — o núcleo do "login = autorizar a GHL".
ghl-callback.ts Handler de GET /oauth/ghl/callback.
services/
constants.ts, scopes.ts, ghl-client.ts Idênticos ao projeto original (só o import de token mudou).
tools/
*.ts Idênticos ao projeto original, exceto locations.ts (cache agora por tenant).
db/
schema.sql DDL do Postgres — rodar uma vez antes do primeiro start.Seguridad
Refresh tokens de la GHL: cifrados en reposo (AES-256-GCM).
Access/refresh tokens que este servidor emite para Claude/ChatGPT: guardados solo como hash SHA-256 — nunca en texto plano, igual que una contraseña.
PKCE (S256) obligatorio en todo el flujo MCP-side, validado localmente (no delegado a la GHL).
Ninguna credencial de una agencia es accesible desde el token de otra — todo acceso a Postgres está filtrado por
companyId, y ese valor solo entra en escena después de que el Bearer token es validado.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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
- AlicenseBqualityDmaintenanceA Model Context Protocol (MCP) server that provides tools for managing GoHighLevel (GHL) conversations, tasks, and calendar appointments through AI assistants like Claude.2135MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for GoHighLevel sub-accounts, enabling management of CRM contacts, pipelines, calendars, invoices, and more via natural language.
- AlicenseCqualityAmaintenanceA Model Context Protocol (MCP) server for GoHighLevel API v2 — giving any AI agent full access to your GHL location.1001935MIT
Related MCP Connectors
Hosted Amazon Seller Central and Amazon Ads MCP server for Claude, ChatGPT, Cursor, and agents.
Hosted Amazon Seller and Vendor MCP server for Claude, ChatGPT, Cursor, Codex, Gemini, Copilot.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jamersoncalixto/ghl-mcp-remote'
If you have feedback or need assistance with the MCP directory API, please join our Discord server