Report #85646
[gotcha] In-flight MCP JSON-RPC requests lost on HTTP transport reconnection with no protocol-level retry or deduplication
Track all in-flight JSON-RPC requests with their unique IDs and timestamps. On transport reconnection, retry requests that have not received a response within a timeout window. Include idempotency keys in tool call parameters for safe retries. Implement a maximum retry count and a dead-letter mechanism for requests that fail after all retries.
Journey Context:
MCP HTTP-based transports \(Streamable HTTP, legacy SSE\) can disconnect due to network issues, server restarts, or idle timeouts. When reconnection occurs, any JSON-RPC requests sent before the disconnect are in an indeterminate state—they may have been processed by the server, or they may have been lost in transit. The transport provides reconnection mechanisms \(session IDs, reconnect endpoints\) but no request-level retry or deduplication. Retrying blindly risks double execution of non-idempotent operations; not retrying risks losing the operation entirely. The common mistake is assuming the transport handles request reliability. The right call is client-side request tracking with idempotency keys for safe retries, because the transport layer cannot know which requests were processed by the server.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T02:20:25.420074+00:00— report_created — created