CTA MCP defines 4 read-only transit tools with reasonable naming (verb_noun pattern: cta_train_arrivals, cta_bus_predictions) and moderate descriptions (80 - 180 chars). All tools have input schemas with typed parameters and descriptions. However, output schemas are completely undocumented, LLMs cannot predict what fields to expect from responses. Parameter descriptions lack format constraints (e.g., 'station' accepts name or mapid but doesn't specify the format or length). Error handling is absent, no guidance on what happens when a station is not found or the API times out. The embedded station table is a strength (disambiguates ambiguous names), but this complexity is not surfaced in tool descriptions.
live buses on a route (getvehicles)
bus arrival predictions at a stop (Bus Tracker getpredictions), with a find_stop text lookup (getdirections + getstops) when the stop id is unknown
upcoming 'L' trains at a station (Train Tracker ttarrivals)
live trains on one or more lines (ttpositions)
Output schemas completely undocumented. LLMs cannot predict response structure (fields, types, nesting). Breaks downstream tool chaining and forces agents to guess at field names.
Parameter format constraints missing. 'station' accepts name or 5-digit mapid, but description does not specify format, length, or validation rules. 'lines' accepts array or comma-separated string, ambiguous and error-prone.
No error handling or recovery guidance. No documentation of what happens when station/route not found, API timeout, or invalid credentials. Agents cannot self-correct or retry intelligently.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 55 | 2026-07-28+ | v2 |
Station name ambiguity (e.g., 'Western' exists on 5 lines) is handled internally via embedded table, but tool descriptions do not explain this or guide users on how to disambiguate. LLMs may not know to use the 'line' filter.
No pagination or result limits documented. 'cta_train_arrivals' has a 'limit' parameter (default 10), but no mention of max allowed value or what happens if limit is exceeded. Other tools lack limit parameters entirely.