Rubric
Contents — domains, guide and mocks

Auditing agents for capability bloat

CCAR-P 3.116 min read · checked 21 September 2026

Task statementEvaluate tool/agent configuration for capability bloat

What a bloated agent pays for

One agent, 140 toolsfour MCP servers, all tools on
  • Context tokensdefinitions sent on every call
  • Wrong tool chosenoverlap blurs the decision
  • Latency and costmore input, more hops
  • Blast radiuswrite tools it never needed
Each extra tool, server or subagent adds a little to every one of these costs, on every request — whether or not it is ever used. It is also one more thing to test and patch.

What “bloat” means, and why it happens

Capability bloat is any capability in an agent’s configuration that its job does not require: tools it never needs, tools that overlap so the choice between them is ambiguous, permissions broader than the task, verbose tool outputs, and subagents that exist because splitting felt tidy rather than because the work demanded it. It rarely starts as a decision. It accumulates — a team connects a whole MCP server because it needed one tool, wraps every endpoint of an internal API because that was quick, or lets a new subagent inherit everything because nobody wrote a tools line.

Anthropic’s context-engineering guidance names the failure directly: bloated tool sets that cover too much functionality or create ambiguous decision points. Its test is a good one to carry into the exam — if a human engineer could not say for certain which tool to use in a given situation, the agent cannot be expected to do better. The recommended target is a minimal viable set of tools, each self-contained and clear about its purpose.

Kind of bloatWhat it costsWhere you see it
Too many tool definitionsTokens on every request; slower first tokenTool API docs cite about 55k tokens of definitions for a five-server setup
Overlapping toolsWrong or redundant tool callssearch_orders and find_order and get_order_by_ref all present
Endpoint-per-tool wrappingMany calls where one would do; more context per tasklist_users + list_events + create_event instead of schedule_event
Over-broad permissionsA mistake or injected instruction can do real damageA read-only reporting agent with delete_record enabled
Verbose outputsContext filled with IDs and fields nobody readsTools returning full JSON records, UUIDs and MIME types
Agent sprawlExtra hops, extra tokens, mis-delegationNine subagents whose descriptions overlap

The numbers matter because they tell you when bloat stops being theoretical. The tool search documentation says Claude’s ability to pick the right tool degrades once more than 30–50 tools are available, and that a typical five-server setup (GitHub, Slack, Sentry, Grafana, Splunk) spends roughly 55k tokens on definitions before any work begins. Anthropic’s research-system write-up adds the agent-side number: agents use about four times the tokens of a chat, and multi-agent systems about fifteen times. Every capability has a price; the architect’s job is to make sure it buys something.

An audit you can run on any configuration

This task statement asks you to evaluate, so think of it as a review against the job description. Write down the tasks the agent must perform, then walk the configuration and ask four questions of every capability: is it needed for a real task, is it distinct from every other capability, is its permission the narrowest that works, and does it need to be loaded on every request?

Auditing a bank’s card-support agent

  • Passes: freeze_card, open_dispute, get_card_statuseach maps to a task in the brief
  • Fails: Whole core-banking MCP server enabled (62 tools)wire transfers and account closure are not in scope
  • Check: search_transactions and list_transactions both onoverlap — merge into one searchable tool
  • Check: Policy lookup loaded on every requestused in 1 in 20 chats — defer it
  • Missing: Scope of the OAuth token behind the servernobody could say — see 3.2
  • Fails: Tool results return full card recordsreturn only the fields the answer needs
The brief: answer card questions, freeze a lost card, open a dispute. Each finding is a capability the brief does not justify, or one that is configured too loosely.

Four remedies, and when each applies

Bloat has more than one shape, so there is more than one fix. Choosing the wrong one is a classic distractor: tool search does nothing about a dangerous permission, and deleting a tool is wrong if a real task needs it once a week.

Which remedy fits this capability?

What is wrong with this capability?
  • No task needs it
    Remove or disableallowlist, not denylist
  • Overlaps another tool
    Merge and namespaceone tool per job
  • Needed, but rarely
    Defer loadingfound via tool search
  • Needed by one subtask
    Scope to a subagentmain agent never sees it

Remove or disable. On the Claude API’s MCP connector, an mcp_toolset accepts a default_config and per-tool configs. Setting enabled: false by default and switching on named tools is an allowlist; leaving the default on and switching a few off is a denylist. Prefer the allowlist: when the server adds a new tool next month, an allowlist keeps it out until someone decides it belongs.

