[BUG] Claude Desktop: chat-initiated tools/call never reaches a healthy local MCP (stdio) server
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?
Report finalized at scratchpad/claude-desktop-mcp-bug.md. Yes — the Desktop version is included: 1.24012.1 (in the Environment table). Here is the full
text to paste into a GitHub issue:
---
Claude Desktop: chat-initiated tools/call never reaches a healthy local MCP (stdio) server
Summary
Chat-triggered tool invocations against a local stdio MCP server (filesystem) fail every time with a bare "Tool execution failed". The Desktop app
completes the initialize + tools/list handshake with the server on every launch, but no tools/call line ever appears in ~/Library/Logs/Claude/mcp.log for a
chat-triggered call. The request is dropped app-side, before it reaches the server's stdio. The server itself is proven healthy in isolation.
Environment
┌──────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Component │ Version │
├──────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Claude Desktop │ 1.24012.1 (build 1.24012.1) │
├──────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ macOS │ 15.7.7 (24G720) │
├──────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Hardware │ Apple Silicon (M3), arm64 │
├──────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Node (server │ v26.5.0 (Homebrew) │
│ runtime) │ │
├──────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ MCP server │ @modelcontextprotocol/server-filesystem@2026.7.10 │
│ package │ │
├──────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Server binary │ /opt/homebrew/bin/mcp-server-filesystem → …/lib/node_modules/@modelcontextprotocol/server-filesystem/dist/index.js (npm global, │
│ │ #!/usr/bin/env node ESM script) │
└──────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Server config (both as a manual mcpServers entry and, later, as a UI-managed Desktop extension):
"filesystem": {
"command": "/opt/homebrew/bin/mcp-server-filesystem",
"args": ["/Users/<user>/PycharmProjects"]
}
Symptom (precise)
- Every app launch, the server lifecycle in mcp.log is:
Initializing server...
Using MCP server command: /opt/homebrew/bin/mcp-server-filesystem
Server started and connected successfully
client → method="initialize" id=0 → server id=0 result
client → method="notifications/initialized"
client → method="tools/list" id=1 → server id=1 result
⟵ then idle. No further lines.
- When a chat asks for a filesystem operation, the UI shows "Tool execution failed" and mcp.log gains no new line at that timestamp — not a tools/call, not
an error. The invocation never leaves the app for the server.
- The last real tools/call reaching this server in the logs was 2026-06-24; every attempt since fails this way.
Server is proven healthy (isolation test)
Drove the exact same binary + args directly over stdio from a standalone Python script (no Claude Desktop involved): sent initialize →
notifications/initialized → tools/list → tools/call (list_directory).
Result:
initialize : OK
tools/list : OK (15 tools)
tools/call : OK — real directory listing returned
process exit code: 0
stderr: "Secure MCP Filesystem Server running on stdio"
The server accepts and correctly executes tools/call. The fault is not in the server, its Node runtime, its arguments, or filesystem access.
Everything ruled out (each verified with NO change to the failure)
- Full app quit + relaunch — clean handshake re-established; tools/call still never reaches the server.
- Node upgrade 25.9 → 26.5 (old runtime removed by brew cleanup) — the live server processes were confirmed spawned against the current, existing Node
26.5.0; not an orphaned-runtime problem.
- Removing remoteToolsDeviceName from config (bridge device m3-macbook-pro-local) — no change. Note: the app re-serializes this key back into the config
on next launch, so a config-file removal is not durable.
- Full account sign-out / sign-in — no change.
- Removing the manual mcpServers entry entirely and re-adding filesystem as a UI-managed Desktop extension — fails identically whether configured as a
manual mcpServers entry or as a managed extension.
Additional observations:
- Two identical server instances are spawned on every launch (each node …/mcp-server-filesystem under a disclaimer helper → main Claude process), i.e. two
independent hosts hold their own copy of the server — consistent with a local app path plus a remote-tools/desktop-connector bridge. The duplication is
structural (survives restart), not a stale leftover.
- Some earlier crash cycles showed the server being spawned via /opt/homebrew/bin/npx (dying with "transport closed unexpectedly … process exiting early");
those predated the config being finalized to the direct binary path and are not the current failure mode. The current handshake is clean.
Conclusion
The fault is in Claude Desktop's routing between a chat session and a local/desktop connector. tools/list reaches the server (tools are enumerated and
shown), but chat-issued tools/call invocations are dropped inside the app before they are written to the server's stdin. This is independent of the server,
its runtime, its arguments, the config style (manual vs. managed extension), the account session, and the remoteToolsDeviceName bridge device — none of
which changed the behavior.
Reproduction
- Configure any stdio MCP server (e.g. @modelcontextprotocol/server-filesystem) in Claude Desktop, manually or as an extension.
- Observe successful initialize + tools/list in ~/Library/Logs/Claude/mcp.log.
- In a chat, request an operation that calls one of its tools.
- Observe "Tool execution failed" in the UI and no tools/call line appearing in mcp.log.
- Confirm the server is healthy by driving the same binary/args over stdio directly (isolation script) — tools/call succeeds there.
---
One small note for accuracy before you file: the report states the config-based removal of remoteToolsDeviceName isn't durable because the app
re-serializes it on launch — that's a directly observed fact from this session, and it's worth keeping in the issue since it tells the maintainers the
bridge device can't be disabled from the config file. If you'd like, I can also attach the isolation Python script (scratchpad/mcp_isolation_test.py) as a
reproducible artifact reviewers can run.
✻ Cogitated for 1m 8s
What Should Happen?
The MCP Server should work
Error Messages/Logs
Steps to Reproduce
Report finalized at scratchpad/claude-desktop-mcp-bug.md. Yes — the Desktop version is included: 1.24012.1 (in the Environment table). Here is the full
text to paste into a GitHub issue:
---
Claude Desktop: chat-initiated tools/call never reaches a healthy local MCP (stdio) server
Summary
Chat-triggered tool invocations against a local stdio MCP server (filesystem) fail every time with a bare "Tool execution failed". The Desktop app
completes the initialize + tools/list handshake with the server on every launch, but no tools/call line ever appears in ~/Library/Logs/Claude/mcp.log for a
chat-triggered call. The request is dropped app-side, before it reaches the server's stdio. The server itself is proven healthy in isolation.
Environment
┌──────────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Component │ Version │
├──────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Claude Desktop │ 1.24012.1 (build 1.24012.1) │
├──────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ macOS │ 15.7.7 (24G720) │
├──────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Hardware │ Apple Silicon (M3), arm64 │
├──────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Node (server │ v26.5.0 (Homebrew) │
│ runtime) │ │
├──────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ MCP server │ @modelcontextprotocol/server-filesystem@2026.7.10 │
│ package │ │
├──────────────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Server binary │ /opt/homebrew/bin/mcp-server-filesystem → …/lib/node_modules/@modelcontextprotocol/server-filesystem/dist/index.js (npm global, │
│ │ #!/usr/bin/env node ESM script) │
└──────────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Server config (both as a manual mcpServers entry and, later, as a UI-managed Desktop extension):
"filesystem": {
"command": "/opt/homebrew/bin/mcp-server-filesystem",
"args": ["/Users/<user>/PycharmProjects"]
}
Symptom (precise)
- Every app launch, the server lifecycle in mcp.log is:
Initializing server...
Using MCP server command: /opt/homebrew/bin/mcp-server-filesystem
Server started and connected successfully
client → method="initialize" id=0 → server id=0 result
client → method="notifications/initialized"
client → method="tools/list" id=1 → server id=1 result
⟵ then idle. No further lines.
- When a chat asks for a filesystem operation, the UI shows "Tool execution failed" and mcp.log gains no new line at that timestamp — not a tools/call, not
an error. The invocation never leaves the app for the server.
- The last real tools/call reaching this server in the logs was 2026-06-24; every attempt since fails this way.
Server is proven healthy (isolation test)
Drove the exact same binary + args directly over stdio from a standalone Python script (no Claude Desktop involved): sent initialize →
notifications/initialized → tools/list → tools/call (list_directory).
Result:
initialize : OK
tools/list : OK (15 tools)
tools/call : OK — real directory listing returned
process exit code: 0
stderr: "Secure MCP Filesystem Server running on stdio"
The server accepts and correctly executes tools/call. The fault is not in the server, its Node runtime, its arguments, or filesystem access.
Everything ruled out (each verified with NO change to the failure)
- Full app quit + relaunch — clean handshake re-established; tools/call still never reaches the server.
- Node upgrade 25.9 → 26.5 (old runtime removed by brew cleanup) — the live server processes were confirmed spawned against the current, existing Node
26.5.0; not an orphaned-runtime problem.
- Removing remoteToolsDeviceName from config (bridge device m3-macbook-pro-local) — no change. Note: the app re-serializes this key back into the config
on next launch, so a config-file removal is not durable.
- Full account sign-out / sign-in — no change.
- Removing the manual mcpServers entry entirely and re-adding filesystem as a UI-managed Desktop extension — fails identically whether configured as a
manual mcpServers entry or as a managed extension.
Additional observations:
- Two identical server instances are spawned on every launch (each node …/mcp-server-filesystem under a disclaimer helper → main Claude process), i.e. two
independent hosts hold their own copy of the server — consistent with a local app path plus a remote-tools/desktop-connector bridge. The duplication is
structural (survives restart), not a stale leftover.
- Some earlier crash cycles showed the server being spawned via /opt/homebrew/bin/npx (dying with "transport closed unexpectedly … process exiting early");
those predated the config being finalized to the direct binary path and are not the current failure mode. The current handshake is clean.
Conclusion
The fault is in Claude Desktop's routing between a chat session and a local/desktop connector. tools/list reaches the server (tools are enumerated and
shown), but chat-issued tools/call invocations are dropped inside the app before they are written to the server's stdin. This is independent of the server,
its runtime, its arguments, the config style (manual vs. managed extension), the account session, and the remoteToolsDeviceName bridge device — none of
which changed the behavior.
Reproduction
- Configure any stdio MCP server (e.g. @modelcontextprotocol/server-filesystem) in Claude Desktop, manually or as an extension.
- Observe successful initialize + tools/list in ~/Library/Logs/Claude/mcp.log.
- In a chat, request an operation that calls one of its tools.
- Observe "Tool execution failed" in the UI and no tools/call line appearing in mcp.log.
- Confirm the server is healthy by driving the same binary/args over stdio directly (isolation script) — tools/call succeeds there.
---
One small note for accuracy before you file: the report states the config-based removal of remoteToolsDeviceName isn't durable because the app
re-serializes it on launch — that's a directly observed fact from this session, and it's worth keeping in the issue since it tells the maintainers the
bridge device can't be disabled from the config file. If you'd like, I can also attach the isolation Python script (scratchpad/mcp_isolation_test.py) as a
reproducible artifact reviewers can run.
✻ Cogitated for 1m 8s
Claude Model
None
Is this a regression?
Yes, this worked in a previous version
Last Working Version
_No response_
Claude Code Version
1.24012.1
Platform
Anthropic API
Operating System
macOS
Terminal/Shell
Terminal.app (macOS)
Additional Information
_No response_
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
Corroborating this from a different MCP server (
apple-notes-mcp, third-party) — same Desktop version, same failure shape, mcp.log confirms the handshake-then-silence pattern, and this is a clear regression on my machine (was working fine earlier the same day, before an app update).Environment
/Users/arich/.nvm/versions/node/v24.15.0/bin/nodeapple-notes-mcp, tested at two versions/launch paths simultaneouslyThis is a regression, not a pre-existing config issue
mcp.logshows the last successfultools/callagainst this server at2026-07-21T20:33:43.443Z(13:33:43 PT).main.logshows Claude 1.24012.0 was downloaded at 13:20:44 PT that same day and 1.24012.1 at 15:10:49 PT, with several quit/relaunch cycles across that afternoon before the update was actually applied (downloads don't take effect until the next relaunch). The server was working normally shortly before this update landed, and has failed on every attempt since, across two separate app relaunches on the current 1.24012.1 build.Setup
Ran two independent instances of the same MCP server side by side in
claude_desktop_config.json, to rule out a version- or launch-mechanism-specific bug:apple-notes-pinned→ v2.5.11, launched directly vianodeapple-notes→ v2.6.8 (resolved fromnpx -y apple-notes-mcp), launched vianpxBoth showed "running" in Settings → Developer after a full quit (⌘Q) and relaunch.
mcp.log — clean handshake, then nothing
Both servers complete
initialize→notifications/initialized→tools/list/prompts/list/resources/listin full, with results returned for every request ID:That's the entirety of both servers' logged activity for the session. Four separate chat-triggered
tools/callinvocations followed this handshake (health-checkanddoctoragainst each server) — every one returned a bare "Tool execution failed" in the UI, and none of them produced atools/callline in mcp.log at all, matching this issue's description exactly: the request is dropped app-side before it reaches the server's stdio.Isolation test
Same server code (v2.6.8, the same binary
npxresolves for Desktop), same machine, same Notes.app/iCloud account, same permissions state — run instead through Claude Code CLI in the same session. Both tools returned full, healthy structured output:doctorreturned all "ok" statuses (Notes.app access, permissions, accounts, operations, Node runtime signature), with a single unrelated "warn" for Full Disk Access.Why I think this is the same bug
apple-notes-mcpitself.nodedirect path vs.npx -y) — rules out an npx-resolution or caching issue.health-check/doctorare read-only and take no arguments, so this doesn't depend on file-write permissions, sandbox entitlements, or argument-passing — about as minimal atools/callas exists, and it still never lands.Also worth cross-linking #80002 (Filesystem extension, same symptom:
tools/listsucceeds,tools/callsilently dropped) — three independent servers now, first-party and third-party, all failing the same way on the same Desktop build. Points firmly at Desktop's chat→connector dispatch layer, likely introduced in the 1.24012.x line.Happy to attach the full mcp.log excerpt or config if useful for triage.
Im having this problem as well
Claude Desktop MCP filesystem completely broken on Windows — tools/call never dispatched, been debugging for hours
Running Claude Desktop 1.24012.1.0 on Windows 11 (MSIX build). MCP filesystem is completely non-functional and I've exhausted every workaround.
What works:
Server starts ✅
Handshake completes ✅
tools/list succeeds ✅
What doesn't work:
tools/call is never sent. Ever. The log just stops after tools/list.
I've tried:
Official Filesystem Desktop Extension → allowlistEnabled resets to false on every startup no matter what
Custom mcpServers entry with npx → stdio pipe never connects
Custom mcpServers entry with node directly → same result
Renaming the server → same result
Manually editing config.json while Claude is running → Claude ignores it
Already on latest version via winget
The main.log shows UtilityProcess Check: Extension [name] not found in installed extensions for every custom mcpServers entry, after which tools/call is never routed.
Closing this out: the symptom resolved on its own, with no change on my end.
No app update, no config edit, no reinstall, no account action, no Node or MCP-server
change — same Desktop build (1.24012.1), same
mcpServersentry, same/opt/homebrew/bin/mcp-server-filesystembinary and args. Chat-initiatedtools/callnow reaches the server and the corresponding lines appear in
~/Library/Logs/Claude/mcp.logagain.For whoever triages this: I found another thread describing the same symptoms over the
same window — handshake clean,
tools/listfine,tools/callsilently never leavingthe app — and the same spontaneous recovery after roughly 24 hours, also with no
client-side change. That pattern is consistent with a server-side or fleet-level
routing condition rather than anything local, which also explains why every local
variable I eliminated (runtime, config style, extension vs. manual entry, bridge
device, sign-out/in) made no difference.
https://github.com/anthropics/claude-code/issues/80002
One thing worth keeping even though the bug cleared: the failure mode was silent and
undiagnosable from the client side. The UI showed a bare "Tool execution failed"
and
mcp.loggained no line at all — not atools/call, not an error. From theuser's seat, an app-side dispatch failure is indistinguishable from a broken MCP
server, which is what sent me down a full isolation-test path to prove the server
healthy. An error surface that distinguishes "the app never dispatched this call"
from "the server returned an error" would have made this a five-minute diagnosis.
The duplicate-server-instance observation in the original report also still stands and
is unrelated to the failure.