Capability bloat is what accumulates when an agent is given more than the task needs: dozens of tool definitions loaded on every request, one agent that owns every tool in the system, MCP servers connected "just in case". It rarely fails loudly. It shows up as three separate costs, and a scenario question will try to blur them, so learn to name each one.
- Token cost and latency. Tool names, descriptions and schemas are input tokens on every request, plus a tool-use system prompt the API adds. Anthropic's tool search docs put a typical five-server setup (GitHub, Slack, Sentry, Grafana, Splunk) at roughly 55k tokens of definitions before any work happens.
- Selection accuracy. The same page says Claude's ability to pick the right tool degrades once you exceed roughly 30–50 available tools.
- Attack surface. Every tool is a capability that a bug, a model mistake or an injected instruction can trigger.
The architect's job is to find which cost is actually hurting, because the remedy differs. Credentials are Lesson 1.2; load-on-demand mechanics are Lesson 1.8.
Diagnose before you prune
The same visible symptom ("the agent picks the wrong tool") has different root causes. Match the cause to the remedy before touching anything.
| What you observe | Root cause | Remedy |
|---|---|---|
| Two tools with similar names get confused; the toolkit is small | Ambiguous interface | Rewrite descriptions (what it does, when to use it and when not to, what each parameter means; Anthropic recommends at least 3–4 sentences per tool), and rename or namespace |
| Many tools that are variations of one job (pivot, percentile, normalise…) | Decision space wider than the job | Consolidate into fewer tools with an action or enum parameter |
| Ten or more tools, or tens of thousands of definition tokens, most unused on any one request | Everything loaded up front | Tool search with defer_loading; keep the 3–5 most-used tools loaded |
| One agent holds tools for several unrelated roles | Overbroad agent | Split by role into subagents, each with its own tool allowlist |
| A tool can do far more than the job (arbitrary SQL, fetch any URL, write anywhere) | Over-scoped tool | Replace with a constrained tool, and enforce the limit at the credential or configuration layer |
Watch the tension in consolidation. It shrinks what the model chooses between, but it merges capabilities: once manage_orders(action=...) covers read, refund and delete, a permission rule that matches on tool name can no longer allow one and deny another. Consolidate within a risk class and keep destructive operations as their own tool.
What does not reduce bloat: moving tools to a second MCP server. The host merges all servers' tools into one registry, so 22 tools over two servers is still 22 tools.
How many tools is too many?
Anthropic documents no fixed per-agent tool count, so treat any single number you have seen quoted (such as 4–5 tools) as a design heuristic, not a limit. What the docs do give are softer figures: degraded selection beyond roughly 30–50 tools, and tool search recommended from 10 or more tools or more than about 10k tokens of definitions; standard loading fits fewer than 10 tools or tools used on every request.
All of them agree on the pattern: a small, role-scoped set in front of the model and the long tail discoverable rather than resident. A scenario will hinge on that pattern, not the digit; use any numbers in the stem to pick which remedy row applies.
Key concept: three quantities, not one
Tool count is only a proxy. What you are actually managing is (1) decision ambiguity (can a human say which tool applies?), (2) tokens carried per request, and (3) blast radius if a call is wrong or hijacked. Anthropic's own test for the first: "If a human engineer can't definitively say which tool should be used in a given situation, an AI agent can't be expected to do better."
A repeatable audit method
- Inventory what the model sees. One flat list per agent, including every connected MCP server's tools, with owner and whether each reads, writes or destroys.
- Measure token cost. The token counting endpoint accepts a
toolsarray, so count with and without a tool set. It is an estimate and rejects server tools and the MCP connector; for those readusageon real responses. - Measure use. Log which tool each agent calls per task type. Never-called tools are removal candidates; always-together tools are consolidation candidates.
- Measure ambiguity. Run an eval set with the expected tool per request. Confusion between two tools is a description problem; scattered errors across a large catalogue is a scale problem.
- Classify privilege. What would the worst call with attacker-chosen parameters do, and which credential sits behind it?
- Apply the smallest change that fixes the measured problem, by blast radius: disable, constrain, split by role, defer, then rewrite.
- Re-run the evals for accuracy, cost and latency, plus a security probe: does an injected request for a removed tool have any tool to call?
Decide the tool set per agent or session, not per turn: changing tool definitions mid-conversation invalidates the prompt cache, and the miss can cost more than the definitions you dropped (the MCP client guidance says so). Deferred loading is the mechanism built to avoid that.
Enforcement, not instruction
Pruning counts only if it is enforced where the model cannot argue. "Only use this for reads" in a system prompt is guidance, not a control. The real levers are configuration:
- MCP connector toolsets (beta). Set
default_config.enabledtofalseand enable named tools inconfigsfor an allowlist, or disable named tools for a denylist. The docs recommend denylisting write or destructive tools for read-only assistants. An allowlist fails closed when the server later adds a tool; a denylist does not. - Subagent tool lists. In the Agent SDK a subagent's
toolsfield restricts what it may use; an omitted tool is not in its session at all. - Claude Code permission rules. Evaluated deny, then ask, then allow; the first match decides, so a narrower allow cannot carve out an exception to a broad deny.
Attack surface matters most where tool output is untrusted. A tool that reads tickets, web pages or third-party MCP results is a channel for injected instructions, so the fewer write-capable tools behind that channel the better. Fewer, narrower tools is the cheapest guardrail you have (the full layers are Domain 4).
Common exam distractor
Watch for answers that treat bloat as a wording problem when it is a scale or privilege problem: "rewrite all 90 descriptions", "move half the tools to a second server", "tell the agent not to use the write tools". The inverse trap is one mega-tool with an action parameter, which trades permission granularity for fewer tools. The right answer names the cause first, then applies a change the model cannot bypass.