ghl-pro-mcp
Le das una orden en tu idioma y te monta el embudo entero dentro de GoHighLevel.
«Quiero un embudo para mi clínica de mascotas, y que agende citas»
A partir de ahí, el asistente pregunta lo que le falta —no inventa nada—, investiga el mercado de tu zona, y despliega en tu cuenta: etiquetas, campos personalizados, pipeline con sus etapas, landing con formulario real y el workflow de respuesta y seguimiento. Todo queda en borrador, y se puede deshacer de una pieza.
Esto es un servidor MCP local: funciona con Claude Code, Claude Desktop, Codex, Cursor, Cline, Windsurf o VS Code. Corre en tu ordenador — tus credenciales y los datos de tu CRM no pasan por ningún servidor intermedio.
Por qué este y no otro
| MCP oficial de GHL | Este | |
|---|---|---|
| Leer workflows | Sí | Sí |
| Crear y guardar workflows | No | Sí |
| Crear embudos | No | Sí |
| Guardar y publicar páginas | No | Sí |
| Crear y editar surveys | No | Sí |
| Operaciones de la API pública disponibles | 548 | 548 |
No es una opinión: la API pública de GoHighLevel solo permite leer workflows, embudos, páginas y surveys. Es un muro de su API, no de su configuración. Cualquier integración que se apoye solo en la API pública se queda fuera de ahí — y ahí es donde está el trabajo.
Este servidor usa además la vía de sesión para esas cuatro cosas, que es lo que le deja montar el embudo completo en lugar de limitarse a consultarlo.
El flujo, de principio a fin
«quiero un embudo para mi clínica de mascotas»
│
├─ nuevo_proyecto ──────► crea el brief y devuelve las preguntas
│
├─ responder_brief ─────► se contestan (el asistente pregunta lo que falta)
│
├─ guia_de_investigacion ► qué hay que averiguar del mercado de esa zona
├─ guardar_investigacion ► 3-5 competidores y las palabras que usa su cliente
│
├─ ver_plan_despliegue ──► enseña qué va a crear y qué falta
│
├─ desplegar_plan ───────► LO CREA TODO, en borrador
│
└─ ver_manifiesto ───────► qué se creó, para poder deshacerlo
deshacer_plan ─────► borra lo que creó, y dice lo que no pudo
El brief manda. Sin las respuestas críticas —sector, objetivo, oferta, zona, quién atiende y qué es un buen lead— el despliegue no se ejecuta. Y sin la investigación del mercado tampoco: sin las palabras que usa tu cliente, la landing sale con los tópicos del sector, igual que la de cualquier competidor.
Qué crea el despliegue
- Etiquetas de segmentación, según lo que el negocio necesite
- Campos personalizados — los que tú digas: la fecha de la última visita, la talla, lo que haga falta para el seguimiento. Sin esto no hay recordatorio del próximo servicio, que es la táctica que más dinero devuelve cuando se vende varias veces al mismo cliente
- Pipeline con etapas derivadas del objetivo (no las mismas cinco para todos)
- Landing con formulario nativo de GoHighLevel — se comprueba que capte de verdad
- Workflow: crea la oportunidad en el pipeline, responde al cliente por el canal que tenga, avisa al negocio, espera un día y deja una tarea de repaso
Nada se publica. Los workflows quedan en borrador y la landing sin publicar: publicar es tu decisión.
Nada se duplica. Si despliegas dos veces, reutiliza lo que se llame igual y te dice qué revisar. Y lo que ya tenías no se apunta en el manifiesto, así que deshacer no te borra algo tuyo.
Requisitos
- uv (recomendado), o Python 3.10 o superior.
- Una Private Integration Token de GoHighLevel, creada dentro de la subcuenta que quieras conectar y con los scopes que necesites.
Instalación
No hay que instalar nada a mano. Con uv en el equipo, el cliente MCP se lo baja de
PyPI la primera vez que lo usa:
{
"mcpServers": {
"ghl-pro": {
"command": "uvx",
"args": ["ghl-pro-mcp@latest"],
"env": { "GHL_ENABLE_SESSION": "1" }
}
}
}
Es el equivalente a npx. El @latest comprueba si hay versión nueva cada vez, así que
los arreglos llegan solos.
Los comandos de terminal
El cliente se lo baja solo con uvx, así que no hace falta instalar nada — pero los
comandos de configuración y diagnóstico (setup, doctor) se lanzan igual, con uvx
delante:
uvx ghl-pro-mcp@latest --version # comprobar que arranca
uvx ghl-pro-mcp@latest setup # configurar
uvx ghl-pro-mcp@latest doctor # comprobar contra tu GoHighLevel
Si lo instalas como herramienta (
uv tool install ghl-pro-mcp), eluvxsobra y los comandos quedan comoghl-pro-mcp setupyghl-pro-mcp doctor. Las dos vías valen;uvxno deja nada instalado.
Funciona igual en Windows, macOS y Linux.
Configuración
Un solo comando:
uvx ghl-pro-mcp@latest setup
Te pide el token privado y el Location ID —y te confirma el nombre de la subcuenta antes de guardar nada—, y después te ofrece configurar workflows y embudos: con la extensión de Chrome, a mano, o dejarlo para más tarde.
Hazlo en una terminal, nunca desde el chat de la IA. Lo que se escribe en la conversación acaba en el historial, y el token privado da acceso completo al CRM.
Las credenciales quedan en un único archivo, en tu carpeta de usuario:
| Sistema | Ruta |
|---|---|
| Windows | %LOCALAPPDATA%\ghl-pro-mcp\credentials.env |
| macOS | ~/Library/Application Support/ghl-pro-mcp/credentials.env |
| Linux | ~/.config/ghl-pro-mcp/credentials.env |
Si prefieres decidir tú la ubicación, define GHL_PRO_ENV_PATH y el asistente escribirá
ahí: respeta esa variable, igual que el servidor al leer.
Añádelo a tu cliente
Al terminar, setup te muestra el bloque exacto que necesitas. Es el de arriba.
GHL_ENABLE_SESSION enciende workflows, embudos y páginas. Sin esa línea tendrás las
548 operaciones de la API pública, pero no el extra — y ese extra es la diferencia.
Reinicia tu cliente de IA después de añadirlo.
| Cliente | Dónde va |
|---|---|
| Claude Code | .mcp.json en la raíz de tu proyecto |
| Claude Desktop | %APPDATA%\Claude\claude_desktop_config.json (Windows) · ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) · ~/.config/Claude/claude_desktop_config.json (Linux) |
| Cursor, Cline, Windsurf | Su propio archivo de configuración de MCP |
Hace falta
uv:winget install astral-sh.uv, ocurl -LsSf https://astral.sh/uv/install.sh | sh.
Comprobar que funciona
uvx ghl-pro-mcp@latest doctor
Comprueba la configuración contra tu GoHighLevel real y te dice, una a una, qué funciona y qué no. No modifica nada salvo que se lo pidas expresamente. Y si quieres llegar más lejos, tiene dos banderas que sí escriben, pero que dejan todo como estaba:
uvx ghl-pro-mcp@latest doctor --escritura # crea un workflow de prueba y LO BORRA
uvx ghl-pro-mcp@latest doctor --pagina <pageId> # guarda esa página sin cambiarla
Las 70 herramientas
El flujo — de la orden al embudo montado
| Herramienta | Qué hace |
|---|---|
nuevo_proyecto |
Empieza: crea el brief y devuelve las preguntas que hay que hacer |
responder_brief |
Guarda las respuestas (fusiona, nunca borra lo ya contestado) |
ver_brief |
Cómo va, qué falta, y cuál es el siguiente paso |
listar_proyectos |
Los proyectos empezados y a cuáles les falta información |
guia_de_investigacion |
Qué hay que averiguar del mercado de esa zona, y por qué |
guardar_investigacion |
Guarda competidores, palabras del cliente, objeciones y precios |
ver_plan_despliegue |
Qué va a crear, en qué orden y qué falta |
desplegar_plan |
Lo crea todo, en borrador |
ver_manifiesto |
Qué se creó y con qué id |
deshacer_plan |
Borra lo que creó, y dice lo que no se pudo borrar |
Cuenta y conocimiento
| Herramienta | Qué hace |
|---|---|
get_account_context |
Subcuenta, pipelines con etapas, calendarios y usuarios |
list_playbooks |
Índice de los 20 documentos de conocimiento |
get_playbook |
Devuelve un documento entero, o una sección suya |
Workflows — el foso
| Herramienta | Qué hace |
|---|---|
catalogo_acciones |
Qué acciones puede tener un workflow |
listar_workflows · ver_workflow |
Listar y leer, con sus nodos |
ver_triggers |
Los disparadores de un workflow, con sus filtros |
crear_workflow · guardar_workflow |
Crear y guardar las acciones |
crear_trigger |
Crear un disparador |
publicar_workflow · despublicar_workflow |
Encender y apagar |
borrar_workflow · borrar_workflows_por_nombre |
Borrar |
Embudos y páginas — el foso
| Herramienta | Qué hace |
|---|---|
listar_embudos · ver_pagina |
Listar y leer |
crear_embudo · crear_paso |
Crear la estructura |
guardar_pagina |
Guardar el contenido de una página |
generar_landing_con_ia |
Pedirle la landing a la IA de GoHighLevel, con tu copy |
ver_landing |
Devuelve una FOTO de la página, para que el modelo la mire |
insertar_survey_en_pagina |
Meter una encuesta dentro de la página |
publicar_pagina |
Publicar (necesita dominio) |
ver_landing es la que cambia el trabajo. El contenido de una página dice qué elementos
hay, no cómo quedan: un texto gris sobre fondo oscuro está perfecto en el dato y es
ilegible en la pantalla. Con la foto, el modelo lo ve y lo corrige.
El sistema experto de diseño
Cuando le pides una landing a la IA de GoHighLevel, no va sola: el prompt llega con la identidad visual del negocio ya resuelta.
El negocio → una de 13 FAMILIAS estéticas → su PALETA, con los hex
→ la ESTRUCTURA de secciones
→ las reglas de composición y copy
Clasifica por familia estética, no por sector — por eso vale para cualquier negocio: la misma paleta sirve para una veterinaria y para un fisioterapeuta. Y si el negocio no encaja en ninguna, usa una genérica limpia que no desentona.
Verificado contra GoHighLevel real: una clínica veterinaria salió con el fondo crema
#FAFAF7 y el botón verde salvia #7C9082 — la paleta que le tocaba, con el color
apareciendo 50 veces en la página — y con el nombre correcto.
Y si la familia no le pega, se cambia con una palabra: familia_diseno. El clasificador
acierta casi siempre, pero no es infalible — una palabra larga y genérica puede ganar a la
del sector. Eso está documentado en vez de escondido.
Y ojo con los estilos. Los genera el editor de GoHighLevel, no la API. Si cambias
textos, precios o imágenes, la página sigue perfecta (el CSS viaja con el contenido). Si
cambias colores o tamaños por API, el CSS se queda describiendo el estilo viejo y la
página sale plana. Detalle en docs/paginas-css.md.
Surveys — el foso
Un formulario recoge datos; un survey califica. El que no encaja se descarta solo, y el que llega a la llamada ya viene caliente y con sus respuestas escritas. La API pública solo puede leer surveys, así que esto tampoco está en el MCP oficial.
| Herramienta | Qué hace |
|---|---|
crear_survey |
Todo en un paso: los campos, las preguntas, los descartes y los textos finales |
listar_surveys · ver_survey |
Listar, leer, y decir qué tiene mal |
guardar_survey |
Guardar uno ya editado — se niega si perdería preguntas o textos |
respuestas_de_survey |
Las respuestas, por contacto y por pregunta |
borrar_survey |
Borrar (pide confirmación: se lleva también las respuestas) |
Se diseña así, y no es adorno: una pregunta por pantalla (diez juntas no las contesta nadie), la primera fácil, los descartes repartidos —tres seguidos parecen un interrogatorio— y una pregunta abierta, penúltima y sin obligar: es la que dice qué quiere aprender el lead, con sus palabras.
Contactos, CRM y agenda
| Herramienta | Qué hace |
|---|---|
search_contacts · create_contact |
Buscar y crear contactos |
list_tags · ensure_tags |
Etiquetas: listar y crear solo las que falten |
list_pipelines · ver_pipeline · crear_pipeline · borrar_pipeline |
Pipelines |
ver_etapas_del_pipeline |
Las etapas, en orden |
crear_oportunidad · mover_oportunidad · buscar_oportunidades |
El lead en el tablero |
listar_calendarios · ver_huecos_libres · agendar_cita · ver_citas_de_contacto |
Calendario y citas |
listar_campos_personalizados · crear_campos_personalizados |
Los campos del seguimiento |
Mensajes y archivos
| Herramienta | Qué hace |
|---|---|
enviar_email · enviar_sms |
Enviar, pasando antes por el checklist de copy |
estado_de_email |
Comprobar si llegó |
listar_archivos · subir_archivo · borrar_archivo |
Archivos |
listar_caller_ids |
Números verificados |
El resto del catálogo
| Herramienta | Qué hace |
|---|---|
estado_catalogo |
Cuántas operaciones hay y de qué dominios |
buscar_operaciones · describir_operacion · llamar_operacion |
Cualquiera de las 548 operaciones de la API pública |
estado_sesion |
Si la vía de sesión está encendida |
Las escrituras empiezan en seco
Ninguna herramienta escribe a la primera. Unas usan dry_run=true —la primera llamada
enseña lo que haría y no crea nada— y otras usan confirmar=true. En cualquiera de los dos
casos, nada se crea ni se envía sin que lo hayas pedido expresamente.
Y hay reglas que están en el código, no en un documento:
- El copy se revisa antes de enviar o guardar. Un SMS con un hueco sin rellenar, o con urgencia inventada, no sale.
- No se manda SMS sin que lo hayas elegido. Cuesta dinero por mensaje y exige consentimiento.
- Los workflows nacen en borrador y la landing sin publicar.
Lo que todavía NO hace
Preferimos decirlo:
- Recordatorio de cita, petición de reseña y reactivación. El plan monta la respuesta inmediata y el seguimiento; esas tres necesitan disparadores de cita o de tiempo que la API no tiene verificados, y un disparador inventado falla en silencio.
- WhatsApp. Fuera de las 24 horas siguientes al último mensaje del cliente, WhatsApp solo admite plantillas aprobadas por Meta. No se pueden inventar.
- El filtro del disparador por formulario. Se crea sin filtro y el asistente te avisa: hay que ponerlo a mano en la interfaz si la cuenta tiene más de un formulario.
- Publicar una página necesita un dominio en la cuenta.
- Meter un survey dentro de una página del embudo. El survey se crea entero y funciona
solo (tiene su propia URL), pero incrustarlo en una página de GoHighLevel todavía se hace
a mano en el editor. El elemento nativo existe (
c-survey); lo que falta es la herramienta.
Dónde se guarda cada cosa
| Qué | Dónde |
|---|---|
| El programa | Dentro del paquete instalado (solo lectura) |
| Tus preferencias, briefs y manifiestos | Directorio de configuración del sistema |
| Tus credenciales | Donde tú decidas, vía GHL_PRO_ENV_PATH |
| Sistema | Preferencias |
|---|---|
| Windows | %LOCALAPPDATA%\ghl-pro-mcp |
| macOS | ~/Library/Application Support/ghl-pro-mcp |
| Linux | ~/.config/ghl-pro-mcp |
Diagnóstico
El servidor nunca escribe en stdout salvo el protocolo: todos los logs van a
stderr. Si algo falla, sube el detalle con:
GHL_PRO_LOG_LEVEL=DEBUG uvx ghl-pro-mcp
Errores frecuentes:
| Síntoma | Causa |
|---|---|
| «Falta configuración: GHL_PRIVATE_TOKEN» | No definiste la variable o el archivo |
| «GHL_PRO_ENV_PATH apunta a un archivo que no existe» | Ruta mal escrita |
| 401 al llamar | El token caducó o se revocó |
| 403 al llamar | Al token le falta el scope de esa operación |
| Faltan datos del catálogo | El paquete se instaló sin la carpeta data/ |
Licencia
Propietaria. Ver el paquete en PyPI.
Metadata
Release files for ghl-pro-mcp 0.1.19
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ghl_pro_mcp-0.1.19.tar.gz | 682.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ghl_pro_mcp-0.1.19-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 1.2 MB
Release files / ghl_pro_mcp-0.1.19.tar.gz
| Download URL | ghl_pro_mcp-0.1.19.tar.gz |
|---|---|
| Size | 682.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b9683174098cd496a21a2fdb66698f3c05c3528c24f8e4084f0b33bd88f847f6
|
|
BLAKE2b-256 checksum How to use checksums |
57cab8875aa71c958559e9f891c55a204a0f735aef0c20cad99455f7f00e64ed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / ghl_pro_mcp-0.1.19-py3-none-any.whl
| Download URL | ghl_pro_mcp-0.1.19-py3-none-any.whl |
|---|---|
| Size | 470.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c251bf690ace4038dabcbcb12ecaa7a811525c43aadef5d333290a4e38d0ffc8
|
|
BLAKE2b-256 checksum How to use checksums |
e873cda23a97bc1cc677c7d045f80ffdc77396d1988b381f49152793a1e09350
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|