[BUG] Claude Desktop: external stdio MCP tools announced but never dispatched in Chat mode (zero tools/call) — Windows/macOS/Linux, all install types
What's wrong
After updating to Claude Desktop 1.24012.1, every MCP tool invocation fails
with "Failed to call tool". The MCP server starts correctly and completes the
full handshake, but the application never sends it any tools/call messages.
This worked correctly before this update and broke immediately after it.
Environment
- Claude Desktop 1.24012.1 (0adcae)
- Package: Claude_1.24012.1.0_x64__pzs8sxrjxfjjc (MSIX install)
- Installed from claude.com/download
- Windows 10 x64
- Node.js v24.14.0 installed system-wide
- Filesystem extension 2026.7.10 (server-filesystem v2026.7.4)
Expected behavior
Filesystem server tools should execute normally, as they did before the update.
Actual behavior
Every tool invocation fails with "Failed to call tool". This affects all
projects relying on the Filesystem connector simultaneously.
Evidence
1. The server starts healthy and completes the handshake, but never receives
a single call. From mcp-server-Filesystem.log:
[Filesystem] Server started and connected successfully
[Filesystem] Message from client: method="initialize" id=0
[Filesystem] Message from server: id=0 result
[Filesystem] Message from client: method="notifications/initialized"
[Filesystem] Message from client: method="tools/list" id=1
[Filesystem] Message from server: id=1 result
// Nothing after this. No tools/call ever arrives.
2. Searching the logs returns zero matches for "tools/call" in mcp.log.
3. main.log shows this consistently on every startup:
[UtilityProcess stderr] No valid root directories provided by client
[UtilityProcess stderr] Client does not support MCP Roots, using allowed
directories set from server args: [ 'D:\Gym' ]
Troubleshooting already performed (all ruled out as the cause)
- The folder exists and is correctly configured under Allowed Directories.
- Tool permissions set to "Always allow"; permission dialogs were explicitly
approved.
- Uninstalled and reinstalled the extension.
- Multiple full clean restarts of the application.
- Registered the same filesystem server as a classic MCP server via mcpServers
in claude_desktop_config.json, using system Node: it fails in exactly the
same way. This rules out the issue being specific to the Desktop Extensions
subsystem.
- Even list_allowed_directories fails — a tool that takes no arguments and
merely returns the server's own configuration. This rules out any path or
folder-permission issue.
Impact
Completely breaks local file access in Claude Desktop. Affects every project
that depends on the Filesystem connector at once. The only workaround found
was installing the Claude Code CLI, which uses a separate configuration path
and is unaffected.
Showing cached comments. Read the full discussion on GitHub ↗
14 Comments
Confirming the same regression on Claude Desktop 1.24012.1.0 (same MSIX package
Claude_1.24012.1.0_x64__pzs8sxrjxfjjc). A few extra data points that narrow it down further:wsl.exe(Windows → WSL:nodeinside WSL →@modelcontextprotocol/server-filesystem), so it isn't specific to a Windows-native Node install.initialize+tools/listsucceeding, but notools/callis ever logged; evenlist_allowed_directoriesfails.Net: healthy
initialize/tools/listwith a total absence oftools/callpoints to a client-side dispatch regression for external stdio servers in Chat mode. Claude Code CLI is unaffected (separate config path), consistent with the original report.Seeing the exact same symptom on Claude Desktop, but with a different MCP server (a custom/internal MCP server, not Filesystem), looks like a general MCP tools/call dispatch failure in Desktop.
Environment:
Claude Desktop (same recent build affected by this issue)
MCP server: custom internal server (unrelated to Filesystem)
Every tool call fails immediately, including simple read-only/no-argument calls
Behavior matches what's described here: the server starts and completes the handshake (initialize + tools/list both succeed), but no tools/call message is ever sent afterward. Same server config works fine when invoked through Claude Code CLI.
Confirming the same regression on Windows 11, Claude Desktop 1.24012.1 (MSIX package
Claude_1.24012.1.0_x64__pzs8sxrjxfjjc), official Filesystem extension, extension-managed built-in Node.js.Since the report lists "Last Working Version: No response" and
main.logwas missing on that install — I have it, so here is the version history and the before/after data.Version transition (
main.log, local time, UTC+2):Both updates were automatic on quit/restart. No configuration change on my side. Note the CCD bump 2.1.215 -> 2.1.217 alongside the app version.
tools/call before and after (
mcp-server-Filesystem.log, UTC). The extension has been in daily use since April:The first session after the update begins at
2026-07-22T03:47:49Z, which is the 1.24012.0 launch. Every session from that point on is broken; every session before it worked. Today: 8 server sessions, 8 successfultools/list, zerotools/call.Handshake is healthy in all 8 of them, e.g.:
mcp.logshows the identical picture.Consistent with @itdoor1520: a built-in MCP call (Claude in Chrome) returned a valid result in the same conversation in which every Filesystem call failed, so dispatch is not broken globally — only for the external stdio server.
Remediation attempted, none of it made any difference:
The 8 clean handshakes logged today are the result of those attempts — the server comes up correctly every single time and still never receives a call.
Full logs available on request.
Confirming on a second environment, with three findings that narrow this down considerably. Full forensic writeup with logs: modelcontextprotocol/servers#4545
Environment: Windows 11 Enterprise 10.0.26200, Claude Desktop 1.24012.1 (Microsoft Store MSIX), Filesystem extension 2026.7.10, system Node v22.22.0. Identical symptom: server completes initialize + tools/list every session; zero
tools/callever arrive (last successful call inmcp-server-Filesystem.logpredates the extension auto-update).1. The regression boundary is the server's tool-schema rewrite, not roots or transport.
Inspecting
@modelcontextprotocol/server-filesystemnpm tarballs:tools/listshape, nooutputSchema) → dispatches fine on 1.24012.1. Verified directly: temporarily swapping the 2025.8.21dist/into the installed extension made all 14 tools work in chat until the app's extension-integrity check reverted the registration.registerTool+outputSchema/structuredContenton every tool) → client never dispatches a single call. No error surfaced beyond "Tool execution failed".2. The broken dispatch layer appears to be in the remotely-served chat code, not the native build.
Two machines on the same account: one applied the pending desktop update, one did not. Both broke identically and simultaneously when the extension registry pushed 2026.7.10 (the extension self-updates on a ~6h timer —
.../dxt/extensions/ant.dir.ant.anthropic.filesystem/download/...in main.log). App version was not a variable; no local update/rollback/freeze changes the behavior.3. Control case: a third-party registry extension using the old tool schema (Windows-MCP) lists and executes tools normally in the same chat sessions — bridge, approval gate, and dispatch all work for old-shape servers.
Also for anyone attempting workarounds — all injection paths are blocked:
claude_desktop_config.jsonmcpServersentries connect but are never bridged into chat (+0 local-mcp); locally installed.mcpbextensions run butlocalMcpBridgenever announces non-registry (local.mcpb.*) extensions; and modifying the installed extension's files silently kills its tool registration on the next enable/disable (only a full UI reinstall restores it).Requests beyond the fix itself: surface an actual error instead of a bare "Tool execution failed", and version-gate registry extension pushes against client compatibility — the silent ~6h auto-update is what turned a schema change into a same-day fleet-wide outage.
OP here. I deleted my two earlier comments and am consolidating into one, partly to reduce noise and partly because one data point in them was wrong — see the retraction below.
---
Retraction first. I earlier cited "Cowork reads local files fine in the same app" as evidence for scoping the regression. That comparison does not hold and should be disregarded: Cowork reaches local files through its own mechanism (
coworkUserFilesPathinclaude_desktop_config.json), not through an external stdio MCP server, so it says nothing abouttools/calldispatch. @itdoor1520's built-in Claude in Chrome observation is the valid comparison — same session, same Chat mode, with only the internal-vs-external-stdio variable changing.---
@sonofsmog — Your extension-registry finding is strongly corroborated by the timestamps on my machine. From
extensions-installations.json:And the first broken server session in
mcp-server-Filesystem.log:12.7 seconds after the 2026.7.10 extension landed. Every session from that point on shows a healthy
initialize+tools/listand zerotools/call.Important caveat, so this isn't over-read: on my machine the app build's
first_launch_atis2026-07-21T22:42:23Z, roughly two minutes before the extension install. Unlike your two-machine setup, my data cannot isolate app version from extension push — both changed within the same window. Your control (one machine updated, one not, both breaking simultaneously on the registry push) is the stronger evidence here; mine is only consistent with it.I can also confirm your
mcpServersfinding independently. I registered the same filesystem server as a classic MCP server viamcpServersinclaude_desktop_config.json, pointing at system Node v24.14.0. Both servers came up in the same session and both completed their handshake — visible in mcp.log as separate entries:Both then failed identically on every call, including
list_allowed_directories(no arguments, returns only the server's own config). This matches your+0 local-mcpobservation: the classic entry connects but never gets bridged to chat. Worth noting it failed for two independent reasons in my case — never bridged, and pointing at a new-schema build.---
@softreset76 — My first broken session (
2026-07-21T22:44Z) falls inside the gap between your last successful call (21 Jul 18:18 UTC) and your first broken session (22 Jul 03:47 UTC). Two machines breaking at different points inside that window fits a staged extension-registry rollout better than a single app release, which supports @sonofsmog's reading over a pure app-version cause.On the CCD 2.1.215 → 2.1.217 hypothesis: as a workaround I installed the standalone Claude Code CLI 2.1.217, and it dispatches
tools/callcorrectly against the same servers and folders. If 2.1.217 works standalone, the CCD bump alone is probably not sufficient to explain the regression.---
@pof-mattfraser — Consistent with your custom-server reproduction: the failure is independent of registration method (Desktop Extension vs. classic
mcpServers) and independent of which server is running. Combined with @sonofsmog's schema findings, the common factor across all our reports is new-schema tool definitions plus Chat-mode dispatch, not any particular server.---
Current picture across reporters:
| Surface | External stdio MCP tools |
|---|---|
| Desktop — Chat mode, new-schema server (≥ 2025.11.25) | Broken — no
tools/callever dispatched || Desktop — Chat mode, old-schema server (≤ 2025.8.21) | Works (per @sonofsmog, reverted by integrity check) |
| Desktop — built-in MCP (Claude in Chrome) | Works |
| Claude Code CLI | Works (separate config path) |
Two secondary issues on the same build, possibly MSIX-virtualization related:
%APPDATA%\Claude\Claude, which does not exist on an MSIX install. The real config lives under%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\.Full logs available on request.
Reproduces on macOS 26.5.2 (Desktop 1.24012.0 and 1.22209.3, classic mcpServers config, nvm node v20) — identical signature: clean handshake + tools/list, no tools/call ever dispatched. On macOS the ≤2025.8.21 fallback also fails (tools dropped at registration), unlike your Windows dist-swap result. Full details: #80094
Confirming the same bug on a classic (non-MSIX) Windows install (and see new note about Linux).
tools/list, then zero tools/call messages ever appear in mcp.log despite repeated
failed tool calls from multiple chats. list_allowed_directories fails too.
to the local-drive case above, so not path-related.
starts the server fine and it serves the path.
identically.
Broke immediately after the latest auto-update (app also crashed once around update time).
Additional datapoint: reproduced on the Linux build as well — this does not appear
to be MSIX- or Windows-specific.
server-filesystem via npx, Node v24.18.0 (nvm).
tools/list, then zero tools/call entries in mcp.log; every tool invocation fails
instantly, including zero-argument list_allowed_directories.
immediately before and after failed calls).
Same account also reproduces on Windows (classic non-MSIX install, WSL UNC path
target) — details in my earlier comment. Two OSes, two install types, three path
types, same zero-tools/call dispatch failure.
Additional Windows data point: the
<=2025.8.21fallback fails here too — dropped at registration instead of at dispatch. Every published version is now broken in Chat mode on this machine, in one of two distinct ways.Environment: Windows 11 Home 10.0.26200 · Claude Desktop 1.24012.1 (Store MSIX,
Claude_1.24012.1.0_x64__pzs8sxrjxfjjc) · classicmcpServersconfig only (no managed extension) · system Node v24.15.0,node.exeinvoked directly ·@modelcontextprotocol/server-filesystemfrom a global npm install · two filesystem server entries + one hand-rolled custom MCP server.Baseline matches the OP exactly. 1,791
tools/callserved historically permcp-server-*.log; last successful call2026-07-22T04:56:39Z, on an app session running since2026-07-21T12:03Z. The staged MSIX package folder was created2026-07-21T22:54Z; the first relaunch after that (05:12:21Z) and every session since shows the known signature — cleaninitialize+tools/list, zerotools/call— surviving annpx→ direct-node.execonfig change, a full machine reboot, and permission re-approvals. Meanwhile the custom server (hand-rolled newline-delimited JSON-RPC, plaininputSchema, no SDK, nooutputSchema) registered and dispatched normally throughout (~1,900 calls today), consistent with the schema-shape scoping already established here.New finding. Pinned the global install to
2025.8.21(last pre-registerToolrelease) to reproduce the dist-swap workaround, and restarted:initialize+tools/listnormally (per theirmcp-server-*.log).main.logshowslocalMcpBridgedropping them at registration — they are never announced, and their tools disappear from every surface, including Claude Code (Desktop) sessions that had been working minutes earlier:So on this machine:
<=2025.8.21→ dropped at registration (the behavior #80094 reports on macOS — now confirmed on Windows), and>=2025.11.25→ announced but never dispatched. npm has no releases between the two, so no published version currently works in Chat mode. One caveat on comparability: @sonofsmog's successful dist-swap ran inside the managed extension subsystem, while this test is the classic-configlocalMcpBridgepath — but given their swap worked earlier the same day on the same app build, this is at least consistent with the remotely-served-chat-code reading, and it means the downgrade/dist-swap workaround is already dead for classic-config users.Two collateral notes: (1) the same
2026.7.10servers dispatch fine from Claude Code (Desktop) sessions on this machine — the roots-negotiating client path is unaffected; Chat mode only. (2) The global install has been reverted to2026.7.10, since the old pin was strictly worse — it also killed the still-working Claude Code path.(Diagnostics gathered with Claude Code on the affected machine.)
OP here. Retitled the issue — "Windows MSIX" was misleading now that @inddev (macOS), @rob-netlaces (Linux, Windows non-MSIX) and @karroush have established the scope. Also correcting my own earlier summary table, and adding a
localMcpBridgedata point that contradicts one finding in this thread.---
My machine runs both registration paths simultaneously, pointing at the same server binary: the managed extension (
Filesystem, 2026.7.10) and a classicmcpServersentry (filesystem) invoking that extension's owndist/index.jswith system Node v24.14.0. That makes the two paths directly comparable in one process, with no cross-machine variables.main.log(local time, UTC−4):Both paths are announced, with all 14 tools each, in the same session — and neither ever receives a
tools/call. The lowercase entry appears exactly when the classic config was added (2026-07-22T00:25:03Zin mcp.log), confirming the mapping. Both sets of tools are visible and selectable in Chat; invoking either fails instantly, including zero-argumentlist_allowed_directories.This appears to contradict @sonofsmog's
+0 local-mcpobservation that classicmcpServersentries connect but are never bridged to chat. On this build they are bridged and are announced. If that finding held elsewhere, the bridging behaviour may vary by build, platform or config shape, and is probably worth separating from the dispatch failure rather than treating as the same symptom.Net for my machine: registration and announcement complete successfully for both paths; the failure is strictly downstream, at dispatch.
---
Correcting my earlier summary table. My row claiming old-schema servers work in Chat mode is contradicted by @karroush and @inddev. There appear to be two distinct failure modes, and my data pins down the second one:
| Condition | Where it fails |
|---|---|
|
<=2025.8.21(pre-registerTool) | At registration — dropped bylocalMcpBridge, never announced (@karroush on Windows, #80094 on macOS) ||
>=2025.11.25(outputSchema/structuredContent) | At dispatch — announced with full tool list, zerotools/call(confirmed here for both managed-extension and classic-config paths) |Per @karroush, no published
server-filesystemversion currently works in Chat mode, so the downgrade/dist-swap workaround is dead for classic-config users.---
On what the variable is not. @inddev reproduces on 1.22209.3 — the build @softreset76 logged as their last working one. Same version working on one machine and failing on another rules out the local app build as the variable, consistent with @sonofsmog's two-machine control.
Separately: I installed the standalone Claude Code CLI 2.1.217 as a workaround and it dispatches
tools/callcorrectly against the same servers and folders, which argues the CCD 2.1.215 → 2.1.217 bump alone doesn't explain this.One open question nobody has resolved. "Schema shape" no longer cleanly explains the registration-side failure: @karroush's hand-rolled server (no SDK, plain
inputSchema, nooutputSchema) registers and dispatches fine, and @sonofsmog's third-party old-schema extension works — yetserver-filesystem 2025.8.21, also old-schema, is dropped at registration. WhateverlocalMcpBridgerejects looks narrower than "lacks outputSchema", possibly SDK-version-specific. Flagging as an open question, not a conclusion.Consistent across every report here: Claude Code dispatches the same servers correctly on the same machines. The regression is confined to Chat mode's external stdio path.
Environment: Windows 10 x64, Desktop 1.24012.1 (MSIX), Filesystem extension 2026.7.10, Node v24.14.0. Full logs available on request.
Following up on "full logs available on request" — here they are, no request needed: https://gist.github.com/DFNR2026/64f866304ecbf750a7db9aa73ea2033b
Contents: complete
mcp-server-Filesystem.logandmcp.log, a filteredmain.logextract (localMcpBridge / UtilityProcess / version lines),extensions-installations.json, and themcpServersconfig block. Sanitized (usernames, directory names, tokens); timestamps and all MCP traffic untouched.This covers the full timeline on one machine: extension 2026.7.10 push (
installedAt 2026-07-21T22:44:15Z) → first broken session 12.7s later → classicmcpServerspath added → both registration paths announced bylocalMcpBridgewith 14 tools each in the same sessions → zerotools/callon either, across every session since.Work around here.
https://github.com/modelcontextprotocol/servers/issues/4545#issuecomment-5056557933
Adding a four-way isolation that pins the trigger to a single field: outputSchema
Same signature as the macOS report: server completes
initializeandtools/list, tools appear in chat, every call fails instantly, and the per-server log shows notools/callever arrives. In one session I measured 0tools/calldispatched to@modelcontextprotocol/server-filesystemagainst 56 to a second local stdio server in the same session.Four-way isolation:
outputSchemais necessary and sufficientFour minimal stdio servers, differing only in whether the single tool declares
outputSchema, plus a non-standardexecutionfield as a control. IdenticalprotocolVersion(2025-06-18), identical declared capabilities ({"tools":{"listChanged":false}}), identical tool name (ping) andinputSchema. All four verified to answertools/callcorrectly when driven directly over stdio.Counts read from
%APPDATA%\Claude\logs\mcp.log:| server |
outputSchema|execution|initialize|tools/list|tools/calldispatched | result in chat ||---|---|---|---|---|---|---|
| osx-a | YES | YES | 1 | 1 | 0 | Tool execution failed |
| osx-b | YES | no | 1 | 1 | 0 | Tool execution failed |
| osx-c | no | YES | 1 | 1 | 1 |
pong|| osx-d | no | no | 1 | 1 | 1 |
pong|initializeandtools/listsucceed on every one.outputSchemareceive zerotools/call. The client never sends one.executionhas no effect — osx-c carries it and works. Not a factor.Repro server
Run as
python osx_probe.py with(fails) orpython osx_probe.py without(works).Steps: register both variants under
mcpServersinclaude_desktop_config.json("args": ["<path>/osx_probe.py", "with"]and"without"), fully quit and reopen Claude Desktop (config is read only at launch), ask the model to callpingon each, then countmethod="tools/call"per server tag inmcp.log.Expected: both dispatch and return
pong.Actual:
withoutreturnspong;withhangs for minutes, fails with "Tool execution failed", and shows zerotools/callinmcp.log.Windows version boundary
Claude_1.24012.1.0_x64) — broken.@modelcontextprotocol/server-filesystem2026.7.4 (serverInfosecure-filesystem-server0.2.0), Node over stdio.protocolVersion 2025-06-18, so this is not a protocol mismatch.Ruled out by direct testing
Full app reinstall (config intact); OS reboot and full shutdown;
server-filesystem2026.1.14 / 2026.7.10 / 2026.7.4 all fail identically; removed a duplicate bundled Filesystem connector; allowed directory confirmed correct; MCP Roots not in use ("Client does not support MCP Roots, using allowed directories set from server args"); not a capability-declaration problem (the failing server declares onlytools, the working one declares more and is fine); not theexecutionfield (isolated above).Why this breaks so much
@modelcontextprotocol/server-filesystemdeclaresoutputSchemaon all 14 of its tools, so every filesystem tool is dead. The same will apply to any server that adopts structured output. A Python FastMCP server on the same machine, declaringoutputSchemaon none of its tools, works normally throughout — which is currently the only reason this machine still has filesystem access at all.The failure is never-dispatched at the transport, surfaced to the user as a multi-minute client-side timeout with no error logged anywhere.
Resolved for me by the app-1.24012.9 update; both Windows (WSL UNC target) and previously-failing setups now dispatch tools/call normally.