Mcp Server Public Transport — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Server Public Transport (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
An MCP Server providing real-time public transport data across Europe.
<a href="https://glama.ai/mcp/servers/@mirodn/mcp-server-public-transport"> <img width="380" height="200" src="https://glama.ai/mcp/servers/@mirodn/mcp-server-public-transport/badge" /> </a>
mcp-server-public-transport is a Model Context Protocol (MCP)-compatible local server that provides access to public transport data across Europe. Currently, it integrates APIs from UK, Switzerland, Norway, Belgium, Berlin/Brandenburg and Portugal (Lisbon + Porto), allowing you to retrieve train connections, live departures, and bus locations.
| Country | API Base URL | Status |
|---|---|---|
| United Kingdom | https://transportapi.com | ✅ |
| Switzerland | https://transport.opendata.ch | ✅ |
| Belgium | https://api.irail.be | ✅ |
| Norway | https://api.entur.io | ✅ |
| Berlin/Brandenburg | https://v6.vbb.transport.rest | ✅ |
| Portugal (Lisbon + Porto) | https://api.transitous.org | ✅ |
| Feature | API Path | Status |
|---|---|---|
| United Kingdom | ||
| Live Departures | /uk/train/station_timetables/{station_code}.json | ✅ |
| Switzerland | ||
| Search Connections | /connections | ✅ |
| Station Lookup | /locations | ✅ |
| Departure Board | /stationboard | ✅ |
| Nearby Stations | /locations?x={lon}&y={lat} | ✅ |
| Belgium | ||
| Live Departures | /departures | ✅ |
| Station Lookup | /stations | ✅ |
| Nearby Stations | /stations/nearby | ✅ |
| Norway | ||
| Place Search | /geocoder/v1/autocomplete | ✅ |
| Live Departures | GraphQL: stopPlace(id) { estimatedCalls(...) } | ✅ |
| Trip Planning | GraphQL: trip(from, to, dateTime, numTripPatterns, ...) | ✅ |
| Nearest Stops | GraphQL: nearest(latitude, longitude, maximumDistance, ...) | ✅ |
| Berlin/Brandenburg | ||
| Location Search | /locations | ✅ |
| Live Departures | /stops/:id/departures | ✅ |
| Live Arrivals | /stops/:id/arrivals | ✅ |
| Journey Planning | /journeys | ✅ |
| Nearby Stations | /locations/nearby | ✅ |
| Portugal (Lisbon + Porto) | ||
| Station Lookup | /geocode | ✅ |
| Search Connections | /plan | ✅ |
| Departure Board | /stoptimes | ✅ |
| Nearby Stations | /reverse-geocode | ✅ |
Portugal coverage is scoped to the Lisbon and Porto metro areas (Metro Lisboa, Carris, Carris Metropolitana, CP suburban; Metro do Porto, STCP) via Transitous, a free MOTIS instance over ingested GTFS feeds. No API key required.
#### Attribution (Transitous)
Lisbon/Porto data is served by Transitous, a volunteer-run, best-effort service (limited hosting, no availability or accuracy guarantees). Keep the Transitous attribution visible when showing this data to users; underlying feeds, including OpenStreetMap, are listed at transitous.org/sources.
Follow the Transitous usage policy: modest request volume, an identifying User-Agent, non-commercial / open-source use only.
Departure/arrival boards and connection searches return a compact format that is the same for every country, instead of the raw upstream payload (typically 80–95% smaller):
{
"station": {"id": "8503000", "name": "Zürich HB"},
"departures": [
{"line": "S 14", "category": "S", "destination": "Hinwil",
"planned": "2026-10-05T10:12:00+02:00", "expected": "2026-10-05T10:36:00+02:00",
"delay_min": 24, "platform": "33", "operator": "SBB"}
]
}expected is only set when real-time data exists.legs (with walk: true for footpaths); departure, arrival andduration_min of a journey are scheduled values, real-time data is on the legs.
remarks. Empty fields are omitted.raw: true to get the unmodified upstream response.Station searches, nearby lookups, be_get_vehicle and uk_live_departures still return the upstream payload.
A public instance is available via Streamable HTTP:
https://mcp-public-transport-412652413053.europe-west1.run.app/mcpclaude mcp add --transport http public-transport https://mcp-public-transport-412652413053.europe-west1.run.app/mcpThe hosted instance does not include UK tools. For UK data, run the server locally with your own keys (see below).
Set the following environment variables:
UK_TRANSPORT_APP_ID=your_uk_app_id
UK_TRANSPORT_API_KEY=your_uk_api_keyThe quickest way is to run the published package with uvx (no clone needed). Add to your claude_desktop_config.json:
{
"mcpServers": {
"mcp-server-public-transport": {
"command": "uvx",
"args": ["mcp-server-public-transport"],
"env": {
"UK_TRANSPORT_APP_ID": "your-uk-app-id",
"UK_TRANSPORT_API_KEY": "your-uk-api-key"
}
}
}
}To run from a local clone instead:
{
"mcpServers": {
"mcp-server-public-transport": {
"command": "uv",
"args": [
"--directory",
"/ABSOLUTE/PATH/TO/mcp-server-public-transport",
"run",
"server.py"
],
"env": {
"UK_TRANSPORT_APP_ID": "your-uk-app-id",
"UK_TRANSPORT_API_KEY": "your-uk-api-key"
}
}
}
}
Replace /ABSOLUTE/PATH/TO/PARENT/FOLDER/mcp-server-public-transport with the actual path where you've cloned the repository.
Note: You may need to put the full path to the uv executable in the command field. You can get this by running which uv on MacOS/Linux or where uv on Windows.
git clone https://github.com/mirodn/mcp-server-public-transport.git
cd mcp-server-public-transport uv sync cp env.example .env uv run server.pyThe project uses pytest for testing with the following commands available:
# Run all tests
make test# Run linting
make lint
# Run code formatting
make formatThe project includes a GitHub Actions workflow (.github/workflows/test.yml) that automatically:
main branchThe CI pipeline ensures code quality and compatibility across supported Python versions before any changes are merged.
The hosted instance runs on Cloud Run with stateless Streamable HTTP (MCP_STATELESS=true), scale-to-zero and a single max instance. A monthly budget triggers deploy/budget-guard, which makes the service private once the budget is used up.
The hosted instance has no UK credentials, so UK tools are not available there. To use them, get your own key at transportapi.com and run the server locally (see Setup).
deploy/gcp-setup.sh.github/workflows/deploy-cloudrun.ymlruns on release tags or manually. It only swaps the image, so limits and public access stay as configured.
Contributions are welcome! Please feel free to submit a Pull Request.
The package is deployed automatically to PyPI when project.version is updated in pyproject.toml. Follow semver for versioning.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.