Skip to content
CCAF Preparation

Task Statement 2.3·Domain 218% of exam

Tool Distribution & Tool Choice

Distribute tools appropriately across agents and configure tool choice

Jump to practice →

Official Exam Guide Objectives

Task 2.3: Distribute tools appropriately across agents and configure tool choice.

Knowledge of

  • The principle that giving an agent access to too many tools (e.g., 18 instead of 4-5) degrades tool selection reliability by increasing decision complexity
  • Why agents with tools outside their specialization tend to misuse them (e.g., a synthesis agent attempting web searches)
  • Scoped tool access: giving agents only the tools needed for their role, with limited cross-role tools for specific high-frequency needs
  • tool_choice configuration options: "auto", "any", and forced tool selection ({"type": "tool", "name": "..."})

Skills in

  • Restricting each subagent's tool set to those relevant to its role, preventing cross-specialization misuse
  • Replacing generic tools with constrained alternatives (e.g., replacing fetch_url with load_document that validates document URLs)
  • Providing scoped cross-role tools for high-frequency needs (e.g., a verify_fact tool for the synthesis agent) while routing complex cases through the coordinator
  • Using tool_choice forced selection to ensure a specific tool is called first (e.g., forcing extract_metadata before enrichment tools), then processing subsequent steps in follow-up turns
  • Setting tool_choice: "any" to guarantee the model calls a tool rather than returning conversational text

What You Need to Know

How many tools an agent holds is not a packaging question. It changes how often the agent picks the right one, which makes it an architectural decision with production consequences.

The Tool Overload Problem

Hand a single agent 18 tools and selection reliability falls away. Each addition widens the choice the model has to make, and the error rate rises with it. What works is 4-5 tools per agent, chosen for that agent's job.

Count is only half of it. What the tools are for matters as much as how many there are. A synthesis agent should NOT have web search tools. A web search agent should NOT have document analysis tools. Equip an agent beyond its remit and it will find occasions to reach outside it — a synthesis agent holding web_search starts searching for itself rather than working from the results it was given, repeating work that is already done and spending context to do it.

Stated as a rule: an agent's toolkit stops at the boundary of its role, and anything past that boundary is an invitation to cross it.

The tool_choice Configuration

How the model engages with the toolkit is set by tool_choice. Three settings, three distinct jobs.

"auto" (default) The decision belongs to the model — a tool call or a text reply, whichever fits. Right for general operation, where answering conversationally is sometimes the correct behaviour.

{
  "tool_choice": { "type": "auto" }
}

"any" A tool call is required; which tool is not. Right when structured output is non-negotiable and several schemas could apply, because plain text stops being a possible outcome.

{
  "tool_choice": { "type": "any" }
}

Extraction is where this pays. Holding separate schemas for invoices, receipts and contracts against a document whose type nobody has established, "any" guarantees one of them is used rather than the model describing what it found in prose.

Forced selection One named tool, and no discretion about it. Right for a step that must not be skipped or reordered.

{
  "tool_choice": { "type": "tool", "name": "extract_metadata" }
}

This is how ordering gets enforced. If nothing may run before metadata extraction, forcing the call removes the possibility of the model deciding otherwise and starting with enrichment. Once that call has happened, later turns can return to "auto" for whatever follows.

Scoped Cross-Role Tools

Occasionally an agent needs a capability that belongs to somebody else's role. Sending every such request back through the coordinator looks correct and costs 2-3 extra hops each time, which can add 40% or more to latency.

The alternative is a scoped cross-role tool: a deliberately narrowed version of that capability, handed to the agent that keeps needing it.

Consider a synthesis agent checking facts continuously while it writes. Routed through the coordinator, every check becomes a delegation to the search agent, a wait, and a return trip. For the 85% of checks that are trivial lookups resolvable in milliseconds, the entire round trip is overhead.

Give that agent a scoped verify_fact covering simple lookups and those resolve where they arise. Anything genuinely hard — several sources, cross-referencing, a judgement call — still goes through the coordinator. The common case gets the short path and the difficult 15% keeps the full pipeline.

