Servidor MCP que expone tools propias (SQLite + API externa) para un LLM.
Three tools with complete schemas and descriptions, but descriptions are minimal (10-20 chars baseline). All tools are READ_ONLY and properly parameterized with types. search_customers and get_order_by_id have good input validation logic (limit clamping, SQL parameterization). get_weather lacks error recovery guidance. No tool annotations (readOnlyHint, idempotentHint) despite all being read-only. Output schemas are not documented, LLMs cannot predict response structure. Parameter descriptions are present but terse (e.g., 'Nombre o parte del nombre del cliente a buscar' is 47 chars, below the 72-char baseline). No pagination support on search_customers despite potentially returning multiple results.
Devuelve un pedido por su id (incluye el cliente).
Clima actual de una ciudad (Open-Meteo, sin API key).
Busca clientes por nombre (coincidencia parcial).
Output schemas not documented. LLMs cannot predict response structure (e.g., search_customers returns list[dict] with fields id/name/email, but this is not declared in tool definition). Agents must infer structure from trial calls.
No tool annotations despite all tools being read-only. FastMCP supports readOnlyHint, should be applied to all three tools to signal safety to agents.
search_customers lacks pagination. Accepts limit (max 50) but no offset/cursor or total_count in response. If 50+ matching customers exist, agent cannot iterate.
get_weather error handling returns bare dicts with 'error' key (e.g., {'error': 'No encontré la ciudad'}). No recovery guidance. Should suggest: 'City not found. Try a larger region name or check spelling.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
Parameter descriptions are minimal (47 - 52 chars vs 72-char baseline). 'Nombre o parte del nombre del cliente a buscar' lacks guidance on case sensitivity, special characters, or minimum length. 'ID del pedido a recuperar' does not explain what happens if order_id does not exist.