MCP server providing real-time and scheduled bus information for Montevideo, Uruguay's public transportation system
This server has 3 tools with reasonable descriptions but significant structural gaps. Tool naming is acceptable (verb-based: consultar_*), but parameter schemas lack explicit type definitions in the visible code, descriptions are present but vary in quality, and critical error handling/output documentation is missing. The output schemas are documented only in docstrings (not formalized), and there is no evidence of input validation, error recovery guidance, or pagination support. The codebase shows basic tool structure but falls short of production-grade definition quality.
Consulta los ETAs (tiempo estimado de llegada) en tiempo real de las líneas de ómnibus. Puede consultar por dirección (busca paradas cercanas) o por ID de parada específica. Utilizar en los casos donde el usuario quiere saber cuando pasa el proximo omnibus por una parada. Por ejemplo: "Cuando pasa el omnibus 181 por la parada de Bulevar Espana esquina Obligado?"
Consulta los proximos omnibus cercanos a una direccion. Puede ser utilizada para obtener las paradas cercanas a una direccion, y para obtener los horarios programados de los omnibus que pasan por dichas paradas, asi como la frecuencia de los mismos. Utilizar para obtener los horarios de los omnibus para un recorrido. ESTOS HORARIOS SON PROGRAMADOS, NO SON EN TIEMPO REAL.
Consulta las rutas de omnibus entre dos direcciones.
Parameter type definitions are incomplete or inferred. The FastMCP decorator uses Python function signatures, but input schema JSON is not explicitly registered. No @mcp.tool() calls show explicit schema registration with formal JSON Schema type/description pairs. Schema completeness cannot be verified.
Output schemas are documented only in docstrings (e.g. 'Returns: Los omnibus que estan cercanos...'), not as formal JSON Schema. LLMs cannot parse prose descriptions of return structures. Without structured output schemas, agents cannot reliably extract and chain return values.
No error handling or recovery guidance. consultar_horarios_programados_omnibus returns bare data or empty lists with no recovery hints. consultar_eta_tiempo_real returns a string 'No se encontraron ETAs...' instead of a structured error. consultar_rutas_omnibus has no error path documented. Per pattern:recovery-guide, errors must tell the LLM what to do next.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 47 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 37 | - | v1 |
Tool descriptions lack 'When to use' context. 'Consulta las rutas de omnibus entre dos direcciones' (Tool 2) is a literal restatement of the function name, not a decision guide. Descriptions should answer: When should the LLM call THIS tool instead of another? consultar_rutas_omnibus vs consultar_horarios_programados_omnibus distinction is unclear from descriptions alone.
Parameter descriptions are incomplete or missing examples of expected input format. 'La direccion a consultar en lenguaje natural' is stated, but the tool then calls utils.geocodificar_direccion() without documenting failure modes. What happens if the address is not found? Does the function return null, raise an exception, or default to a location? No guidance for LLM.
No pagination or result limiting. consultar_horarios_programados_omnibus returns all stops within radius with all horarios. No documented limit, offset, or total count. consultar_rutas_omnibus returns 'Las rutas...' with no indication of how many routes or how they are ordered. Large result sets blow context windows.
Inconsistent return structure. consultar_eta_tiempo_real returns either a list of dicts or a string 'No se encontraron ETAs...'. This breaks LLM parsing and chaining. Should always return structured objects, with an error field or empty array.
Default parameter values risk unintended side effects. 'tiempo' defaults to current datetime if None, 'radio' defaults to 200m. If an LLM omits these, does it always return current time? No fallback or negotiation if time is ambiguous. Not explicitly dangerous, but undocumented implicit behavior.