MCP server for Montevideo's public bus network (STM) — consult stop schedules, routes and arrivals
This is a domain-specific transit tool with 5 well-intentioned tools, but significant gaps in schema completeness, error handling guidance, and parameter descriptions. The tools are READ_ONLY (good for safety), have Spanish descriptions that are reasonably detailed, but the input parameter documentation is inconsistent and several parameters lack proper type constraints. Tool names follow a reasonable verb_noun pattern in Spanish (buscar_parada, proximos_buses, recorrido_linea, ubicacion_bus, como_llegar), which is clear and domain-appropriate. However, schema quality varies: buscar_parada and proximos_buses accept flexible string inputs with no enums for critical fields like 'linea' (bus line number), and radio_metros has no bounds declared. Output schemas are not explicitly documented in the tool definitions visible in source. Error handling is minimal, no recovery guidance for cases like 'parada not found' or 'linea invalid'. The package.json and test utilities show good engineering (proper fixtures, mocking, integration test structure), but this doesn't translate to user-facing tool quality. STDIO-only transport is a hard cap at 50 for protocol readiness, severely limiting this server's production utility.
Busca paradas del STM cercanas a un punto en Montevideo. Modos: lugar (comercio o institución), calle1+calle2 (intersección), calle1 solo (calle o dirección con número), o latitud+longitud (coordenadas GPS).
Calcula una ruta en transporte público entre dos puntos en Montevideo. Acepta direcciones, nombres de lugares o coordenadas GPS.
Próximos ómnibus en una parada STM. Identificá la parada por parada_id, calle1+calle2, o calle1 sola. No necesitás llamar a buscarParadas primero — pasá calle1 y calle2 directamente y busca la parada automáticamente.
Muestra el recorrido completo de una línea de ómnibus con todas sus paradas en orden.
Muestra la posición en tiempo real de los ómnibus de una línea (requiere credenciales API).
Input schemas lack enum constraints for critical string fields (linea, variante). LLMs will hallucinate invalid bus line numbers or variant codes.
No bounds declared on numeric parameters (radio_metros, cantidad, latitud, longitud). LLMs could pass absurd values like radio_metros=999999999 or cantidad=999999, risking timeout or API abuse.
Output schemas not documented in source. Tool descriptions do not specify what fields are returned (e.g., what does buscar_parada return? parada_id, nombre, calle1, calle2, latitud, longitud?). LLMs cannot plan downstream tool chains without knowing the response structure.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 44 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 51 | - | v1 |
No error handling guidance. Tool descriptions omit recovery hints like 'If parada not found, try buscar_parada() first' or 'linea does not exist, call list_all_lineas() to see valid options.' Bare errors leave LLMs dead-ended.
Parameter descriptions lack specificity about format and constraints. E.g., latitud/longitud description says 'Latitud WGS84' but does not state the range (-90 to +90 for latitude, -180 to +180 for longitude). LLMs may pass out-of-range coords. calle1/calle2 description does not clarify: Is this a street name only, or a full address with number? Do case and accents matter?
Tools accept multiple input modes (e.g., proximos_buses accepts parada_id, calle1+calle2, or calle1 alone) but do not declare which combinations are valid or what the fallback behavior is. The description says 'No necesitás llamar a buscarParadas primero' but does not formalize mutual exclusivity rules.
ubicacion_bus description notes '(requiere credenciales API)' but tool parameters do not reflect this, no indication of what happens if credentials are missing or invalid. Error handling should be explicit.
No pagination or result limits documented. If recorrido_linea returns all stops on a line (potentially hundreds), there is no indication of result count, pagination mechanism, or a limit parameter. Large responses waste context window.