San Francisco Bay Area Rapid Transit real-time data (api.bart.gov)
BART MCP demonstrates solid fundamentals: all 4 tools have clear, action-oriented names (bart_departures, bart_stations, bart_trip_planner, bart_advisories) and substantive descriptions (150 - 250 chars each). Input schemas are present with typed properties and descriptions. However, output schemas are entirely undocumented, LLMs cannot predict response structure or plan downstream calls. Parameter descriptions are good but lack explicit constraints (e.g., no enum for station codes, no min/max for trip count). Error handling is absent from tool definitions. The _apiKey parameter pattern is reasonable but exposes API key as a parameter (though BART's is public). Overall: above-average naming and descriptions, but missing output documentation and error guidance that would push this to 80+.
Current BART service advisories and delays for the San Francisco Bay Area train system, plus elevator outage status at stations. Answers "is BART delayed right now", "are there BART service alerts", "which BART elevators are out". Example: bart_advisories({})
Real-time BART San Francisco Bay Area train departures for a station — next train departure times in minutes, per destination, with platform, direction, train length (cars), line color, delay, and bikes allowed. Station accepts a 4-letter BART code ("EMBR", "SFIA") or a station name ("Embarcadero", "Downtown Berkeley", "SFO"). Answers "when is the next BART train". Example: bart_departures({ station: "Embarcadero" })
List all 50 BART San Francisco Bay Area train stations with 4-letter code, full name, city, street address, and coordinates. Optional filter matches station name or city (e.g. "Oakland", "Berkeley", "airport"). Use to find the station code for departures, trips, or fares. Example: bart_stations({ filter: "San Francisco" })
Plan a BART trip between two Bay Area stations — the next trains from origin to destination with departure and arrival times, trip duration, legs (line, transfer stations, bikes), and the fare (Clipper and discount prices). Covers trips like SF to Oakland, Embarcadero to SFO airport, Berkeley to Millbrae. Stations accept 4-letter codes or names. Example: bart_trip_planner({ from: "Embarcadero", to: "SFIA" })
Output schemas completely undocumented. LLMs cannot predict response structure (fields, types, nesting) for any tool. Breaks tool chaining and forces agents to guess at response format.
No error handling guidance in tool definitions. If a station code is invalid or API fails, LLMs have no recovery path. Missing pattern:recovery-guide.
Parameter constraints not formalized. 'trips' param accepts 1-4 but no min/max in schema. Station names accept aliases (SFO→SFIA) but no enum or pattern documented. LLMs may pass invalid values.
_apiKey parameter exposes API key as a tool parameter. Although BART's key is public, this pattern violates secret-injection best practice. Should use server-side environment variable injection only.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
No pagination or result limits documented. bart_stations returns all 50 stations; bart_departures may return many trains. No mention of limits, pagination, or how to handle large result sets.