The exam tests this pattern directly (Q9).

Replacing Generic Tools with Constrained Alternatives

fetch_url will retrieve anything from anywhere. load_document, which accepts document URLs and validates them, will not. Substituting the second for the first:

  • Prevents misuse (the agent cannot fetch arbitrary URLs)
  • Makes the tool's purpose clearer (the description is specific, not generic)
  • Reduces the risk of unintended side effects (no fetching of non-document resources)

Note that the second benefit feeds selection quality as well as safety: a narrow tool can be described precisely, and precise descriptions are what tool selection runs on. What that amounts to is least privilege applied to tool design: reach is granted to the extent the role needs it and no further.

Role-Specific Tool Scoping in Practice

Here is how tool distribution looks in a well-designed multi-agent research system:

AgentTools (4-5 each)
Web Searchsearch_web, fetch_page, extract_links, save_snippet
Document Analysisextract_metadata, extract_data_points, summarize_content, verify_claim
Synthesiscompile_report, verify_fact (scoped), format_citation, assess_coverage
CoordinatorAgent (formerly Task, used to spawn subagents), review_output, request_revision

Every agent's list stops at what its role requires. Synthesis carries the scoped verify_fact for the trivial cases. The coordinator holds no domain tools whatever — its job is running the workflow, and giving it the means to do the work itself is how coordinators start doing the work itself.

Deep Dive

tool_choice has four types, not three — and each has a default

The lesson's three headline modes (auto, any, forced) are three of four documented tool_choice types. The Messages API reference defines all four: auto — "The model will automatically decide whether to use tools" (default when tools are provided); any — "The model will use any available tools"; tool — "The model will use the specified tool with tool_choice.name"; and none — "The model will not be allowed to use tools" (default when no tools are provided). none is the one this lesson doesn't otherwise mention: it's how you force a pure-text turn — a synthesis or proofreading pass, say — even when the request still carries a tools array for later turns.

{ "tool_choice": { "type": "none" } }

Sourcesplatform.claude.com › messagesplatform.claude.com › define-toolsfetched 2026-07-30

Forced selection suppresses commentary, not just tool choice

With tool_choice set to any or tool, "the API prefills the assistant message to force a tool to be used. This means that the models will not emit a natural language response or explanation before tool_use content blocks, even if explicitly asked to do so." Under plain auto, Claude commonly adds a short text block explaining what it's about to do before or alongside a tool call — forced selection removes that entirely. If your pipeline logs or displays Claude's reasoning before a forced first step, expect that field to be empty.

Sourceplatform.claude.com › define-toolsfetched 2026-07-30

Forced tool_choice is incompatible with manual extended thinking

A configuration trap worth knowing cold: "When using manual extended thinking (thinking: {type: \"enabled\"}) with tool use, tool_choice: {\"type\": \"any\"} and tool_choice: {\"type\": \"tool\", \"name\": \"...\"} are not supported and result in an error. Only tool_choice: {\"type\": \"auto\"} ... and tool_choice: {\"type\": \"none\"} are compatible with manual extended thinking." A document-analysis agent that both reasons with manual extended thinking and needs to force extract_metadata as its mandatory first step cannot do both on the same call — the forcing has to happen without manual extended thinking enabled, or not at all. Note the scope carefully: the restriction is specific to manual extended thinking. The same page adds that "adaptive thinking, including on models where thinking is on by default such as Claude Opus 5, supports forced tool use."

Sourceplatform.claude.com › define-toolsfetched 2026-07-30

disable_parallel_tool_use lives inside tool_choice, not at the top level

Parallel tool calls are on by default. To turn them off you set disable_parallel_tool_use: true, but it is "not a top-level request parameter" — it's a field inside the tool_choice object, and its effect depends on the enclosing type:

tool_choice.typeEffect of disable_parallel_tool_use: true
autoAt most one tool call per response; Claude can still answer in plain text
any / toolExactly one tool call
{ "tool_choice": { "type": "any", "disable_parallel_tool_use": true } }

