菜单

MCP server 多久换一次工具?两周内,每五台里有一台换过

2026-10-14MCP Checkup

我们的探测器每 12 小时向目录里的每个 server 要一次工具列表,不带凭据,把拿到的结果存下来。把两次的列表并排放,就能看出这个 server 的工具在这期间有没有变。这篇文章统计的就是这件事有多频繁,范围是我们至少读到过两次工具列表的全部远程 MCP server。

什么算一次变化

每读到一份列表,我们都会算一个工具集指纹:把工具名排好序,再做哈希。所以顺序无关,只看名字:同一个名字下换了描述或输入 schema,指纹不变。描述的情况放在后面讲。

一次变化,是同一个 server 相邻两次成功读取的指纹不同。读取失败的那次跳过,下一次成功读取和它之前最后一次成功读取比较。server 的第一次读取不算变化。

我们排除了 5 个 server。2 个是使用 Indie 档的已认领 server,每 15 分钟读一次,用的是另一套时钟。3 个返回的是分页列表:应答里带着下一页的游标,而我们从不取下一页,所以它们的第一页可能两次读取不一样,工具本身却没变。剩下 1,893 个至少读过两次的 server。

我们还找了「看起来是变化、其实不是」的情况。没有一次变化只是由重复的名字造成的:每次变化都至少新增或去掉了一个名字。如果是我们这边的改动引起的,会表现为某一轮 12 小时里集中爆发,因为每个 server 每轮读一次。我们没有看到这种情况:9 月 17 日到 10 月 7 日,每天每 1,000 次成功读取里,有 10 到 26 次和上一次不同,而较忙的那几天,变化是分散在一整天里的。

两周内,五台里有一台

1,893 个 server 里,415 个至少变过一次工具集,占 22%。但 server 加入目录的时间不同。有的我们读了 47 天,有的不到一天,中位数是 9 天。所以更公平的问法是:同样长的时间里,有多少变过。

至少读了 server 数 这段时间内变过 占比
7 天 1,419 215 15%
14 天 803 180 22%
21 天 546 156 29%

每一行只计每个 server 被观测的前 7、14 或 21 天内的变化。各行不是同一批 server:21 天那一行只包括我们读得最久的那些。

多数变化来自少数 server

这 415 个 server 一共变了 788 次:

每个 server 的变化次数 server 数
0 1,478
1 242
2 88
3 到 5 72
6 到 10 11
超过 10 2

变了三次及以上的 85 个 server,占 1,893 个的 4.5%,贡献了 788 次里的 370 次,将近一半。变得最多的一个 server 变了 13 次。按累计约 24,000 个 server 日的观测平均,是每个 server 每 31 天变一次;但大多数 server 从没变过,这个平均数说明不了多少。

多数变化是新增工具

我们比较了每次变化前后的工具名:

变化类型 次数 占比
只新增名字 667 85%
只去掉名字 56 7%
既有新增也有去掉 65 8%

总共出现了 3,040 个新名字,消失了 963 个。变化都不大:318 次只涉及一个名字,中位数是两个。在变过的 415 个 server 里,364 个最后的工具比最初多,33 个比最初少,18 个数量相同。只有 11 次变化回到了这个 server 之前出现过的某个工具集,所以在同一个地址后面两个版本来回切换的 server 很少。

工具越多,越常变

至少读了 14 天的 803 个 server,按第一次读取时的工具数分组:

第一次读取时的工具数 server 数 14 天内变过 占比
0 到 5 362 56 15%
6 到 10 211 34 16%
11 到 20 130 39 30%
21 到 50 71 33 46%
51 及以上 29 18 62%

最后一行样本小,但五行的方向一致。

两次变化隔多久

在变过两次及以上的 173 个 server 里,相邻两次变化的间隔中位数是 36 小时。四分之一的间隔在 12 小时以内,也就是只隔一次读取;四分之一超过四天半。短于 12 小时的变化我们看不到:两次读取之间加上又删掉的工具,不会留下痕迹。

名字不是全部

从 9 月 16 日起,我们还会对每个工具的名字、描述和输入 schema 一起算一个摘要。比较相邻两次都有摘要的读取:405 个 server 改过工具名,共 755 次;566 个 server 名字一个没变、但改了描述或 schema,共 1,378 次。其中一部分很可能是每次请求都不一样的文字,比如描述里的日期;我们没有把这部分单独分出来。

给维护者

目录里每个 server 的页面会显示它的工具集最近一次变化是什么时候(用的是同一个指纹),以及是否在最近 7 天内;统计页会统计最近 7 天有多少 server 变过。我们不带凭据读取,所以我们比较的列表,就是任何匿名客户端拿到的列表。如果页面上的日期让你意外,说明某个环节给出了和你预期不同的列表:一次部署、一个功能开关、一个地区。

去掉名字的变化少一些,788 次里有 121 次,而正是这类变化会让还拿着旧列表的客户端出错。协议里有通知的办法:在 tools 上声明了 listChanged 能力的 server,会在列表变化时告诉已连接的客户端,客户端可以重新获取。

给 agent 开发者

只取一次的工具列表只是一个快照。大约每五个 server 里就有一个在两周内给出了不同的列表;第一次读取时工具超过 20 个的 server 里,大约一半变过。多数变化是新增,所以过期的列表通常是漏了新工具,而不是指向已经不存在的工具,但也不总是这样。如果你要记录 server 的某些信息供以后对比,只记名字会漏掉大部分变化。agent 自己添加 server 时能检查些什么,见这一篇。

我们怎么数的

范围:至少存有一份工具列表的 1,903 个 server,去掉每 15 分钟读一次的 2 个已认领 server,以及返回分页列表的 3 个;剩下的 1,898 个里,1,893 个至少读过两次。时间:2026 年 10 月 8 日 UTC 13:22 到 13:29,对生产数据库的只读查询。最早的一份列表来自 8 月 20 日。

一次读取,是探测器不带凭据发出 tools/list 后得到的一次成功应答。工具集是应答里的工具名排序后的列表。一次变化,是同一个 server 相邻两次读取的工具集不同。新增和去掉的名字,是只出现在变化某一侧的名字。一个 server 的观测窗口,从第一次读取到最近一次读取。

已知局限。短于 12 小时的变化看不到(见为什么每 12 小时探测一次)。分页列表只看到第一页。先要密钥的 server 不在这些数字里(每 10 个里有 3 个)。描述的比较从 9 月 16 日开始。我们也看不到列表为什么变:一次发布、一次配置修改、换了一个后端来应答,或者工具取决于我们没有发送的东西。