What a Sume MCP create result tells the agent to call next

A Sume MCP create result carries agent.next_step: jobs_wait with the job_id and timeout 50, plus poll_after_seconds 5. Follow it; do not resubmit.

4 min readSume
All posts

After a create call on Sume's hosted MCP, the result's agent object includes next_step: the tool jobs_wait with the job id and a timeout_seconds of 50, and poll_after_seconds, which defaults to 5. Follow it and do not resubmit the create.

The envelope fields

Successful tool results are merged with an agent envelope. It holds next_steps (plain sentences), next_step (one machine-readable call), adjustments, poll_after_seconds, recovery and hint. For tools whose name ends in _create, the sentences tell the agent to capture the request id and any resource id, then use jobs_wait, and not to echo prompts, signed URLs or private media URLs in reports.

The agent envelope on Sume MCP results (read 2026-10-05 against the Sume codebase)
FieldPurpose
next_stepsplain-language follow-ups
next_stepone tool call with arguments, such as jobs_wait
adjustmentspath, from, to and reason for any corrected input
poll_after_secondssuggested spacing for status reads, default 5
recoverycode and hint for a stop condition
hintpointer when a field was redacted

Job id discovery

The server finds the job id in several places, in order: a top-level job_id, then response.data.job_id, request_id, a nested job or run id, and finally a /v1/jobs/<id> status URL. You do not need to guess. If the envelope has no next_step, the call did not create a job, and you should read the result as it is.

Following it in code

The helper below prefers the server's pointer and falls back to the wait.

def follow(result: dict) -> dict:
    step = (result.get('agent') or {}).get('next_step')
    if step and step.get('tool') == 'jobs_wait':
        return {'tool': 'jobs_wait', 'arguments': step['arguments']}
    return {'tool': None, 'arguments': {}}

res = {'agent': {'next_step': {'tool': 'jobs_wait',
       'arguments': {'job_id': 'job_1', 'timeout_seconds': 50}}}}
print(follow(res))

Limits

The envelope is guidance for the next call, not a promise about timing. A render can outlast many slices. Keep re-issuing the wait, and read the jobs_wait post for slice rules.

What the envelope is for

A model reading a raw create response has to infer the follow-up call. The agent envelope states it: the tool, its arguments and a poll interval. That removes a class of mistakes, such as waiting on the wrong id, using a status poll in a tight loop, or giving up because the first read says in progress.

Checklist before you ship

  • Copy job_id and timeout_seconds from next_step instead of retyping them.
  • Treat poll_after_seconds as a floor for status polling, not as a deadline.
  • Prefer jobs_wait over a hand-written polling loop.
  • Never resubmit the create because the next step has not finished.

Sources

Related posts

More in Agents

All Agents posts

Written by Sume