Claude can return several tool_use blocks in one response, and parallel tool use is on by default. Send every tool_result back together in one user message, and set disable_parallel_tool_use: true inside tool_choice if you want one call at a time.
Running the calls
When a response has stop_reason: "tool_use", it can hold more than one tool_use block. The API does not set an execution order. You can run the calls concurrently, sequentially in the order they appear, or a mix. Independent read-only lookups are usually safe to run in parallel. Calls with side effects or ordering needs are better run one after another.
Whatever you choose, return one tool_result per tool_use block, all in the next user message, each matched by tool_use_id and placed before any text. If you skip a call, for example because an earlier one failed, still return a result for it with is_error: true and a short reason.
Why Claude stops calling in parallel
The most common cause is the message history. If your loop sends each result in its own user message, the transcript shows a one-call-per-turn pattern and Claude learns to follow it. The fix is to collect the results for a turn and send them in a single user message. A stronger system prompt can also raise how often Claude batches calls. If calls in one batch depend on each other, add a system prompt line such as "Only batch tool calls that are independent of each other."
Turning it off
Set disable_parallel_tool_use: true inside the tool_choice object, for example {"type": "auto", "disable_parallel_tool_use": true}. It is not a top-level request parameter. With auto, Claude calls at most one tool per response and can still answer in plain text. With any or tool, Claude calls exactly one tool.
This suits flows where one pending call at a time keeps approval or auditing simple, such as an agent that can run destructive operations.
Where the exam catches people
Believing disable_parallel_tool_use is a top-level parameter: it only works inside the tool_choice object.
Believing parallel calls need to be switched on: they are on by default, and splitting results across messages is what makes Claude stop.
Believing a failed or skipped call can be dropped from the reply: every tool_use needs a tool_result, with is_error: true for failures.
Believing the calls in one response must run concurrently: the API sets no order, and running them sequentially is valid.