MCP 工具 schema 被拒后,别再每轮 400:Claude Code 会跳过参数继续聊
你可能遇到过这种场面:会话里挂着几个 MCP 服务器,一切正常;某次更新或新加了一个工具之后,接下来每一轮请求都报 HTTP 400,发什么都失败,只能 /clear 或关掉那个 MCP 才能继续。
根因常常不是你的提示词,而是某个 MCP 工具的 input schema 不合 Anthropic API 的胃口——请求里带着这份 schema,整包被拒;下一轮又带着同一份 schema,于是再拒一遍。
CLI 2.1.300 修了这件事:一旦 API 因为某个 MCP 工具的 input schema 拒绝了请求,Claude Code 会在本会话剩余时间里,把该工具改成「不带参数」再发给模型,这样对话可以继续,而不是每轮都 400。
以前会发生什么
简化成一条链:
- MCP 服务器声明了一个工具,其 JSON Schema(
inputSchema)有问题——例如不支持的关键字、错误的$ref、过于嵌套、类型写法 API 不接受等; - Claude Code 把工具列表(含这份 schema)放进对 Anthropic 的请求;
- API 返回 400;
- 你改提示词、重试、换模型——只要工具列表还在,每一轮照样 400。
从用户视角看,就像「Claude Code 突然坏了」;其实是某一个坏掉的工具定义拖垮了整次会话的请求。
现在的行为
2.1.300 之后:
- 第一次因 schema 被拒时,Claude Code 会识别到问题出在某个 MCP 工具上;
- 本会话后续请求里,这个工具会以不带参数的形式继续出现(避免再把坏 schema 送上去);
- 其它工具、其它 MCP 服务器不受影响,对话可以继续。
注意:这是会话级缓解,不是自动修好了 MCP。新开会话、重启 Claude Code 之后,如果 schema 还没改好,第一次请求仍可能撞上同样的 400,然后再进入「跳过参数」模式。
你还需要修 MCP 本身
跳过参数只是让你不至于被卡死。那个工具本身:
- 模型可能看不到完整参数说明,调用时更容易猜错字段;
- 真正要稳定用这个工具,仍应修服务器端的
inputSchema。
排查建议:
- 缩小范围:临时关掉刚加的 MCP / 插件,看 400 是否消失,定位到具体服务器;
- 对照官方工具定义:用
claude mcp list/ 服务器自带的文档,检查每个工具的 schema 是否过于花哨(复杂oneOf、allOf、自定义扩展字段等); - 看错误正文:400 响应里通常会点名哪段 schema 不合法,对照改工具定义;
- 升级 MCP SDK / 服务器:不少社区 MCP 在近期修过「Anthropic 不接受的 schema」问题。
和「工具描述太长」不是同一类问题
站内另有文章讲 MCP 工具描述长度被截断或限制(例如描述字符上限)。那种是「描述被切短」,请求一般仍能成功。本文说的是 schema 本身被 API 拒绝 → 整请求 400。两者都和 MCP 有关,但症状和修法不同:一个是缩短/精简描述,一个是修好 JSON Schema。
小结
- 2.1.300:某个 MCP 工具的 input schema 被拒后,本会话后续不再每轮 400,而是跳过该工具参数继续聊;
- 这是护栏,不是根治——坏 schema 仍应在 MCP 服务器侧修好;
- 若刚接了一个新 MCP 就全会话 400,优先怀疑那个服务器的工具定义,而不是模型或网络。
升级后,偶发的「坏 MCP 把整窗对话钉死」会少很多;长期仍建议把 MCP 的 schema 当成对外 API 合同来维护。