Sourceplatform.claude.com › parallel-tool-usefetched 2026-07-30

Changing tool_choice between turns has a prompt-caching cost

A coordinator that forces extract_metadata on turn one, then switches to auto for later turns (exactly the pattern this lesson recommends), pays a caching price for the switch: "changes to the tool_choice parameter will invalidate cached message blocks. Tool definitions and system prompts remain cached, but message content must be reprocessed." Worth knowing when estimating latency/cost for a workflow that toggles forced-then-auto tool_choice on every run.

Sourceplatform.claude.com › define-toolsfetched 2026-07-30

Bloated tool sets are a named failure mode in Anthropic's context-engineering guidance

The 4-5-tools-per-agent guideline isn't just a selection-accuracy heuristic — Anthropic's context-engineering guidance names it directly as a top failure mode: "One of the most common failure modes we see is bloated tool sets that cover too much functionality or lead to ambiguous decision points about which tool to use." Framed this way, every extra overlapping tool costs two things at once — more decision complexity and more context budget spent on descriptions the agent will rarely use. That reframes "scope tools to the agent's role" as a context-engineering discipline, not only a routing-accuracy one.

Sourceanthropic.com › effective-context-engineering-for-ai-agentsfetched 2026-07-30

Quick Reference

FactValue
tool_choice: autoModel decides whether to call a tool or respond in text; default when tools are provided
tool_choice: anyModel must call some tool, but chooses which
tool_choice: tool (forced){"type": "tool", "name": "…"} — model must call the named tool
tool_choice: noneModel may not call any tool; default when no tools are provided
Forced (any/tool) side effectAPI prefills the assistant message — no natural-language text before tool_use, even if asked
Extended thinking compatibilityManual extended thinking only works with auto/none; any/tool error out
disable_parallel_tool_useLives inside tool_choice, not top-level
…with autoAt most one tool call (or none)
…with any/toolExactly one tool call
Effect of changing tool_choiceInvalidates cached message blocks; tool definitions/system prompt stay cached
Optimal tools per agent4-5, scoped to role
Bloated tool setsNamed Anthropic failure mode: ambiguous decision points from overlapping functionality
Scoped cross-role toolConstrained capability given directly to an agent for its high-frequency simple case; complex cases still route through the coordinator

Exam Traps

Practice Scenario

A synthesis agent frequently returns control to the coordinator for simple fact verification, adding 2-3 round trips per task and 40% latency. Analysis shows 85% of verifications are simple lookups. What is the most effective solution?

Build Exercise

Configure Tool Distribution Across a Multi-Agent System

Difficulty: Intermediate (2/4)

45 minutes

  1. Design three agent roles (web search, document analysis, synthesis) and assign 4-5 tools to each, scoped to its role

Why: Tool overload degrades selection reliability. The exam tests the principle that each agent should have 4-5 tools scoped to its specific role. Giving a single agent 18 tools is a known anti-pattern that causes misrouting.

You should see: A configuration object or table listing three agents, each with exactly 4-5 tools. No tool appears in more than one agent role (except scoped cross-role tools added later). Tool names clearly indicate their purpose and scope.

  1. Add a scoped verify_fact tool to the synthesis agent that handles simple lookups directly

Why: Routing every fact verification through the coordinator adds 2-3 round trips and up to 40% latency. The exam tests the scoped cross-role tool pattern — give the agent a constrained version of a capability for the 85% simple case, routing only complex cases to the coordinator.

You should see: A verify_fact tool added to the synthesis agent toolset with a description that explicitly limits it to simple single-source lookups and states that complex multi-source verifications should be escalated to the coordinator.

  1. Configure tool_choice forced selection on the document analysis agent to ensure extract_metadata runs as the mandatory first step

Why: Forced selection enforces workflow ordering. The exam tests your knowledge of all three tool_choice modes: auto lets the model choose freely, any guarantees a tool call, and forced selection guarantees a specific tool call. This prevents the model from skipping mandatory steps.

