[BUG] Claude Desktop stops dispatching tools/call to local stdio MCP servers for all instances launched after ~18:29 UTC 2026-07-21; remote connectors and Claude Code unaffected
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?
Summary: Local stdio MCP servers complete initialize and tools/list normally, but no tools/call is ever written to the server's stdin. The model's tool attempt surfaces as "Tool execution failed" (1.22209.3.0) / "Failed to call tool" (1.24012.0.0). Reproduced on two independent Windows 11 machines.
Timeline (all UTC, from mcp.log):
Machine A: last successful tools/call id 207 at 18:24:08 on 07-21, in a session started earlier; first app restart at 18:29:35 → broken; broken ever since
Machine B: idle from 16:01:14; first launch after, at 18:34:20 → broken
Pattern: every instance started before ~18:29 UTC worked until closed; every instance started after fails. Consistent with a startup-fetched server-side change.
Ruled out by test: server package version (pinned known-good); a second no-argument memory server fails identically; bundled Filesystem extension off throughout; fresh sessions; client update 1.22209.3.0 → 1.24012.0.0 (failure survived it); full reboot.
Controls: Remote connectors (Google Drive) work in the same failing sessions. Claude Code v2.1.216 on the same machine, same account, same server binary dispatches tools/call normally.
Environment: Sideloaded MSIX from claude.ai/download (SignatureKind: Developer), package family Claude_pzs8sxrjxfjjc, Windows 11. Logs from both machines attached.
Minor log artifact: brief interleaved launches of "filesystem"/"Filesystem" at 19:09:40 on Machine A from toggling the bundled extension during testing — postdates the failure, noise not cause.
[NOTE: This summary was compiled by Claude Desktop (Fable 5, after several hours of troubleshooting the problem.]
What Should Happen?
When the model emits a tool call targeting a local stdio MCP server, Claude Desktop should write the tools/call request to the server's stdin and return the result — as it did for every session started before ~18:29 UTC on 2026-07-21, and as Claude Code v2.1.216 still does on the same machine, same account, and same server binary. Instead, the request is never written (server logs show initialize and tools/list succeed, then zero tools/call entries across thousands of attempts), and the UI surfaces "Failed to call tool" / "Tool execution failed."
Error Messages/Logs
Steps to Reproduce
Steps to reproduce:
- On Windows 11, install Claude Desktop (sideloaded MSIX from claude.ai/download; reproduced on 1.22209.3.0 and 1.24012.0.0, package family Claude_pzs8sxrjxfjjc).
- Configure any local stdio MCP server in claude_desktop_config.json. Reproduced with @modelcontextprotocol/server-filesystem (via npx and via a global npm install) and with a no-argument memory server -- the specific server does not matter.
- Launch Claude Desktop and start a fresh conversation. Note in mcp.log that the server starts, completes initialize, and answers tools/list normally.
- Ask Claude anything that triggers a tool call on that server (e.g. "list the contents of an allowed directory").
- Observe: "Failed to call tool" in the UI; mcp.log shows no tools/call entry was ever sent to the server.
Reproduces 100% of the time on any Desktop instance launched after ~18:29 UTC 2026-07-21, on two independent machines. Instances launched before that time dispatched calls normally until closed (last success: tools/call id 207 at 18:24:08Z, five minutes before the first broken restart at 18:29:35Z). Same server binary, same account, Claude Code v2.1.216 on the same machine: works. Remote connectors (Google Drive) in the same failing Desktop session: work.
Claude Model
Not sure / Multiple models
Is this a regression?
Yes, this worked in a previous version
Last Working Version
_No response_
Claude Code Version
v2.1.216
Platform
Other
Operating System
Windows
Terminal/Shell
Windows Terminal
10 Comments
Corroborating data point from macOS (filed as #79933 before finding this issue — likely the same incident, observed at a different layer):
Failed to call tool "<name>", including Anthropic's bundled Filesystem extension (list_allowed_directories,read_multiple_files). Fresh conversations and full Cmd+Q restart don't recover.tools/callDOES reach the server and the server returns a result in <1s (mcp-server-*.log) — the failure shows up inclaude.ai-web.logas the web layer failing to hand the result to the backend:So on macOS the dispatch happens but the result-submission side-channel is broken; on your Windows machines dispatch never starts. Both fit your "startup-fetched server-side change" hypothesis better than a client regression — my failures also survived a client update. Request IDs for backend tracing are in #79933.
Corroborating from macOS 26.5.1 (Apple Silicon), Claude Desktop 1.24012.0 — same incident, with stdio-level captures that confirm the dispatch never happens.
Setup: local stdio MCP server (fork of
@modelcontextprotocol/server-filesystem2026.7.10) configured viaclaude_desktop_config.json. To rule the server out, I wrapped it in ateeinterceptor that logs everything Claude Desktop writes to the server's stdin.What the interceptor shows, for every one of 8+ server spawns since onset: both spawned instances (clientInfo
claude-ai/0.1.0andlocal-agent-mode-<server>/1.0.0) receive exactlyinitialize → notifications/initialized → tools/listand then nothing, ever. Verbatim capture of a session in which three tool calls failed in the UI (stdin, complete — nothing truncated):Server side (stderr) confirms it is up and configured, and answers both requests in <10 ms:
Meanwhile the UI shows "Failed to call tool …" / "Tool execution failed" immediately after the permission prompt.
claude.ai-web.loglogs thetool_approval_gatewith the correct<server>:<tool>name, then the call vanishes silently — no error inmain.log,mcp.log, or the per-server log.Timeline (UTC): first failing calls in my logs at 19:09 on 2026-07-21; sessions earlier that evening were already broken from ~18:1x–19:00. Consistent with your ~18:29 onset for freshly started instances.
Ruled out (failure survives all of the following, applied together): full macOS reboot; complete deletion of
~/Library/Application Support/Claude; sign-out and fresh sign-in; minimal fresh config; new conversations; server rename. Also reproduced with the official Filesystem connector — identical symptom.Controls matching yours: remote connectors work in the same failing sessions; Claude Code (2.1.x) on the same machine, same account, dispatches
tools/callto the same server binary normally.One more data point that may help locate it:
main.logshows the local tools are announced and the device bridge is healthy at the time of failure —so the break appears to be between chat-side tool invocation and the local dispatch, not in server registration.
I built a free tool that might help debug this — MCP Debug Proxy (github.com/ZachDreamZ/mcp-debug-proxy). It sits between Claude Desktop and any stdio-based MCP server to capture the full JSON-RPC exchange with microsecond timing.
In situations like this where ools/call sends but the response gets lost (the 404 side_channel pattern we're seeing in #79933), you can run:
ash
pip install mcp-debug-proxy
mcp-debug --out session.json -- python your_server.py
This produces a full session log and latency report showing exactly where the round-trip fails — whether it's a missing response, a connection reset, or a timeout. I've been using it to characterize this exact bug pattern and the output helped narrow it to a client-side delivery issue rather than the server.
The CLI is MIT licensed on GitHub — no affiliation with Anthropic, just a tool I made while debugging my own MCP integrations.
Hope this helps folks triage while the root cause gets fixed.
Corroborating from macOS 26.5 (Darwin 25.5.0, Apple Silicon), Claude Desktop 1.24012.0 — same incident, plus one additional control not yet in this thread.
Setup: two local stdio servers in
claude_desktop_config.json, launched via npx:obsidian-mcp-server@3.2.9and@modelcontextprotocol/server-filesystem.Symptom (matches OP exactly):
mcp-server-*.logshows both servers completeinitialize+tools/listnormally on every spawn, but zerotools/callentries ever appear; chat surfaces bare "Tool execution failed" (or hangs ~4 min). No error inmain.log/claude.ai-web.log— the dispatch dies silently client-side.Timeline (UTC): last successful chat tools/call batch logged 2026-07-19 ~14:24 (28 calls, zero errors). First failing instance started 2026-07-21 21:21 — after the ~18:29 threshold reported by OP. Consistent with a startup-fetched server-side change rather than the app binary (our auto-update installed hours before the onset and sessions kept working until relaunch).
Ruled out: fresh conversations; full Cmd+Q relaunches; renaming the server key in config (full client-side state/approval reset); re-pinning server versions; adding a brand-new never-before-seen filesystem server — it fails identically on first use.
Controls: (1) Claude Code sessions on the same machine, same account, same config, same server entries dispatch
tools/callto both servers instantly, at the same moment chat fails. (2) A third-party agent connected to the same Obsidian instance via the plugin's built-in HTTP MCP endpoint works normally — only Desktop chat's local stdio dispatch path is affected.Confirmation on two more Windows 11 machines — package family Claude_pzs8sxrjxfjjc
Reproduced on two additional Windows 11 machines (same sideloaded MSIX, package
family
Claude_pzs8sxrjxfjjc). The log-level detail below is from the machine Iinspected directly; the second reproduced the same behavior end-user-side.
Symptom matches exactly: the bundled Filesystem extension (local stdio) completes
initializeandtools/list, then receives zerotools/call—mcp-server-filesystem.logshows the request never arrives on stdin. Chat surfaces"Failed to call tool
list_allowed_directories" — a no-argument call, so path/scopeis not a factor.
main.loglogs no routing error, so the call dies in theChat/renderer layer before reaching the local bridge.
Consistent with the ~18:29 UTC server-side cutoff:
tools/callon the inspected machine: 2026-07-21T19:32:20Z,on an app instance that had been running since before the cutoff.
every launch since.
Client version is not the differentiator (matches the report):
shutdown/restart and installing the pending update did not restore it.
New datapoint — propagation to live sessions: on the second machine, an
already-running Chat session that had been working stopped working mid-session,
with no restart. So the change now affects in-flight sessions, not only instances
launched after the cutoff — keeping a pre-cutoff instance alive no longer helps.
Controls match: CoWork / Claude Code dispatches
tools/callnormally on bothmachines (same account, same server binaries), and remote connectors are
unaffected. The failure is scoped precisely to Home/Chat → local stdio MCP servers.
Update: auto-updated to 1.24012.1 (macOS, Apple Silicon) — still reproduces. Fresh conversation, freshly renamed server entries (clean approval state): both
obsidian-mcp-server@3.2.9and@modelcontextprotocol/server-filesystemfail with "Tool execution failed".tools/listhandshake succeeds; notools/callever reaches either server process; no client-side error logged. Claude Code sessions on the same machine keep working against the same servers throughout. Consistent with a server-side gate rather than the app binary.Confirming that it is happening to me as well
[BUG] Claude Desktop Windows MSIX 1.24012.1.0 — tools/call never dispatched for any MCP server (official extension + custom mcpServers both broken)
Environment
Claude Desktop version: 1.24012.1.0 (MSIX, Claude_pzs8sxrjxfjjc)
OS: Windows 10
Confirmed latest version via winget upgrade Anthropic.Claude → "No available upgrade found"
Bug Description
tools/call is never dispatched to any MCP server. Both the official Filesystem Desktop Extension and custom mcpServers entries complete the handshake and respond to tools/list, but no tools/call message is ever sent by the Claude Desktop client.
What works
MCP server starts and connects successfully
initialize → result completes
notifications/initialized sent
tools/list → result completes
What doesn't work
tools/call is never sent after any of the above
mcp.log evidence
2026-07-22T02:11:30.833Z [info] [filesystemfinal] Message from server: id=0 result
2026-07-22T02:11:31.335Z [info] [filesystemfinal] Message from client: method="notifications/initialized"
2026-07-22T02:11:31.346Z [info] [filesystemfinal] Message from client: method="tools/list" id=1 params
2026-07-22T02:11:31.354Z [info] [filesystemfinal] Message from server: id=1 result
No tools/call entry ever appears regardless of how many tool calls are attempted.
main.log evidence
For every custom mcpServers entry regardless of name:
[warn] UtilityProcess Check: Extension [server-name] not found in installed extensions
For the official Filesystem extension:
[info] Using UtilityProcess for extension Filesystem: appConfig.isUsingBuiltInNodeForMcp is true and built-in node is compatible
Both paths result in the same failure — tools/call never dispatched.
Official Filesystem Extension — allowlistEnabled bug
The official extension has a secondary bug: allowlistEnabled resets to false on every startup regardless of UI configuration.
config.json after every startup:
json
"dxt:allowlistEnabled:199b4c8d-63b1-49c8-a130-71c88b08a28b": false
Extension settings file (ant.dir.ant.anthropic.filesystem.json) correctly shows:
json
{
"isEnabled": true,
"userConfig": {
"allowed_directories": ["C:\\Users\\Papa\\Desktop\\Knowledgebase"]
}
}
The directory is saved correctly but the allowlist gate never activates. Manually flipping to true via PowerShell has no effect — Claude Desktop overwrites it back to false on the next startup, and does not re-read it mid-session.
Reproduction steps
Install Claude Desktop 1.24012.1.0 on Windows 11 via winget/Store (MSIX build)
Install the official Filesystem extension from Connectors panel
Add any allowed directory
Ask Claude to list that directory
Observe: tools/call never appears in mcp.log
Alternative reproduction:
Add any custom mcpServers entry to the MSIX config at %LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json
Restart Claude Desktop
Ask Claude to use any tool from that server
Observe: same result — tools/call never dispatched, main.log shows UtilityProcess warning
Workarounds attempted — all failed
npx command → stdio pipe failure
node directly with absolute path → tools/call still not dispatched
Renaming server to avoid name collision with extension → same UtilityProcess warning, same failure
Manual config.json edit while Claude is running → ignored
winget upgrade → already on latest
Expected: tools/call dispatched after successful tools/list
Actual: Client goes silent after tools/list. No calls ever reach the server.
Likely root cause found: tool-name mismatch between declaration and invocation for local MCP tools (DevTools/HAR capture of a failing turn, macOS, Claude Desktop 1.24012.0)
I captured a failing conversation turn in DevTools and the HAR shows the full round trip. Three steps, one
tool_use_id:1) The client declares local MCP tools to the backend by their bare name — completion request,
toolsarray:(No
mcp_server_url, nobackend_execution— unlike remote connectors, which carry"backend_execution":true.)2) The backend/model invokes them with a colon-qualified name — completion SSE stream:
3) ~4 s later the client posts the generic failure — same
tool_use_id,POST .../tool_result:During that window my stdio interceptor confirms nothing is written to the local server's stdin — the renderer apparently fails to resolve the qualified name
workspace:list_allowed_directoriesagainst its locally registered bare namelist_allowed_directoriesand gives up before any dispatch.This one mismatch explains every observation in this thread:
backend_execution: true), where the qualified mapping is known.tool_usenames in the tool-search path.<integration_name>:<tool>.Suggested fix directions: strip/resolve the
<integration_name>:prefix in the desktop client's local tool dispatcher, or roll back/gate the backend change that emits qualified names for locally executed tools.I have also filed this through official support with the full (sanitized) HAR and log bundle, so engineering can request the complete captures there.
See https://github.com/anthropics/claude-code/issues/79992#issuecomment-5049455483 for a workaround.
macOS confirmation of the
$schemaworkaround from https://github.com/anthropics/claude-code/issues/79992#issuecomment-5049455483 — and a correction of my earlier root-cause hypothesis.I inserted a transparent stdio filter in front of my filesystem server (fork of
@modelcontextprotocol/server-filesystem, 14 tools, all declaring"$schema": "http://json-schema.org/draft-07/schema#"ininputSchema/outputSchema) that removes only the$schemakeys fromtools/listresponses. Result on macOS 26.5.1, Claude Desktop 1.24012.1:[strip-schema] removed $schema from 28 schema(s)(14 tools × input+output schema)tools/callsince onset — captured on the server's stdin:{"method":"tools/call","params":{"name":"list_allowed_directories","arguments":{}},"jsonrpc":"2.0","id":2}tools/call.Caveat: not a strict A/B on my side (I have not yet re-removed the filter), but combined with fpl9000's same-session A/B on Windows this looks conclusive.
Correction: in my earlier comment (https://github.com/anthropics/claude-code/issues/79926#issuecomment-5043423056) I hypothesized the colon-qualified
tool_usenames (<integration>:<tool>) were the root cause. That was observational correlation — the qualified naming is apparently normal and resolvable; the actual discriminator is the declared JSON-Schema meta-schema, consistent with a pre-dispatch tool-definition validator rejecting draft-07$schemadeclarations before anything is serialized to the transport (which is why nothing is ever logged locally).Workaround for anyone affected until Anthropic ships a fix: wrap your server command in a filter that strips
$schemafromtools/listresponses (fpl9000's proxy, or a ~30-line Python line filter does it).