[BUG] MCP stdio server lists no tools since protocol 2026-07-28 is negotiated (tools/list times out, mcp-grafana)

Status Fixed / completed
Reported on v2.1.220
Maintainer reply None cached
Activity 3 comments · opened Sep 25, 2026 · closed Sep 28, 2026

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-grafana over stdio (uvx mcp-grafana --disable-write), declared in local scope
  • Other stdio servers in the same session (Laravel Boost) negotiate 2026-07-28 too 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.

View original on GitHub ↗

3 Comments

ogmdev · 19 days ago

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-prod and grafana-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 every 2026-07-28 connection times out. Possibly related: #96183, #88128.

ogmdev · 19 days ago

Root cause found, and it is server side. With 2.1.281 Claude Code negotiates 2026-07-28 and sends server/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 the subscriptions/listen line removed, tools/list returns 65 tools immediately; with it, no answer. The per-server "flakiness" in my previous comment matches which servers got the legacy initialize path vs the 2026-07-28 path.

Upstream: grafana/mcp-grafana#1241 (closed as duplicate) → fix in grafana/mcp-grafana#1236 (bump mark3labs/mcp-go to v1.1.1, stdio subscriptions/listen deadlock), still open; v1.6.0 does not include it.

Workaround that works here: wrap the stdio server so the subscriptions/listen request 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=legacy is reported in #1241 as another workaround.

Client-side suggestion: a subscriptions/listen that stays unanswered should not block tool discovery; a timeout on it could fall back to listing tools without subscription.

ogmdev · 17 days ago

Resolved on our side: mcp-grafana v1.6.1 (released 2026-09-28, includes grafana/mcp-grafana#1236) answers tools/list after subscriptions/listen. With the workaround removed, all three stdio servers list their tools and Loki queries succeed under Claude Code negotiating 2026-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 unanswered subscriptions/listen).