菜单

探测器有时会扣下的那一次调用

2026-09-30MCP Checkup

我们有一项检查 error_taxonomy,需要探测器调用一次工具。它只调用一个,名字是我们保留给「不应存在的工具」的 __mcpcheckup_probe_nonexistent_tool__。要观测的是:server 收到一个它没有的工具的调用时怎么处理。server 们都怎么答复,我们写过一篇。

我们也在认领页和另一篇文章里说过:我们从不调用你的任何工具。这两句话要同时成立,前提是这个保留名不是你的工具。可是没有任何东西能阻止 server 定义一个同名工具。所以探测器不作假设,而是先核对。

什么时候扣下这次调用

调用之前,探测器先向 server 要工具列表。只要下面任何一条成立,就扣下这次调用:

  • 列表第一页里有一个名字完全相同的工具(逐字比较:不忽略大小写,不去空白);
  • 探测器没有读完整份列表:它读到的某一页带着 nextCursor,指向一页它没读的内容,所以看不到那一页里有没有这个名字;
  • 列表读不出来;
  • 握手或工具列表被凭据门控挡住。

所以,只有在探测器不带凭据把工具列表读到最后一页(不再带 nextCursor 的那一页)、且读到的各页都不含这个名字时,才会发出这次调用。除了凭据门控,握手结果不影响这一点:握手因为别的原因失败的运行,只要工具列表干净地返回,仍然会发出这次调用。

调用被扣下时,error_taxonomy 记为跳过、未核实,并附上原因;报告页会写明是哪个原因。它从不显示为失败。

第四条是后来加的

前三条规则 2026-09-23 进入探测器,第四条 2026-09-26 进入。

在那之前,被凭据门控挡住时,探测器仍然会发出这次调用,因为 auth_metadata 检查读的是这次调用返回的 401。当时的考虑是:凭据门控后面的 server 不会替没有密钥的调用方执行工具。但这只有在门控也挡住工具调用时才成立。如果一台 server 只门控工具列表、不门控工具本身,又恰好定义了这个保留名,那个工具就会被执行。从 2026-09-26 起,auth_metadata 改读探测器已经从门控那里收到的质询,这次调用不再发出。

我们没有证据表明这种情况发生过。我们也看不到那些 server 的工具列表,而这正是问题所在:只在运气好时才成立的承诺,不是我们做出的承诺。

有多常见

2026-09-30 我们观测的 2,282 个公开端点,各自最近一次运行:

保留名调用 端点数
发出,并判定了答复 1,424
扣下:凭据门控 704
扣下:工具列表读不出来 133
扣下:列表还有后续页 1
扣下:列表里有这个保留名 0
没走到这一步:我们的时间或大小预算用完了,或 server 要求我们放慢 20

自 2026-09-23 以来,在我们能读到的所有工具列表里,这个保留名一次也没出现过。

代价

扣下一次调用,就少一项观测。对这些端点,报告说不出它们怎样拒绝未知工具;在列表读不出来的情况下,auth_metadata 也没有可读的东西。我们宁可记下「没有观测」并写明原因,也不愿靠执行一个 server 可能当真的调用来换取这项观测。

如果你维护一台 server

请不要把工具命名为 __mcpcheckup_probe_nonexistent_tool__。如果你的工具列表是分页的,探测器不会发出这次调用。这是有意的设计,你的报告会写明原因。

数字从哪里来

2026-09-30 20:05 UTC 对生产数据库做的只读查询:每个公开 target 最近一次完成的运行里 error_taxonomy 的结果;对因列表无法核实而扣下的,再看同一次运行里 tools_list 的结果。「保留名出现过几次」是对全部已存 error_taxonomy 行的计数。文中日期是各版检查套件进入探测器的日子。