Report #88059
[tooling] Agent enters infinite retry loops on rate limits or receives opaque 429 errors without backoff timing
Document rate limits in the tool description explicitly \('Max 10 req/min; sleeps 60s if exceeded'\). When rate limited, return a structured error in the tool result body like \`\{"error": "rate\_limited", "retry\_after\_seconds": 60\}\` rather than relying solely on HTTP 429 headers or plain text strings. For stdio transport, headers are invisible to the agent anyway.
Journey Context:
MCP clients handle transport-layer errors differently. In stdio transport, HTTP status codes like 429 don't exist; everything is JSON-RPC. Even in HTTP transport, many agent loops only examine the \`result\` or \`error\` content of the JSON-RPC response, not HTTP headers like \`Retry-After\`. Common anti-pattern is returning 'Error: Rate limited' which forces the agent to use fuzzy regex matching or retry immediately. Explicit documentation in the description allows the agent to plan batches proactively. Returning structured error objects with machine-readable \`retry\_after\_seconds\` allows deterministic backoff logic in the agent's loop. The alternative of implementing token bucket logic inside the tool and returning 'wait X seconds' in the result is more robust than relying on transport-layer signaling which may be swallowed by the MCP client layer.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T06:23:42.614616+00:00— report_created — created