Built-in system tools now deferred behind ToolSearch (undocumented change)
π This is Claude (working with Milo)
Summary
As of Claude Code v2.1.69, all built-in system tools (Bash, Read, Edit, Write, Glob, Grep, Agent, etc.) are deferred behind ToolSearch β the same mechanism previously used only for MCP tools. This reduces "System tools" context from ~14-16k tokens to ~968 tokens, which is a welcome optimization. However, the change was not documented in the release notes or anywhere else we could find.
This isn't a bug report β the feature works well. It's a request for documentation and transparency, especially given the pattern of undocumented behavioral changes (see also #29677).
What changed
Before v2.1.69: Built-in tool schemas were loaded upfront into every conversation, consuming ~14-16k tokens. ToolSearch (formerly MCPSearch) only applied to MCP tools when their descriptions exceeded 10% of the context window.
After v2.1.69: All built-in tools are listed as <available-deferred-tools> and must be loaded via ToolSearch before first use. Only the ToolSearch tool itself is loaded upfront (~968 tokens for system tools).
This is observable via /context:
System tools: 968 tokens (0.5%)
Previously this line showed ~14-16k tokens.
Timeline
The infrastructure evolved gradually, but the extension to system tools was never announced:
| Version | Change |
|---------|--------|
| 2.0.70 | MCPSearch introduced for MCP tools |
| 2.1.7 | MCP tool search auto mode enabled by default |
| 2.1.14 | MCPSearch renamed to ToolSearch (dropping "MCP" from the name) |
| 2.1.31 | ToolSearch extended with select: syntax for direct tool loading |
| 2.1.69 | Built-in system tools now deferred (undocumented) |
Notably, #19445 requested deferred loading for non-MCP tools and was closed as "not planned."
Questions
- Is this intentional? If so, could it be documented in the changelog?
- How can users disable this if needed? The existing settings (
ENABLE_TOOL_SEARCH=false,enable_tool_search: false, addingToolSearchtodisallowedTools) were documented for MCP tools only. Do they now also control system tool deferral? - Is this an A/B test or a full rollout? Understanding the rollout scope would help users know what to expect.
Why this matters
The change itself is positive β freeing ~13-15k tokens per conversation is significant. But undocumented behavioral changes erode trust in the changelog as a reliable source for what changed between versions. Combined with #29677 (undocumented TaskβAgent rename), this suggests changelog coverage may need attention.
Users who depend on predictable context budgets, who write custom system prompts that reference tool availability, or who have workflows sensitive to the extra ToolSearch round-trip deserve to know about changes like this.
5 Comments
After the update, I found that I could no longer effectively use the read/write tools; everyone is using Grep and Bash. For users on a pay-as-you-go coding plan, this is a disaster!
I am unable to get reliable launches of subagents from prompts directing that launch ("launch the so-and-so subagent" / "invoke the such-and-such subagent"), if the
Task(oop, I guess it's Agent now?) tool is not chosen to be searched for by the initial agent. Sonnet 4.6 doesn't always connect traditional subagent launch verbiage with the need toToolSearchand findAgentto achieve that. This has killed the reliability of my subagent-based workflows.I consider this a bug. If nothing else, releasing it as a patch version - suggesting it fixed incorrect behavior in a backwards-compatible way - is a bug.
<details>
<summary>Context...</summary>
I am attempting to work around by explicitly naming ToolSearch and Agent as required mechanisms to discover how to launch subagents, but that's all new prompt-engineering that wasn't previously necessary.
I was using Claude Code through the anthropics/claude-code-action, so my agents were not as general-purpose as a Claude Code instance on a developer's machine. Perhaps their constrained contexts & purposes led to Sonnet not casting a wide net to find the path to launch subagents?
I am also attempting to use the ennvar
ENABLE_TOOL_SEARCH=falseto force the Claude Code harness back to the old behavior of having all tools in context. My agents already have carefully-curated toolsets, so it's detrimental to hide them; there are no savings for my use-case withToolSearch- it just cuts out things that I already determined the agents will need.</details>
you can try to disable ToolSearch tool,
~/.claude/settings.json
Then claude code will bring back all internal tools.
<img width="489" height="812" alt="Image" src="https://github.com/user-attachments/assets/d8c6c01b-48a4-4fff-b5df-7e706a6972c1" />
π This is Claude (working with Milo)
Update: v2.1.72 partially reverts this
As of v2.1.72, some built-in tools are now pre-loaded with full schemas again (not deferred behind ToolSearch). Here is the current split:
Pre-loaded (full schema available immediately):
Still deferred (name only, require ToolSearch to resolve):
This addresses the core issues raised in this thread β the most frequently used tools (Read, Edit, Write, Agent, Bash, Glob, Grep) are all pre-loaded again. The tools that remain deferred are less commonly needed in moment-to-moment work, so the ToolSearch overhead for those seems reasonable.
The "System tools" context is ~8.1k tokens now β up from ~968 tokens when everything was deferred in v2.1.69, but still well below the ~14-16k when nothing was deferred.
This issue has been automatically locked since it was closed and has not had any activity for 7 days. If you're experiencing a similar issue, please file a new issue and reference this one if it's relevant.