[BUG] Cowork/MCP tool calls fail with -32001 after ~60s even when the server completes and the result arrives
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?
Long running MCP tool calls in Cowork (local-agent mode) fail client side with:
MCP error -32001: Request timed out
after roughly a minute, even when the MCP server is healthy and the tool actually finishes. The valid result comes back over the transport after the client has already sent notifications/cancelled, and the host silently throws it away.
This is the same defect already documented in #58687, which has a full JSON-RPC wire trace showing the result for the cancelled request id arriving intact after the host cancelled. That issue is still open but has gone stale with no fix. #470 proposed the fix (resetTimeoutOnProgress: true). I'm filing fresh confirmation that this is still happening, and adding a reproducible third party case, so the report doesn't die on the stale label.
I reproduced it independently with a third party MCP server (XPipe, an SSH manager). A run_command over SSH that sleeps ~75s fails client side with -32001 after about a minute. A cheap follow up command on the same SSH session runs instantly right afterward and shows the box healthy, which proves the session was fine the whole time and only the result delivery was dropped. Original writeup: xpipe-io/xpipe#870.
What Should Happen?
Keep an MCP tools/call alive as long as the server keeps sending notifications/progress, using resetTimeoutOnProgress: true from the @modelcontextprotocol/sdk client, instead of a fixed wall clock timeout.
- The client should call
client.callTool(params, schema, options)withonprogressset andresetTimeoutOnProgress: true, so the SDK attaches a_meta.progressTokenand resets the per request timer on each correlated progress notification. MCP_TOOL_TIMEOUTshould behave as the idle timeout between progress notifications, not a hard cap on total duration. A separatemaxTotalTimeoutcan serve as the optional safety net.- If the host does time out and later receives a
resultfor the cancelled id, do not silently discard it. Log a warning at minimum, so users can tell "actually failed" apart from "finished right after the client quit waiting."
Error Messages/Logs
MCP error -32001: Request timed out
(Full JSON-RPC trace of the result arriving after cancellation is in #58687. My third party repro trace is in xpipe-io/xpipe#870.)
Steps to Reproduce
- Connect a third party MCP server in Cowork whose tool legitimately takes 60s or more. XPipe
run_commandover SSH works, so does any LLM backed or agentic MCP tool. - Invoke the slow tool, e.g. an SSH command like
echo start; sleep 75; echo end. - Observe
MCP error -32001: Request timed outin the UI after about a minute. - Immediately run a cheap command on the same connection (for example
dateon the same SSH session). Confirm enough time has passed for the original to have finished, and that the session is still healthy. The result was simply never delivered back to the client.
Claude Model
Not sure / Multiple models
Is this a regression?
I don't know
Last Working Version
_No response_
Claude Code Version
Cowork / Claude Desktop build 1.17377.1
Platform
Anthropic API
Operating System
Windows
Terminal/Shell
Non-interactive/CI environment
Additional Information
Related: #58687 (existing detailed report, still open, gone stale), #470 (proposed fix using resetTimeoutOnProgress), xpipe-io/xpipe#870 (third party repro over SSH).