Cap 6: Diseño de Tools Efectivos
Tool Descriptions: el mecanismo de selección
Cuando Claude tiene acceso a múltiples tools, la description es el mecanismo principal que usa para decidir cuál invocar. No es el nombre, no es el schema — es la description la que determina si el modelo selecciona correctamente.
El problema de descriptions mínimas
{
"name": "analyze_content",
"description": "Analyzes content"
}
Con una description tan escueta, Claude no puede distinguir de forma confiable entre tools similares. Si además tienes analyze_document con description “Analyzes a document”, el modelo va a hacer misrouting constantemente.
Qué incluir en una buena description
Una description efectiva contiene:
- Qué hace el tool — propósito específico, no genérico
- Input formats — qué tipo de datos acepta
- Example queries — cuándo debería invocarse
- Edge cases — qué NO hacer con este tool
- Boundary explanations — dónde termina su responsabilidad
{
"name": "analyze_sentiment",
"description": "Analyzes emotional sentiment of customer feedback text. Input: raw text string from support tickets or reviews (max 5000 chars). Use this for: determining if feedback is positive/negative/neutral, extracting emotion keywords. Do NOT use for: document summarization, content classification by topic, or structured data analysis. Returns: sentiment score (-1 to 1), dominant emotion, confidence level."
}
Overlap ambiguo entre tools
El problema
Cuando dos tools tienen nombres o descriptions que se superponen, Claude no puede determinar cuál usar:
| Tool A | Tool B | Problema |
|---|---|---|
analyze_content | analyze_document | ¿Cuál es para texto plano vs PDF? |
search_records | find_entries | Sinónimos sin distinción clara |
process_data | transform_data | Verbos genéricos, misma semántica |
Diagnóstico de misrouting
Si observas que Claude invoca el tool equivocado:
- Revisa las descriptions — ¿hay palabras compartidas que crean ambigüedad?
- Compara los schemas de input — ¿aceptan los mismos tipos?
- Verifica si el system prompt crea asociaciones no intencionadas
System prompt y asociaciones no deseadas
El wording del system prompt puede crear asociaciones implícitas con tools. Si tu prompt dice:
“Cuando el usuario pida analizar algo, usa las herramientas disponibles”
Claude puede asociar “analizar” con cualquier tool que tenga “analyze” en el nombre, ignorando la intención real.
Solución: ser específico en el system prompt sobre cuándo usar cada tool:
“Para análisis de sentimiento de feedback, usa analyze_sentiment. Para clasificación de documentos por categoría, usa classify_document.”
Estrategias para eliminar overlap
1. Renombrar tools con verbos específicos
❌ analyze_content → ✅ extract_sentiment
❌ analyze_document → ✅ classify_document_type
❌ process_data → ✅ normalize_csv_records
2. Actualizar descriptions al renombrar
Renombrar sin actualizar la description no resuelve nada. El nombre es una señal secundaria; la description es la primaria.
3. Splittear tools genéricos
Un tool genérico que hace “de todo” es peor que varios tools específicos con contratos claros.
Antes — un tool genérico:
{
"name": "data_tool",
"description": "Handles all data operations",
"inputSchema": {
"type": "object",
"properties": {
"action": { "enum": ["search", "create", "update", "delete"] },
"data": { "type": "object" }
}
}
}
Después — tools específicos con contratos I/O definidos:
[
{
"name": "search_customers",
"description": "Search customer records by name, email or ID. Input: search query string or partial match. Returns: array of matching customer objects with id, name, email, status.",
"inputSchema": {
"type": "object",
"properties": {
"query": { "type": "string" },
"limit": { "type": "number", "default": 10 }
},
"required": ["query"]
}
},
{
"name": "create_customer",
"description": "Creates a new customer record. Requires name and email. Returns: created customer object with generated ID. Fails if email already exists.",
"inputSchema": {
"type": "object",
"properties": {
"name": { "type": "string" },
"email": { "type": "string", "format": "email" }
},
"required": ["name", "email"]
}
}
]
4. Contratos I/O definidos
Cada tool debe tener:
- Input contract: tipos exactos, campos requeridos vs opcionales, validaciones
- Output contract: estructura de respuesta exitosa, estructura de error
- Boundary: qué rangos acepta, qué tamaños máximos, qué formatos
{
"name": "resize_image",
"description": "Resizes an image to specified dimensions. Input: image URL or base64 (max 10MB, formats: PNG/JPG/WebP). Width and height in pixels (min 1, max 4096). Returns: base64 encoded resized image. Fails if: image exceeds size limit, unsupported format, dimensions out of range."
}
Regla de oro
Si no puedes explicar en una oración cuándo usar tool A versus tool B, tus usuarios (y Claude) tampoco podrán.
La prueba definitiva: describe a un colega cuándo debería usar cada tool. Si necesitas más de 10 segundos para difereciarlos, necesitas rediseñar.