# Transit MCP > Transit MCP is a free, anonymous, read-only Model Context Protocol (MCP) server for transit in New York (`nyc`: subway, LIRR, Metro-North, buses), Washington DC (`dc`: Metrorail, Metrobus) and the SF Bay Area (`sfbay`: every 511 operator, including BART, Muni, Caltrain and the ferries; departures, alerts and vehicle locations come from 511 SF Bay). It plans trips across every mode, buses included, lists departures, reports service alerts and elevator outages, and shows where trains and buses are. When `plan_trip` can't find a journey it returns `routeHints`; planning along named lines (`routes`) works everywhere. Transit MCP was formerly Metro MCP; it is the same server. - MCP endpoint (Streamable HTTP): https://transitmcp.com/mcp - Legacy endpoint, still supported: https://metro-mcp.anuragd.me/mcp - Authentication: none. No login, API key, bearer token, or OAuth flow is required. Stale Authorization headers are ignored. - Server description (JSON): https://transitmcp.com/info - Works with Claude, Cursor, Codex, Gemini, and any MCP client that speaks Streamable HTTP. - ChatGPT plugin listing: https://chatgpt.com/plugins/plugin_asdk_app_6a9078f4d6dc8191be735cc1c2ff45b5 ## Tool areas - Arrivals: real-time arrivals for DC Metro and NYC Subway stations and DC Metrobus stops (`get_station_predictions`, `get_bus_predictions`). - Incidents: service disruptions and DC Metro elevator and escalator outages (`get_incidents`, `get_elevator_incidents`). - Stations: station search, listing by line, full station lists, and transfers (`search_stations`, `get_stations_by_line`, `get_all_stations`, `get_station_transfers`). - Routes: NYC Subway route detail, DC Metrobus routes and stops (`get_route_info`, `get_bus_routes`, `get_bus_stops`). - Live positions: DC Metro train positions and Metrobus vehicles (`get_train_positions`, `get_bus_positions`). - Global capabilities: `find_transit`, `plan_trip`, `get_departures`, `get_service_status`, `get_vehicle_status`. These five tools are registered alongside the 13 compatible tools. DC, NYC and SF Bay are available. `plan_trip` searches every line of a coverage, buses included, and also plans along lines you name (`routes`). - Pass `coverage` as `dc`, `nyc` or `sfbay` (region names such as SF or Washington DC also work) whenever you know the region; leave it out only when a place could be in several. - `find_transit` with no arguments (or only `coverage`) lists the regions and what each supports. Without `coverage`, a name is searched in every region. Riders' everyday names work ("King Street", "42nd St Times Square", DC's "Chinatown" or "Convention Center"), as do small misspellings. When nothing matches, `suggestions` are the closest names, not matches: confirm one, or retry with the official name or coordinates. - `find_transit` lists candidates best first: exact names and well-known place names (SFO, Union Square, Penn Station, Grand Central, Dulles), then stations, then rail before bus. Each stop carries `stopType` (`station`, `platform`, `stop` for a street stop), `modes` and `routeNames`, so choose the one the rider means rather than the first name that matches. - To get from A to B, call `plan_trip` with the rider's own place names. A name for one place plans from or to all its stations. A name for different places ("Broadway") returns the best trip from each, labelled in `reading` and explained in `notice`: use the one the conversation points to, or ask the rider. No form is ever shown to the user. - If `plan_trip` returns no itinerary (`PLANNING_UNAVAILABLE`, `SCOPE_LIMIT_EXCEEDED`, or nothing found), it returns `routeHints`: the lines near each end, and `direct` lines serving both. Choose the lines you would ride (your own knowledge of the network helps, e.g. BART from SFO, then Muni) and call `plan_trip` again with `routes` (up to four route refs). The server finds the actual trips, boarding stops, transfers and walks on those lines and validates them. Present only returned itineraries as confirmed journeys. - For "the next train from A to B", call `get_departures` with `toStop` (or `toStopRef`): rows list only trips that stop at B after A, each with `arrival` (stop, scheduled and predicted time). - For "when is the next train at X", call `get_departures` with `stop` (a station name) and `coverage` in one step. A name for one place covers all its stations: a station complex such as Times Sq-42 St, stations a short walk apart, or a well-known place such as Penn Station or SFO. Its stations in other networks are listed in `otherStations` (the LIRR at Penn Station). A name for different places returns `ENTITY_AMBIGUOUS` with a question to ask the rider and one candidate per place. Rows carry `routeName` and `stopName`. - NYC departures can include observed trains: `scheduleMatch` is `unscheduled_call` (a reroute) or `unmatched_trip` (not in the timetable). These have a predicted time and no scheduled time. Report them as running, not as scheduled service. - For a wheelchair user, someone with a stroller or anyone avoiding stairs, call `plan_trip` with `accessibility: "step_free"`. It refuses with `ACCESSIBILITY_UNAVAILABLE` (no current elevator report) or `ENDPOINT_NOT_STEP_FREE` (that station has no step-free platform now); then call `get_service_status` for the station and relay `equipment.outages`, including `alternativeRoute`. Departure rows and station details carry `stepFree` (`accessible`, `partial`, `not_accessible`, `unknown`); `partial` means only some platforms, such as one direction. - The `nyc` coverage holds the subway, the Long Island Rail Road, Metro-North and NYC buses (every borough and MTA Bus Company); `dc` holds Metrorail and Metrobus. `plan_trip` plans with every mode, buses included, changing between them on foot (Penn Station, Grand Central, Atlantic Terminal, Jamaica). For a single bus ride `get_departures` with `toStop` gives the next buses and their arrival times. LIRR and Metro-North departures carry the track in `platform` when the railroad publishes it. Metro-North publishes no train locations. NYC bus predictions, locations and alerts come from MTA Bus Time; without its key NYC bus departures are timetable only (`scheduled_only`, `REALTIME_UNAVAILABLE`). - For "where is my train" or "what trains are at X", call `get_vehicle_status` with a line `ref`, a dated `tripInstanceRef` (from `get_departures` or a `plan_trip` leg), or a station (`stop` name with `coverage`). Each train has `trainId`, `stopStatus` (`stopped_at`, `incoming_at`, `in_transit_to`), `stopName`, `previousStopName` and `headsign`. An NYC `trainId` such as `1A 1023 207/FAR` reads as line A, scheduled out at 10:23, 207 St to Far Rockaway; `find_transit` with `train ` finds that train's trip. DC trains have GPS `coordinates`; NYC trains have coordinates only when stopped at a station (`coordinatesSource: stop`), otherwise null. Describe NYC positions by station, never invent a point between stations. - Use `find_transit` to inspect coverage availability and its planning capability; the open `plan_trip` search needs its planning capability, while `routes` works wherever schedules are available. When global coverage is unavailable, use `search_stations`, `get_station_predictions` and `get_incidents` for DC/NYC departure or service questions. These legacy tools do not provide a full journey planner. Never present a route pieced together from departure boards as confirmed; have `plan_trip` check it with `routes`. Preserve `realtime`, `scheduled_only`, or `unavailable` status and source timestamps. Times shown to a rider are local to the agency with their UTC offset; provenance stamps (`asOf`, `ingestedAt`) are UTC. Global tools have no Transit Board renderer. - DC-only: bus tools, `get_train_positions` and `get_elevator_incidents`. NYC-only: `get_route_info` and `get_station_transfers`. A null `minutesAway` means unknown, not zero; retain the returned arrival status. - Discovery preserves material exact alternatives up to 50 candidates or places per query or endpoint. Larger ambiguous sets return `SCOPE_LIMIT_EXCEEDED` with no partial choices; narrow the query or supply an exact reference. Non-material fuzzy results honor `limit`. - Names may carry their operator ("16th St Mission BART", "Penn Station LIRR", "Dupont Circle Metro"), where they are ("14 St, Manhattan", "Metro Center DC") or their line ("Canal St on the 6", "Pentagon on the Blue Line"). `get_service_status` takes a line by name with `coverage` (`ref: "L"`, `"Red Line"`). - To keep a rider posted, recheck a planned trip shortly before they leave: `get_service_status` with `itinerary` set to the trip exactly as `plan_trip` returned it reports `journeyValid`, `legChecks` and `transferChecks`, judged on current times (a late train that still makes every change keeps the trip valid; a missed change is `MISSED_CONNECTION`); if it no longer holds, plan again. During the ride, `get_vehicle_status` with the ride's `tripInstanceRef` shows where the train is. - The first call after a quiet spell can take several seconds while the timetable loads; retry a timeout once before reporting the service as down. Public results come from official WMATA (DC Metro and Metrobus) and MTA (NYC Subway, Long Island Rail Road, Metro-North and NYC buses, including MTA Bus Time) feeds. SF Bay results come from 511 SF Bay regional feeds, with attribution to 511 SF Bay and participating operators. ## Quick connect ```json { "mcpServers": { "transit-mcp": { "type": "http", "url": "https://transitmcp.com/mcp" } } } ``` ## Docs - [Transit MCP docs](https://transitmcp.com/docs/): client setup, HTTP endpoints, MCP tools, resources and prompts, and data sources. - [Agent skill (SKILL.md)](https://github.com/Aarekaz/transit-mcp/blob/main/skills/transit-mcp/SKILL.md): which tool answers which question, ambiguous names, and rechecking a trip. - [Source code on GitHub](https://github.com/Aarekaz/transit-mcp): MIT licensed. ## Policies - [Privacy](https://transitmcp.com/privacy/): how anonymous requests, operational telemetry, and provider logs are handled. - [Terms of Use](https://transitmcp.com/terms/): fair use, rate limits, and live data limits. - [Support](https://transitmcp.com/support/): documentation, issue reporting, maintainer contact, and security reports.