Merge and namespace. Anthropic’s tool-writing guidance recommends a few thoughtful tools aimed at high-impact workflows rather than one tool per API endpoint: schedule_event instead of listing users, listing events and creating an event; get_customer_context instead of three separate fetches; search_logs instead of read_logs. Where several services offer similar actions, a prefix such as asana_search versus jira_search makes the boundary explicit.

Defer loading. Tool search lets you keep a large catalogue while loading only what a request needs. You mark tools with defer_loading: true, keep the three to five most used tools loaded, and Claude searches for the rest. The documentation suggests it once you pass about ten tools or 10k tokens of definitions, and advises against it for small sets where every tool is used on every request. The wider “load up front or discover as needed” decision is covered in 3.8.

Allowlist one MCP server, defer its long tailpython
response = client.beta.messages.create(
    model=MODEL,
    max_tokens=2048,
    betas=["mcp-client-2025-11-20"],
    mcp_servers=[{
        "type": "url", "name": "crm",
        "url": "https://crm.example.com/mcp",
        "authorization_token": crm_token,        # obtained by your app (see 3.2)
    }],
    tools=[
        {"type": "tool_search_tool_bm25_20251119", "name": "tool_search_tool_bm25"},
        {
            "type": "mcp_toolset",
            "mcp_server_name": "crm",
            "default_config": {"enabled": False},    # allowlist: off unless named
            "configs": {
                "find_customer":        {"enabled": True},   # hot path: always loaded
                "get_customer_context": {"enabled": True},
                "list_contracts": {"enabled": True, "defer_loading": True},  # rare
            },
        },
    ],
    messages=messages,
)

Scope to a subagent. When one subtask needs a heavy capability — a browser, a database console — give it to a subagent rather than the main agent. In Claude Code a subagent’s tools field is an allowlist and disallowedTools a denylist; if tools is omitted the subagent inherits every available tool, MCP tools included. An mcpServers entry defined inline on a subagent keeps that server’s tool descriptions out of the main conversation entirely.

A read-only reviewer that cannot inherit everythingyaml
---
name: contract-reviewer
description: Reviews contract drafts against the clause library. Read-only.
tools: Read, Grep, Glob          # allowlist: no Edit, Write, Bash or MCP
---
Compare the draft to the clause library and list deviations with line numbers.

Agent bloat is the same problem one level up

The objective says tool/agent configuration, and agents bloat too. A coordinator with nine specialist subagents whose descriptions overlap has the same ambiguous-choice problem as nine overlapping tools, plus a hop, a fresh context and a summary for every delegation. Anthropic’s research system scaled effort to the query — one agent with a handful of tool calls for simple fact-finding, many subagents only for genuinely broad research — and warned that multi-agent designs fit poorly where agents must share context or depend on each other heavily. (Designing multi-agent systems is 1.4; here you are judging whether an existing configuration carries more agents than its work needs.)

Designing for the workflow, not the API

One tool per endpoint

  • list_users, list_events, create_event
  • get_customer_by_id, list_transactions, list_notes
  • read_logs returns the whole file
  • Every subagent inherits every tool

One tool per job

  • schedule_event finds a slot and books it
  • get_customer_context returns what a support reply needs
  • search_logs returns matching lines with context
  • Each subagent gets an explicit tools allowlist
The left column mirrors how the backend is organised; the right mirrors what the agent is trying to do. Fewer, richer tools mean fewer calls, less context and fewer wrong choices.

Traps the wrong answers are built from

Tempting but wrongDo this instead
Connecting a whole MCP server because one tool was neededEnable only the needed tools with an allowlist (default_config off, named tools on).
Adding prompt rules to steer between overlapping toolsMerge the overlap into one tool with a clear name, description and parameters.
Using tool search to “hide” a risky toolDisable it or narrow its permission; deferral only saves tokens.
Leaving tools unset on subagentsGive every subagent an explicit allowlist; unset means it inherits everything.
Adding a routing agent to cope with too many specialistsMerge specialists whose work overlaps and scale agent count to task complexity.

