ttc-mcp
This server provides access to Toronto Transit Commission (TTC) data via the Model Context Protocol. Capabilities include:
Fare information: Retrieve current fares for different rider categories (adult, senior, youth, child) and payment types (PRESTO, cash, day pass, monthly), plus the 2‑hour transfer rule. Supports filtering by category and/or type.
Static schedules: Look up subway, streetcar, and bus routes, stops, and timetables.
Real‑time data: Get live vehicle positions and real‑time arrival predictions for buses and streetcars (subway real‑time is not published).
Service alerts: Read disruptions across all TTC modes.
Trip planning: Plan multi‑modal trips with transfers (in active development).
Deployment: Self‑hostable via Docker or Vercel, using stdio or Streamable HTTP transports.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ttc-mcp Show me the next streetcar arrivals at Queen and Spadina."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ttc-mcp
A Model Context Protocol server for the Toronto Transit Commission (TTC). Exposes subway, streetcar, and bus schedules, live vehicle positions, real-time arrivals, and service alerts to LLM clients — plus multi-modal trip planning with transfers.
Built entirely on TTC's official open feeds — no API key required:
Static GTFS (routes, stops, schedules) from open.toronto.ca
GTFS-Realtime (vehicle positions, trip updates, service alerts) from
bustime.ttc.ca
TypeScript · stdio + Streamable HTTP transports · self-hostable via Docker or Vercel.
Sibling project to go-planning-mcp (GO Transit / Metrolinx).
Status: in active development. Tracked via a wayfinder map under
.wayfinder/— most of the static-schedule surface (stops, routes, schedules) is implemented; real-time tools andplan_tripare landing incrementally. See the repo's open issues for exact status.
Scope notes
Real-time coverage (live positions & arrivals) is bus + streetcar only — TTC does not publish subway real-time. Subway is served from the static schedule plus service alerts.
Fares are a flat PRESTO fare with a 2-hour transfer window (no machine-readable fare data in the feed).
Related MCP server: openbusdata
Self-hosting
Quick start (Docker)
docker run -p 3000:3000 ghcr.io/emilsoleymani/ttc-mcp:latestOr with the provided docker-compose.yml:
docker compose up -dThe image bakes a local libSQL file from TTC's live GTFS feed at build time, so it's self-contained — no external database needed. Once running, connect an MCP client to http://localhost:3000/mcp (Streamable HTTP), or curl http://localhost:3000/health for a liveness check.
Configuration
Var | Purpose | Default |
| Schedule DB connection: a |
|
| Turso auth token (only needed when | — |
| Overridable GTFS-Realtime base URL |
|
| Coalescing cache window for decoded RT feeds |
|
| Set |
|
| HTTP transport port |
|
Updating
The Docker image is self-contained, so picking up newer TTC schedule data means pulling a freshly-built image (the upstream GTFS Refresh workflow rebuilds and republishes on a weekly cadence, or trigger your own rebuild):
docker compose pull && docker compose up -dIf you instead point LIBSQL_URL at a shared Turso database, data freshness follows that database directly — no image update needed.
Building from source
git clone https://github.com/EmilSoleymani/ttc-mcp.git
cd ttc-mcp
npm ci
npm run ingest # downloads the live TTC feed, builds ./data/ttc.db
npm run build
npm run start:http # or: npm run start:stdioLicense
MIT © 2026 Emil Soleymani
Available Tools
1 toolget_fareGet TTC faresA
The current TTC fare table (adult/senior/youth/child by payment type) plus the 2-hour transfer rule. Fares are a flat, hand-maintained table — TTC publishes no machine-readable fare data. Optionally filter by category and/or fare_type.
Inputs: category, fare_type. Returns: fares, notes, transfer, source_url
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 1 tool
With only one tool, there is no risk of ambiguity or confusion.
The single tool follows a clear verb_noun pattern, consistent with common conventions.
A single tool for a transit server like TTC is extremely limited; typical servers would include many more tools for routes, schedules, stops, etc.
Only fare information is provided; there are obvious gaps for routes, schedules, real-time updates, and other transit data.
Maintenance
Related MCP Connectors
MBTA MCP — Boston real-time transit via the MBTA v3 API (api-v3.mbta.com)
Transitland MCP — global GTFS aggregator
Swiss Transport MCP — wraps Transport Open Data API (free, no auth)
SEPTA MCP — Philadelphia SEPTA real-time transit (www3.septa.org/api, keyless)
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that provides cached access to Munich Public Transport (MVG) disruption data.Creative Commons Zero v1.0 Universal
- AlicenseCqualityCmaintenanceMCP server for the UK Bus Open Data Service, enabling timetable queries, stop search, route discovery, journey planning, and real-time bus tracking.1622 PyPIMIT
- FlicenseNot gradedqualityDmaintenanceMCP server exposing live MBTA V3 transit data, with tools for routes, stops, arrivals, alerts, and vehicle positions.-
- AlicenseAqualityDmaintenanceAn MCP server exposing Greater Helsinki public transport data from Digitransit, enabling LLM hosts to answer live transit queries, plan journeys, and fetch stop departures via natural language.315 npmMIT