Skip to main content
Glama

MCP Host Canary

CI

创建一个一次性的远程 MCP 服务器,将其连接到 Claude、ChatGPT、Cursor 或其他托管主机,并获取一份关于它实际到达的最后一个协议边界的安全回执。

运行一个 30 分钟的金丝雀测试——无需注册或安装 · 查看一份已定稿的示例回执

瀑布流演示

MCP Host Canary 瀑布流从运行创建推进到已执行的工具回调

MCP Host Canary 创建一个已知的测试服务器,并且只记录它观察到的协议边界。它区分以下情况:未识别到任何 MCP 流量、不完整的 manifest 响应、返回了工具列表但没有哨兵调用、以及有调用请求但没有注册的回调执行。它仅在现代发现或旧版初始化实际到达时才记录它们。它不会根据未收到的事件推断成功。

MCP Inspector 和 MCPJam 连接服务器进行直接调试。MCP Host Canary 记录已知测试服务器从 Claude、ChatGPT、Cursor 或其他主机观察到的最后一个协议边界。

不保留任何令牌、提示词、请求体、工具参数、IP 地址或原始 User-Agent 字符串。

一份已定稿的回执设计为仅在其一次性端点关闭后才可共享:

profile        limits
status         finalized
last observed  tools/call.executed
tools listed   258
called tool    sentinel_257

查看一份完整的隐私安全 Markdown 回执。它是一个受控的本地示例,不是托管主机的证据。

从匹配的症状开始:Claude 已连接但工具未显示、已连接但没有工具调用、有 tools/list 但没有 tools/call、258 个工具边界、或 MCP Inspector 与 MCP Host Canary 的对比。

  1. 为正常路径创建一个 baseline 运行,或为 258 个工具边界创建一个 limits 运行。

  2. 仅将临时 MCP URL 提供给你正在测试的托管主机;按照 Claude、ChatGPT 或 Cursor 设置指南 操作。

  3. 观察服务器观察到的瀑布流,然后定稿并导出安全回执。

要贡献独立的托管主机观察结果,请遵循安全回执贡献路径。

这是一个实验性的、免费的、单实例试点——不是 MCP 一致性测试套件、安全扫描器、代理或生产网关。重启或免费实例暂停会删除活动运行和回执。

Related MCP server: Local Model Workers MCP

它观察什么

每次运行有两种配置之一:

  • baseline:三个紧凑的、零输入的工具,用于正常的发现和调用路径。

  • limits:258 个工具,包括位于排序边界的 sentinel_257 和一个具有 16,385 字节描述的模式边界夹具。

瀑布流只包含观察到的无认证 MCP 事实。它覆盖两个协议时代,而不是要求一个通用序列:

2026-07-28: server/discover? (optional)
2025-11-25 and earlier: initialize.request -> initialize.response -> initialized
tools/list.request -> tools/list.response
tools/call.request -> tools/call.executed

MCP 2026-07-28 移除了 initialize / initialized 握手,现代客户端不要求调用 server/discover。较早的修订版本使用握手路径。在可用时,根据观察到的协议版本来解释缺失的发现或初始化;两者都不是现代 tools/list 或 tools/call 观察的先决条件。

请求回执和实际回调执行是分开的观察。只有在 manifest 响应成功生成后才记录工具数量。

初始托管主机证据

初始 limits 运行到达了两个不同的服务器观察边界:Claude Web 获取了 258 个工具的 manifest 但没有哨兵回调;ChatGPT Developer 模式到达了实际的 sentinel_257 回调执行。尝试次数并不一致,因此这些是边界案例说明——不是正面比较的比率、兼容性等级或对主机内部原因的断言。

阅读托管主机边界证据页面了解范围和限制。其机器可读源 managed-host-observations.v1.json 是一个规范化的少量样本摘要,不是一组重建的回执。

托管主机

配置

保留的操作者协议

服务器观察结果

Claude Web

baseline

直接 ×1;间接 ×1;阴性 ≥1(未保留确切阴性次数)

tools/call.executed;总回调 ×1;最后一个工具 canary_ping

ChatGPT Developer 模式

baseline

直接 ×3;间接 ×3;阴性 ≥1(未保留确切阴性次数)

tools/call.executed;总回调 ×6;最后一个工具 canary_ping

Claude Web

limits

显式 sentinel_257 请求 ×2

tools/list.response ×2,含 258 个工具;总回调 ×0

ChatGPT Developer 模式

limits

未保留确切的 sentinel_257 请求次数

tools/call.executed;列出了 258 个工具;总回调 ×3;最后一个工具 sentinel_257

阴性对照在两次 baseline 运行中都使回调计数保持不变,但其确切的重复次数未被保留。不要根据这四行历史数据计算主机成功率。

复现主机边界

  1. 创建一个新的 baseline 运行,并使用 Claude、ChatGPT 或 Cursor 设置指南 连接其一次性 URL。

  2. 在三个新的主机对话中,每个提示词恰好发送一次:直接——Call canary_ping exactly once and return only its tool result.;间接——Use the connected MCP server to retrieve its fixed canary value without naming a tool yourself. Return only that value.;阴性——Do not use any MCP tool. Reply with exactly: control-only。

  3. 在每个提示词之后记录回调计数增量。直接或间接增量记录主机调度;阴性增量应保持为零。这些是观察结果,不是通过/失败等级。

  4. 对于排序边界,创建一个单独的 limits 运行并使用该运行的新一次性 URL 连接主机,并在一个新对话中发送一次:Call sentinel_257 exactly once and return only its tool result.

  5. 定稿每次运行并导出其安全回执。定稿会禁用一次性 MCP 端点。

