[BUG] Claude Desktop 2.1.126 (2026-05-12): tools/call never written to MCP server stdin — UI spinner hangs forever, log shows no tools/call entry

Resolved 💬 2 comments Opened May 13, 2026 by francosolerio Closed May 16, 2026

Preflight Checklist

  • [x] I have searched existing issues and this hasn't been reported yet
  • [x] This is a single bug report (please file separate reports for different bugs)
  • [x] I am using the latest version of Claude Code

What's Wrong?

After connecting any local stdio MCP server, the full lifecycle works:

  • initialize → OK
  • notifications/initialized → OK
  • tools/list → OK (tools appear in the UI)
  • claude mcp list reports the server as ✓ Connected

But the moment the model attempts a tools/call, the UI shows the spinner ("Utilizzo di cupertino: search · 5m 28s · 25 tokens") and never moves. The token counter stays frozen — the model is not waiting on a slow response, it is blocked before sending the request.

No "method":"tools/call" line ever appears in ~/Library/Logs/Claude/mcp-server-<name>.log. The request is never written to the server's stdin.

Verified the MCP server binary is healthy

Feeding the same JSON-RPC sequence by hand via stdio returns tools/call results in milliseconds:

{ printf '%s\n' '{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"test","version":"0.1"}}}'
  printf '%s\n' '{"jsonrpc":"2.0","method":"notifications/initialized"}'
  printf '%s\n' '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
  sleep 1
  printf '%s\n' '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search","arguments":{"query":"NavigationStack","limit":3}}}'
  sleep 2
} | /opt/homebrew/bin/cupertino serve

→ valid response in <100 ms, no error.

Not server-specific

Reproduced with two unrelated MCP servers:

  • cupertino 0.10.0 (native Swift binary, Apple docs MCP)
  • iterm-mcp (Node.js, via npx -y iterm-mcp)

Same symptom in both. So the regression is in the Claude Desktop MCP client dispatch path, not in any individual server.

New disclaimer helper introduced in this build

The 2026-05-12 build adds a new wrapper at /Applications/Claude.app/Contents/Helpers/disclaimer. Every configured MCP server is now spawned as:

/Applications/Claude.app/Contents/Helpers/disclaimer /path/to/server serve

strings on the helper shows it is just a shim around responsibility_spawnattrs_setdisclaim() (a private macOS API to detach TCC responsibility from the parent process). Its only relevant strings are:

Usage: disclaimer <command> [args...]
Failed to set disclaim attribute: %s

It should be transparent on stdio (just execs the child after the disclaim syscall), but its introduction is coincident with this regression for me. Worth checking whether the shim's process detachment is interacting badly with how the parent pipes JSON-RPC to the server's stdin after tools/list.

Related issues

  • #37806 — same symptom, macOS Apple Silicon, March 2026, marked stale and now locked so I can't comment there. Root cause is very likely the same.
  • #58771 — different MCP regression filed for build dated 2026-05-12 (Optional[List[str]] serialization). Suggests a broader MCP client regression landed in that build.
  • #22299 — similar "tools/call never appears in log" symptom on Windows, regression in CCD v2.1.22.
  • #50319 — silent tools/call hang in a different edge case (namespace collision); also macOS.

Platform

Claude Desktop (macOS app)

What Should Happen?

After a successful tools/list, tools/call requests should be written to the MCP server's stdin and the response returned to the model. If the dispatch fails the client should surface an error, not hang the UI indefinitely.

Error Messages/Logs

Steps to Reproduce

  1. macOS Tahoe (26), Apple Silicon, Claude Desktop with Claude Code 2.1.126 (build dated 2026-05-12).
  2. Configure any local stdio MCP server in ~/Library/Application Support/Claude/claude_desktop_config.json, e.g. cupertino:
{
  "mcpServers": {
    "cupertino": {
      "command": "/opt/homebrew/bin/cupertino",
      "args": ["serve"]
    }
  }
}
  1. Start a new conversation and ask the model to use a cupertino tool (e.g. "use cupertino to search for NavigationStack").
  2. Observe the "Utilizzo di cupertino: search" spinner with the token counter frozen for minutes.
  3. tail -f ~/Library/Logs/Claude/mcp-server-cupertino.log while the spinner spins — you will see tools/list and resources/list arrive and be answered, but no "method":"tools/call" line ever appears.

Claude Model

Opus

Is this a regression?

Yes, this worked in a previous version

Last Working Version

Worked before the 2026-05-12 Claude Desktop build (binaries in /Applications/Claude.app/Contents/Helpers/ are dated 2026-05-12, which matches the day the failure began).

Claude Code Version

2.1.126

Platform

Other

Operating System

macOS

Terminal/Shell

Terminal.app (macOS)

Additional Information

_No response_

View original on GitHub ↗

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