You should see: A document analysis agent configuration where the first API call uses tool_choice with type: tool and name: extract_metadata, and subsequent calls switch to tool_choice: auto for the remaining analysis steps.

  1. Replace a generic fetch_url tool with a constrained load_document that validates document URLs only

Why: This applies the principle of least privilege to tool design. A generic fetch_url tool can fetch anything from anywhere, enabling misuse. A constrained load_document that validates URLs prevents the agent from fetching arbitrary resources. The exam tests this pattern directly.

You should see: A load_document tool definition that includes URL validation logic (checking for document file extensions or trusted domains) and rejects non-document URLs with a clear error message.

  1. Test with a query that requires all three agents and verify that no cross-role tool misuse occurs

Why: End-to-end testing validates that your tool distribution works in practice. Cross-role misuse — such as a synthesis agent running its own web searches instead of using provided results — is a common failure the exam expects you to prevent through proper scoping.

You should see: A test run log showing: the web search agent using only its tools, the document analysis agent starting with extract_metadata (forced), and the synthesis agent using compile_report plus verify_fact for simple checks. No agent calls a tool outside its assigned set.

Sources


Appendix A — Build Exercise Step Hints

Progressive hints revealed by the "Stuck? Get a nudge" control on each step.

Step 1. Design three agent roles (web search, document analysis, synthesis) and assign 4-5 tools to each, scoped to its role

Why: Tool overload degrades selection reliability. The exam tests the principle that each agent should have 4-5 tools scoped to its specific role. Giving a single agent 18 tools is a known anti-pattern that causes misrouting.

You should see: A configuration object or table listing three agents, each with exactly 4-5 tools. No tool appears in more than one agent role (except scoped cross-role tools added later). Tool names clearly indicate their purpose and scope.

Stuck? Get a nudge

Step 2. Add a scoped verify_fact tool to the synthesis agent that handles simple lookups directly

Why: Routing every fact verification through the coordinator adds 2-3 round trips and up to 40% latency. The exam tests the scoped cross-role tool pattern — give the agent a constrained version of a capability for the 85% simple case, routing only complex cases to the coordinator.

You should see: A verify_fact tool added to the synthesis agent toolset with a description that explicitly limits it to simple single-source lookups and states that complex multi-source verifications should be escalated to the coordinator.

Stuck? Get a nudge

Step 3. Configure tool_choice forced selection on the document analysis agent to ensure extract_metadata runs as the mandatory first step

Why: Forced selection enforces workflow ordering. The exam tests your knowledge of all three tool_choice modes: auto lets the model choose freely, any guarantees a tool call, and forced selection guarantees a specific tool call. This prevents the model from skipping mandatory steps.

You should see: A document analysis agent configuration where the first API call uses tool_choice with type: tool and name: extract_metadata, and subsequent calls switch to tool_choice: auto for the remaining analysis steps.

Stuck? Get a nudge

Step 4. Replace a generic fetch_url tool with a constrained load_document that validates document URLs only

Why: This applies the principle of least privilege to tool design. A generic fetch_url tool can fetch anything from anywhere, enabling misuse. A constrained load_document that validates URLs prevents the agent from fetching arbitrary resources. The exam tests this pattern directly.

You should see: A load_document tool definition that includes URL validation logic (checking for document file extensions or trusted domains) and rejects non-document URLs with a clear error message.

Stuck? Get a nudge

Step 5. Test with a query that requires all three agents and verify that no cross-role tool misuse occurs

Why: End-to-end testing validates that your tool distribution works in practice. Cross-role misuse — such as a synthesis agent running its own web searches instead of using provided results — is a common failure the exam expects you to prevent through proper scoping.

You should see: A test run log showing: the web search agent using only its tools, the document analysis agent starting with extract_metadata (forced), and the synthesis agent using compile_report plus verify_fact for simple checks. No agent calls a tool outside its assigned set.

Stuck? Get a nudge

Appendix B — Interactive Study Prompts

Two prompts to paste into Claude. B1 drills the judgement the exam actually measures; B3 reviews the code you wrote for the Build Exercise above. The exam simulator between them is the interactive quiz on this page.

B1. Concept Check — Discrimination Drill

