Domain 2: Tool Design & MCP Integration (18%)Lesson 10 of 30

2.3 Tool Distribution & Tool Choice

2.3.1 Can an Agent Have Too Many Tools?

It's tempting to think more tools make an agent more capable — give it everything and let it figure out what to use. Task Statement 2.3 says the opposite is true past a point: handing an agent too many tools makes it WORSE at choosing among them. This lesson is about how many tools an agent should have, how to distribute tools across a multi-agent team, and how to control which tool gets called.

Here's the intuition. Imagine a kitchen with five well-chosen, clearly-labelled tools versus a drawer crammed with fifty gadgets, half of them similar. In the crammed drawer you waste time deciding, grab the wrong thing, and occasionally use a tool for something it wasn't meant for. The model faces the same problem: every extra tool is another option to weigh on every turn, and similar tools blur together (exactly the misrouting from Lesson 2.1, now multiplied). The guidance from the exam is concrete — aim for roughly 4–5 tools per agent, each scoped to that agent's role. Eighteen tools on one agent is a recipe for unreliable selection.

Fewer, scoped tools beat a crowded toolbox~4–5 scoped tools (✓)each matches the agent's rolereliable selection18 tools on one agent (✗)more options to weigh each turndegraded, unreliable selection

Past ~4–5 tools, each extra option degrades selection reliability. Scope each agent's toolset to its role rather than piling everything on.

ℹ️

The one idea to hold onto

More tools is not more capable. Giving an agent too many tools (≈18 vs a focused 4–5) degrades selection reliability by increasing decision complexity. Scope each agent's toolset to its role.

2.3.2 Scoping Tools to Roles

In a multi-agent system, the natural way to keep each agent's toolset small is to scope tools to the agent's ROLE — give each agent only the tools its job requires. This isn't just about reliability; it's also a safety principle (least privilege) we'll deepen in 2.5. An agent with tools outside its specialization tends to MISUSE them.

A concrete example from the research-system world: a synthesis agent's job is to combine findings, not to gather them. If you give that synthesis agent a web_search tool, it may start doing its own searches — duplicating the search agent's work, blurring responsibilities, and producing inconsistent results. The fix is to scope: the search agent gets search tools, the analysis agent gets document tools, the synthesis agent gets only what synthesis needs. Each agent's 4–5 tools map cleanly to its role.

Agent roleScoped toolset (~4–5)
Web searchsearch, fetch_page, extract_results
Document analysisload_document, extract_data, summarize
Synthesisread findings, verify_fact (scoped)
CoordinatorAgent/Task (to delegate), routing tools

Each agent gets the tools its role needs and no more. A synthesis agent with web search would misuse it by re-doing the search agent's job.

2.3.2 — Key Concept

Scope each agent's tools to its role. Agents given tools outside their specialization tend to misuse them (a synthesis agent doing web searches duplicates work). Role-scoped toolsets keep selection reliable and responsibilities clean.

2.3.3 The 85% Case: Scoped Cross-Role Tools

Strict scoping has a cost, and the exam tests the nuance. Suppose the synthesis agent frequently needs to verify a small fact mid-synthesis — a date, a name, a statistic. With strict scoping, it has to hand control back to the coordinator, which invokes the search agent, which returns, which re-invokes synthesis. That round-trip adds 2–3 hops and can balloon latency (think +40%) for what is usually a trivial lookup.

Here's the insight: if 85% of those verifications are simple fact-checks and only 15% need deep investigation, you shouldn't route ALL of them through the coordinator. Instead, give the synthesis agent a SCOPED cross-role tool — a narrow verify_fact tool that handles the simple 85% directly — while still routing the genuinely complex 15% through the coordinator to the full search agent. You get the speed of local handling for the common case and the power of full delegation for the hard case.

Notice this is a balance, not a contradiction of 2.3.2: you're not handing the synthesis agent the full web_search tool (which it would misuse), you're giving it a CONSTRAINED tool sized exactly to its high-frequency need. Scope tightly by default; add a narrow cross-role tool only where a high-frequency simple case justifies it.

Verification: route by how hard it issynthesis agentneeds to verify a fact85% simple → verify_factscoped tool, handled locally, fast15% complex → coordinatorfull search agent, when needed

Give the synthesis agent a scoped verify_fact tool for the simple 85% (fast, local) while routing the complex 15% through the coordinator. Tight scope by default, a narrow cross-role tool where frequency justifies it.

2.3.3 — Key Concept

Routing every cross-role need through the coordinator adds latency. For a high-frequency simple case (the 85%), give the agent a narrow, scoped cross-role tool (e.g. verify_fact) and route only the complex cases (15%) through the coordinator — not the full generic tool, which it would misuse.

2.3.4 Controlling Tool Choice

So far the model has freely decided whether and which tool to call. Sometimes you need to take that decision into your own hands — guarantee that it calls SOME tool, or a SPECIFIC tool. That's what the tool_choice setting controls, and it has a small set of modes worth knowing precisely.

tool_choiceBehaviorUse when
"auto" (default)Model decides: call a tool OR reply in textNormal agentic work
"any"Must call SOME tool (model picks which)You need a tool call, not chat — e.g. structured extraction
{type:"tool",name:...}Must call THAT specific toolA mandatory first step (e.g. extract_metadata before enrichment)
"none"No tools may be calledForce a plain text response

