Claude Tool Search Tool: What It Is and When to Use It
What Is the Claude Tool Search Tool?
The "tool search tool" refers to a pattern (and, increasingly, a built-in capability) that lets Claude discover which tools to use from a large catalog instead of having every tool definition loaded into its context window up front. Rather than sending Claude 80 tool schemas on every request, you register a smaller "search" tool that Claude calls first — it queries your tool catalog, gets back the two or three tools relevant to the current task, and only then calls those.
If you landed here wondering "what is Claude's tool search tool and do I need it," the short answer is: you need it once your tool count grows past what fits comfortably in a system prompt without hurting accuracy or burning tokens on every single call. Below is how it works, when it's worth building, and how to structure it well.
Why It Exists: The Problem With Large Tool Sets
Claude's tool use works by sending full JSON schema definitions — name, description, parameters — for every available tool with each request. That's fine for five or ten tools. It breaks down once you're connecting Claude to:
- Multiple MCP servers, each exposing a dozen tools
- Internal plugin systems where teams keep adding new actions
- Multi-product agents that need access to billing, support, analytics, and deployment tools depending on the task
Three problems show up as the tool list grows:
- Token cost. Every tool definition is sent on every turn, whether or not it's relevant, which adds up fast across a conversation.
- Selection accuracy. Models are noticeably worse at picking the right tool when there are 50+ candidates versus 5–10. Similar names and overlapping descriptions increase misfires.
- Latency. Larger prompts take longer to process before the model even starts reasoning about the task.
The tool search tool pattern solves all three by keeping the "always visible" tool list small and treating the rest of your catalog as searchable, on-demand context.
How It Works
The core idea is a two-step tool call:
- Claude is given one lightweight tool — something like
search_tools— whose only job is to accept a query string and return matching tool definitions from your catalog. - Claude calls
search_toolsfirst, inspects the results, and then issues a normal tool call against whichever tool it found relevant.
A simplified tool definition for the search step looks like this:
{
"name": "search_tools",
"description": "Search the available tool catalog by keyword or task description. Returns matching tool schemas that can then be called directly.",
"input_schema": {
"type": "object",
"properties": {
"query": { "type": "string", "description": "What the tool needs to accomplish" }
},
"required": ["query"]
}
}
On the server side, search_tools is backed by whatever retrieval mechanism makes sense — a simple keyword match against tool names and descriptions, embeddings over tool docs, or a static category lookup if your catalog is organized predictably. The response you return to Claude should be the actual tool schemas (name, description, input_schema) for the top matches, formatted the same way you'd normally pass them in the tools array.
Once Claude has those schemas in context, it calls the real tool exactly as it would with a normally-declared tool — same tool_use block, same input validation, same result-handling loop.
When You Should Use It
Not every integration needs this. Rough guidance:
- Under ~15 tools: just declare them normally. The overhead isn't worth the added complexity.
- 15–50 tools: worth testing. Measure whether tool selection accuracy or latency actually degrades before building search.
- 50+ tools, or a growing/dynamic catalog: build tool search. This is the range where fixed tool lists start causing real problems, especially if tools come from multiple MCP servers or third-party integrations you don't fully control.
It's also useful when your tool catalog changes frequently — new internal APIs, new MCP servers coming online — and you don't want to redeploy or bloat every request just because a new tool exists somewhere in the system.
Best Practices for Tool Discovery
- Write tool descriptions for search, not just for Claude's execution logic. A vague description that "sort of" works with the full list in context can be too weak to surface correctly in a search step. Be explicit about what the tool does and when to use it.
- Cap the number of results. Returning 20 "matching" tools from search defeats the purpose. Aim for 1–5 strong matches.
- Namespace by domain. Prefixing tool names (
billing_refund,deploy_rollback) makes both search and selection more reliable. - Log search queries. If Claude keeps searching for tools that don't exist or misses ones that do, that's a signal your descriptions or retrieval logic need tuning.
- Fall back gracefully. If search returns nothing useful, have Claude respond to the user rather than guessing at a tool call with a made-up name.
Tool Search Tool vs. Regular Tool Definitions
Regular tool use is the right default: define your tools, pass them in the tools array, let Claude call them directly. See /docs/tools for the mechanics of that flow. The search pattern is an addition on top, not a replacement — you still define tools the same way, you just delay exposing most of them until a search step narrows the list down.
Using It Through an API Layer
If you're calling Claude through SubToAPI, the tool-calling loop — sending tool_use blocks, returning tool_result messages, streaming partial responses — works the same as it does against the standard Messages API, so a tool search step drops in without changes to your surrounding integration. SubToAPI turns your existing Claude access into a standard HTTPS API with application keys (sub_live_...), streaming, and usage metadata per key, which is handy if multiple services or team members are each managing their own tool catalogs. Check /docs/tools and /docs/streaming for the request/response shapes, or start with /docs/quickstart if you're setting this up for the first time.
FAQ
Is the tool search tool a separate product from Claude's normal tool use? No — it's a pattern built using the same tool-calling mechanism. You add one extra "search" tool that returns other tool schemas on demand, rather than sending your entire tool catalog on every request.
How many tools justify building a tool search step? Somewhere around 15–50 tools is the range to start testing. Below that, declaring tools directly is simpler and works fine. Above 50, or with a frequently changing catalog, search-based discovery meaningfully improves accuracy and token efficiency.
Does using a tool search step change how tool results are returned to Claude? No. Once Claude finds and calls the actual tool, the request/response format — tool_use and tool_result blocks — is identical to standard tool use. Only the discovery step is different.