GrokMCP
GrokMCP
GrokMCP 是一个部署在 Cloudflare Workers 上的非官方、私有、单用户 Grok 搜索
MCP 服务。它面向 ChatGPT 网页版,只暴露 x_search 和 web_search 两个只读搜索
工具;Grok 登录、状态和退出操作全部放在受保护的中文 Worker 管理页中。
项目使用一个 SQLite Durable Object 保存 OAuth 状态,并用 Workers 内置 Web Crypto 的 AES-256-GCM 加密 OAuth 数据。仓库不包含任何真实 token、callback URL 或 Cloudflare secret。
本项目与 xAI、X、OpenAI、Cloudflare 均无隶属或背书关系。它复用了当前 Grok CLI/Hermes 兼容流程的公共 OAuth client ID。上游 OAuth、API、模型能力、 账号套餐和服务条款都可能变化,升级前请重新核对官方文档。
当前运行契约
Worker 名:
grokmcp健康检查:
GET /healthzMCP URL:
https://grokmcp.<账户>.workers.dev/t/<MCP_URL_TOKEN>/mcp管理 URL:
https://grokmcp.<账户>.workers.dev/admin/t/<ADMIN_URL_TOKEN>MCP 协议:仅
2026-07-28,逐请求 JSON 响应,不创建旧式会话MCP 工具:仅
x_search、web_search状态:类名为
GrokState、对象名为single-user的唯一 SQLite Durable Object模型:Worker 变量
GROK_X_SEARCH_MODEL,默认grok-4.6Node.js:22
应用版本:
0.3.x
明确不支持旧 initialize/session 客户端、SSE 传输、账号管理 MCP 工具、多账号或 多租户、旧版 xAI 原始响应兜底,以及原始帖子列表分页。
架构与数据流
ChatGPT 网页版
└─ 带 MCP_URL_TOKEN 的 HTTPS 请求
└─ Worker 路由鉴权与请求体限制
└─ MCP 2026-07-28 / x_search 或 web_search
└─ single-user SQLite Durable Object
├─ 解密或刷新 Grok OAuth token
└─ xAI Responses API + 对应搜索工具
浏览器
└─ 带 ADMIN_URL_TOKEN 的中文管理页
└─ 登录 / 回调 / 状态 / 退出
└─ 同一个 SQLite Durable Object主要边界如下:
src/worker.ts在读取请求体或访问 Durable Object 前校验精确 URL 路径,负责 健康检查、管理路由、MCP 路由、Host/Origin 校验和请求体上限。src/admin.ts生成无 JavaScript、无第三方资源、不可缓存的中文管理页。所有 动态值均经过 HTML 转义;错误页只显示稳定中文说明、错误码和可选参考编号。src/mcp.ts定义两个工具的输入 schema、outputSchema和 MCP 处理器,不包含 任何账号管理工具。src/grokState.ts独占 SQLite OAuth 状态、刷新串行化和 xAI 调用。升级时必须 保留GrokState类名、v1迁移及single-user对象名。src/cryptoVault.ts使用 AES-256-GCM、每条记录独立的 96 位 IV 和用途绑定 AAD。 修改加密密钥或既有用途字符串会使当前密文无法读取。src/oauth.ts实现 PKCE、严格 loopback callback 校验、OIDC discovery 和 token 刷新;discovery 返回的 token endpoint 被限制在 HTTPSx.ai域名。src/xaiClient.ts构造当前 xAI Responses API 请求,只解析output[].content[].output_text.text和引用信息,并限制超时及响应大小。
搜索历史、查询文本和搜索结果不会写入 SQLite;数据库只保存加密的 OAuth 登录 材料和短期登录尝试。
MCP 工具、参数映射与限制
参数不是未经检查地“原样透传”。MCP 输入先经过 Zod 和运行时双重校验,再映射到
xAI Responses API:query 写入 input[0].content,过滤器和媒体选项写入
tools[0]。
x_search
字段依据当前 xAI X Search 公共契约。
MCP 参数 | xAI 请求位置 | 规则 |
|
| 必填,1–8,000 个字符 |
|
| 可选,最多 20 个非空账号 |
|
| 可选,最多 20 个非空账号 |
|
| 可选,必须是真实的 |
|
| 可选,必须不早于 |
|
| 可选布尔值 |
|
| 可选布尔值 |
allowed_x_handles 与 excluded_x_handles 不能同时包含值。
web_search
字段依据当前 xAI Web Search 公共契约。
MCP 参数 | xAI 请求位置 | 规则 |
|
| 必填,1–8,000 个字符 |
|
| 可选,最多 5 个非空域名 |
|
| 可选,最多 5 个非空域名 |
|
| 可选布尔值 |
|
| 可选布尔值 |
allowed_domains 与 excluded_domains 不能同时包含值。本项目当前没有给
web_search 暴露日期过滤参数。
返回值
两个工具都声明相同的 MCP outputSchema。成功时,structuredContent 与 JSON
文本块内容一致:
{
"ok": true,
"text": "模型综合搜索结果后生成的回答",
"citations": ["https://example.com/source"],
"model": "grok-4.6"
}引用 URL 会去重。失败时返回稳定 code 和说明,并将 MCP 结果标记为错误。
“最多搜索多少帖子”
当前 xAI X Search 公共参数和本 MCP 都没有 max_results,本项目也没有自行添加
这个参数。上游由 Grok 决定检索范围,再返回综合文本和引用,而不是可分页的原始
帖子数组。因此:
不能指定或保证固定检查多少条帖子;
20 是账号过滤器条目上限,不是帖子数量上限;
返回长度、引用数量和实际检索量会随问题、模型及 xAI 服务变化;
本项目自己的安全上限
MCP HTTP 请求体:128 KiB;
管理表单请求体:16 KiB;
单次查询:8,000 字符;
xAI/OAuth 网络请求超时:60 秒;
xAI 搜索响应:2 MiB;
OAuth 响应:64 KiB;
待处理的浏览器登录:10 分钟、单次使用;
不保存搜索历史。
免费资源边界
部署只使用一个 Worker、一个 SQLite Durable Object、Worker 变量、Worker secrets 和 Workers Builds,不需要 KV、D1、R2、Queues、Workers AI 或付费加密服务。 Web Crypto 是 Workers 内置能力,不产生单独费用。
低频个人使用的目标是落在当前 Workers 免费额度、 Durable Objects 免费额度 和 Workers Builds 免费额度 内。撰写本文时,Workers Builds 免费计划提供每月 3,000 构建分钟、1 个并发构建, 单次最长 20 分钟。平台额度可能调整,请以链接中的最新规则为准。
Cloudflare 免费不等于 xAI/Grok 免费;你仍需自行承担 Grok/X 账号套餐、上游工具 调用或速率限制带来的约束。
从 GitHub 安装与验证
唯一源码仓库是 git@github.com:nympheon/grok-MCP.git。不要依赖本地压缩备份。
git clone git@github.com:nympheon/grok-MCP.git
cd grok-MCP
npm ci
npm run verifynpm run verify 是本地、GitHub Actions 和 Workers Builds 共用的发布门禁,依次
执行 Worker 类型生成、Biome、TypeScript、全部测试和 Wrangler dry-run。它不会
启动本地 Worker,也不会部署生产版本。
依赖均精确锁定。更新依赖后必须提交同步生成的 package-lock.json,重新执行完整
门禁,并检查 Worker 兼容日期与生成绑定类型。
首次部署
前提:Node.js 22、npm、启用了 workers.dev 子域的 Cloudflare 账号,以及一个
兼容的个人 Grok/X 账号。
npm ci
npm run secrets:init
npx wrangler login
npm run verify
npm run deploy:with-secretsnpm run secrets:init 会创建 Git 已忽略且权限为 0600 的 .secrets.local,其中
包含三个彼此独立的 256 位随机值:
MCP_URL_TOKEN:嵌入 ChatGPT MCP URL 的密码;ADMIN_URL_TOKEN:嵌入中文管理 URL 的独立密码;TOKEN_ENCRYPTION_KEY:加密 SQLite OAuth 记录的 AES 密钥。
命令不会打印这些值,并会保留已有值。deploy:with-secrets 仅用于首次部署或明确
轮换;已有 Worker 的普通代码升级绝不能上传新的 secrets 文件。
首次部署后,可在私密终端中构造两条受保护 URL:
npm run url -- https://grokmcp.<账户>.workers.dev
npm run admin-url -- https://grokmcp.<账户>.workers.dev这两个命令会有意显示完整 bearer URL。请像密码一样保护它们,不要提交、截图、 写入日志或发送给他人。
使用中文管理页登录 Grok
登录、状态、callback 和退出均不是 MCP 工具。打开完整管理 URL 后:
点击 开始新的 Grok 登录;
点击 打开 Grok 授权页面,使用唯一的目标 Grok/X 账号登录;
Grok 会跳转到
http://127.0.0.1:56121/callback?...。浏览器显示无法连接是 预期现象,不需要启动本地监听器;从地址栏复制包含且只包含一个
code和一个state的完整 URL;在十分钟内回到管理页,将其粘贴到 完整回调 URL,点击 完成 Grok 登录;
确认账号状态显示 已登录。
callback URL 和 authorization code 都是短期凭据,不要共享。开始新的登录会替换 尚未完成的登录尝试;成功回调只能使用一次。
管理页还会显示当前模型、应用版本、Worker 版本、凭据时间、完整 MCP URL、公共 OAuth 兼容信息和 Cloudflare 运维说明。管理 URL 与其中显示的 MCP URL 都是密码。 点击退出会删除 OAuth 凭据和待处理登录请求,但不会删除三个 Worker secret。
连接 ChatGPT 网页版
按照当前 OpenAI 自定义 MCP 连接说明
添加远程 MCP,并粘贴以 /mcp 结尾的完整 MCP URL。不要再配置 Authorization
header 或额外 OAuth 凭据,鉴权已经包含在 URL token 中。
客户端必须支持 MCP 2026-07-28 的逐请求 envelope 和标准 header。若客户端仍
发送旧 initialize/session 请求,Worker 会返回 400,而不是降级到旧协议。
GitHub Actions 与 Workers Builds
GitHub Actions 对 main 推送和 Pull Request 执行:
npm ci
npm run verify
npm audit --audit-level=low现有 Worker 可按 Workers Builds 配置说明 在 Cloudflare Dashboard 的 Workers & Pages → grokmcp → Settings → Builds 关联 此仓库,设置为:
Production branch: main
Root directory: /
Build command: npm run verify
Deploy command: npm run deployWorkers Builds 只从 GitHub 获取无密钥源码。npm run deploy 不提供 secrets 文件,
因此普通 main 提交会验证并自动部署代码,同时保留 Cloudflare 中现有的
MCP_URL_TOKEN、ADMIN_URL_TOKEN、TOKEN_ENCRYPTION_KEY、SQLite Durable
Object 数据和 Grok 登录。GitHub Actions 负责独立验证,不持有 Cloudflare 密钥,
也不部署生产版本。
日常升级与修改模型
Workers Builds 关联完成后,常规流程是:
git pull --ff-only
npm ci
npm run verify
git add <明确修改的文件>
git commit -m "说明本次修改"
git push origin main推送后必须同时确认 GitHub Actions 与 Cloudflare Build 成功,再验收 /healthz、
中文管理页、tools/list 和真实搜索。普通升级不要运行 secrets:init、
deploy:with-secrets 或批量 secret 上传。
修改模型时,编辑 wrangler.jsonc 中的 GROK_X_SEARCH_MODEL,执行门禁后提交到
main。空值或格式非法的模型名会回退到 grok-4.6;格式合法但上游不支持的模型
会由 xAI 返回错误。直接在 Dashboard 修改普通变量可能被后续仓库部署覆盖,因此
仓库配置是长期事实来源。
Secret 恢复与轮换
Cloudflare 只显示 secret 名称,不会显示已上传原值:
只要仍能打开管理页,就能从页面恢复完整 MCP URL;
丢失
MCP_URL_TOKEN且无法从管理页恢复时,只能轮换并更新 ChatGPT;丢失
ADMIN_URL_TOKEN时无法从 Worker 读回,只能轮换并保存新的管理 URL;TOKEN_ENCRYPTION_KEY永远不应在页面或日志中恢复。丢失本地副本不影响普通 部署,但轮换后必须重新登录。
可在 Cloudflare Dashboard 的 Worker Settings → Variables and Secrets 中只
替换目标名称,也可使用 wrangler secret put <NAME>。轮换影响如下:
MCP_URL_TOKEN:旧 ChatGPT URL 立即失效,需要更新连接;ADMIN_URL_TOKEN:旧管理 URL 立即失效,需要保存新 URL;TOKEN_ENCRYPTION_KEY:现有 OAuth 密文按设计不可读,必须重新登录 Grok。
一次只轮换实际受影响的 secret。不要为了更换 URL 而更换加密密钥。更详细的泄露 处理见 SECURITY.md。
回滚
若自动部署后的代码异常:
在 Cloudflare Worker 的 Deployments 页面把上一正常版本恢复为 100% 流量;
记录故障版本和上一正常版本 ID;
在 GitHub 修复或回退对应提交,重新通过
npm run verify后推送;验证现有 secret 名称、Grok 登录和 Durable Object 仍然有效。
普通代码回滚不会轮换 secret,也不会删除 SQLite 数据。未来若新增 Durable Object 迁移,必须先评估数据向后兼容性;恢复旧代码不等于撤销已经执行的数据迁移。
故障排查
现象 | 优先检查 |
| MCP URL 是否完整、token 是否被轮换、是否误用了管理 token |
管理页返回 | 管理 URL 是否完整、 |
管理操作返回 | 浏览器 Origin/Host 是否与 Worker 地址一致,是否经由改写请求的代理 |
localhost callback 无法打开 | 这是预期行为;复制地址栏完整 URL 回管理页 |
| 必须是精确的 |
| 在管理页重新开始登录并于十分钟内完成 |
| 在管理页重新登录;永久 refresh 拒绝会清理无效凭据 |
| 遵循 xAI 限速并稍后重试;本项目不会绕过账号限制 |
模型调用失败 | 核对 |
旧 MCP 客户端收到 | 升级到支持 MCP |
GitHub Actions 成功但线上未更新 | 检查 Cloudflare Builds 是否关联 |
Build 中 | 先在 Node.js 22 的干净 clone 中运行 |
内部错误会在中文管理页显示 correlation ID。排查时使用该编号和 Cloudflare 的版本 信息,不要记录受保护 URL。由于 URL 路径包含 bearer token,本项目有意关闭 Worker invocation observability;source map 仍会随版本上传用于诊断。
安全要点
token 缺失、格式错误或路径不匹配时,在解析请求体或访问 Durable Object 前 返回
404;MCP token 与管理 token 不可交叉使用。URL token 使用 SHA-256 摘要比较,代码不记录请求 URL 或请求体。
管理写操作只接受同源表单 POST;页面设置严格 CSP、
no-store、no-referrer、DENYframe 和nosniff。OAuth 使用 PKCE S256、随机 state/nonce、十分钟过期和单次回调;原始 state 不以 可查询明文保存。
OAuth 尝试和 token set 使用用途绑定 AES-GCM 加密落盘。
只有明确的永久 refresh 拒绝才删除登录;网络故障、超时、429、临时无效响应和 5xx 会保留密文供稍后重试。
公共仓库必须排除
.secrets.local、真实 callback、受保护 URL、OAuth token、.wrangler、依赖、缓存和部署产物。本项目仅适合一个受信任用户,不应作为共享、多租户或公开搜索代理。
仓库结构
src/ Worker、MCP、OAuth、加密、Durable Object 与 xAI 客户端
test/ 纯单元测试
test-worker/ workerd/Miniflare Worker 与 Durable Object 测试
test-node/ secret 管理脚本测试
scripts/secrets.mjs 首次部署/主动轮换的本地 secret 辅助工具
wrangler.jsonc Worker、变量、SQLite Durable Object 与迁移配置
.github/workflows/ GitHub Actions 验证
AGENTS.md 后续代码维护约束
SECURITY.md 私密漏洞报告与凭据事故处理许可证
使用本项目即表示你自行负责遵守 xAI、X、OpenAI、Cloudflare 和所在地区的适用条款 及法律,并承担非官方 OAuth 兼容流程失效的风险。