MCP batch mixed tools error: split status reads, waits, tools
Sume's legacy MCP batch must hold one class of work: jobs_status reads, jobs_wait waits, or other tools. A mixed array gets 400 -32600. Here is how to split it.

A legacy array posted to Sume must hold one class of work: all jobs_status reads, all jobs_wait waits, or all other tools. A mixed array gets HTTP 400 with code -32600 and the message "Legacy batches must contain one work class: status reads, waits, or other tools." Legacy arrays are also capped at 4 messages. Split it into one array per class, or better, one message per POST.
Classes below are from its MCP server source and the tools and gates docs.
Which three classes does Sume use?
| Class | Tool calls in it | Note |
|---|---|---|
| Status reads | jobs_status | Read tool |
| Waits | jobs_wait | Its own tool in the Jobs family |
| Other tools | Everything else | Write and paid tools need idempotency_key |
How do I split a mixed batch?
Group the calls by tool name, then send one request per group. Paid and write calls carry their own idempotency_key, so a retry of one group does not resubmit another. Waiting belongs in its own jobs_wait request; see MCP jobs_wait for long video jobs.
function groupByClass(calls) {
const groups = { read: [], wait: [], tool: [] };
for (const call of calls) {
const key =
call.params.name === "jobs_wait"
? "wait"
: call.params.name === "jobs_status"
? "read"
: "tool";
groups[key].push(call);
}
return Object.values(groups).filter((g) => g.length > 0);
}
// POST each group to https://mcp.sume.com/mcp as its own request.Why does Sume sort calls by class?
Each class draws on its own admission budget, so a wait cannot be mixed with quick reads. Which budget a call uses is covered in how the endpoint counts reads and writes.
Sources
Related posts
More in Developers
- MCP CORS preflight: headers Sume allows for a browser client
Sume answers an MCP OPTIONS preflight with 204 and lists authorization, content-type, idempotency-key, mcp-session-id and x-api-key for listed origins.
- MCP DPoP sender-constrained tokens: Sume is bearer-only today
The MCP roadmap lists DPoP finalization, but Sume's hosted MCP issues mcp_at_ bearer tokens sent in the Authorization header, valid for one hour.
- MCP DCR application_type: what Sume's register endpoint reads
The 2026-07-28 MCP spec asks clients to send application_type in dynamic registration. Sume's /oauth/register reads redirect_uris and other named fields.
- MCP server URL trailing slash 404: use mcp.sume.com/mcp
Sume's hosted MCP URL is https://mcp.sume.com/mcp with no trailing slash. The server registers that exact path, so write it as documented; skip redirect flags.
Written by Sume