Philadelphia SEPTA real-time transit MCP server providing access to regional rail arrivals, train tracking, bus positions, and service alerts via the SEPTA API (keyless)
SEPTA MCP has well-structured tool names (verb_noun pattern: septa_rail_arrivals, septa_next_to_arrive, septa_train_view, septa_bus_positions, septa_alerts) and clear, actionable descriptions (avg ~60 chars, all 10-100 range). Input schemas are present with type declarations and descriptions for all parameters. However, OUTPUT schemas are completely undocumented, no tool specifies what fields it returns, forcing LLMs to guess at response structure. Parameter descriptions are minimal (e.g., 'Regional Rail station name' lacks format/constraint details). No error handling guidance visible, tools throw errors but don't guide recovery. Fuzzy resolution logic is sophisticated but not exposed to the LLM via parameter constraints or enums. Missing: pagination info, result limits, field mappings for chaining tools.
system service alerts, advisories, and detours by route
live bus/trolley vehicle positions for a route
next trains from origin to destination with connections
regional rail departures board at a station
all live regional-rail trains with position and lateness
No output schemas documented. Tools return data but LLMs cannot predict field names, types, or structure. Forces trial-and-error parsing and wastes tokens on clarification.
Parameter descriptions lack format/constraint details. 'Regional Rail station name' doesn't explain fuzzy resolution, case sensitivity, or valid examples. LLMs cannot validate input before calling.
No error handling guidance. Code throws errors (e.g., 'SEPTA: ... is required') but tools don't document recovery paths or categorize errors as retryable vs. user-fixable.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
No pagination or result-limit documentation. septa_train_view returns 'all live trains' with no limit stated, could return hundreds of items, exhausting context window.
Fuzzy station/route resolution is internal logic, not exposed via enums or parameter constraints. LLMs cannot discover valid station names without trial-and-error or external lookup.