MCP stdio servers using rmcp >= 0.2 show 'tools fetch failed' — client not sending initialized notification
Claude Code version: 2.1.143
OS: macOS 25.3.0 (arm64)
Summary
Any MCP stdio server that strictly implements MCP 2024-11-05 (e.g. those using the rmcp Rust SDK >= 0.2) shows △ connected · tools fetch failed in /mcp. The server connects but tools never load.
Root cause
The MCP 2024-11-05 spec requires the client to send an initialized notification after receiving the initialize response, before sending any other requests:
- Client →
initializerequest - Server →
initializeresponse - Client →
{"jsonrpc":"2.0","method":"notifications/initialized","params":{}}← missing - Client →
tools/listrequest
Claude Code's MCP client skips step 3. Servers that enforce this (rmcp raises "expect initialized notification, but received: ListToolsRequest") reject the subsequent tools/list, producing "tools fetch failed".
Reproduction
# Install any rmcp-based server, e.g. https://github.com/madeye/mcp-distill
# Add to ~/.claude.json as a stdio MCP server
# Run: claude /mcp → shows "connected · tools fetch failed"
Manually confirming the binary works correctly with the full handshake:
printf '{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}\n{"jsonrpc":"2.0","method":"notifications/initialized","params":{}}\n{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}\n' \
| mcp-distill serve 2>/dev/null
# → returns all 11 tools cleanly, exit 0
Without the notifications/initialized step, the server responds:
Error: expect initialized notification, but received: Some(Request(...ListToolsRequest...))
Expected behaviour
CC sends notifications/initialized after receiving the initialize response, per MCP 2024-11-05 spec §3.1.
Workaround
None client-side — rmcp enforces this at the library level.
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