ghl-context-mcp
ghl-context-mcp
一个刻意保持精简的 GoHighLevel MCP 服务器。六种工具,只专注一件事:让你在打电话之前,心里有数对面是谁。
为什么会有它
在 CRM 之上接入一个智能体,最常见的失败模式是暴露一块又宽又泛的工具面,把原始 API JSON 直接倒出来:模型会选择错误的工具,把上下文窗口烧在那些没有出人会说出口的字段上,偶尔还捏造或覆盖一条记录。这台服务器选的是另一个方向。它只提供六个工具,每个工具都对上一次与联系人交谈的那个时刻。它返回出的每个字段,要么是别人会说出口的话,要么是别人下一次调用时需要传回去的东西。日期计算它自己做,写入功能则在点亮之前始终关闭。窄工具面是否真的胜过宽工具面,这是可衡量的;配套的基准 mc-tool-suface-bench 就是用来量它的。
Related MCP server: GoHighLevel MCP Server
工具
工具 | 作用 | 类型 | 上限 |
| 将姓名、电话或邮箱解析为恰好一个联系人;否则返回候选项 | 读 | 400 |
| 将近期记录、短信、笔记、预约和阶段变更组织成一段陈述性文本,并带一个概拒 | 读 | 1200 |
| 每个商机位于哪个阶段、阶段内停留天数、金额、是否已停滞 | 读 | 500 |
| 某人或日历即将来的预约,以及相对时间 | 读 | 900 |
| 写一条笔记,具有可重试幂等性,并回显已存内容 | 写 | 200 |
| 把商机移动到另一个阶段,由 stale-context 检查保护 | 写 | 250 |
上限是每次响应的 token 预算,它由一个测试强制保证:如果响开始超过上限,构建就会失败。这里“token”差不多,见 DESIGN.md。
使用方法
这是一个 MCP 服务器,目标用户是 AI 智能体,而不是坐在终端前的人。你需要把服务器接到你的智能体上(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,所以没有 token 会落在配置文件里。用销售代表在开始一天工作时的方式对你的智能体说话:
我今天要给 Marcus Halloway 和 Priya Nair 打电话。在每位接线之前,给我一份通话前简报。
智能体会解析每个联系人,拉去时间线、管道位置、快到来的约会,并给你汇报。
其他 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 | |
| 是 | 该 token 所属的子账户 ID | |
| 否 |
| 除非某它恰好为 |
| 否 |
| 用于计算“停滞”阈值的倍数,基准是阶段在停留的中往时间 |
| 否 |
| 联系人解析对方法: |
在 Settings、Integrations、Private Integrations 下创建这个 token,信域选中 contacts.readonly、contacts.write、opportunities.readonly、opportunities.wite 和 calendars.readonly。
没有客户端也先看到并且效果
如果手边没有 MCP 客户端,代码库里带了一个终端 demo,它会跑跟智能体几乎完全相同操作步骤,然后打印走那会前现场:
npm run brief -- "Marcus Halloway"它不是最终产品,只是证明“这套做法有价值”的演示。最终产品,是上面那个智能体连接。
从源码运行
npm install
npm run build
npm testnpm test,在没有任何凭据的情况下,也要能构建通过。在线检查 npm run live-check 和 npm run live-write-check,需要一份真实的。
响应结构
一份能解析出来的联系人:
{
"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 的商机 | 否 |
| 目标阶段不存在于该 pipeline 中(会返回合法阶段列表) | 否 |
| 断言中所说的“当前阶段”与端上真实状态不一致 | 是,需重新读取后 |
| 调用 | 是 |
| 写入被关闭的培养下发起写操作 | 否 |
| token 缺少一个必须的 scope | 否 |
| token 被拒绝 | 否 |
| GoHighLevel 正在限流(带上 `retry_after_seconds) | 是 |
| GoHighLevel 返回了一个错误 | 是,只重试一次 |
| 请求的时间窗内超过 365 天 | 是 |
设计笔记
这条服务器建立在八条规则上,这里每条一句话。完整版、以及预期间里面会出现那“过了未知”式问答的推演,在 DESIGN.md。
一把工具只做一件事。如果工具描述落得需要写“实现”,说明这是两个工具。
描述是写给模型看的:它什么时候应该用它、不要用它,以及它和哪个兄弟工具容易搞混。
原始的 API 数据形态不得越过该边界,有测试强制。
错误是指令式的,使用祈对语气写,并列出它现在该选哪些合法选项。
每个响应都带 token 上限,有测试强制,超出就会导致构建失败。
服务器本身完成算术:年龄、时长、相对时间、次数计算都是在它计算。
写操作只会基础上它们所依赖的状态发生变化上执行,如果状态不一致,就会大声失败。
写入默认关着,只有
GHL_ALLOW_WRITES=true才开。
一切它不做的事
这些“不做”都是留有余地。
没选上 | 为什么 |
| 智能体在凭空创建一个或覆盖记录,是现实世界出现过的最大翻车场景。创建走表但或走人流程。 |
| 受控于 APP下发给订阅者短信/邮件,是合规这台服务器不该去跑的。 |
| 无限制结果集合会把上下文窗口烧干。智能体真正需要的,是一次解析到一个确定的结果,而不是一张列表。 |
| 这类“列出对象名”的工具,经常浪费有利一次来回。名称在工具内部已经由 io url 转 ID,凡是给错名字,就会拿到合法名字列表。 |
工作流/自动化触发器 | 它引发的副作用,服务器事先解释不清又无法事撤销。 |
| 刻意先不上,因为这个组合要留到基准测试时单独作为“一个臂”。如果它能赢,那就跟着它依赖的数据一起,v2 见。 |
局限
只支持单个 location、只有 Private Integration Token 认证,不支持 OAuth。分项有上限:每工具可取的列表数量固定。停滞检测需要有一定规模的数据才有意义,写在出来的代码中目前用了一个定值兜底,原因是 GoUpLevel 不暴露阶段历史。电话号匹配是 North America 为中心的。Token 限上是代理 token 计,不是 Claude 原生 token 计。GoHighLevel 的读取比写入慢大概 1 秒。目前的测试只验证一个“账号形状应样本”。
许可证
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Personal CRM operated by AI agents. Read relationship context before acting, write back after.
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.
CRM, relationship intelligence, and multi-agent orchestration for AI agents.
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.13 npm120ISC
- FlicenseNot gradedqualityDmaintenanceEnables LLMs to read conversations, send messages, create tasks, and manage calendar appointments within GoHighLevel CRM locations.1-
- AlicenseAqualityDmaintenanceEnables 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
- AlicenseCqualityCmaintenanceEnables AI agents to interact with the GoHighLevel (GHL) CRM and marketing automation platform through 576 tools covering contacts, opportunities, conversations, calendars, invoices, payments, campaigns, and other business operations.50018 npmMIT