Report #16461
[gotcha] Async start-job \+ check-status tool pairs create token-burning polling loops
Instead of separate start/check tools, implement a single tool that blocks until completion with a client-side timeout. If you must use async patterns, have the status tool return an explicit 'wait N seconds before checking again' directive and enforce it client-side. Better: use MCP's notification mechanism to push completion events rather than requiring the agent to poll.
Journey Context:
For slow operations \(builds, deployments, long-running tests\), developers naturally split the tool into start\_job \(returns a job ID\) and check\_status \(takes a job ID, returns status\). The LLM then polls: call check\_status, get 'pending,' call check\_status again, get 'pending,' repeat. Each poll costs a full API round-trip and token expenditure. The agent has no concept of 'wait 10 seconds'—it calls check\_status immediately in the next turn. This can easily burn 50\+ API calls for a single 2-minute operation. The fundamental problem is that LLMs don't have a native 'sleep' primitive. The fix is to avoid the pattern entirely when possible \(just block\), or to make the wait directive machine-enforceable so the client middleware can actually delay the next poll.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T02:45:12.333307+00:00— report_created — created