L'outil de recherche d'outils permet à Claude de travailler avec des centaines ou des milliers d'outils en découvrant et chargeant dynamiquement les outils à la demande. Au lieu de charger toutes les définitions d'outils dans la fenêtre de contexte dès le départ, Claude recherche votre catalogue d'outils—y compris les noms d'outils, les descriptions, les noms d'arguments et les descriptions d'arguments—et charge uniquement les outils dont il a besoin.
Cette approche résout deux défis critiques à mesure que les bibliothèques d'outils se développent :
Bien que cela soit fourni en tant qu'outil côté serveur, vous pouvez également implémenter votre propre fonctionnalité de recherche d'outils côté client. Voir Implémentation personnalisée de la recherche d'outils pour plus de détails.
L'outil de recherche d'outils est actuellement en bêta publique. Incluez l'en-tête bêta approprié pour votre fournisseur :
| Fournisseur | En-tête bêta | Modèles supportés |
|---|---|---|
| Claude API Microsoft Foundry | advanced-tool-use-2025-11-20 | Claude Opus 4.5 Claude Sonnet 4.5 |
| Google Cloud's Vertex AI | tool-search-tool-2025-10-19 | Claude Opus 4.5 Claude Sonnet 4.5 |
| Amazon Bedrock | tool-search-tool-2025-10-19 | Claude Opus 4.5 |
Sur Amazon Bedrock, la recherche d'outils côté serveur est disponible uniquement via l'API invoke, pas l'API converse.
Vous pouvez également implémenter une recherche d'outils côté client en retournant des blocs tool_reference de votre propre implémentation de recherche.
Il existe deux variantes de recherche d'outils :
tool_search_tool_regex_20251119) : Claude construit des motifs regex pour rechercher des outilstool_search_tool_bm25_20251119) : Claude utilise des requêtes en langage naturel pour rechercher des outilsLorsque vous activez l'outil de recherche d'outils :
tool_search_tool_regex_20251119 ou tool_search_tool_bm25_20251119) dans votre liste d'outilsdefer_loading: true pour les outils qui ne doivent pas être chargés immédiatementtool_reference les plus pertinentsCela maintient votre fenêtre de contexte efficace tout en maintenant une haute précision de sélection d'outils.
Voici un exemple simple avec des outils différés :
L'outil de recherche d'outils a deux variantes :
{
"type": "tool_search_tool_regex_20251119",
"name": "tool_search_tool_regex"
}{
"type": "tool_search_tool_bm25_20251119",
"name": "tool_search_tool_bm25"
}Format de requête de variante Regex : Expression régulière Python, PAS langage naturel
Lors de l'utilisation de tool_search_tool_regex_20251119, Claude construit des motifs regex en utilisant la syntaxe re.search() de Python, pas des requêtes en langage naturel. Motifs courants :
"weather" - correspond aux noms/descriptions d'outils contenant "weather""get_.*_data" - correspond aux outils comme get_user_data, get_weather_data"database.*query|query.*database" - motifs OU pour la flexibilité"(?i)slack" - recherche insensible à la casseLongueur maximale de requête : 200 caractères
Format de requête de variante BM25 : Langage naturel
Lors de l'utilisation de tool_search_tool_bm25_20251119, Claude utilise des requêtes en langage naturel pour rechercher des outils.
Marquez les outils pour un chargement à la demande en ajoutant defer_loading: true :
{
"name": "get_weather",
"description": "Get current weather for a location",
"input_schema": {
"type": "object",
"properties": {
"location": { "type": "string" },
"unit": { "type": "string", "enum": ["celsius", "fahrenheit"] }
},
"required": ["location"]
},
"defer_loading": true
}Points clés :
defer_loading sont chargés dans le contexte immédiatementdefer_loading: true ne sont chargés que lorsque Claude les découvre via la recherchedefer_loading: trueLes deux variantes de recherche d'outils (regex et bm25) recherchent les noms d'outils, les descriptions, les noms d'arguments et les descriptions d'arguments.
Lorsque Claude utilise l'outil de recherche d'outils, la réponse inclut de nouveaux types de blocs :
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "I'll search for tools to help with the weather information."
},
{
"type": "server_tool_use",
"id": "srvtoolu_01ABC123",
"name": "tool_search_tool_regex",
"input": {
"query": "weather"
}
},
{
"type": "tool_search_tool_result",
"tool_use_id": "srvtoolu_01ABC123",
"content": {
"type": "tool_search_tool_search_result",
"tool_references": [{ "type": "tool_reference", "tool_name": "get_weather" }]
}
},
{
"type": "text",
"text": "I found a weather tool. Let me get the weather for San Francisco."
},
{
"type": "tool_use",
"id": "toolu_01XYZ789",
"name": "get_weather",
"input": { "location": "San Francisco", "unit": "fahrenheit" }
}
],
"stop_reason": "tool_use"
}server_tool_use : Indique que Claude invoque l'outil de recherche d'outilstool_search_tool_result : Contient les résultats de recherche avec un objet tool_search_tool_search_result imbriquétool_references : Tableau d'objets tool_reference pointant vers les outils découvertstool_use : Claude invoquant l'outil découvertLes blocs tool_reference sont automatiquement développés en définitions d'outils complètes avant d'être affichés à Claude. Vous n'avez pas besoin de gérer cette expansion vous-même. Cela se fait automatiquement dans l'API tant que vous fournissez toutes les définitions d'outils correspondantes dans le paramètre tools.
L'outil de recherche d'outils fonctionne avec les serveurs MCP. Ajoutez l'en-tête bêta "mcp-client-2025-11-20" à votre requête API, puis utilisez mcp_toolset avec default_config pour différer le chargement des outils MCP :
Options de configuration MCP :
default_config.defer_loading : Définir la valeur par défaut pour tous les outils du serveur MCPconfigs : Remplacer les valeurs par défaut pour des outils spécifiques par nomVous pouvez implémenter votre propre logique de recherche d'outils (par exemple, en utilisant des embeddings ou une recherche sémantique) en retournant des blocs tool_reference à partir d'un outil personnalisé :
{
"type": "tool_search_tool_result",
"tool_use_id": "toolu_custom_search",
"content": {
"type": "tool_search_tool_search_result",
"tool_references": [{ "type": "tool_reference", "tool_name": "discovered_tool_name" }]
}
}Chaque outil référencé doit avoir une définition d'outil correspondante dans le paramètre tools de niveau supérieur avec defer_loading: true. Cette approche vous permet d'utiliser des algorithmes de recherche plus sophistiqués tout en maintenant la compatibilité avec le système de recherche d'outils.
Pour un exemple complet utilisant des embeddings, consultez notre cookbook de recherche d'outils avec embeddings.
L'outil de recherche d'outils n'est pas compatible avec les exemples d'utilisation d'outils. Si vous avez besoin de fournir des exemples d'utilisation d'outils, utilisez l'appel d'outils standard sans recherche d'outils.
Ces erreurs empêchent la requête d'être traitée :
Tous les outils différés :
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "All tools have defer_loading set. At least one tool must be non-deferred."
}
}Définition d'outil manquante :
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "Tool reference 'unknown_tool' has no corresponding tool definition"
}
}Les erreurs lors de l'exécution d'outils retournent une réponse 200 avec les informations d'erreur dans le corps :
{
"type": "tool_result",
"tool_use_id": "srvtoolu_01ABC123",
"content": {
"type": "tool_search_tool_result_error",
"error_code": "invalid_pattern"
}
}Codes d'erreur :
too_many_requests : Limite de débit dépassée pour les opérations de recherche d'outilsinvalid_pattern : Motif regex mal formépattern_too_long : Le motif dépasse la limite de 200 caractèresunavailable : Service de recherche d'outils temporairement indisponibleLa recherche d'outils fonctionne avec la mise en cache des invites. Ajoutez des points de rupture cache_control pour optimiser les conversations multi-tours :
import anthropic
client = anthropic.Anthropic()
# First request with tool search
messages = [
{
"role": "user",
"content": "What's the weather in Seattle?"
}
]
response1 = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
betas=["advanced-tool-use-2025-11-20"],
max_tokens=2048,
messages=messages,
tools=[
{
"type": "tool_search_tool_regex_20251119",
"name": "tool_search_tool_regex"
},
{
"name": "get_weather",
"description": "Get weather for a location",
"input_schema": {
"type": "object",
"properties": {
"location": {"type": "string"}
},
"required": ["location"]
},
"defer_loading": True
}
]
)
# Add Claude's response to conversation
messages.append({
"role": "assistant",
"content": response1.content
})
# Second request with cache breakpoint
messages.append({
"role": "user",
"content": "What about New York?",
"cache_control": {"type": "ephemeral"}
})
response2 = client.beta.messages.create(
model="claude-sonnet-4-5-20250929",
betas=["advanced-tool-use-2025-11-20"],
max_tokens=2048,
messages=messages,
tools=[
{
"type": "tool_search_tool_regex_20251119",
"name": "tool_search_tool_regex"
},
{
"name": "get_weather",
"description": "Get weather for a location",
"input_schema": {
"type": "object",
"properties": {
"location": {"type": "string"}
},
"required": ["location"]
},
"defer_loading": True
}
]
)
print(f"Cache read tokens: {response2.usage.get('cache_read_input_tokens', 0)}")Le système développe automatiquement les blocs tool_reference dans tout l'historique de conversation, de sorte que Claude peut réutiliser les outils découverts dans les tours suivants sans effectuer une nouvelle recherche.
Avec le streaming activé, vous recevrez les événements de recherche d'outils dans le flux :
event: content_block_start
data: {"type": "content_block_start", "index": 1, "content_block": {"type": "server_tool_use", "id": "srvtoolu_xyz789", "name": "tool_search_tool_regex"}}
// Search query streamed
event: content_block_delta
data: {"type": "content_block_delta", "index": 1, "delta": {"type": "input_json_delta", "partial_json": "{\"query\":\"weather\"}"}}
// Pause while search executes
// Search results streamed
event: content_block_start
data: {"type": "content_block_start", "index": 2, "content_block": {"type": "tool_search_tool_result", "tool_use_id": "srvtoolu_xyz789", "content": {"type": "tool_search_tool_search_result", "tool_references": [{"type": "tool_reference", "tool_name": "get_weather"}]}}}
// Claude continues with discovered toolsVous pouvez inclure l'outil de recherche d'outils dans l'API Messages Batches. Les opérations de recherche d'outils via l'API Messages Batches sont facturées de la même manière que celles des requêtes de l'API Messages régulière.
Bons cas d'usage :
Quand l'appel d'outils traditionnel pourrait être meilleur :
L'utilisation de l'outil de recherche d'outils est suivie dans l'objet d'utilisation de la réponse :
{
"usage": {
"input_tokens": 1024,
"output_tokens": 256,
"server_tool_use": {
"tool_search_requests": 2
}
}
}curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: advanced-tool-use-2025-11-20" \
--header "content-type: application/json" \
--data '{
"model": "claude-sonnet-4-5-20250929",
"max_tokens": 2048,
"messages": [
{
"role": "user",
"content": "What is the weather in San Francisco?"
}
],
"tools": [
{
"type": "tool_search_tool_regex_20251119",
"name": "tool_search_tool_regex"
},
{
"name": "get_weather",
"description": "Get the weather at a specific location",
"input_schema": {
"type": "object",
"properties": {
"location": {"type": "string"},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"]
}
},
"required": ["location"]
},
"defer_loading": true
},
{
"name": "search_files",
"description": "Search through files in the workspace",
"input_schema": {
"type": "object",
"properties": {
"query": {"type": "string"},
"file_types": {
"type": "array",
"items": {"type": "string"}
}
},
"required": ["query"]
},
"defer_loading": true
}
]
}'curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: advanced-tool-use-2025-11-20,mcp-client-2025-11-20" \
--header "content-type: application/json" \
--data '{
"model": "claude-sonnet-4-5-20250929",
"max_tokens": 2048,
"mcp_servers": [
{
"type": "url",
"name": "database-server",
"url": "https://mcp-db.example.com"
}
],
"tools": [
{
"type": "tool_search_tool_regex_20251119",
"name": "tool_search_tool_regex"
},
{
"type": "mcp_toolset",
"mcp_server_name": "database-server",
"default_config": {
"defer_loading": true
},
"configs": {
"search_events": {
"defer_loading": false
}
}
}
],
"messages": [
{
"role": "user",
"content": "What events are in my database?"
}
]
}'