La herramienta de búsqueda de herramientas permite a Claude trabajar con cientos o miles de herramientas descubriendo y cargando dinámicamente solo las que necesita. En lugar de cargar todas las definiciones de herramientas en la ventana de contexto de antemano, Claude busca en tu catálogo de herramientas—incluyendo nombres de herramientas, descripciones, nombres de argumentos y descripciones de argumentos—y carga solo las herramientas que necesita.
Este enfoque resuelve dos desafíos críticos a medida que las bibliotecas de herramientas se escalan:
Aunque esto se proporciona como una herramienta del lado del servidor, también puedes implementar tu propia funcionalidad de búsqueda de herramientas del lado del cliente. Consulta Implementación personalizada de búsqueda de herramientas para más detalles.
La herramienta de búsqueda de herramientas está actualmente en beta pública. Incluye el encabezado beta apropiado para tu proveedor:
| Proveedor | Encabezado beta | Modelos soportados |
|---|---|---|
| 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 |
En Amazon Bedrock, la búsqueda de herramientas del lado del servidor está disponible solo a través de la API invoke, no la API converse.
También puedes implementar búsqueda de herramientas del lado del cliente devolviendo bloques tool_reference desde tu propia implementación de búsqueda.
Hay dos variantes de búsqueda de herramientas:
tool_search_tool_regex_20251119): Claude construye patrones regex para buscar herramientastool_search_tool_bm25_20251119): Claude usa consultas en lenguaje natural para buscar herramientasCuando habilitas la herramienta de búsqueda de herramientas:
tool_search_tool_regex_20251119 o tool_search_tool_bm25_20251119) en tu lista de herramientasdefer_loading: true para herramientas que no deberían cargarse inmediatamentetool_reference más relevantesEsto mantiene tu ventana de contexto eficiente mientras se mantiene alta la precisión en la selección de herramientas.
Aquí hay un ejemplo simple con herramientas diferidas:
La herramienta de búsqueda de herramientas tiene dos variantes:
{
"type": "tool_search_tool_regex_20251119",
"name": "tool_search_tool_regex"
}{
"type": "tool_search_tool_bm25_20251119",
"name": "tool_search_tool_bm25"
}Formato de consulta de variante Regex: Regex de Python, NO lenguaje natural
Cuando uses tool_search_tool_regex_20251119, Claude construye patrones regex usando la sintaxis re.search() de Python, no consultas en lenguaje natural. Patrones comunes:
"weather" - coincide con nombres/descripciones de herramientas que contienen "weather""get_.*_data" - coincide con herramientas como get_user_data, get_weather_data"database.*query|query.*database" - patrones OR para flexibilidad"(?i)slack" - búsqueda insensible a mayúsculas/minúsculasLongitud máxima de consulta: 200 caracteres
Formato de consulta de variante BM25: Lenguaje natural
Cuando uses tool_search_tool_bm25_20251119, Claude usa consultas en lenguaje natural para buscar herramientas.
Marca herramientas para carga bajo demanda agregando 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
}Puntos clave:
defer_loading se cargan en contexto inmediatamentedefer_loading: true se cargan solo cuando Claude las descubre a través de búsquedadefer_loading: trueAmbas variantes de búsqueda de herramientas (regex y bm25) buscan nombres de herramientas, descripciones, nombres de argumentos y descripciones de argumentos.
Cuando Claude usa la herramienta de búsqueda de herramientas, la respuesta incluye nuevos tipos de bloques:
{
"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: Indica que Claude está invocando la herramienta de búsqueda de herramientastool_search_tool_result: Contiene los resultados de búsqueda con un objeto tool_search_tool_search_result anidadotool_references: Array de objetos tool_reference que apuntan a herramientas descubiertastool_use: Claude invocando la herramienta descubiertaLos bloques tool_reference se expanden automáticamente en definiciones de herramientas completas antes de ser mostrados a Claude. No necesitas manejar esta expansión tú mismo. Sucede automáticamente en la API siempre que proporciones todas las definiciones de herramientas coincidentes en el parámetro tools.
La herramienta de búsqueda de herramientas funciona con servidores MCP. Agrega el encabezado beta "mcp-client-2025-11-20" a tu solicitud de API, y luego usa mcp_toolset con default_config para diferir la carga de herramientas MCP:
Opciones de configuración MCP:
default_config.defer_loading: Establece el valor predeterminado para todas las herramientas del servidor MCPconfigs: Anula los valores predeterminados para herramientas específicas por nombrePuedes implementar tu propia lógica de búsqueda de herramientas (por ejemplo, usando embeddings o búsqueda semántica) devolviendo bloques tool_reference desde una herramienta personalizada:
{
"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" }]
}
}Cada herramienta referenciada debe tener una definición de herramienta correspondiente en el parámetro tools de nivel superior con defer_loading: true. Este enfoque te permite usar algoritmos de búsqueda más sofisticados mientras se mantiene la compatibilidad con el sistema de búsqueda de herramientas.
Para un ejemplo completo usando embeddings, consulta nuestro cookbook de búsqueda de herramientas con embeddings.
La herramienta de búsqueda de herramientas no es compatible con ejemplos de uso de herramientas. Si necesitas proporcionar ejemplos de uso de herramientas, usa llamadas de herramientas estándar sin búsqueda de herramientas.
Estos errores previenen que la solicitud sea procesada:
Todas las herramientas diferidas:
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "All tools have defer_loading set. At least one tool must be non-deferred."
}
}Definición de herramienta faltante:
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "Tool reference 'unknown_tool' has no corresponding tool definition"
}
}Los errores durante la ejecución de herramientas devuelven una respuesta 200 con información de error en el cuerpo:
{
"type": "tool_result",
"tool_use_id": "srvtoolu_01ABC123",
"content": {
"type": "tool_search_tool_result_error",
"error_code": "invalid_pattern"
}
}Códigos de error:
too_many_requests: Límite de velocidad excedido para operaciones de búsqueda de herramientasinvalid_pattern: Patrón regex malformadopattern_too_long: El patrón excede el límite de 200 caracteresunavailable: Servicio de búsqueda de herramientas temporalmente no disponibleLa búsqueda de herramientas funciona con almacenamiento en caché de prompts. Agrega puntos de ruptura cache_control para optimizar conversaciones de múltiples turnos:
import anthropic
client = anthropic.Anthropic()
# Primera solicitud con búsqueda de herramientas
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
}
]
)
# Agrega la respuesta de Claude a la conversación
messages.append({
"role": "assistant",
"content": response1.content
})
# Segunda solicitud con punto de ruptura de caché
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)}")El sistema expande automáticamente bloques tool_reference en todo el historial de conversación completo, por lo que Claude puede reutilizar herramientas descubiertas en turnos posteriores sin volver a buscar.
Con streaming habilitado, recibirás eventos de búsqueda de herramientas como parte del stream:
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"}}
// Consulta de búsqueda transmitida
event: content_block_delta
data: {"type": "content_block_delta", "index": 1, "delta": {"type": "input_json_delta", "partial_json": "{\"query\":\"weather\"}"}}
// Pausa mientras se ejecuta la búsqueda
// Resultados de búsqueda transmitidos
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 continúa con herramientas descubiertasPuedes incluir la herramienta de búsqueda de herramientas en la API de Lotes de Mensajes. Las operaciones de búsqueda de herramientas a través de la API de Lotes de Mensajes se cotizan igual que las solicitudes de la API de Mensajes regular.
Casos de uso buenos:
Cuándo el llamado de herramientas tradicional podría ser mejor:
El uso de la herramienta de búsqueda de herramientas se rastrea en el objeto de uso de respuesta:
{
"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?"
}
]
}'