MCP jobs_wait wait_deadline_exceeded vs wait_canceled: what to do
Both are retryable 503 results from Sume's jobs_wait with next_action poll_status. The job is untouched: call jobs_wait again, never resubmit.

The jobs_wait tool on Sume's hosted MCP server holds a call open until jobs finish. It waits 50 seconds by default and 55 at most, and takes one job id or a batch of 1 to 20. Most of the time it ends in a normal result. If the wait runs out, you get a result with timed_out set to true, which is a scheduling fact and not a failure. Two other outcomes are real errors, and they are easy to confuse: wait_deadline_exceeded and wait_canceled.
What each code means
Both come back as a tool error with http_status 503, retryable true and next_action poll_status. The server chooses between them with one test: if the request's abort signal fired, the code is wait_canceled; for any other interruption inside the wait it is wait_deadline_exceeded.
So wait_canceled says your side or the transport ended the call, for example a client timeout shorter than the wait, or a user pressing stop. wait_deadline_exceeded says the wait was cut short without an abort from you. In neither case did anything happen to the job.
| Outcome | Kind | What to do |
|---|---|---|
| timed_out: true in a normal result | Not an error | Call jobs_wait again on the same ids |
| wait_deadline_exceeded | 503, retryable | Call jobs_wait again, or switch to a status read |
| wait_canceled | 503, retryable | Check your client timeout, then call again |
| wait_busy | 429, retry_after_seconds 1 | Another wait holds the budget; retry the wait |
The one thing never to do
Do not call the paid create tool again. The job id you hold is still the job. A second create is a second charge unless you resend the original idempotency_key. The error text even says so in the busy case: keep one jobs_wait for all pending job ids and do not submit replacement jobs.
If your client has a request timeout, set it above the wait you ask for. A 30 second client timeout and a 50 second default wait will produce wait_canceled on every long video. Either raise the client timeout past 55 seconds or pass a smaller timeout on the call.
A safe loop
Treat all of these as the same thing: still working. Track the ids you submitted, call jobs_wait with wait_for set to all, and repeat until every job reports a terminal status. Use include_results only when you are ready to read output, because large results fill the model context.
- Wait on all pending ids in one call, not one call per id.
- On a 503 or timed_out, wait again; add a short pause after repeated errors.
- After about three errors in a row, read GET /v1/jobs/{id}/status once to confirm the status.
- Never replace a pending job with a new create.
Sources
Related posts
More in Integrations
- MCP max_spend_exceeded: how Sume compares a dry run to your cap
max_spend_usd is optional on Sume's paid MCP tools, from 0 to 10,000. If the estimate is higher, max_spend_exceeded stops the call before it bills.
- MCP missing_tool_argument vs invalid_tool_argument: three look-alikes
Sume's MCP server has three near-identical codes: missing_tool_argument, invalid_tool_argument and invalid_tool_arguments. Learn which field each one names.
- MCP 503 mcp_oauth_unavailable vs 401: do not re-sign-in
A bad OAuth token gets 401 with WWW-Authenticate; a server fault gets 503 mcp_oauth_unavailable or mcp_oauth_not_configured. Retry on 503, sign in only on 401.
- MCP OAuth invalid_grant: four causes at Sume's token endpoint
The Sume MCP token endpoint answers invalid_grant with one of five messages. They group into four causes: reuse, expiry, mismatch and a bad PKCE verifier.
Written by Sume