You should now be able to

  • Audit an agent configuration against its task list and classify each surplus capability.
  • Explain the costs of bloat: context tokens, selection accuracy, latency, blast radius and upkeep.
  • Choose between removing, merging, deferring and scoping a capability for a given finding.
  • Configure an MCP toolset allowlist and deferred loading on the Claude API.
  • Recognise agent sprawl and judge when subagents should be merged or given narrower tools.

Practice questions

Original questions written for this lesson, in the exam’s style. Answer first, then open the reasoning — every option is explained, including why the wrong ones are tempting.

  1. Question 1

    An insurance claims agent is connected to three MCP servers exposing 95 tools in total. Logs show it often calls lookup_policy_v2 when get_policy was the right choice, and first-token latency has crept up. Only 14 tools appear in a month of successful runs.

    What should the architect recommend first?

    1. AAdd system-prompt rules that describe when to prefer each policy tool.
    2. BMove to a larger model that handles long tool lists better.
    3. CAllowlist the needed tools per server and merge the overlapping policy tools.
    4. DAdd a router agent that picks a server before the main agent runs.
    Show answer and reasoning
    1. AIncorrect. Tempting and cheap, but it leaves 95 definitions in context and steers around an overlap that should not exist.
    2. BIncorrect. It raises cost and latency and still leaves ambiguous, overlapping tools in the configuration.
    3. CCorrect. It removes unused capabilities and the ambiguous choice at their source, cutting tokens and selection errors together.
    4. DIncorrect. It adds a hop and another model decision without removing any of the overlap or the unused tools.
  2. Question 2

    A reporting agent must query sales data and occasionally look up a rarely used currency-conversion tool. Its MCP server also exposes delete_report and bulk_update_prices, which the agent never needs.

    Which two configuration changes address the bloat correctly? (Select 2.)

    1. ADisable delete_report and bulk_update_prices in the toolset configuration.
    2. BDefer loading the currency tool so it is found through tool search when needed.
    3. CDefer loading delete_report so the agent is less likely to find it.
    4. DRemove the currency tool because it is used in few requests.
    5. EKeep all tools and add “never delete reports” to the system prompt.
    Show answer and reasoning
    1. ACorrect. Out-of-scope write tools should not be available at all; disabling them removes the risk, not just the tokens.
    2. BCorrect. It is needed but rare — the case deferral is for. The hot-path query tools stay loaded.
    3. CIncorrect. Deferral keeps the capability callable; a dangerous, unneeded tool should be disabled.
    4. DIncorrect. A real task needs it; removing it breaks that task. Rare use argues for deferral, not deletion.
    5. EIncorrect. Instructions are probabilistic and can be overridden by injected content; the permission remains.
  3. Question 3

    In Claude Code, a team defines a log-summariser subagent with a name, a description and a prompt, but no tools field. The project also has a production database MCP server configured.

    What can the subagent use?

    1. AOnly read-only built-in tools, because subagents are sandboxed.
    2. BEvery tool available to subagents, including the database MCP tools.
    3. CNo tools, because an explicit tools list is required to spawn it.
    4. DOnly the tools named in its description text.
    Show answer and reasoning
    1. AIncorrect. There is no such default; omitting tools does not make a subagent read-only.
    2. BCorrect. With tools omitted the subagent inherits the full available pool, MCP tools included — which is why an allowlist matters.
    3. CIncorrect. The field is optional; the zero-tools error arises only when a given list resolves to nothing.
    4. DIncorrect. The description tells the coordinator when to delegate; it grants no permissions.
  4. Question 4

    A coordinator delegates to eight specialist subagents. Two pairs have near-identical descriptions and delegation is inconsistent. What is the best first change?

    1. AMerge each overlapping pair so every subagent has a distinct purpose.
    2. BAdd a ninth subagent that decides which specialist to call.
    3. CGive every subagent all tools so any of them can finish the job.
    4. DRaise the coordinator’s turn limit so it can retry delegation.
    Show answer and reasoning
    1. ACorrect. Overlapping descriptions create the same ambiguous choice as overlapping tools; merging removes it and a hop.
    2. BIncorrect. It adds latency and tokens and still has to choose between ambiguous descriptions.
    3. CIncorrect. That trades a delegation problem for a much larger capability and security surface.
    4. DIncorrect. Retrying an ambiguous choice does not make it less ambiguous; it just costs more.

Sources

Drafted with AI assistance and checked against the sources above; expert review is in progress. Spotted an error? Tell us and it gets fixed, dated and listed on how this is written.