监测发现36小时内4.4%的MCP服务器更改工具inputSchema,其中15个已有工具契约被破坏性修改,可导致Agent缓存失效和调用错误。
两天前,我对公共 MCP 注册表的工具接口进行了编目:随机抽样 500 个活跃服务器,捕获 477 个工具清单,对每个工具的 inputSchema 进行了哈希处理。
今天,我对相同的服务器重新运行了该操作——相同的随机种子、相同的样本——并对哈希值进行了比对。
475 个可比较的服务器中,有 21 个在约 36 小时内改变了它们的工具契约。这占 4.4%。
中间的行是最无趣的。添加工具是安全的——昨天有效的任何东西都不会停止工作。
其他两行才是问题所在。
最危险的类别是无声的那一个
15 个服务器改变了一个保留了名称的工具的 inputSchema。其中包括:
get_model_pricing modelpricewatch.com
poll_for_upload ai.moda/mcp-servers/remote-camera
search_incidents gateway.pipeworx.io/ai-incident-db
wsdot_get_toll_rates wsdot.caseyjhand.com
get_article childadhd.ai
list_deputies gateway.pipeworx.io/nosdeputes-fr
如果你的 agent 昨天发现了 get_model_pricing 并缓存了它的样子,现在它调用该工具时就会使用错误的形状。没有人宣布过这个改变。服务器正在运行。工具还在那里。名称完全相同。正常运行时间监控显示完美的绿色。
你只在调用时才会发现问题,在运行过程中,它表现为参数验证错误,或者——更糟的是——看起来像一个 model 幻觉出了某个参数。这是一件很令人讨厌的调试事情,因为每一个直觉都指向你的 prompt 而不是第三方的 schema 在你不知情的情况下改变了。
一个服务器完全删除了一个工具:mcp.argo.games 中的 invite_user_by_email 消失了。那个至少失败得很响。
这个比率意味着什么和不意味着什么
我在 36 小时的时间窗口内测量了 4.4%。这是诚实的表述,我想小心地对这一数字进行什么样的推断。
你可能天真地将其年化——一个恒定独立的 2.9%/天意味着大约 59% 的服务器在一个月内发生变化——但我认为你不应该相信这个数字,包括来自我的。Schema 变更不是独立的硬币翻转。它们会聚集:一个积极开发的服务器会多次改变,一个不活跃的服务器永远不会改变。这周移动的 21 个服务器不相称地是下周也会移动的那些。
所以更有用的说法更窄,但仍然引人注目:在任何给定的一天,你依赖的 MCP 服务器中有几个百分比会改变它们的工具契约,这些改变中的大多数对检查主机是否启动的任何东西都是无形的。
获得真实数字的方法不是更好的推断。而是更多的快照。我会继续拍摄它们。
为什么我比正常运行时间数字更在乎这个
我现在测量了关于这个注册表的三件事:大约四分之一的端点不为匿名客户端提供服务,故障按托管平台集中,现在契约在你下面以每天几个百分比的速度移动。
我最初假设宕机是有趣的故障。它不是。宕机很响,你会立即发现。有趣的故障是肯定正在运行但不再执行你的 agent 学到的行为的服务器。
这种重新框架化来自一个读者,而不是来自我。在普查帖子上,Mads Hansen 论证我应该停止将结果折叠成可达-vs-损坏,而是追踪四个正交状态:传输可达性、协议协商、认证行为和契约兼容性。401 是对前两个的积极证据,对后两个没有说明。他是对的,这篇帖子基本上是第四个状态第一次被测量。
从 5,346 个注册表列出的完成匿名握手的服务器中提取 500 个端点的随机样本,random.seed(20260730) 使重新运行命中相同的服务器。对于每一个:initialize → notifications/initialized → tools/list,处理 SSE 框架化的响应并在后续操作上线程化 Mcp-Session-Id(几个服务器需要两者,如果跳过任何一个,你会得到一个空的库存)。每个工具 inputSchema 的 SHA-256,排序的键。
基准 2026-07-30,重新运行 2026-08-01,475 个服务器在两个中都可比较。两个从可读集合中掉出,一个回来了——我将所有三个都排除在外,而不是猜测发生了什么。
快照是时刻,不是真理。其中两个是一条线,不是趋势。这是第二个。