Claude Code's 60 s MCP timeout: Sume sync waits 30 s, video polls

Claude Code 2.1.287 caps MCP tool calls at 60 seconds per server. Sume's 30 s sync wait and 55 s jobs_wait fit under it; a video render needs repeated waits.

4 min readSume
All posts

Claude Code now ends an MCP tool call after 60 seconds per server, so a render that outlasts that has to be polled, not awaited. Sume's waits are built to fit: sync blocks for at most 30 seconds and jobs_wait holds at most 55.

The changelog entry for 2.1.287 (Oct 1, 2026) says MCP tool calls no longer hang forever and that the per-server timeout is 60 seconds.

Each Sume wait against the 60 s line

The 55-second cap leaves five seconds of margin. If your connection adds latency, pass a smaller timeout_seconds, such as 40.

Sume wait mechanisms compared with a 60-second tool timeout (read 2026-10-03)
MechanismMaximum holdFits under 60 s?
mode: sync or subscribe on submit30 seconds (wait_timeout_seconds is clamped to 0 to 30)Yes
MCP jobs_wait, default slice50 secondsYes
MCP jobs_wait, largest slice55 seconds (larger values are clamped)Yes, narrowly
mode: async plus status pollingA fast read per callYes

Video is longer than any slice

The docs note that images often finish within the 30-second sync window, while video, avatar-video and face-swap jobs routinely do not. A wait is a bounded view of a job, not a limit on the job.

To wait for a ten-minute render, repeat the wait rather than asking for a longer one. When a slice ends with wait_slice_expired, call jobs_wait again with the same ids.

What not to do after a timeout

A timed-out tool call tells you only that you stopped waiting. The job continues and continues to bill. Three habits matter.

  • Do not resubmit the paid create. If you must retry a submit, reuse the same idempotency key so the retry returns the original job.
  • Treat a 524, 522, 523 or 525 on jobs_wait as a transport failure, not a job outcome. Re-issue the wait or read jobs_status once.
  • Do not report the job blocked because a slice expired; check terminal and result_ready first.

A prompt that works

You can steer the agent with an instruction rather than code. For example: submit once with an idempotency key, record the job id, then call jobs_wait with timeout_seconds of 45 and repeat on wait_slice_expired until the job is terminal, then read jobs_result.

If you submit several jobs at once, pass up to 20 ids to one jobs_wait call and set include_results: true, so a single call per slice covers the whole batch.

Webhooks as the alternative

If your own service starts the work, a webhook removes waiting entirely. Sume sends job.completed, job.failed or job.canceled to a public HTTPS URL, signed with HMAC SHA-256. Keep status polling available as a backup for deliveries that never arrive.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume