Every agent design answers a question that is easy to skip: what is in the context on the first token, and what is fetched later? A monolithic strategy loads everything up front: all tool definitions, all instructions, the whole knowledge base. A progressive discovery strategy loads a lightweight index first and pulls detail in only when a task needs it. Neither is universally better. The exam asks you to weigh cost, accuracy, latency and failure modes for a described workload and to notice when a candidate answer quietly assumes the wrong side of the trade.
Where the choice appears
| Layer | Monolithic | Progressive mechanism |
|---|---|---|
| Tools | Every definition in every request | Tool search with defer_loading; in MCP hosts, a search_tools meta-tool and connecting servers on demand |
| Instructions and expertise | One very large system prompt | Agent Skills: name and description always loaded (about 100 tokens per skill), the SKILL.md body when triggered, bundled files and scripts only when used |
| Knowledge | The whole corpus in the prompt | Retrieval (Lessons 1.5 and 1.6) |
| Code and data | Pre-loaded files and large tool results | Just-in-time exploration with tools such as grep and glob; code execution that filters data before it reaches the model |
Anthropic's own numbers show the scale. Its tool search docs put a five-server setup at roughly 55k tokens of definitions and say selection accuracy degrades beyond roughly 30–50 tools. Its engineering write-up on code execution with MCP gives an illustrative case where moving from loading all tool definitions to discovering them on demand cut usage from about 150,000 tokens to about 2,000. Treat these as illustrations of magnitude, not guarantees.
The trade-offs, both directions
Monolithic is strong when the context is small. It is the simplest design, the model always sees everything so nothing can go undiscovered, there is one round trip, an unchanging prefix caches well, and debugging is easy because you know exactly what the model saw. It fails as content grows: tokens and time to first token are paid on every request, selection and focus degrade, and you approach context limits.
Progressive is strong when the context is large and each task needs a small part of it. It keeps the window focused and scales far beyond what fits (tool search supports up to 10,000 deferred tools per request). Its costs are real:
- Extra latency. Anthropic's context engineering guidance is explicit that runtime exploration is slower than retrieving pre-computed data, and needs careful tool and heuristic design.
- Discovery misses. The model cannot search for a capability it does not know exists. Mitigate with clear names and consistent prefixes (
github_,slack_), keyword-rich descriptions, a system prompt line that lists the available categories, and keeping your 3–5 most-used tools always loaded. - Harder debugging. What the model saw depends on what it searched for, so log the searches and what was loaded.
- Cache interaction. Server-side tool search excludes deferred tools from the cached prefix, so caching is preserved. Home-grown designs that add or remove definitions mid-conversation invalidate the cache; MCP client guidance suggests appending after the cache breakpoint or routing every call through one stable
call_toolmeta-tool.
Key concept: progressive discovery moves the cost, and the failure mode
It shifts cost from every request to only the requests that need a capability, and it replaces "too much context" with "the model may not find it". A good answer names both, and says what you measure to know which risk you actually have.
Tool search and skills in practice
Server-side tool search offers two variants: tool_search_tool_regex_20251119 (Claude writes Python regex patterns, up to 200 characters) and tool_search_tool_bm25_20251119 (natural-language queries, up to 500 characters). You include the search tool, mark the tools to hold back with defer_loading: true, and at least one tool must stay non-deferred. Searches return matching tools as tool_reference blocks, five by default, which the API expands into full definitions. Two details are frequently missed. First, defer_loading controls what enters the context, not what you send: you still send every definition in tools on each request. Second, a deferred tool cannot also carry cache_control. For MCP connector toolsets you set defer_loading in default_config or per tool in configs. You can also implement your own search, for example with embeddings, by returning tool_reference blocks from a custom tool.
The docs give guidance on when it pays: 10 or more tools, definitions above about 10k tokens, degrading selection, or several MCP servers; standard loading is the better fit for fewer than 10 tools or when every tool is used on every request. The MCP client guidance suggests a threshold expressed as a share of the context window (for example 1–5%) at which a host switches to progressive discovery. Claude Code enables tool search for MCP tools by default in recent versions.
Skills apply the same idea to instructions: a Skill's description decides whether it triggers, so it must say both what it does and when to use it. Scripts run through bash and only their output enters the context. Only use Skills from sources you trust, as the docs warn that a malicious Skill can direct tool use and data exposure.
Choosing and combining
The usual answer is a hybrid: keep a small always-on core and make the long tail discoverable. Claude Code is the model case in Anthropic's write-up: project instruction files are loaded up front while files are explored just in time. For long exploration sessions, Anthropic lists compaction, structured note-taking into external memory and sub-agents with clean contexts that return distilled summaries as complementary techniques (Lesson 6.4). To decide, measure rather than guess: what share of the context do definitions and instructions consume, how often is each item actually used, what is the selection accuracy, and what does an extra discovery round trip add to latency?
Common exam distractor
"A larger context window makes discovery unnecessary" ignores per-request cost, latency and selection accuracy. "Deferred loading shrinks the request payload" is false: definitions are still sent, only the context is smaller. "Progressive discovery is always better" ignores the extra round trip and discovery misses for small toolsets. "Add or remove tools freely each turn" forgets prompt cache invalidation.