The tool_choice modes. 'auto' lets the model choose; 'any' guarantees a tool call; forced selection pins a specific tool; 'none' disables tools.

Two modes earn their keep in practice. Use "any" when conversational text would be a failure — for example, an extraction pipeline where you MUST get structured data back, not a chatty paragraph; 'any' forces the model to call one of your extraction tools. Use forced selection ({type:"tool",name:"extract_metadata"}) when a particular step must run FIRST regardless of what the model thinks — pin extract_metadata as the opening move, then handle the enrichment steps in follow-up turns. (And recall the Lesson 1.1 warning: forcing a tool every turn with 'any' can prevent the loop from ever ending — use it deliberately, not as a permanent setting.)

ℹ️

2.3.4 — Key Concept

tool_choice controls selection: 'auto' (model decides), 'any' (must call some tool — guarantees structured output over chat), forced {type:'tool',name:...} (must call a specific tool — e.g. a mandatory first step), and 'none' (no tools).

2.3.5 The Exam Traps

The 2.3 traps test whether you'll over-provision tools, route everything through the coordinator, or pick the wrong tool_choice. Keep three ideas straight: scope tightly, handle the high-frequency simple case locally, and match tool_choice to the guarantee you need.

  • Over-provisioning. ✗ Giving the synthesis agent the full web_search tool so it 'can verify anything'. ✓ Give it a scoped verify_fact for the 85% simple case; route the 15% complex through the coordinator.
  • Routing everything centrally. ✗ Sending every simple verification back through the coordinator (2–3 hops, +latency). ✓ Handle the common simple case with a scoped local tool.
  • Wrong tool_choice for structured output. ✗ Leaving tool_choice on 'auto' when you MUST get a tool call (structured data). ✓ Use 'any' to guarantee a tool call.
  • Tool overload. ✗ Putting 18 tools on one agent. ✓ ~4–5 role-scoped tools per agent.
⚠️

2.3.5 — Exam Trap

✗ Over-provisioning a generic tool 'just in case' (it gets misused). ✗ Routing all simple cross-role needs through the coordinator (latency). ✗ Using 'auto' when structured output is required (use 'any'). ✗ 18 tools on one agent. ✓ ~4–5 scoped tools, a narrow cross-role tool for the high-frequency 85%, and the right tool_choice for the guarantee you need.

2.3.6 Put It Together: Distribute and Control Tools

You now know why fewer tools means better selection, how to scope tools to roles, the 85%/15% cross-role pattern, and the tool_choice modes. The exercise makes the trade-offs tangible — you'll feel the latency of over-routing and the reliability cost of tool overload.

2.3.6 — Build Exercise (45 min)

(1) Build a 3-agent research system; scope each agent to ~4–5 role-specific tools. (2) Deliberately overload one agent with 18 tools and measure how its selection accuracy drops. (3) Make the synthesis agent route every fact-check through the coordinator; measure the added latency. Then give it a scoped verify_fact tool for simple checks and route only complex ones centrally; compare. (4) Build an extraction step and prove that tool_choice:'auto' sometimes returns chat, while 'any' guarantees a tool call; then force a specific tool to run first with {type:'tool',name:...}.

You've now designed individual tools (2.1), made them fail well (2.2), and distributed and controlled them (2.3). The next lesson, 2.4, moves to where many of these tools actually come from in practice: external MCP servers, and how to wire them into Claude Code and agents.

ℹ️

Where this shows up on the exam

2.3 questions involve tool counts, cross-role access, or tool_choice. If you scope tightly, give a narrow tool for the high-frequency simple case, and match tool_choice to whether you need 'a tool call' (any) or 'a specific tool' (forced), you'll answer correctly.

Key Takeaways

  • More tools is not more capable: giving an agent too many tools (~18 vs a focused 4–5) degrades selection reliability by increasing decision complexity.
  • Scope each agent's tools to its role; agents with tools outside their specialization misuse them (a synthesis agent doing web searches duplicates the search agent's work).
  • Routing every cross-role need through the coordinator adds 2–3 hops and large latency; for the high-frequency simple case (~85%), give a narrow scoped cross-role tool (e.g. verify_fact).
  • Route only the genuinely complex cases (~15%) through the coordinator — and give a CONSTRAINED tool, not the full generic one the agent would misuse.
  • tool_choice modes: 'auto' (model decides), 'any' (must call some tool — guarantees structured output over chat), forced {type:'tool',name:...} (must call a specific tool, e.g. a mandatory first step), 'none' (no tools).
  • Use 'any' when conversational text would be a failure (structured extraction); use forced selection to make a specific step run first, then continue in follow-up turns.
  • Forcing a tool every turn (recall Lesson 1.1) can stop the loop from ever ending — use tool_choice deliberately, not as a permanent setting.

Check Your Understanding

Test what you learned in this lesson.

Q1.A synthesis agent often needs simple fact-checks (dates, names, statistics). Currently each one returns control to the coordinator, which invokes the web-search agent, then re-invokes synthesis — adding 2–3 round trips and ~40% latency. 85% of these are simple; 15% need deep investigation. What's the best approach?

Q2.You're building an extraction pipeline and you MUST get structured data back, never a conversational reply. Which tool_choice setting fits?

Q3.What happens to tool selection when you put 18 tools on a single agent?

Q4.Why shouldn't you give a synthesis agent the full generic web_search tool to 'cover all cases'?

Practice This Lesson