Prompt — paste into Claude

You are examining me for the Claude Certified Architect – Foundations (CCAR-F) exam, Domain 2: Tool Design & MCP Integration (18% of the exam), Task Statement 2.3: Tool Distribution and Tool Choice. Use British English throughout.

What this exam actually measures. Not one item on the official exam asks what something is. Every item drops you into a production system that is already misbehaving, offers four defensible engineering responses, and asks which is best. The skill being tested is proportionality: fix the root cause with the cheapest instrument that gives the guarantee the situation demands. So do not quiz me on definitions. Make me choose between options that are both defensible, then attack whatever I chose.

How to run this session.

  • One question at a time. Stop and wait. Never answer your own question, and never move on until I have committed.
  • Never reveal which option is right before I commit to one.
  • Do not praise me. A correct answer earns "Yes" and the next question. If I am right for the wrong reason, say so — that is the failure that costs marks on exam day.
  • When I am wrong, quote the exact phrase in my answer that gave it away, correct it in one sentence, and move on. One correction at a time.
  • If I write something fluent but empty, name it: "That is a restatement, not a reason."
  • Set every scenario inside one of the exam's production contexts: the Customer Support Resolution Agent (Agent SDK, MCP tools get_customer, lookup_order, process_refund, escalate_to_human), the Multi-Agent Research System (a coordinator delegating to web-search, document-analysis, synthesis and report-generation subagents), or Developer Productivity with Claude (an agent over an unfamiliar codebase using Read, Write, Bash, Grep, Glob).

Session plan — about twelve questions.

Round 1 — Anchor (1 question). One concrete question to check I have actually read the material. If I cannot answer it, stop the session and tell me to read the lesson before continuing.

Round 2 — Discrimination (5 questions). Each one: describe a symptom in one of the contexts above, with a number or a log observation in it. Offer exactly two responses, both defensible. Ask me to pick one and justify it in a single sentence. Then argue the case for the option I rejected as strongly as you can, and ask whether I am holding or changing my answer. Only after I answer that, tell me which is right and why the other one is the more tempting trap.

Round 3 — Proportionality (2 questions). Take one symptom and run it twice with different stakes: once where the cost of an error is a wasted retry, once where it is an incorrect refund or a corrupted production branch. The right answer must change between the two. If I answer the same way both times without noticing the stakes moved, that is the finding — tell me.

Round 4 — Code review (3 questions). Present a colleague's confident proposal containing one of the trap errors listed below, written the way a teammate would write it in a pull request. Ask me what is wrong with it. Do not signal that anything is wrong.

Round 5 — Verdict. Rate me green, amber or red on each concept below. Name the single weakness most likely to cost me marks, and give me one specific next action: a section of this lesson to re-read, or a step of the Build Exercise to redo. If I am not ready for this task statement, say so plainly.

Concepts in scope

  1. Tool overload — selection reliability falls as the toolkit grows, because every extra tool adds decision complexity; eighteen tools on one agent is the exam's failure case and four or five scoped to the agent's role is the target.
  2. Relevance, not just count — an agent holding tools outside its specialisation tends to misuse them, as when a synthesis agent with search access runs its own searches instead of using the results it was handed, duplicating work and burning context.
  3. The tool_choice modesauto lets the model choose between calling a tool and answering in text; any guarantees some tool call, which is what an extraction pipeline needs when the document type is unknown; forced selection of a named tool guarantees a mandatory first step, after which later turns revert to auto.
  4. Scoped cross-role tools — pushing every simple verification back through the coordinator costs two or three extra hops and can add forty per cent latency, so the synthesis agent gets a constrained verify_fact for the eighty-five per cent simple case while genuinely complex checks still go through the coordinator.
  5. Constrained alternatives to generic toolsload_document, which validates that a URL points at a document, replaces fetch_url, which can fetch anything from anywhere; that is least privilege applied at the tool interface.
  6. Role-specific distribution in practice — each subagent role carries its own small set (search, analysis, synthesis), and the coordinator holds only workflow tools for spawning subagents and reviewing their output rather than any domain tools of its own.

