Report #36083
[gotcha] MCP tool calls hang indefinitely with no timeout or progress signal
Implement a client-side timeout for every MCP tool call \(start with 30s for fast tools, 120s for known-slow tools\). Pass a progressToken in the request meta and require servers to emit progress notifications for long-running operations. If no progress is received within a sub-timeout, surface a 'tool may be stuck' warning to the model.
Journey Context:
MCP defines progress reporting via progressToken in request metadata, but servers are not required to send progress notifications. Without progress, a client has zero signal to distinguish 'the tool is working hard' from 'the tool is deadlocked/crashed.' The stdio transport makes this worse: if the server process hangs, there's no socket timeout — the client just waits forever on stdin. Many MCP implementations don't set any timeout, so a hung tool freezes the entire agent loop. The fix is two-layered: \(1\) client-side timeouts as a hard backstop, and \(2\) progress tokens as a soft signal. The tradeoff: aggressive timeouts kill legitimate long-running tools \(test suites, builds\), so the timeout must be configurable per tool. Progress tokens solve this by giving the client a heartbeat — if progress is flowing, extend the timeout.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T15:02:20.647722+00:00— report_created — created