An MCP server that answers one question well: is the subway line we recommend disrupted on that date, at that station?
If your question is "is the L running right now," close this page. Open mta.info or any transit app. They are free, official, and faster than anything here. This tool would be a worse answer.
It earns its place on a narrower question, and the narrowness is the point: a date in the future, a specific station, and a yes or no you are willing to put in an email to 3,000 people. That question is tedious by hand and easy to get confidently wrong.
resolve_station reads a
station list generated from MTA's static GTFS and committed to the repo. It makes no network call,
so this panel will read the same next year unless MTA renames a station.This is the demo worth your time. It is a real trap, and the obvious implementation walks straight into it.
mta.info/alerts. Filter to the 4, set the date to 09/26.alert_type, never on
station mention.Knowing which questions a tool cannot answer is part of using it.
| Not this | Why |
|---|---|
| "When is the next 6 train?" | No arrivals or trip updates. Those are protobuf-only feeds and would pull in three
custom .proto files for a feature this tool does not need. |
| "Is the M15 bus delayed?" | Bus Time needs an API key and is out of scope. Bus alerts are in the same keyless family and could be added. |
| "Are Times Sq and Port Authority connected?" | Stations linked only by transfer, under different names, are not modeled. 60 such pairs exist. Asking about one name will not surface alerts filed against the other. |
| "Is my station definitely fine?" | MTA tags stations only when it considers the change significant. Every response carries
station_level_detail so a quiet answer is never mistaken for a guarantee. |
BetaNYC publishes seven MCP servers to npm. This one is deliberately not among them, and the reason is worth more than the code.
MTA's data feed terms, term 1:
"In developing your app, you will provide that the MTA data feed is available to others only from a non-MTA server. Accordingly, you will download and store the MTA data feed on a non-MTA server which users of your app will access in order to obtain data. MTA prohibits the development of an app that would make the data available to others directly from MTA's server(s)."
A published package makes every installer's machine fetch straight from
api-endpoint.mta.info, with no server of ours in between. There is a tempting
counter-argument, that each user is simply fetching for themselves. It does not survive the clause's
own wording: the non-MTA server is defined as the one "which users of your app will access in
order to obtain data." It names the exact party the counter-argument tries to carve out.
So package.json sets "private": true, and the decision is enforced in
code rather than in a comment somebody later deletes.
This is v0.1.0 alpha, in active development, and it has not been used by anyone outside BetaNYC. We are sharing it this early on purpose, to find out what breaks. Tool names, parameters, and response shapes can change without notice. Do not build anything you care about on it yet.
alert_type values seen
across two live pulls. MTA can emit others. An unrecognized one counts as a disruption
by design, but that is a safety net rather than coverage.Found something wrong? Open an issue. That is the point of putting it out this early.
Clone and build. Node 20 or newer. No API key is needed for any feed it uses.
git clone https://github.com/BetaNYC/mta-mcp.git cd mta-mcp npm install npm run build
Then point an MCP client at the build. For Claude Code, in .mcp.json:
{
"mcpServers": {
"mta-mcp": {
"command": "node",
"args": ["${HOME}/Code/mta-mcp/dist/index.js"]
}
}
}
MTA publishes no rate limit, no refresh cadence, and no cache headers, so politeness cannot be
negotiated with the server. Six mechanisms impose it instead, all on by default: a 60-second
response cache, single-flight de-duplication, a process-wide one-second floor between requests,
bounded retry that honors Retry-After, a 15-second timeout, and a
User-Agent that identifies the project.
There is no background polling, no prefetch, no warm-up fetch. It fetches only when a tool is called. The test suite makes zero network requests, so continuous integration never touches MTA at all.
This is not the only one, and for most questions it is not the one you want. Several of these are further along, and all of them do live arrivals, which this server does not do at all. If your question is "when is the next train," start here rather than with us.
| Project | Language | What it does that this one does not |
|---|---|---|
| where_is_my_train_mcp
sasabasara · also on Smithery |
TypeScript | The broadest of these. Live arrivals with crowding where available, fuzzy station search, elevator status, transfers, and nearby-station lookup by latitude and longitude. |
| nyc-subway-mcp-server
hardparking |
TypeScript | Real-time arrivals, live vehicle positions, and a line-status overview. Runs over HTTP as well as stdio. |
| metro-mcp
Aarekaz |
TypeScript | Covers DC Metro as well as NYC. Anonymous, read-only, deployed on Cloudflare Workers, so there is nothing to install. |
| mta-mcp
nkasmanoff · same name as ours, no relation |
Python | Next-train arrivals by station and direction. Small and readable, which makes it a good first thing to look at if you are learning how these fit together. |
What this server does that they do not: take a date. Every one of the above answers about now. None of them accepts a future date, and none of them separates service that got worse from service that got better at a station. That gap is the only reason this exists.
Three different questions, three different places. Sending one to the wrong place mostly wastes your time, so here is the routing.
| Your question | Where it goes |
|---|---|
| A tool returns the wrong shape, a schema is wrong, this server crashes | Our issue tracker Especially while this is alpha. Include the entity_id from
the response if it is an alert-matching question; it makes the alert findable in the raw
feed. |
| A feed field is undocumented, an alert looks wrong, MTA's API behaves oddly | MTA Developer
Google Group MTA has no dedicated developer support team but actively monitors this group. Asking there rather than in our tracker gets you a better answer and helps everyone else building against the same feeds. It is also where we would take the two open questions in "what we could not verify" above. |
| You want to build civic tech in New York with other people | BetaBuilders BetaNYC's community, below. |
In BetaNYC's own words, "a BetaBuilder is a New Yorker who sustains the city's civic infrastructure." The BetaNYC Discord is where classes, fellowships, and open data work get planned, where projects and job openings get posted, and where a tool like this one gets argued about before it is any good.
Membership is earned rather than bought, and there are several doors:
Read the full thing and pick a door →
Data from the MTA service alerts feed, free to use under MTA's terms. Station names from MTA's published static GTFS. MTA's own implementation notes live at nymta/gtfs-documentation, which is sparse but is the only first-party source for how these feeds actually behave.
This is built and maintained by BetaNYC, New York's civic technology and open-data community. We work to improve lives in New York through civic design, technology, data, and public-interest technology.
| Where to look | What is there |
|---|---|
| About BetaNYC | Who we are, the team, and how the organization is structured. |
| Our work | Programs, research, and the open-data work this tool exists to support. |
| Events calendar | What is coming up. Attending a class is also one of the doors into BetaBuilders. |
| NYC School of Data | Our annual open-data conference, free and open to the public. |
| CityCamp NYC | The unconference where New Yorkers and city government work on civic problems together. Getting people there is the reason this server was built. |
| github.com/BetaNYC | Everything else we publish, including seven MCP servers for NYC civic data that are on npm. |
These tools are free and open source. If you want to help keep the work going, donating is the most direct way.
Link note. Every outbound link on this page was HTTP-checked on
2026-09-21. The mta.info and claude.ai links return 403 to a command-line
request because of bot protection, not because they are dead; both were confirmed in a real
browser. MTA redirects www.mta.info to mta.info, so the bare form is
used here.
AI disclosure. This server was largely written with Claude, and this page with it too. Every response shape shown here was observed in a real call rather than invented, which is the repository's own standing rule and the reason the badges exist.