MCP server 多久换一次工具?两周内,每五台里有一台换过
我们的探测器每 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 日开始。我们也看不到列表为什么变:一次发布、一次配置修改、换了一个后端来应答,或者工具取决于我们没有发送的东西。