Local MCP servers fail with 'Not ready after 60 seconds' even though the remote connection succeeds (shared-pool readiness bug)
Title
Local MCP servers fail with "Not ready after 60 seconds" / "Request timed out" even though the remote connection succeeds (shared-pool readiness bug)
Environment
- App: Claude Desktop (Cowork build), Windows 11 Enterprise
- Update channel:
autoUpdatesChannel: "latest"(auto-updates enabled) - Config: 5 local MCP servers defined in
claude_desktop_config.json(3 remote viamcp-remote+ 2 local stdio: playwright, context7) - Network: corporate proxy (reachable, verified via
Test-NetConnection), internal domain reachable directly in browser
Summary
All 5 configured local MCP servers (confluence-mcp, jira-mcp, github-mcp, playwright, context7) suddenly started failing this morning with no config changes since the previous day, when all 5 were working. The same MCP configs work correctly via the claude CLI (Claude Code) on the same machine at the same time, ruling out network/proxy/token/cert issues.
Steps to reproduce
- Configure any MCP server via
mcpServersinclaude_desktop_config.json(works fine one day) - Restart the app (auto-update likely applies here)
- Open Settings → 계정 → 로컬 MCP 서버 — all servers show ⚠️ 실패 with "Couldn't start for Cowork and Code sessions. Error: Request timed out"
- In parallel, run
claude mcp listin a terminal with the identical server definitions — all connect successfully (✔ Connected)
Expected behavior
Local MCP servers configured in claude_desktop_config.json connect successfully, consistent with the claude CLI behavior using the same config.
Actual behavior
Per %LOCALAPPDATA%\Claude\Logs\mcp-server-confluence-mcp.log, the underlying mcp-remote process actually succeeds in connecting to the remote server:
[27284] Connected to remote server using StreamableHTTPClientTransport
[27284] Local STDIO server running
[27284] Proxy established successfully between local STDIO and remote StreamableHTTPClientTransport
But shortly after, the app's internal session-pool layer reports a timeout and shuts the server down before the UI/session ever sees it as ready:
[info] Server transport closed (renderer released port); shutting down server
[error] Couldn't start for Cowork and Code sessions. Error: Not ready after 60 seconds; the sessions waiting for it started without it { metadata: { context: 'shared-pool', ... } }
[error] Couldn't start for Cowork and Code sessions. Error: Request timed out { metadata: { context: 'shared-pool', ... } }
This indicates the underlying connection succeeds, but the app's shared MCP-process-pool coordination (used across Cowork/Code sessions in the same app) fails to propagate the "ready" signal within its 60s window, and reports a false failure to the UI.
Notes
- This reproduces identically for all 5 configured servers (3 remote HTTP via mcp-remote, 2 local stdio), suggesting the bug is in the shared-pool layer itself rather than any individual server's transport/auth.
- Fully quitting (including tray icon) and relaunching the app did not resolve it.
- Suspect this coincides with an overnight auto-update (
autoUpdatesChannel: "latest"), since nothing in the local config changed between the last known-good state and this failure.
Attachments
- (attach a redacted excerpt of
mcp-server-confluence-mcp.logaround the failure timestamp — double-check nox-auth/Authorizationheader values are present before attaching)
Showing cached comments. Read the full discussion on GitHub ↗
3 Comments
Log excerpt: mcp-server-confluence-mcp.log (last 200 lines, most recent failure cycle)
Note: header names (e.g.
x-auth) appear but values/tokens are never logged by mcp-remote, so this excerpt is safe to share as-is.Helpful split in the report: CLI
claude mcp listshows Connected while Desktop's shared-pool path times out after the child already logged a successful transport. That usually means readiness is being judged on a different signal than "child process started / remote handshake OK."Things that have helped isolate this class of shared-pool false fail on Windows:
Proxy established successfully/Connected to remote serverappears beforeNot ready after 60 seconds, the gate is almost certainly waiting on an in-app ready event that never fires (or fires on a different session id), not on network/auth.mcp-remotecold start eating the 60s budget across five servers.node/mcp-remotefrom the previous Desktop process before relaunch.NODE_EXTRA_CA_CERTSenv the CLI shell has. If only the threemcp-remoteservers fail while native stdio (playwright/context7) succeed under the single-server test, lean that way; if all five fail identically, pool coordination is still the prime suspect.Redacting
Authorization/ cookie headers from the attached mcp-server log before upload is the right call — the useful lines are the transport success + the shared-pool timeout metadata, not the headers.Update: re: @stonianua's diagnostic tips (1) and (4)
Thanks for the detailed breakdown — here's what we found re-examining the original log and running a partial version of the "reduce fan-in" test.
Re (1) timestamp comparison: Confirmed exactly the pattern you flagged. In the originally attached log:
The actual remote handshake succeeds, but strictly after the shared-pool's 60s gate already reported failure to waiting sessions. So this isn't "gate waits on the wrong signal never firing" — the right signal does fire, just too late.
Re (4) env inheritance vs. cold-start latency: Ran a rough version of the single-server test (imperfect — renaming server keys to "_disabled_X" doesn't actually stop them from being attempted, it just renames them, so all 5 were still attempted). Even so, in that run:
context7(local stdio, directnpx) → started successfullyconfluence-mcp(remote viamcp-remote) → still failed with the same "Not ready after 60 seconds" errorCombined with (1), our read is this is less likely a proxy/
NODE_EXTRA_CA_CERTSenv-inheritance gap (which would typically cause a hard failure, not an eventual success) and more likely: remote servers routed throughmcp-remotehave a cold-start path (OAuth discovery + proxy negotiation + TLS to the remote endpoint) that's slow enough to blow through whatever fixed budget the shared-pool readiness gate uses, while local stdio servers spawn fast enough to always clear it.If that's right, possible directions: extend/make configurable the shared-pool readiness timeout for
mcp-remote-backed servers specifically, or have the pool accept a "still connecting, don't give up" heartbeat frommcp-remoteinstead of a hard 60s cutoff.Happy to run a cleaner single-server test (actually removing the other 4 entries rather than renaming) if useful — didn't want to spend more cycles on it without a signal this is helpful for triage.