[BUG] MCP stdio server lists no tools since protocol 2026-07-28 is negotiated (tools/list times out, mcp-grafana)
Summary
Since this afternoon (2026-09-25, between 13:33 and 14:21 UTC), Claude Code negotiates MCP protocol 2026-07-28 with stdio servers. With mcp-grafana (v1.5.1 and v1.6.0), the connection succeeds but tools/list and resources/list time out after 30 s, so the server exposes no tools. The same servers worked earlier the same day, when the negotiated version was 2025-11-25.
Environment
- Claude Code 2.1.220, desktop app (Code tab), macOS 26
- MCP server:
mcp-grafanaover stdio (uvx mcp-grafana --disable-write), declared in local scope - Other stdio servers in the same session (Laravel Boost) negotiate
2026-07-28too and work
MCP log (~/Library/Caches/claude-cli-nodejs/<project>/mcp-logs-grafana/*.jsonl)
| Start (UTC) | mcp-grafana | Negotiated protocol | Tools |
|---|---|---|---|
| 08:23 | v1.5.1 | 2025-11-25 | loaded |
| 13:33 | v1.6.0 | 2025-11-25 | loaded |
| 14:21, 15:20, 15:22 | v1.6.0 | 2026-07-28 | Failed to fetch tools: Request timed out |
| 15:51 | v1.5.1 (pinned) | 2026-07-28 | Failed to fetch tools: Request timed out |
Successfully connected (transport: stdio) in 886ms
Connection established with capabilities: {"hasTools":true,...,"serverVersion":{"name":"mcp-grafana","version":"v1.5.1"},"protocolEra":"modern","negotiatedProtocolVersion":"2026-07-28"}
Failed to fetch resources: Request timed out
Failed to fetch tools: Request timed out
Server side is fine over plain JSON-RPC
Driving the same launcher by hand, initialize with protocolVersion: "2026-07-28" is answered with "protocolVersion": "2025-11-25", and tools/list returns 65 tools immediately. Yet Claude Code logs negotiatedProtocolVersion: "2026-07-28", i.e. it seems to proceed with a version the server did not accept, and the following requests are never answered.
Expected
Claude Code falls back to the version the server returns in initialize (2025-11-25) and lists its tools, as it did before the update.
3 Comments
Additional data, 2026-09-26, same machine, same mcp-grafana binary, three stdio servers pointing at different Grafana instances, started in the same session at 06:56:54Z. Per the client's MCP logs, the version kept by the client differs per server:
grafana→2025-11-25, tools listed and queries work;grafana-prodandgrafana-preprod→2026-07-28,Failed to fetch tools: Request timed out/Failed to fetch resources: Request timed out. In another session started two minutes earlier, all three servers timed out the same way. So negotiation looks non-deterministic across servers in one session, and every2026-07-28connection times out. Possibly related: #96183, #88128.Root cause found, and it is server side. With 2.1.281 Claude Code negotiates
2026-07-28and sendsserver/discover,subscriptions/listen,resources/list,tools/list. mcp-grafana acknowledges the listen (notifications/subscriptions/acknowledged) and then never answers anything else on the stdio connection. Replaying the exact captured client traffic: with thesubscriptions/listenline removed,tools/listreturns 65 tools immediately; with it, no answer. The per-server "flakiness" in my previous comment matches which servers got the legacyinitializepath vs the2026-07-28path.Upstream: grafana/mcp-grafana#1241 (closed as duplicate) → fix in grafana/mcp-grafana#1236 (bump mark3labs/mcp-go to v1.1.1, stdio
subscriptions/listendeadlock), still open; v1.6.0 does not include it.Workaround that works here: wrap the stdio server so the
subscriptions/listenrequest never reaches it, e.g.grep --line-buffered -v method:subscriptions/listen | mcp-grafana .... Claude Code then cancels the pending listen on its own and lists the tools.MCP_PROTOCOL_NEGOTIATION=legacyis reported in #1241 as another workaround.Client-side suggestion: a
subscriptions/listenthat stays unanswered should not block tool discovery; a timeout on it could fall back to listing tools without subscription.Resolved on our side: mcp-grafana v1.6.1 (released 2026-09-28, includes grafana/mcp-grafana#1236) answers
tools/listaftersubscriptions/listen. With the workaround removed, all three stdio servers list their tools and Loki queries succeed under Claude Code negotiating2026-07-28. This issue can probably be closed, unless you want to keep it for the client-side hardening suggested above (not blocking tool discovery on an unansweredsubscriptions/listen).