The model can call multiple tools per turn
When the user asks a compound question ('weather in Seoul and Tokyo'), Claude returns multiple tool_use blocks in a single assistant turn. You execute them, collect the results, and send all tool_result blocks back in one user turn. Round-trips drop from N+1 to 2.
Concurrency is your job
The protocol delivers parallel tool_use blocks; running them concurrently is your code's job. asyncio.gather or Promise.all over the blocks is the obvious move. Make sure tool order in the response matches the tool_use_ids — the model uses ids to associate results.
When to disable parallel
If your tools have ordering dependencies (call A before B), pass tool_choice: {"type": "tool", "name": "A"} on the first round and a different choice on the second. Or set disable_parallel_tool_use: True in tool_choice to force sequential. Use sparingly — most tools are independent.