[BUG] 2.1.153 silently discards tools/list response from rmcp 0.12.0 HTTP MCP server (works in 2.1.152, wire-identical handshake)
What's Wrong
2.1.153 completes the full MCP handshake against an HTTP server backed by rmcp 0.12.0 — initialize → notifications/initialized → GET /mcp SSE → tools/list (200, full tool list) — then silently does not expose those tools to the model. Zero tool_use blocks; the model writes tool-call notation as text. Exit 0, no error event, no stderr. 2.1.152 with the byte-identical wire interaction surfaces the tools normally.
Wire-level diff (logging HTTP proxy between claude and the rmcp server)
Both versions send byte-identical initialize:
{"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{"roots":{},"elicitation":{}},"clientInfo":{"name":"claude-code","version":"<2.1.152|2.1.153>",…}},"jsonrpc":"2.0","id":0}
Both receive (rmcp 0.12.0):
{"jsonrpc":"2.0","id":0,"result":{"protocolVersion":"2025-03-26","capabilities":{"tools":{}},"serverInfo":{"name":"rmcp","version":"0.12.0"},…}}
Both then: notifications/initialized (202), GET /mcp SSE (200), tools/list (200 SSE, 7403-byte response listing every tool).
Divergence is purely post-tools/list:
- 2.1.152 → emits
tools/callwithin seconds; run does real work (16–20 calls per run in my repros). - 2.1.153 → no further MCP traffic. Model produces
<details><summary>Tool use: fs_list</summary>…</details>or{"name":"fs_list","input":{…}}as text blocks.
Three 2.1.153 reruns with fresh cliSessionId → 0 tool calls. Two 2.1.152 runs (direct + proxied) → 16 and 20. Deterministic.
Repro
claude against the rmcp 0.12.0 HTTP MCP server in CLAI, any prompt that needs tools. 2.1.152 works, 2.1.153 silently doesn't. Synthetic Python mcp 1.27 HTTP servers (with or without auth, stateful or stateless) do not reproduce — so the trigger is something in the response shape rmcp 0.12.0 returns. Suspects per tool entry: inputSchema.$schema (draft-2020-12), annotations.openWorldHint, or the absence of capabilities.tools.listChanged in the server's init response.
Meta
Regression, last working 2.1.152. Platform: Anthropic API (subscription login), Linux (Arch), non-interactive sdk-cli entrypoint. Workaround: npm install -g @anthropic-ai/claude-code@2.1.152. Silent failure → autonomous schedulers see exit 0 and advance thinking the run succeeded. Same release as #62972 (Discord) and #60428 (Slack) — same silent-MCP-drop pattern.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