[BUG] Claude Desktop (Windows): MCP tool calls hard-terminated and bridge wedge after repeated timeouts
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?
Bug Report — Claude Desktop (Windows): MCP tool calls hard-terminated at ~4 minutes, and bridge wedge after repeated timeouts
Summary
On Claude Desktop for Windows, any MCP tool call whose execution exceeds ~4 minutes (~240 s)
is terminated client-side with:
"No result received from the Claude Desktop app after waiting 4 minutes. The local MCP
server providing this tool may be unresponsive, crashed, or not running."
The MCP server is healthy and still processing; it returns normally when the same call
finishes faster. The displayed message is misleading (it blames the server, which is fine).
A more severe secondary effect: after a few such timeouts the bridge wedges across ALL
connected MCP servers (see below).
Environment
- Claude Desktop: 1.11187.1 (MSIX package Claude_1.11187.1.0_x64__pzs8sxrjxfjjc)
- OS: Windows 11 Pro, build 10.0.26200
- MCP server(s): local stdio servers (custom), C# MCP SDK 1.3, launched by Claude Desktop
- Transport: local stdio
Severity / Impact
Medium–High for infrastructure/automation use. Blocks any MCP tool whose single call runs
~4 min (DISM /Online /Cleanup-Image /ScanHealth, sfc, long SQL queries, backups, large
file ops, long scripts). The secondary wedge requires restarting MCP servers / the app.
Expected behavior
Long calls run to completion, OR the client honors a configurable/request-level timeout. A
single timed-out call must never wedge other healthy MCP servers. MCP supports long-running
operations and progress notifications; a fixed client cap should not silently kill them.
Actual behavior
~240 s cap on every tool call, ignoring any server-side timeout; misleading error text;
cross-server wedge after repeated timeouts.
Evidence / Diagnosis — it is the client/bridge, not the server
- Multiple runs of Start-Sleep 280 all terminated at ~4 min.
- The tool exposes a server-side timeout_seconds parameter; setting it to 600 does NOT change
the outcome -> the cap is in the Claude Desktop MCP client, not the server.
- A trivial call immediately after a single terminated long call returned in <200 ms (server
healthy); but after further timeouts, trivial calls on ALL connected servers also hung 4 min.
Tested across versions
Reproduced consistently across multiple Claude Desktop updates, including 1.11187.2 (latest
as of testing).
Requested fix (any of)
- Make the MCP tool-call timeout configurable (per-server and/or global).
- Honor MCP progress notifications to reset/extend the timeout.
- Raise/remove the fixed cap for local stdio servers.
- Isolate per-server connections so one timed-out call cannot wedge other MCP servers.
- Fix the misleading error text (server is healthy, not crashed).
What Should Happen?
To work normally with MCP tools
Error Messages/Logs
Tool result could not be submitted. The request may have expired or the connection was interrupted. Refresh the page to continue.
Steps to Reproduce
Steps to reproduce — primary (4-min cap)
- Connect any local stdio MCP server exposing a long-running tool.
- Invoke a call that takes > ~4 minutes, e.g.:
Start-Sleep -Seconds 280 # 4m40s
- The call is terminated at ~4 minutes; the result is never returned.
Steps to reproduce — secondary (bridge wedge)
- Trigger the 4-min timeout above 2–3 times (and/or a long-timed-out call on a second MCP server).
- Issue a TRIVIAL call afterwards (1-line command, server timeout 30 s).
- Observed: after the first one or two timeouts a trivial call may still recover (<200 ms),
but after repeated timeouts every connected MCP server becomes unresponsive — trivial calls
then also time out at the same 4-minute mark — until the user restarts the MCP servers /
Claude Desktop. Points to a shared client-side bridge resource (connection/worker pool or
event loop) being exhausted/blocked by the capped-but-still-running requests.
Claude Model
Opus
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
Claude 1.11187.2 (8cc3af) 2026-06-05T04:43:40.000Z
Platform
Anthropic API
Operating System
Windows
Terminal/Shell
Windows Terminal
Additional Information
Showing cached comments. Read the full discussion on GitHub ↗
8 Comments
Found 3 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
This is NOT a duplicate that should be auto-closed. The bot points to #44032 as
canonical, but #44032 was closed as "invalid / not about Claude Code" and locked
on 2026-04-17 — and #64614 and #51043 were then auto-closed as duplicates *of that
locked/invalid issue*. Net result: a confirmed, recurring defect has no live tracking
issue. This report is correctly triaged (labels: bug, platform:windows, area:mcp), so
please keep it open as the canonical tracker.
It is OS- and transport-independent — the same defect is described across:
Concrete, reproducible evidence (this report adds a protocol-level trace the others lack):
notifications/cancelledat exactly +4:00after
tools/call, withMCP error -32001: Request timed out— i.e. a hard client-sidecap, server still running.
timeout_seconds=600does not bypass it → confirms "not configurable".calls then also hang 4 min until restart) → this is the "UI state corruption" from #44032.
Requested fix (any one): configurable client-side tool-call timeout (per-server/global);
honor MCP progress notifications to extend it; and isolate per-server connections so one
timed-out call cannot wedge other servers.
The real bug here is the cross-server wedge, not the 4-minute cap itself.
After a call hits the cap, all connected MCP servers go unresponsive — unrelated trivial calls also hang for 4 minutes, until a full restart. One stuck call freezing every other server is a missing per-server isolation defect (a shared client-side bridge resource blocked/exhausted). This is a bug regardless of whether the 4-min cap is intentional, and it's why this issue should stay open.
Workaround (local stdio servers you control): you can't fix the client-side isolation, but you can stop your server from ever tripping the wedge — cap each tool call below the ~4-min limit on the server side and return a normal error. It must be race-and-abandon, not cooperative cancellation, since most handlers don't observe a
CancellationToken. For .NET /ModelContextProtocolSDK, one CallTool filter does it:In Claude Desktop (Windows 11, local stdio, C# SDK 1.3): a
Start-Sleep 150call advertisingtimeout_seconds: 250returned the error at ~120 s; the next call succeeded in ~170 ms, no wedge (server log:after 120039ms). I can no longer reproduce the cross-server wedge from a well-behaved server.This doesn't fix the root: a server that doesn't self-cap (or any remote connector you don't control) will still wedge the bridge. The real fix is client-side per-server isolation, so one timed-out call can't take down the others.
Still affected on Claude Desktop for Windows (latest version, July 2026). I use the ioBroker MCP adapter to query InfluxDB history data from my smart home setup. Any history_query over a larger time range triggers the 4-minute timeout. Worse: after 2-3 timeouts, ALL connected MCP servers become unresponsive (the bridge wedge described in #65643). The only recovery is killing all node.exe processes in Task Manager and restarting Claude Desktop — a normal restart doesn't help because the node processes survive the close.
A configurable timeout (or at minimum raising the default to 10 minutes) would make MCP usable for real-world data queries.
macOS confirmation, with server-side log evidence: the timed-out call never reaches the local MCP server
Adding a macOS data point to this report, including local MCP server logs that show where the call is lost. Since this reproduces on macOS, the
platform:windowslabel may be too narrow. Related: #44032 (hard 4-minute client timeout) and #41836 (no session/conversation identifier sent to MCP servers).Environment
initializeexchange in the log:serverInfo=secure-filesystem-server 0.2.0, protocol version2025-11-25,clientInfo=claude-ai 0.1.0Symptom
One conversation's
list_allowed_directoriescall, the cheapest tool this server exposes, fails after exactly 4 minutes with the standard message: "No result received from the Claude Desktop app after waiting 4 minutes. The local MCP server providing this tool may be unresponsive, crashed, or not running." Unlike the original report, no long-running call is involved on my side; the dropped call is trivial and the server is idle and healthy.Server-side log (
~/Library/Logs/Claude/mcp-server-Filesystem.log, timestamps UTC,{ metadata: undefined }suffixes trimmed)Incident on 2026-07-19. The failing call must have been dispatched between roughly 12:05 and 12:16 UTC (the error was on screen at 12:20:46 UTC). In that window the server receives no
tools/callat all. The transport is torn down at 12:14:26 and immediately rebuilt:The dropped call never appears in the log. It is lost inside the Desktop app's bridge before reaching the server process. Every call that is delivered gets a result within milliseconds; the slowest response in several weeks of this log is about 17 seconds for one large read (2026-07-10), nowhere near 240 seconds.
Same signature on 2026-06-18. A connection is opened, handles
initializeandtools/list, receives not a singletools/call, and is torn down exactly 4 minutes later, to the second:Additional observation
Around window/renderer changes ("Server transport closed (renderer released port)") the app opens several connections within the same second (for example 2026-07-08 13:10:52 to 13:11:45 UTC, and 2026-07-17 12:41:52 to 12:42:35 UTC). In my usage the losses cluster around exactly this churn, when two conversations pull on the bridge at once.
Takeaways
I can share a redacted copy of the full log file if that helps.
Follow-up with new evidence: a call reported as timed out was delivered, executed in 1 ms, and its result was lost — silent side effects behind the 4-minute error
Same environment as my comment from July 19 above (macOS, Filesystem desktop extension, built-in Node.js runtime). New observations from one morning (2026-07-20, all times UTC), collected across several conversations using the same Desktop app and correlated against
mcp-server-Filesystem.log.1. Lost result with a persisted side effect (data-integrity hazard)
A
write_filecall from one conversation was reported to the model with the standard error ("No result received from the Claude Desktop app after waiting 4 minutes …"). The server log shows the call was in fact delivered and answered instantly:The target file existed on disk afterwards, its contents matching the payload of the "failed" call verbatim, and its birth timestamp equals the delivery time (
stat -f "%SB"reports 10:50:59 CEST, i.e. 08:50:59 UTC). Only the success response was lost on its way back to the conversation.Implication: the timeout message can mask a completed, persisted write. Blindly retrying "failed" calls risks double execution; for non-idempotent tools this is a data-integrity problem, not just a UX problem. Suggested addition to the fix list: when the 4-minute timeout fires, do not silently discard a result that still arrives, and tell the model/user that the operation may nevertheless have completed.
2. Delivery losses also occur with a single conversation
Two further losses hit trivial
read_text_filecalls on markdown files under 4 KB while no other conversation was issuing tool calls; one of them was the second call immediately after a fresh app start, right after a first call that had returned in milliseconds. Concurrent conversations and window switching aggravate the problem but are not required.3. Delivery is stochastic; reads and writes are equally affected
An identical
edit_filecall failed once and succeeded on manual retry. Another write was delivered normally between two losses. Across the whole day, every call that reached the server was answered in milliseconds, and every failure corresponds to a missingtools/callentry in the log (delivery loss), reconfirming the July 19 analysis. The exact-240-second teardown signature appeared again: last delivered call at 07:27:41, then a silent teardown at 08:04:32, i.e. 240 seconds after the reconstructed dispatch of a lost call.4. Accumulation and wedge
After repeated timeouts, and after further calls were issued despite earlier failures, even trivial calls began timing out until the app was fully restarted — matching the wedge behavior described in this issue.
Happy to share redacted log sections for each of these windows.
Windows/MSIX confirmation of the delivery-loss signature, plus a persistent variant and a separate config-path defect
Corroborating @Fuchskind73's "the call never reaches the server" analysis from the Windows side, on a build very close to the original reporter's.
Environment
Claude_pzs8sxrjxfjjc)claude_desktop_config.json-declared and Desktop Extension installedSame signature, Windows side
Every local server log shows the complete handshake and then nothing — no error, no disconnect:
Meanwhile
main.logaccumulatesMCP_TOOL_TIMEOUTevents with no correspondingtools/callin any server log at any timestamp. Confirming the point already made in this thread: the client times out on requests it never put on the wire, and the resulting message ("the local MCP server ... may be unresponsive, crashed, or not running") names a component that is provably healthy. On this machine that misdirection cost several weeks of restart and reinstall cycles aimed at servers that were fine the entire time.The backend was independently exonerated too: for the Obsidian connector, the backing REST service returned a full authenticated listing in under a second during the exact period the connector was reported unresponsive.
What may be new here: a persistent, not intermittent, variant
Reports in this thread describe stochastic loss that a restart clears. Last
tools/callactually received per server on this machine:| Server | Installed via | Last
tools/callreceived ||---|---|---|
| obsidian-vault | config | 2026-07-17 |
| Windows-MCP | extension | 2026-07-15 |
| Control your Mac | extension | never — zero occurrences |
| PDF Tools | extension | never — zero occurrences |
"Control your Mac" has been installed,
isEnabled: true, and starting cleanly across many app restarts since 2026-07-02 — eighteen days — and its log contains not onetools/call. If that is the same defect, it is not self-clearing on restart for every connector, which would matter for how the fix is validated.Limitation, stated plainly:
MCP_TOOL_TIMEOUTentries inmain.logare global rather than per-connector, so I cannot prove from logs alone that a call was attempted against that specific connector and dropped, versus never attempted. PDF Tools in particular may simply be unused. I am reporting the observation, not asserting the attribution.Separate defect that compounds diagnosis on Windows: config-path divergence
%APPDATA%\Claude\claude_desktop_config.jsondoes not exist on this machine. The MSIX build reads only the virtualized copy under:Documentation and most third-party setup guides reference the
%APPDATA%path. An edit written there succeeds and has no effect — no warning, no error, no indication the file is not the one being read. This is independent of the dispatch bug, but it means anyone on MSIX debugging the dispatch bug is liable to spend a cycle "fixing" a config the app never reads.A startup warning when a config file exists at the unread path would remove that class of confusion entirely.
Related trap for anyone else diagnosing on Windows: Desktop Extensions never appear in
claude_desktop_config.jsonat all — they live inClaude Extensions\with anisEnabledflag inClaude Extensions Settings\<id>.json. Reading only the config file makes extension-installed connectors look unregistered. I made exactly that error before catching it.The one diagnostic change that would have mattered most
Independent of root cause, the timeout message should distinguish:
The current text asserts the first in a case that is provably the second. That single distinction would have cut this investigation from weeks to minutes, and going by this thread, the same is true for several other people here.
Thanks for the detailed writeup - this lines up with what I found on my end
too. After a hung
history_querycall, I closed Claude Desktop completely,and Task Manager still showed 5 "Node.js JavaScript Runtime" processes
running afterward, holding around 43% of RAM between them. So a plain
close/restart clearly doesn't reliably tear down the mcp-remote child
processes on my machine either - matches your point that this doesn't
self-clear for every connector.
Can also confirm the config-path issue from the MSIX side: we're on the
MSIX build too, and %APPDATA%\Claude\claude_desktop_config.json here is
exactly the stale copy you'd expect - last modified once, never touched
again after we found the real path. The live config is under
%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\.
Same package family ID as yours, for what it's worth - seems to be fixed
per-app rather than per-install.
The "request never transmitted vs. sent-but-no-response" distinction you're
asking for would have saved me time too - I initially assumed my local
ioBroker MCP adapter itself was the problem and restarted that for nothing
before finding this thread.
Am Mo., 20. Juli 2026 um 16:09 Uhr schrieb haloeight <
@.***>: