Claude Desktop 1.24012.0: all MCP tool calls fail ("Failed to call tool") — tool_result POST returns 404 side_channel_waiting_key_absent while servers respond normally
Note: this is a Claude Desktop (macOS chat app) bug, not Claude Code CLI. Filing here because there is no public Desktop tracker — please route internally. Also reported via in-app feedback.
Environment
- Claude Desktop 1.24012.0 (macOS), auto-updated 2026-07-21 ~23:04 EEST — failures became persistent right after this update
- macOS 26.2 (25C56), Apple Silicon
- Multiple MCP servers affected, including Anthropic's own bundled Filesystem extension
Symptom
Every MCP tool call in Desktop chats renders as a bare "Failed to call tool \"<name>\"" — no error text at all reaches the chat (server-returned isError messages are never shown either).
- Affects ALL servers: a local stdio .mcpb extension (calibre-mcp) and the bundled Filesystem extension (
Failed to call tool "list_allowed_directories",Failed to call tool "read_multiple_files") fail identically. - Neither a full client restart (Cmd+Q) nor a fresh conversation recovers — new conversations fail from the first tool call, so this is a global client regression, not conversation-scoped state expiry.
Evidence the servers are not at fault
~/Library/Logs/Claude/mcp-server-*.logshows the server responded to EVERYtools/callwith a result in 0.7–1s during the failing sessions — no crashes, no timeouts, no stderr errors inmain.log.- The same installed bundle, driven directly over stdio JSON-RPC with a Desktop-like minimal environment, answers all tools correctly.
~/Library/Logs/Claude/claude.ai-web.logshows the real failure — the web layer cannot submit the tool result back to the backend:
POST /api/organizations/<org>/chat_conversations/<conv>/tool_result
→ 404 {"type":"not_found_error","message":"Tool result could not be submitted.
The request may have expired or the connection was interrupted. Refresh the page to continue.",
"details":{"error_visibility":"user_facing","error_code":"side_channel_waiting_key_absent"}}
Request IDs of failed tool_result submissions (for backend tracing)
| Local time (EEST) | request_id |
|---------------------|--------------------------------|
| 2026-07-07 19:54:27 | req_011Cco3g88ptXCddBusjyMhV |
| 2026-07-08 22:17:22 | req_011Ccq8PALQEDsrStVL2GU3L |
| 2026-07-19 19:21:49 | req_011CdBitkckrhDxG4xkmeQBt |
| 2026-07-20 23:15:54 | req_011CdDvYvALKEZNfSvUpdC8S |
| 2026-07-21 00:41:34 | req_011CdE35pw83UDmj9pcDdRDz |
| 2026-07-21 14:21:40 | req_011CdF7d8xRHgP2KKztCedhh |
Occurrences were sporadic before (11 since 2026-07-02); after the 1.24012.0 update the failures became persistent — every tool call, every conversation.
Expected
- Tool results submit reliably; if the side-channel key expires, the client re-establishes it transparently.
- At minimum: surface a NAMED client-side error in the chat UI instead of a bare "Failed to call tool", which looks exactly like an MCP server bug — we spent a day debugging our own server (calibre-mcp) because of it.
9 Comments
Likely the same incident as #79926 (Windows, same onset ~18:29 UTC 2026-07-21, same "Failed to call tool" symptom, remote connectors + Claude Code unaffected there too). Difference: there
tools/callnever reaches the server's stdin; here it reaches the server and a result comes back, but thetool_resultPOST fails withside_channel_waiting_key_absent. Both point at a server-side change in the tool-call side-channel rather than a client regression — my failures also predate and survive the client update to 1.24012.0.This error pattern (tool_result POST returns 404 side_channel_waiting_key_absent) usually means the server is responding correctly to the tool call, but the response delivery mechanism fails — Claude expects the result on a side channel that doesn't exist or timed out.
First, confirm the server itself works by wrapping it with a debug proxy:
ash
pip install mcp-debug-proxy
mcp-debug --out debug_session.json -- python your_server.py
Then trigger the failing tool call. When it fails, check:
mcp-debug --report debug_session.json
This will show you:
If the report shows the server returned successfully but Claude still shows failure, the issue is in the transport layer (stdio → HTTP bridging issue in 1.24012.0). If the server never got the request, it's a connection/routing issue.
The 1.24012.0 release had some MCP transport changes — check if rolling back to a previous version resolves it, which would confirm a regression.
@ZachDreamZ Thanks, but that diagnostic is already done and reported above: I drove the exact installed server directly over stdio JSON-RPC — it receives
tools/calland returns valid results in <1s, and Desktop's ownmcp-server-*.logconfirms the same during failing sessions. The failure is strictly between the Desktop web layer and the backend (POST /tool_result→ 404side_channel_waiting_key_absent).Rollback is also ruled out as a fix: per #79926 the failure survives a client update and hit machines that hadn't updated at all — onset was simultaneous (~18:29 UTC 2026-07-21), consistent with a server-side change, not a 1.24012.0 transport regression.
Heads-up:
pip install mcp-debug-proxy— that package doesn't exist on PyPI (404), so others shouldn't go looking for it.New finding (2026-07-22, Desktop 1.24012.1): a second, deterministic trigger — any tool declaring
outputSchemais rejected client-side before dispatchFollow-up to the original report. On 1.24012.1 we isolated a minimal repro:
outputSchema(calibre_ping) — it is the only tool that works. Every other tool shows "Tool execution failed", and the server's MCP transport log shows thetools/callfor those tools never reaches the server (zero JSON-RPC traffic — pre-dispatch rejection, not a server error and not the result-submission failure from the original report).outputSchemaremoved from exactly one previously-failing tool (calibre_list_libraries), leaving an identical-shape tool (calibre_list_categories) unchanged as control. Fresh conversation: probe tool works, control fails 3/3. Server log for the session (init2026-07-22T13:25:47Z): twotools/callarrive (ping, probe — both answeredresult(1 blocks)in <1s), zero traffic for the three control attempts.list_allowed_directories,list_directory): current@modelcontextprotocol/server-filesystemdeclaresoutputSchemaon its tools.Minimal repro: any stdio server with two no-arg tools, identical except one declares
outputSchema— the one with it fails, the one without works.This makes every schema-conforming MCP server (per spec,
outputSchemais a standard optional field) unusable in Desktop 1.24012.x.Root cause isolated: the
$schemameta-key inoutputSchematriggers the pre-dispatch rejectionFollow-up to my previous comment. Bisected with a dependency-free stdio server exposing 7 no-arg tools with graduated
outputSchemavariants (Desktop 1.24012.1, macOS):| outputSchema variant | Result |
|---|---|
| none | ✅ |
|
{"type":"object"}| ✅ || +
properties/required| ✅ || +
additionalProperties:false| ✅ || +
"$schema":"http://json-schema.org/draft-07/schema#"| ❌ never dispatched || full zod-like schema WITH
$schema| ❌ never dispatched || same full schema WITHOUT
$schema| ✅ |The failing pairs differ by exactly the one
$schemakey; server stderr confirms thosetools/callnever arrive.inputSchema(which also carries$schemafrom zod) is unaffected — onlyoutputSchematrips it.This explains the blast radius:
zod-to-json-schemainside the official MCP TypeScript SDK always emits$schema, so effectively every TS-SDK server declaringoutputSchemais unusable in Desktop 1.24012.x, including the bundled Filesystem server.Server-side workaround (verified, fully restores operation): strip the
$schemakey from eachoutputSchemain outgoingtools/listresults — it's pure metadata, so this is semantics-free.Corroborating this on Windows — same build family, same day, same umbrella symptom (all MCP tool calls fail, global, survives restart and new conversations). Cross-platform, so it's the
1.24012build, not OS-specific.Environment
SignatureKind: Developer, not Store)@modelcontextprotocol/server-filesystem, launched vianodedirectly). Onset: right after the auto-update to1.24012.1on 2026-07-21.**One difference worth flagging — my failure looks like it happens earlier in the pipeline than yours:**
initialize→ result,tools/list→ result — and then zerotools/callentries. Unlike your macOS logs, the tool call never reaches the local server at all:For contrast, the same server on 2026-07-13 (pre-update) logged tool calls normally:
claude.ai-web.logand the other logs and found noside_channel_waiting_key_absentand notool_result404. So on Windows the client appears to fail before the tool-result submission stage you captured — the call isn't being dispatched to the server in the first place.Net: likely the same
1.24012client regression, but manifesting one step earlier on Windows (no dispatch) vs the tool-result submit 404 on macOS. Might be two faces of the same broken tool-call side channel.Ruled out on my side: server health (clean handshake every launch), launch method (
nodedirectly, nocmd/npx), config correctness, enterprise policy (noHKLM/HKCUPolicies\Claudekeys;isLocalDevMcpEnabledat default), and multiple-instance/split install (single MSIX). Happy to provide request IDs or full logs if useful for backend tracing.@bfgmaster i fixed my problem here https://github.com/anthropics/claude-code/issues/79933#issuecomment-5047036349
Corroborating on Windows, with an important caveat: the server-side
outputSchema/$schemaworkaround that restores operation on macOS is not sufficient on Windows1.24012.1— the tools still never surface.Environment
SignatureKind: Developer, not Store); single install@modelcontextprotocol/server-filesystem, launched vianodedirectly (nonpx/cmdwrapper). Onset: right after the auto-update to1.24012.1on 2026-07-21.Confirms @caelum29's root cause, plus the exact npm version boundary
The
$schemakey insideoutputSchemais the trigger. Checking the published tarballs of@modelcontextprotocol/server-filesystem:2025.8.21and earlier — nooutputSchemaat all → clean2025.11.25and later, through2026.7.10(currentlatest) — emitoutputSchema(with$schemaviazod-to-json-schema) → affectedSo the newest unaffected published version is
2025.8.21.But on Windows
1.24012.1the server-side fix does NOT restore operationAfter downgrading to
2025.8.21(verifiednpm ls -g→2025.8.21; confirmed the tarball has zerooutputSchemareferences), the filesystem tools still can't be used:initialize → result,tools/list → result, no EPIPE — and zerotools/callever arrive. (Same server loggedtools/callnormally pre-update, through 2026-07-13.)github-projects→github-projects-fs) to rule out cached client state — no change.+menu, and the model reports the server's tools as unavailable. The client registers the server but will not expose its tools.Representative server log —
2025.8.21, fresh key, clean handshake, no dispatch:Interpretation
On Windows
1.24012.1the regression looks broader than theoutputSchemapre-dispatch rejection isolated on macOS. Even a fully cleantools/list(nooutputSchema) under a brand-new connector key does not restore tool availability — the client ingests the server but won't surface its tools, so notools/callis ever attempted. Stripping$schemafixes the macOS case but is insufficient here, which points to an additional client-side fault in the Windows1.24012.xbuild.Ruled out on my side
Server health (clean handshake every launch), launch method (
nodedirectly), config correctness, EPIPE (separately worked around via node-direct launch), enterprise policy (noHKLM/HKCUPolicies\Claudekeys;isLocalDevMcpEnabledat default), and multiple-instance/split install (single MSIX package).Net: this needs a client-side fix — the server-side
outputSchemamitigation is not a complete workaround on Windows1.24012.x. Happy to provide full logs or request IDs for backend tracing.Resolved for me as of 2026-07-23 — on an unchanged client build, with the current
outputSchema-emitting server.Environment: Claude Desktop 1.24012.1 (0adcae, built 2026-07-21), Windows 11 Pro. No client update since my earlier Windows report — the build string is identical to when it was broken — and no local config changes.
Crucially, I'm on
@modelcontextprotocol/server-filesystem@2026.7.10(currentlatest), which does emitoutputSchema($schemaviazod-to-json-schema) — the exact payload that was triggering the pre-dispatch rejection. I've been on this version for ~19h; it was broken yesterday and works today. Filesystem tool calls now dispatch and return results, read and write both confirmed, and the normal "Claude wants to use \<tool\>" permission prompt now appears (it never got that far before).Server log —
tools/callreaching the server and returning results, the step that was silently missing on every prior session:Same client build + same
outputSchema-bearing server that failed yesterday, now working with no local change → this is a server-side / backend fix, and it covers the actual$schema-in-outputSchemacase, not just a stripped-down schema. So on Windows1.24012.xthe resolution came without a client update.