ghl-context-mcp
ghl-context-mcp
Сознательно маленький MCP-сервер GoHighLevel. Шесть инструментов, ограниченных одной задачей: понимать, с кем вы собираетесь говорить.
Зачем он нужен
Типичный сценарий отказа, когда агента ставят поверх CRM, — это широкая обобщённая инструментальная поверхность, которая сбрасывает сырой JSON из API: модель выбирает не тот инструмент, сжигает своё окно контекста на полях, которые никто никогда не произнесёт вслух, и иногда выдумывает или перезаписывает запись. Этот сервер делает противоположную ставку. Он поставляет шесть инструментов, каждый из которых привязан к моменту, когда агент собирается поговорить с контактом. Каждое возвращаемое поле — это то, что человек мог бы сказать, или то, что агент передаёт дальше при следующем вызове. Сервер сам занимается вычислением дат и не выполняет записи, пока вы их не включите. Утверждение, что узкая поверхность лучше широкой, измеримо, и сопутствующий бенчмарк (mcp-tool-surface-bench) создаётся для того, чтобы это измерить.
Related MCP server: GHL MCP Server
Инструменты
Инструмент | Что делает | Тип | Потолок |
| Находит имя, телефон или email до единственного контакта либо возвращает кандидатов | чтение | 400 |
| Последние звонки, SMS, заметки, встречи и изменения этапов связным текстом с заголовком | чтение | 1200 |
| Где находится каждая сделка, сколько дней в этапе, стоимость и не застряла ли она | чтение | 500 |
| Предстоящие встречи по контакту или календарю с относительным временем | чтение | 900 |
| Записать заметку с идемпотентностью, безопасной для повторов, и эхом того, что сохранено | запись | 200 |
| Переместить сделку на другой этап, с защитой от устаревшего контекста | запись | 250 |
Потолки — это бюджеты токенов на ответ, контролируемые тестом, который валит сборку, когда ответ вырастает за их пределы. См. DESIGN.md о том, что здесь означает «токен».
Использование
Это MCP-сервер, и его целевой пользователь — агент ИИ, а не человек за терминалом. Вы подключаете сервер к своему агенту (Claude Code, Claude Desktop или любой среде, поддерживающей MCP), а затем общаетесь с агентом на обычном языке. Именно агент решает найти контакт и подтянуть его контекст.
Быстрый старт для команды с Claude Code
Склонируйте репозиторий, затем установите и соберите:
npm install && npm run buildДобавьте свои учётные данные:
cp .env.example .env # then edit .env and fill in GHL_PIT and GHL_LOCATION_IDОткройте папку в Claude Code. Он прочитает закоммиченный
.mcp.json, предложит серверghl-context, и вы одобрите его один раз. Сервер загружает.envпри запуске, поэтому токен никогда не лежит в конфигурационном файле.Общайтесь со своим агентом так, как представитель начал бы свой день:
Сегодня я звоню Маркусу Харлоуэю и Прие Найр. Дай мне краткую справку перед каждым звонком.
Агент находит каждый контакт, подтягивает таймлайн, положение в воронке и предстоящие встречи и возвращает справку.
Другие MCP-клиенты
Направьте любой MCP-клиент на сервер через stdio. Опубликованный пакет не требует ни клонирования, ни сборки. Для Claude Desktop добавьте это в claude_desktop_config.json:
{
"mcpServers": {
"ghl-context": {
"command": "npx",
"args": ["-y", "ghl-context-mcp"],
"env": {
"GHL_PIT": "pit-...",
"GHL_LOCATION_ID": "your-sub-account-id"
}
}
}
}Чтобы запустить локальную копию кода вместо опубликованного пакета, установите command в node, а args — в ваш собранный dist/index.js.
Переменные окружения
Переменная | Обязательно | По умолчанию | Значение |
| да | Private Integration Token для одного субаккаунта | |
| да | ID субъекта, которому принадлежит токен | |
| нет |
| Записи отказывают, если это не ровно |
| нет |
| Порог зависания как кратное медианному времени на этапе |
| нет |
|
|
Создайте токен в разделе Settings, Integrations, Private Integrations с областями contacts.readonly, contacts.write, opportunities.readonly, opportunities.write и calendars.readonly.
Посмотреть без клиента
Если у вас нет под рукой MCP-клиента, в репозитории есть терминальная демонстрация, которая выполняет ту же последовательность, что и агент, и печатает справку:
npm run brief -- "Marcus Halloway"Это демонстрация ценности, а не продукт. Продукт — это подключение агента, описанное выше.
Из исходников
npm install
npm run build
npm testnpm test проходит успешно без учётных данных. Живые проверки, npm run live-check и npm run live-write-check, требуют настоящего .env.
Формы ответов
Найденный контакт:
{
"resolution": "exact",
"contact": {
"contact_id": "NnAyKFnTSAVKg1amAArO",
"name": "Marcus Halloway",
"primary_phone": "+15551230010",
"primary_email": "marcus.halloway@example.com",
"tags": ["synthetic-seed"],
"owner": null,
"last_activity_at": null,
"last_activity_summary": null
}
}Неоднозначное совпадение возвращает кандидатов, а не угадывание:
{
"resolution": "ambiguous",
"candidates": [
{
"contact_id": "...",
"name": "Jordan Wells",
"primary_phone": "+15551230012",
"primary_email": "jordan.wells@example.com",
"last_activity_at": null
},
{
"contact_id": "...",
"name": "Jordan Wells",
"primary_phone": "+15551230013",
"primary_email": "jordan.wells.cpa@example.com",
"last_activity_at": null
}
],
"disambiguate_by": ["email", "primary_phone"],
"instruction": "Ask the user which one, or call again with the exact email or phone."
}Неоднозначность считается успехом. Агент, получивший ошибку, останавливается, а тот, кому вручили список кандидатов, продолжает работать и спрашивает пользователя, какой контакт он имел в виду.
Ошибки
Все ошибки имеют одну форму. Никакой сырой HTTP-статус не достигает модели.
Код | Когда | Повторяемо |
| Запросу не соответствует ни один контент | нет |
| Нет сделки с таким id | нет |
| Целевой этап не найден в воронке (перечисляет варианты) | нет |
| Заявленный текущий этап не совпадает с актуальным состоянием | да, после повторного чтения |
|
| да |
| Записи отключены, а была выполнена попытка записи | нет |
| У токена отсутствует необходимая область | нет |
| Токен отклонён | нет |
| GoHighLevel ограничивает запросы (содержит | да |
| GoHighLevel вернул ошибку | да, один раз |
| Запрошенный временной интервал превышает 365 дней | да |
Дизайн-заметки
Восемь правил, на которых построен сервер, по одной строке. Полная версия с обоснованием, которое спросил бы интервьюер, — в DESIGN.md.
Одна задача на инструмент. Если в описании появляется «и», это два инструмента.
Описания написаны для модели: когда использовать, когда не стоит и с каким смежным инструментом его пугают.
Никакие сырые API-формы не пересекают границу — за этим следит тест.
Ошибки — это инструкции в повелительном наклонении с перечислением допустимых вариантов.
Каждый ответ имеет потолок токенов, который контролирует тест, валящий сборку.
Сервер выполнит математику: сроки, длительности, относительное время, количество.
Записи утверждают состояние, от которого зависят, и громко падают при несоответствии.
Записи выключены, если не задано
GHL_ALLOW_WRITES=true.
Чего этот сервер не делает
Каждое ограничение — намеренное.
Что не реализовано | Почему |
| Агенты, выдумывающие или перезаписывающие записи, — главный реальный источник сбоев. Создание должно жить в форме или в человеческом процессе. |
| Исходящие сообщения под контролем агента — это зона комплаенса. Контекстному серверу не следует этим заниматься. |
| Неограниченные наборы результатов сжигают контекстное окно. Агенту нужно одно решённое совпадение, а не список. |
| Инструменты исследования схемы в основном стоят такта. Имена превращаются в id внутри инструментов, а неверные имена возвращают допустимые варианты. |
Workflow / автоматизация сценариев | Побочные эффекты, которые сервер не может описать заранее или отменить после. |
| Намеренно отложено, чтобы бенчмарк мог проверить его как отдельную ветку. Если он победит — появится в v2 вместе со всеми данными, которые за ним стоят. |
Ограничения
Только один субъект, только авторизация по Private Integration Token, без OAuth. Пагинация ограничена максимумами по каждому инструменту. Обнаружение зависаний требует объёма данных, чтобы быть значимым, и сейчас использует фиксированную замену, потому что GoHighLevel не раскрывает историю этапов. Соотнесение телефонных номеров заточено под США. Потолки токенов — это прокси-токены, а не точные токены Claude. Чтения GoHighLevel отстают от записей примерно на секунду. Протестировано только на одной форме аккаунта.
Лицензия
MIT
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
- AlicenseNot gradedqualityBmaintenanceProvides access to over 460 tools within the GoHighLevel CRM, allowing AI assistants to manage contacts, opportunities, messaging, and business workflows through natural language.2397ISC
- AlicenseNot gradedqualityCmaintenanceEnables Claude to manage GoHighLevel CRM contacts, pipelines, and workflows through natural language commands.35MIT
- FlicenseNot gradedqualityDmaintenanceEnables LLMs to read conversations, send messages, create tasks, and manage calendar appointments within GoHighLevel CRM locations.1
- AlicenseAqualityBmaintenanceEnables AI assistants to interact with GoHighLevel CRM via natural language for lead lookup, pipeline management, messaging, and calendar operations, with read-only mode by default.12MIT
Related MCP Connectors
Stop re-explaining yourself to Agents. Give it the right context, right when needed.
LeadConnector / GoHighLevel MCP Pack — wraps the GoHighLevel CRM for AI agents.
Agent-native CRM. 25 tools — contacts, deals, sequences, enrichment waterfall, audit log.
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/ceosykes/ghl-context-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server