MCP stdio servers using rmcp >= 0.2 show 'tools fetch failed' — client not sending initialized notification

Resolved 💬 3 comments Opened May 16, 2026 by colorpanda82 Closed Jun 15, 2026

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:

  1. Client → initialize request
  2. Server → initialize response
  3. Client → {"jsonrpc":"2.0","method":"notifications/initialized","params":{}}missing
  4. Client → tools/list request

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.

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