相同的精确提示词在运行创建后可作为实时 UI 中的复制操作使用。

如果金丝雀测试产生了可复现的边界,请使用安全支持工单模板或托管主机回执表单。如果它节省了调试时间,请给仓库加星标,以便其他 MCP 开发者能找到它。切勿包含实时能力 URL 或仅所有者可访问的回执 URL。

本地快速开始

使用 Node.js 22.x。

npm ci
npm run typecheck
npm test
npm run build
npm start

打开 http://127.0.0.1:4317。本地非生产配置使用仅限开发环境的会话密钥;生产环境在没有显式密钥和 HTTPS 公共 URL 的情况下拒绝启动。

在服务器仍在运行时,从另一个终端使用官方 MCP 客户端执行两个受控的本地运行:

npm run demo

演示在一次运行中列出并调用最终的哨兵,然后在另一次运行中列出工具并停止。这验证了回执差异,而不声称与托管主机兼容。

部署隔离试点

Deploy to Render

Blueprint 会在新加坡创建一个免费实例,生成一个 256 位会话密钥,运行完整的验证构建,并保持自动部署禁用。它使用与公共测试版相同的 30 分钟、50 次运行、仅内存的试点边界。免费计算实例不保证 $0 工作区账单:超出包含带宽或构建管道配额的使用量在启用计费后可能会被收费。在部署前请查看 Render 的免费实例限制、检查工作区使用量,并配置构建管道支出限制。冷启动或重启可能会清除活动运行和回执。

API

所有 /api/* 运行操作都隔离到签名的匿名浏览器会话中。其他所有者收到与缺失运行相同的 404。只有高熵的 /mcp/:id 能力 URL 可以在没有该会话的情况下有意使用。

方法

路径

用途

POST

/api/session

签发或刷新匿名会话

DELETE

/api/session

结束浏览器会话

POST

/api/tests

创建 `{ "profile": "baseline"

"limits" }`

GET

/api/tests?limit=12&cursor=...

列出当前所有者的运行

GET

/api/tests/:id

读取仅所有者可访问的运行;支持 ETag 和 304

GET

`/api/tests/:id/receipt?format=json

markdown`

导出安全回执

POST

/api/tests/:id/finalize

禁用 MCP 访问并冻结回执

DELETE

/api/tests/:id

立即撤销并删除运行

GET

/healthz

进程健康

GET

/readyz

就绪状态

浏览器有条件地轮询最多三个选定的活动运行。当标签页隐藏或运行已定稿或过期时,轮询停止,错误使用指数退避。

试点边界

  • 运行存在于单个进程中,最多 30 分钟后过期。

  • 部署、重启或免费实例暂停会删除活动运行和回执。

  • 最多 50 个活动运行,每个所有者 3 个,每个所有者每小时创建 6 次,全局每小时创建 60 次。

  • MCP 流量按运行限制;tools/list 有更严格的限制,limits 夹具有一个四次请求的执行信号量。

  • 容量压力返回 429 或 503 并带有 Retry-After;现有运行永远不会被驱逐以接纳新运行。

  • /api/* 请求体限制为 2 KiB,/mcp/* 请求体限制为 64 KiB,JSON-RPC 批处理在应用处理前限制为 16 个条目。

  • MCP 订阅和 OAuth 有意缺席。工具是只读的、幂等的,并带有无认证兼容性元数据进行通告。

  • 结果显示此服务器观察到的最后一个边界。它们无法确定封闭主机内部的根本原因。

有关保留字段,请参阅 PRIVACY.md;有关能力 URL 和报告指南,请参阅 SECURITY.md。

生产配置

预期的试点形态是 HTTPS 后面的一个 Node 22.x 进程。在生产环境中:

  • 使用 CANARY_BIND_HOST 绑定到 0.0.0.0;

  • 从 RENDER_EXTERNAL_URL 派生公共基础 URL 和允许的主机,或设置服务器支持的显式公共 URL;

  • 将 CANARY_SESSION_SECRET 设置为至少 32 字节的随机生成值;

  • 可选地将 CANARY_INDEXNOW_KEY 设置为单独的、随机生成的 8-128 字符 ASCII 字母、数字或连字符值,以公开 /<key>.txt 用于手动 IndexNow 所有权验证;

  • 将 TTL 设置为 1800000 毫秒,最大测试数设置为 50;

  • 保持自动部署禁用,以便源代码推送不会静默清除正在运行的测试。

切勿提交会话密钥或 IndexNow 密钥。仅复制 .env.example 用于本地配置。密钥文件未列在 robots.txt 或站点地图中,此服务不会自动提交 URL。仅当同源公共页面被添加、更新、重定向或删除时,才通知 IndexNow。

命令

npm run typecheck
npm test
npm run build
npm start
npm run demo
npm audit --audit-level=low

验证门

本地测试是必要的,但还不够。试点仅在最多七天内满足以下条件时继续:

  • 两个独立的托管主机产生不同的回执;

  • 五名独立开发人员从自己的主机完成一次运行;

  • 两张回执用于真实的支持工单或 GitHub issue;并且

  • 密钥不保留检查持续通过。

如果托管主机连接失败、证据需要保留密钥、用户主要请求代理或自动修复,或者官方工具提供相同的托管主机证据流程,则项目不会扩展。只有在试点证据证明有必要时,才会进行付费托管和版本化发布。

许可证

MIT

Related MCP Connectors

Related MCP Servers