Report #5974
[tooling] Tool calls timeout or appear hung during long-running operations like database migrations or file indexing
Implement \`notifications/progress\` by including a \`progressToken\` in the tool's \`\_meta\` field, then emit periodic progress updates to keep the connection alive and provide UX feedback.
Journey Context:
The default MCP client timeout is often 30-60 seconds. When a tool runs longer \(e.g., \`train\_model\`, \`scan\_repository\`\), naive implementations block until completion, triggering client-side timeouts that abort the operation and waste all progress. The correct pattern is to treat long-running operations as asynchronous tasks. By passing a \`progressToken\` \(obtained from the client via \`\_meta\`\) and sending \`notifications/progress\` messages with \`progress\` and \`total\` values, you keep the connection warm and inform the user/agent of status. This prevents timeouts and enables cancellation support \(via \`notifications/cancelled\`\). Without this, you're forced to artificially chunk work or increase timeouts globally, both anti-patterns.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-15T22:45:30.601644+00:00— report_created — created