DB Timetable MCP Server
jorekai/db-timetable-mcp · 17 stars · TypeScript · MIT
MCP server Ein Model Context Protocol (MCP) Server für die Deutsche Bahn Timetable API
Install
The repo has no one-line install. Follow its README.
Files
DB Timetable MCP Server
A Model Context Protocol server for the official Deutsche Bahn Timetables API. It converts the compact DB XML into semantic JSON and merges the planned schedule with live changes into one station board.
What it guarantees
- Correct platforms and times.
effectiveholds the value to display.plannedandchangedexplain the deviation. - Output built for models. Tools return
structuredContent, descriptive JSON schemas, and a data model available as an MCP resource. - MCP conformance. Official TypeScript SDK, stdio for local clients, stateless Streamable HTTP for remote operation.
- Safe defaults. No logs on
stdout, loopback binding unless you change it, host allowlist, timeouts, non-root container, reproducible lockfile. - Verifiable behaviour. Unit, contract, and transport tests, coverage thresholds, CI, dependency and secret checks.
Quick start
Requirements: Node.js 22 or 24 LTS, and a subscribed Timetables product in the DB API Marketplace.
git clone https://github.com/jorekai/db-timetable-mcp.git cd db-timetable-mcp npm ci cp .env.example .env
Fill in .env:
DB_TIMETABLE_CLIENT_ID=deine-client-id DB_TIMETABLE_CLIENT_SECRET=dein-api-key
Then build and start:
npm run build npm start
In stdio mode the process waits for an MCP client. Status messages go to stderr only. stdout stays reserved for JSON-RPC.
Claude Desktop
Run npm ci && npm run build first, then point the configuration at an absolute path in claude_desktop_config.json.
macOS/Linux:
{
"mcpServers": {
"db-timetable": {
"command": "node",
"args": ["/absolute/path/db-timetable-mcp/dist/index.js"]
}
}
}
Windows:
{
"mcpServers": {
"db-timetable": {
"command": "node",
"args": ["C:\\absolute\\path\\db-timetable-mcp\\dist\\index.js"]
}
}
}
The .env file is looked up in the current working directory and next to the project directory, which covers the case where Claude Desktop starts the compiled server from somewhere else. You can also set the two credentials in the env object of the MCP entry instead.
After a configuration change, quit Claude Desktop completely and start it again. More in Troubleshooting.
Tools
| Tool | Purpose |
|---|---|
getStationBoard |
Recommended. Joins the planned schedule and the full change set into a live station board |
getPlannedTimetable |
Static planned timetable for an EVA number, date, and hour |
getCurrentTimetable |
The complete change set (fchg), named this way for compatibility |
getRecentChanges |
Changes from the last two minutes (rchg) for incremental updates |
findStations |
Station search by name, EVA number, or DS100 code |
Every tool takes an optional includeRawXml: true. The full reference with examples is in docs/api.md.
Data model
An arrival or departure event, abbreviated:
{
"planned": { "time": { "local": "2026-07-17T10:20" }, "platform": "8" },
"changed": { "time": { "local": "2026-07-17T10:27" }, "platform": "10" },
"effective": { "time": { "local": "2026-07-17T10:27" }, "platform": "10" },
"delayMinutes": 7,
"platformChanged": true,
"isCancelled": false
}
Use effective for anything a traveller sees. The model can retrieve the same explanation through the db-timetable://docs/data-model resource. Details in docs/data-model.md.
Streamable HTTP and Docker
Start it locally:
MCP_TRANSPORT=http npm start
- MCP endpoint:
http://127.0.0.1:3000/mcp - Health check:
http://127.0.0.1:3000/health
With Docker Compose:
docker compose up --build -d docker compose ps curl http://127.0.0.1:3000/health
Compose binds the port to loopback on purpose, runs as an unprivileged user, and uses a read-only filesystem. A public endpoint additionally needs TLS and authentication behind a reverse proxy. ALLOWED_HOSTS must list every allowed hostname.
Configuration
| Variable | Default | Description |
|---|---|---|
DB_TIMETABLE_CLIENT_ID |
– | DB client ID, required for API calls |
DB_TIMETABLE_CLIENT_SECRET |
– | DB API key, required for API calls |
DB_TIMETABLE_BASE_URL |
official v1 URL | Alternative base URL, mainly for tests |
DB_TIMETABLE_TIMEOUT_MS |
15000 |
Request timeout between 1000 and 120000 ms |
MCP_TRANSPORT |
stdio |
stdio or http |
HOST |
127.0.0.1 |
HTTP bind address |
PORT |
3000 |
HTTP port |
MCP_ENDPOINT |
/mcp |
Streamable HTTP path |
ALLOWED_HOSTS |
– | Comma-separated host allowlist, required with 0.0.0.0/:: |
DOTENV_CONFIG_PATH |
– | Explicit absolute path to an env file |
LOG_LEVEL |
info |
debug, info, warn, or error |
The old values TRANSPORT_TYPE=sse|httpStream and SSE_ENDPOINT still map to Streamable HTTP, so migration does not break an existing client.
Development
npm run dev # stdio with watch mode npm run dev:http # Streamable HTTP with watch mode npm run check # lint, types, tests, and build npm run test:coverage
Further reading:
The documents under docs/ are currently written in German.
Troubleshooting
Expected "," or "]" after array element in Claude Desktop
Update to version 2 and rebuild. Earlier versions wrote log lines to the stdio protocol channel. Version 2 uses stderr for that.
DB-API-Zugangsdaten fehlen even though .env exists (the message reads "DB API credentials are missing")
The file must sit in the repository root next to package.json. If it lives somewhere else, set DOTENV_CONFIG_PATH to an absolute path. Do not wrap the values in quotes or leave trailing spaces around them.
401/403 from the DB API
Check that the client ID and the API key belong together, and that the application has subscribed to the Timetables product.
Wrong platform
Use getStationBoard and read effective.platform. planned.platform is the scheduled platform by definition, and changed.platform is present only when DB has reported a change.
Data source and license
The timetable data comes from Deutsche Bahn and is served through the Timetables API 1.0.274. According to the DB API Marketplace the data is under CC BY 4.0, so attribution to Deutsche Bahn is required when you use it. The Marketplace currently states a limit of 60 calls per minute.
The MCP server itself is under the MIT license.
Facts
- Kind
- MCP server
- Group
- Uncategorized
- Stars
- 17
- License
- MIT
- Language
- TypeScript
- Last push
- 2026-10-06
- Forks
- 7
- Topics
- claude, deutsche-bahn, llm, mcp, mcp-server, model-context-protocol, public-transport, railway, timetable, typescript
- 1REAio.github.morluto/reaReverse engineer anything from your terminal or agent with one CLI and MCP server.125.3k
- 2com.browser-use/browser-usecom.browser-use/browser-useControl a real Chrome browser to complete any task: fill forms, extract data, book flights.117.7k
- 3World Monitorapp.worldmonitor/mcpLive markets, conflicts, country risk, chokepoints, energy, and China decision signals. 93 tools.88.3k
- 4Scrapling MCP Serverd4vinci/scrapling🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scraplingdev86.9k
- 5Everythingmodelcontextprotocol/serversThis MCP server attempts to exercise all the features of the MCP protocol. It is not intended to be a useful server, but rather a test server for builders of MCP clients. It implements prompts, tools, resources, sampling, and more to showcase MCP capabilities.85.8k
- 6Fetchmodelcontextprotocol/serversA Model Context Protocol server that provides web content fetching capabilities. This server enables LLMs to retrieve and process content from web pages, converting HTML to markdown for easier consumption.85.8k