Trap errors to plant in Round 4

  • Routing every fact verification back through the coordinator when eighty-five per cent of them are single-source lookups.
  • Leaving tool_choice on auto in a pipeline that must produce structured output, so the model can answer in prose instead.
  • Handing a single agent eighteen tools and expecting it to keep selecting correctly.
  • Giving a subagent a generic fetch_url when a load_document constrained to document URLs would cover everything it actually needs.

Stay inside the material above. If I raise something outside it, tell me it is out of scope for this task statement and return to the drill. Begin with Round 1.

B2. Exam Simulator

Exam simulator

Question 1 of 10

Scenario · Multi-Agent Research System

Your synthesis agent hands control back to the coordinator whenever it needs a fact checked; the coordinator delegates to the web-search agent and re-invokes synthesis with the answer. That adds two to three round trips per task and 40% latency, and your evaluation shows 85% of these checks are single-source lookups of dates and figures. Which approach should you take?

B3. Build Coach — Code Review

The Build Exercise and its hint ladder are already on this page. This prompt is for the one thing the page cannot do: review the configuration you actually wrote.

Prompt — paste into Claude

You are a staff engineer reviewing my implementation of a build exercise for the Claude Certified Architect – Foundations exam, Domain 2, Task Statement 2.3: Tool Distribution and Tool Choice. Use British English throughout.

I am building the tool distribution for a multi-agent research system: three subagent roles — web search, document analysis and synthesis — each holding a small set of tools scoped to that role, a scoped verify_fact on the synthesis agent for simple single-source checks, forced tool selection on the document-analysis agent so metadata extraction runs before anything else and auto takes over afterwards, a constrained load_document in place of a generic fetch_url, and one end-to-end query that proves no agent reaches outside its own set.

It has to satisfy all of the following:

  • Each of the three roles carries four to five tools, and no tool appears under two roles except the deliberately scoped cross-role one.
  • The synthesis agent's verify_fact description states its ceiling: simple single-source checks only, with complex multi-source verification going back to the coordinator.
  • The document-analysis agent's first call forces the named metadata-extraction tool, and later calls in the same run switch back to auto.
  • load_document validates the URL it is given — by extension or trusted domain — and rejects anything that is not a document with a clear message.
  • A single query exercising all three agents produces a log in which every call belongs to the calling agent's own set, and the analysis agent's first call is the forced one.

How to review.

  • Ask me to paste my code, including the per-agent tool sets, the tool_choice configuration and the end-to-end run log. If I have not pasted any, ask for it and nothing else. Do not write the implementation for me, do not offer a reference solution, and do not fill in a step I have skipped.
  • Work through the criteria above in order. For each one, quote the line of my code that satisfies it, or say plainly that nothing does.
  • Then hunt for the failure modes below. Each is a real production bug, not a style preference.
  • Rank everything you find: (1) would fail in production, (2) would lose marks on the exam, (3) style. Give me the first item under (1) and then stop — wait for my fix before giving me the next one.
  • If my code satisfies everything, do not congratulate me. Change the requirements — the synthesis agent now needs a source document fetched halfway through writing the report — and make me decide whether that is a scoped tool or a coordinator round trip, and defend it.
  • If I ask you to just write it for me, refuse once and give me the smallest nudge that would unblock me instead.

Failure modes to probe

  • The same tool left in two roles' sets — a page fetcher on both the search and the synthesis agent, say — so the synthesis agent quietly re-fetches instead of using what it was given.
  • The forced first call never released, so every subsequent turn re-forces metadata extraction and the agent never reaches its enrichment tools.
  • verify_fact described without its ceiling, so the synthesis agent uses it for exactly the complex multi-source cases that were meant to go to the coordinator.
  • Forced selection configured on a call that also enables manual extended thinking, which is an unsupported combination and errors outright rather than degrading quietly.
  • load_document that validates nothing in practice — a substring check on the URL, or validation performed after the fetch has already happened — so the constraint documents an intention the code never enforces.

Start by asking me for my code.