MBTA MCP demonstrates solid tool design with clear naming (verb_noun pattern), comprehensive descriptions (100-250 chars each), and well-structured input schemas. All 6 tools follow consistent patterns and include parameter type definitions. However, output schemas are not documented in the visible code, and error handling guidance is minimal. Tool descriptions are good but could be more concise per LLM-optimization baselines (50-200 chars). No tool annotations (readOnlyHint, destructiveHint) are present despite all tools being read-only operations.
Find stops by name or partial name. Use when a rider mentions a station or stop (for example "Park Street" or "South Station") and you need the stop ID for other tools.
Get MBTA service alerts and disruptions. Use for delays, detours, elevator outages, and service changes. Optionally filter by route_id and/or stop_id.
Get upcoming predicted arrivals/departures for a stop. Requires a stop ID from find_stop or get_stops_for_route. Optionally filter by route_id and direction_id (0 or 1). Limit defaults to the next 10.
List MBTA routes. Use this first when you need route IDs or want to browse the system. Optionally filter by GTFS route type: 0=light rail/streetcar, 1=subway, 2=commuter rail, 3=bus, 4=ferry.
List stops served by a specific MBTA route. Use when you already know a route ID (for example Red, Orange, Green-B, or 1) and need stop IDs/names along that route.
Get live vehicle locations and status. Use when the rider asks where trains/buses are right now. Optionally filter by route_id (recommended for buses).
Output schemas not documented. Tool descriptions explain what is returned (e.g., 'upcoming predicted arrivals'), but the actual response structure (fields, types, pagination) is not visible in the MCP tool definitions. LLMs cannot plan downstream calls or extract specific fields without knowing the response schema.
No tool annotations present. All 6 tools are read-only operations (risk: READ_ONLY), but readOnlyHint is not set in tool definitions. This prevents clients from optimizing caching, retry logic, and safety checks.
Error handling guidance missing. Tool descriptions do not explain what errors can occur, how to recover, or what the LLM should do if a call fails (e.g., 'If stop not found, try find_stop() first').
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Pagination not documented. Tools like get_routes and get_vehicles may return large result sets, but no limit, offset, or cursor parameters are visible. Without pagination, large responses can exhaust context windows.
Parameter descriptions contain example values (e.g., 'Red, Orange, Green-B, or 1' for route_id). LLMs tend to reuse example values literally rather than adapting to context, causing failures when those specific routes are not relevant.