DLF代理MCP服务器
遥控器 模型上下文协议 (MCP)服务器,让AI代理完全控制 GoHighLevel.部署为Cloudflare Worker,具有用户密钥身份验证、每个用户范围、多帐户支持和管理面板。
508工具 跨越18个领域模块,覆盖整个GHL API v2 surface+内部工作流生成器API。
居住地址: https://dlf-agency.skool-203.workers.dev
它的作用
将任何兼容MCP的AI客户端(Claude Code、Claude Desktop、Cursor、Windsurf、自定义代理)连接到您的GoHighLevel帐户。然后,AI可以通过自然语言管理您的整个GHL工作空间:
- *“显示本周的所有约会”*
- *“通过电子邮件创建一个名为John Smith的新联系人john@example.com"*
- *“在我的渠道中搜索超过5000美元的交易”*
- *“为短信自动回复创建会话AI代理”*
- *“列出过去30天的所有发票”*
- *“构建在表单提交时触发的工作流”*
快速入门(以用户身份连接)
1.获取API密钥
首选 https://dlf-agency.skool-203.workers.dev/signup 并注册。你的钥匙(uk_...)如图所示 一次 --立即复制。管理员必须批准您的帐户才能正常工作。
2.连接您的MCP客户端
克劳德代码:
claude mcp add --transport http \
--header "X-User-Key: uk_YOUR_KEY_HERE" \
dlf-agency https://dlf-agency.skool-203.workers.dev/mcp克劳德桌面/光标/任何MCP客户端(.mcp.json):
{
"mcpServers": {
"dlf-agency": {
"type": "http",
"url": "https://dlf-agency.skool-203.workers.dev/mcp",
"headers": {
"X-User-Key": "uk_YOUR_KEY_HERE"
}
}
}
}3.开始使用它
连接后,让你的AI在GHL中做任何事情:
"List all contacts tagged 'hot-lead'"
"Send an SMS to contact ID xyz saying 'Hey, following up on our call'"
"Create a calendar event for tomorrow at 2pm"建筑
MCP Client (Claude Code, Cursor, etc.)
│
│ HTTPS + X-User-Key header
▼
Cloudflare Worker (outer wrapper)
│
├── Validates API key against D1 (SHA-256 hashed)
├── Stores auth context in KV (scopes + allowed accounts)
├── Passes user ID via URL query param
│
▼
GHLMcpAgent (Durable Object)
│
├── Reads auth from KV (scopes, allowed accounts)
├── Enforces per-tool scope checks (default-deny)
├── resolveClient() → picks correct GHL API key for the location
│
▼
GoHighLevel REST API (services.leadconnectorhq.com)为什么选择KV认证?
MCP SDK McpAgent.serve() 在内部创建一个WebSocket升级请求,删除所有自定义标头。仅 x-partykit-room (会话ID)和 Upgrade 生存。因此,我们将身份验证上下文存储在以用户ID为键的KV中,持久对象从那里读取它。
所有路线
| 路线 | 方法 | 授权 | 描述 |
|---|---|---|---|
/health | GET | None | 健康检查--返回服务器名称+版本 |
/mcp | 职位 | X-User-Key header | MCP端点——所有工具调用都在此处 |
/signup | GET/POST | 无(速率受限) | 自助用户注册 |
/admin | GET | 密码 | 管理面板--管理用户、帐户、范围 |
/install | GET | 无 | 返回GHL OAuth安装URL以添加位置 |
/callback | GET | 无 | OAuth回调——将身份验证代码交换为令牌 |
/refresh | 职位 | X-Admin-Pin header | 强制刷新所有OAuth位置令牌 |
/admin/agency-token | 获取/发布 | X-Admin-Pin header | 查看/存储代理PIV令牌 |
/authorize | GET | PIN、会话或用户密钥 | OAuth自动批准 |
/register | POST | PIN或用户密钥 | OAuth客户端注册 |
认证
用户密钥认证(主要——适用于MCP客户端)
每一个请求 /mcp 必须包含API密钥:
Header: X-User-Key: uk_58894012-805b-4081-89c8-2ad0391e6c2b密钥生成于 /signup 或由管理员。它们在存储之前经过SHA-256哈希处理——原始密钥只显示一次,永远无法恢复。
用户生命周期:
- 用户注册地址:
/signup->状态=pending - 管理员在管理面板->状态中批准=
active - 管理员可以随时禁用->状态=
disabled
按用户访问控制:
- 范围:用户可以调用的工具名称的JSON数组(例如。,
["ghl_get_contact", "ghl_send_message"]),或["*"]所有508个工具 - 允许的帐户:用户可以访问的GHL位置ID的JSON数组(例如。,
["W7BRJwzJCvFs9r0xZHrE"]),或["*"]对于所有
GHL OAuth(用于添加位置)
要连接新的GHL位置(子帐户):
- 访问
GET /install--返回GHL OAuth选择位置URL - 在浏览器中打开该URL——选择要安装的GHL位置
- GHL重定向到
/callback?code=xxx - 服务器交换访问+刷新令牌的代码
- 令牌与位置ID一起存储在D1中
- 代币到期时自动刷新(24小时生命周期)
这使用具有以下凭据的GHL Marketplace OAuth流:
- 客户端ID:通过设置
GHL_CLIENT_ID秘密 - 客户端密钥:通过设置
GHL_CLIENT_SECRET秘密 - 重定向URI:
https://dlf-agency.skool-203.workers.dev/callback
私有集成令牌(PIT)
对于不使用OAuth的位置,您可以使用GHL私有集成令牌手动添加它们:
- 在GHL中:设置>集成>私有集成>创建
- 复制令牌
- 使用
ghl_add_sub_account工具或管理面板添加位置及其PIT
PIT不会过期,但也不能自动刷新。OAuth令牌是首选。
管理面板
网址: https://dlf-agency.skool-203.workers.dev/admin
特征:
- 查看、创建、编辑和删除用户
- 设置每个用户的范围(他们可以使用哪些工具)
- 设置每个用户帐户的访问权限(他们可以访问哪些GHL位置)
- 查看和管理子帐户
- 具有类别预设的范围选择器(完整/只读/无)
登录需要 ADMIN_PASSWORD 秘密。
工具域(508个工具)
| 域 | 工具 | 文件 | 它涵盖了什么 |
|---|---|---|---|
| 账户 | 5 | accounts.ts | 子账户管理(添加、列表、切换、删除) |
| 人工智能代理 | 26 | ai-agents.ts | 语音AI、对话AI、Agent Studio、通话记录 |
| 自动化 | 11 | automation.ts | 工作流程、表格、调查 |
| 企业 | 5 | businesses.ts | 业务CRUD |
| 日历 | 56 | calendars.ts | 日历、约会、团体、资源、服务、预订 |
| 联系人 | 27 | contacts.ts | 联系人、笔记、任务、标签、关注者、合并 |
| 内容 | 41 | content.ts | 博客、媒体、文档、菜单、快照、模板 |
| 对话 | 22 | conversations.ts | 消息、电话、转录、附件 |
| 错误 | 2 | errors.ts | 查看并清除服务器错误日志 |
| 知识库 | 14 | knowledge-base.ts | 知识库、常见问题解答、网络爬虫 |
| 位置 | 45 | locations.ts | 位置、用户、自定义字段、标签、业务配置文件 |
| 营销 | 70 | marketing.ts | 社交媒体、电子邮件活动、渠道、链接、队列 |
| 市场 | 9 | marketplace.ts | 应用程序安装、计费、重新计费 |
| 杂项 | 66 | misc.ts | 公司、电话号码、产品、定制对象、品牌 |
| 机会 | 12 | opportunities.ts | 交易、渠道、追随者 |
| 支付 | 68 | payments.ts | 发票、订单、订阅、预估、优惠券、运费 |
| 软件即服务 | 13 | saas.ts | SaaS重新计费、订阅、代理计划、钱包 |
| 工作流生成器 | 16 | workflow-builder.ts | 工作流CRUD、触发器、步骤、发布/草稿(BETA) |
Beta版:工作流生成器(16个工具)
工作流生成器工具使用 内部GHL API (backend.leadconnectorhq.com)使用Firebase身份验证。这些不是官方GHL REST API的一部分,可能会在不通知的情况下更改。
工具: ghl_workflow_builder_list, ghl_workflow_builder_create, ghl_workflow_builder_get, ghl_workflow_builder_get_steps, ghl_workflow_builder_get_triggers, ghl_workflow_builder_update, ghl_workflow_builder_save_steps, ghl_workflow_builder_publish, ghl_workflow_builder_draft, ghl_workflow_builder_delete, ghl_workflow_builder_create_trigger, ghl_workflow_builder_update_trigger, ghl_workflow_builder_delete_trigger, ghl_workflow_builder_create_folder, ghl_workflow_builder_clone, ghl_workflow_builder_error_count
状态: 贝塔。这些工具可能无法可靠地用于创建/更新操作。读取操作(list、get)是稳定的。
需要 GHL_FIREBASE_REFRESH_TOKEN 秘密有待设定。
禁用:管道写入操作
三个管道工具被禁用,因为GHL对所有令牌类型都返回401:
ghl_create_pipeline--残疾人ghl_update_pipeline--残疾人ghl_delete_pipeline--残疾人
读取管道(ghl_list_pipelines, ghl_get_pipeline)工作得很好。写入操作需要单独的 opportunities.pipeline.write GHL目前在私有集成或OAuth令牌授予中未公开的范围。
代码保存在 src/tools/_disabled/pipeline-write.ts 当GHL修复此问题时,可以重新启用。
子账户管理
服务器支持多个GHL位置(子帐户)。每个都有自己的API密钥存储在D1中。
解析顺序 (当调用工具时):
- 如果
locationId在工具args中传递->使用D1中的该位置的键 - 如果不
locationId->使用D1中的默认帐户 - 如果D1中没有违约->回退到
GHL_API_KEY+GHL_LOCATION_ID环境变量
令牌类型:
- OAuth令牌:有
refresh_token+expires_at到期前自动刷新。 - 私有集成令牌:静态,永不过期,无需刷新。
项目结构
dlf-ghl-mcp-server/
├── src/
│ ├── index.ts # Worker entry: auth wrapper + GHLMcpAgent DO
│ ├── types.ts # Env, User, SubAccount, ApiVersion types
│ ├── config.ts # API base URL, versions, MCP server metadata
│ │
│ ├── client/ # GHL API client layer (makes HTTP calls)
│ │ ├── base.ts # BaseGHLClient -- fetch wrapper with auth headers
│ │ ├── index.ts # GHLClient -- composes all 16 domain factories
│ │ ├── ai-agents.ts # Voice AI, Conversation AI, Agent Studio
│ │ ├── automation.ts # Workflows, forms, surveys
│ │ ├── businesses.ts # Business CRUD
│ │ ├── calendars.ts # Calendars, events, bookings, services
│ │ ├── contacts.ts # Contacts, notes, tasks, tags
│ │ ├── content.ts # Blogs, media, documents, menus, snapshots
│ │ ├── conversations.ts # Messages, calls, transcriptions
│ │ ├── knowledge-base.ts # KBs, FAQs, crawlers
│ │ ├── locations.ts # Locations, users, custom fields
│ │ ├── marketing.ts # Social, email, campaigns, funnels, links
│ │ ├── marketplace.ts # Billing, app installations
│ │ ├── misc.ts # Companies, phone, products, objects, brands
│ │ ├── opportunities.ts # Opportunities, pipelines
│ │ ├── payments.ts # Invoices, orders, subscriptions, coupons
│ │ ├── saas.ts # SaaS rebilling, wallets
│ │ └── workflow-builder.ts # Internal GHL API (Firebase auth) -- BETA
│ │
│ ├── tools/ # MCP tool registrations (Zod schemas + handlers)
│ │ ├── index.ts # registerAllTools() -- calls all 18 domain modules
│ │ ├── _helpers.ts # ok(), err(), resolveClient() shared utilities
│ │ ├── _disabled/
│ │ │ └── pipeline-write.ts # Pipeline CRUD (disabled -- GHL returns 401)
│ │ ├── accounts.ts # 5 tools
│ │ ├── ai-agents.ts # 26 tools
│ │ ├── automation.ts # 11 tools
│ │ ├── businesses.ts # 5 tools
│ │ ├── calendars.ts # 56 tools
│ │ ├── contacts.ts # 27 tools
│ │ ├── content.ts # 41 tools
│ │ ├── conversations.ts # 22 tools
│ │ ├── errors.ts # 2 tools
│ │ ├── knowledge-base.ts # 14 tools
│ │ ├── locations.ts # 45 tools
│ │ ├── marketing.ts # 70 tools
│ │ ├── marketplace.ts # 9 tools
│ │ ├── misc.ts # 66 tools
│ │ ├── opportunities.ts # 12 tools
│ │ ├── payments.ts # 68 tools
│ │ ├── saas.ts # 13 tools
│ │ └── workflow-builder.ts # 16 tools (BETA)
│ │
│ ├── db/
│ │ ├── accounts.ts # D1: sub_accounts + oauth_tokens tables
│ │ ├── users.ts # D1: users table, API key hashing
│ │ └── errors.ts # D1: error capture table
│ │
│ ├── handlers/
│ │ ├── admin.ts # Admin panel (HTML dashboard + REST API)
│ │ ├── oauth-callback.ts # GHL OAuth code exchange + token storage
│ │ └── register.ts # User self-registration form
│ │
│ └── utils/
│ ├── errors.ts # GHLError class (statusCode + details)
│ ├── logger.ts # Structured JSON logger with field redaction
│ ├── rate-limit.ts # KV-based sliding window rate limiter
│ └── webhook.ts # Optional error webhook sender
│
├── scripts/
│ ├── deploy.sh # Full deploy pipeline (both workers)
│ ├── check-duplicates.sh # Detect duplicate tool names (crash prevention)
│ ├── count-tools.sh # Tool count per domain (--detail for names)
│ ├── add-domain.sh # Scaffold new domain module pair
│ └── add-tool.sh # Add tool to existing domain
│
├── migrations/
│ ├── 0001_create_users_table.sql
│ └── 0002_add_allowed_accounts.sql
│
├── wrangler.toml # Cloudflare Worker config (bindings, DO, D1, KV)
├── tsconfig.json
├── package.json
└── SERVER-MAP.md # Quick reference with all tool names + scope presets两层模块模式
每个GHL API域都有一对并行文件:
src/client/.ts -> Factory function returning async methods (HTTP calls)
src/tools/.ts -> registerXxxTools(server, env) registering MCP tools客户端层:每个文件导出一个 domainMethods(client) 工厂。 GHLClient 它的建造者拥有全部16家工厂。
工具层:每个文件导出一个 registerXxxTools(server, env) 功能。 registerAllTools() 调用所有18个注册功能 GHLMcpAgent.init().
部署
需求
- Cloudflare员工 账户
- 18+
- 具有API访问权限的GHL帐户
- GHL OAuth应用程序凭据(用于OAuth安装流程)
从头开始设置
git clone https://github.com/Bladefitness/dlf-ghl-mcp.git
cd dlf-ghl-mcp/dlf-ghl-mcp-server
npm install
# Create Cloudflare resources
npx wrangler d1 create ghl-accounts
npx wrangler kv namespace create OAUTH_KV
# Update wrangler.toml with the IDs from above
# Set required secrets
echo "your-admin-password" | npx wrangler secret put ADMIN_PASSWORD
echo "your-admin-pin" | npx wrangler secret put ADMIN_PIN
echo "your-ghl-client-id" | npx wrangler secret put GHL_CLIENT_ID
echo "your-ghl-client-secret" | npx wrangler secret put GHL_CLIENT_SECRET
# Optional: for workflow builder tools
echo "your-firebase-refresh-token" | npx wrangler secret put GHL_FIREBASE_REFRESH_TOKEN
# Deploy
npm run deploy
# Verify
curl https://your-worker.workers.dev/health秘密参考
| 机密 | 必填 | 目的 |
|---|---|---|
ADMIN_PASSWORD | 是 | 管理面板登录密码 |
ADMIN_PIN | 是 | X-Admin-Pin API管理路由的标头 |
GHL_CLIENT_ID | 是 | GHL OAuth应用程序客户端ID |
GHL_CLIENT_SECRET | 是 | GHL OAuth应用程序客户端密码 |
GHL_FIREBASE_REFRESH_TOKEN | 否 | Firebase刷新令牌(工作流构建器BETA) |
GHL_FIREBASE_TOKEN | 否 | 静态Firebase ID令牌(回退) |
ERROR_WEBHOOK_URL | 否 | 错误报告的Webhook URL |
Cloudflare绑定
| 绑定 | 类型 | 目的 |
|---|---|---|
MCP_OBJECT | 持久对象 | MCP会话持久性(GHLMcpAgent) |
GHL_DB | D1数据库 | 用户、子帐户、OAuth令牌、错误 |
OAUTH_KV | KV命名空间 | 身份验证上下文、会话、速率限制计数器 |
部署脚本
# Full pipeline: duplicate check -> tsc -> deploy both workers -> health verify
./scripts/deploy.sh
# Dry run (no actual deploy)
./scripts/deploy.sh --dry-run
# Deploy only one worker
./scripts/deploy.sh --one dlf-agency安全
| 保护 | 如何 |
|---|---|
| API密钥哈希 | SHA-256哈希存储在D1中——原始密钥从未持久化 |
| 每个用户范围 | 默认拒绝:无作用域=无工具。管理员必须授予访问权限 |
| 帐户隔离 | 用户只能访问其所在地区的GHL位置 allowed_accounts |
| 速率限制 | 120次/分钟 /mcp,每分钟需要5次 /signup |
| 表头净化 | 传入 X-User-Scopes, X-User-Allowed-Accounts 剥离以防止欺骗 |
| 定时安全认证 | 管理员PIN使用HMAC-SHA256常量时间比较 |
| 会话指纹识别 | 绑定到IP+用户代理的管理会话 |
| 错误编辑 | API密钥、令牌、密码在所有错误日志中都被屏蔽 |
| 跨域资源共享 | 管理路线仅限于同一起点;公共路由使用通配符 |
| 安全标头 | X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Referrer-Policy: no-referrer |
GHL API版本
| 版本 | 用于 |
|---|---|
2021-07-28 | 大多数端点(联系人、对话、发票、工作流等) |
2021-04-15 | 日历事件、被阻止的时段、对话AI代理、通话、转录 |
每个客户端模块中的每个端点都会自动设置正确的版本。
添加新工具
将工具添加到现有域
# Scaffold both client method + tool registration
./scripts/add-tool.sh contacts ghl_archive_contact
# Or manually:
# 1. Add method to src/client/contacts.ts
# 2. Add server.tool() to src/tools/contacts.ts
# 3. Run ./scripts/check-duplicates.sh to verify no name collision添加新域
# Scaffold the full module pair
./scripts/add-domain.sh new-domain
# Then wire it up:
# 1. Import factory in src/client/index.ts
# 2. Import register function in src/tools/index.tsD1数据库架构
用户
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL UNIQUE,
api_key TEXT NOT NULL UNIQUE, -- SHA-256 hash of uk_
status TEXT DEFAULT 'pending', -- 'pending' | 'active' | 'disabled'
scopes TEXT DEFAULT '["*"]', -- JSON array of tool names or ["*"]
allowed_accounts TEXT DEFAULT '["*"]', -- JSON array of location IDs or ["*"]
created_at TEXT, updated_at TEXT, notes TEXTsub_计数
id TEXT PRIMARY KEY, -- GHL Location ID
name TEXT NOT NULL,
api_key TEXT NOT NULL, -- Bearer token (PIT or OAuth)
account_type TEXT DEFAULT 'sub_account', -- 'sub_account' | 'oauth_location'
is_default INTEGER DEFAULT 0,
refresh_token TEXT, -- OAuth only
expires_at INTEGER, -- Unix timestamp, OAuth only
notes TEXT, created_at TEXT, updated_at TEXT成本
| 资源 | 免费等级 | 付费 |
|---|---|---|
| 工人要求 | 10万/天 | 0.30美元/M |
| 持久对象 | -- | 0.15美元/M请求 |
| D1读取 | 500万/天 | 0.001美元/百万行 |
| KV读数 | 10万/天 | 0.50美元/M读数 |
对于个人/小团队使用,这通常保持在免费等级限制范围内。
