Report #42821
[gotcha] MCP progress reporting is optional — long-running tools appear to hang with no feedback
Never assume progress reporting works. For any tool that may take more than a few seconds, implement client-side timeouts \(e.g., 30 seconds\) with a fallback action: either report the timeout to the model with an error result, or switch to an async polling pattern where the tool returns a job ID immediately and a separate 'check\_status' tool polls for completion. Test your timeout handling with intentionally slow tools.
Journey Context:
The MCP spec defines a progress notification mechanism: the client sends a progressToken in the tool call's \_meta field, and the server can send progress notifications back. This sounds like a robust solution for long-running tools. In practice, progress reporting is entirely optional — most MCP servers don't implement it. If you send a progressToken, the server silently ignores it. Your tool call then blocks with no feedback until it completes or the connection drops. For tools that take minutes \(data processing, compilation, large queries\), this looks identical to a hung server. There's no way to distinguish 'working slowly' from 'broken and stuck' without progress updates. The spec's optional progress mechanism creates a false sense of capability — you think you have observability, but you don't unless both client and server explicitly implement it.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T02:20:37.143796+00:00— report_created — created