IndianRailwaysMCP
📑 Inhaltsverzeichnis
🎯 Zweck & Philosophie
Die Indian Railways betreibt täglich über 13.000 Züge, aber ihre Daten liegen hinter inkonsistenten HTML-Seiten und ratenbegrenzten Endpunkten — was es für KI-Agenten mühsam macht, eine einfache Frage wie "hat mein Zug Verspätung?" zu beantworten.
Indian Railways MCP Server löst dies, indem er Fahrpläne, Live-Status, PNR, Tarife und Sitzplatzdaten in einer einzigen, strukturierten MCP-Schnittstelle normalisiert, die jeder KI-Assistent direkt aufrufen kann.
🔐 Keine Authentifizierung, keine Geheimnisse — jede Datenquelle ist öffentlich; es gibt nichts zu leaken
🧩 Mehrschichtige Architektur — Server-, Client- und Parser-Ebenen sind unabhängig testbar und austauschbar
📊 TTL-basiertes Caching — jeder Tool-Aufruf respektiert ein Datenfrische-Fenster, anstatt die Upstream-Seiten zu überlasten
⚡ Standardmäßig robust — Wiederholungsversuche mit exponentiellem Backoff absorbieren Upstream-Unzuverlässigkeit, sodass dein Agent mitten im Gespräch nicht abstürzt
🏗 Architektur
graph TD
Client["🖥️ MCP Client<br/>(Claude Desktop / Cursor / Continue.dev)"] -->|MCP Protocol · stdio| Server
subgraph Server["🚂 Indian Railways MCP Server"]
direction TB
SL["🛠️ Server Layer<br/>Tool registration (10 tools)<br/>Pydantic input validation"]
CL["🌐 Client Layer<br/>httpx session mgmt<br/>tenacity retry logic<br/>TTL response cache"]
PL["🔎 Parser Layer<br/>BeautifulSoup HTML parsing<br/>Pydantic JSON parsing<br/>Regex extraction"]
SL --> CL --> PL
end
PL -->|HTTP/HTTPS| ERail[("🗄️ ERail.in<br/>Schedules · Live status<br/>PNR · Seats · Fares")]
PL -->|HTTP/HTTPS| IRInfo[("🗄️ IndianRailways.info<br/>Coach position<br/>Platform locator")]Datenfluss: Der MCP-Client sendet einen Tool-Aufruf über stdio → Die Server-Ebene validiert die Eingabe mit Pydantic → Die Client-Ebene stellt eine HTTP-Anfrage mit Wiederholungslogik → Die Parser-Ebene extrahiert strukturierte Daten aus HTML/JSON → Die Cache-Ebene speichert das Ergebnis mit einer TTL → Die Antwort wird formatiert und an den Client zurückgegeben.
✨ Funktionen
Modul | Fähigkeit | Echtzeit | Cache-TTL |
🔍 Bahnhofs- & Zugsuche | Suche nach 8.000+ Bahnhöfen und 10.000+ Zügen nach Name oder Code | ❌ | 24 Stunden |
🚂 Zugfahrplan | Komplette Route mit allen Bahnhöfen, Zeiten und Entfernungen | ❌ | 1 Stunde |
📍 Live-Fahrstatus | Echtzeit-Standort, Verspätungen und Bahnsteiginformationen | ✅ | 2 Minuten |
🎫 PNR-Status | Passagierdetails, Wagen-/Sitzplatzvergabe, Reiseinformationen | ✅ | 30 Sekunden |
💺 Sitzplatzverfügbarkeit | Verfügbarkeit nach Klasse — AVAILABLE / RAC / WL | ✅ | 2 Minuten |
💰 Tarifauskunft | Tarifaufschlüsselung über alle Reiseklassen | ❌ | 1 Stunde |
🔀 Züge zwischen Bahnhöfen | Jeder Zug, der zwei Bahnhöfe verbindet | ❌ | 1 Stunde |
🏢 Bahnhof live | Bevorstehende Abfahrten von jedem Bahnhof | ✅ | 2 Minuten |
🚃 Wagenposition | Wagenanordnung an jedem Bahnhofsbahnsteig | ❌ | 1 Stunde |
🧰 Technologie-Stack
Ebene | Technologie |
Laufzeit | Python 3.10+ |
Protokoll | Model Context Protocol (MCP) SDK 1.0+ |
HTTP-Client | httpx |
HTML-Parsing | BeautifulSoup4 |
Validierung | Pydantic 2.0+ |
Wiederholungslogik | tenacity (exponentieller Backoff) |
Tests | pytest, pytest-cov, pytest-mock, pytest-asyncio |
Paketierung | pyproject.toml (pip-installierbar) |
Containerisierung | Docker ( |
Prozessverwaltung | systemd (Linux-Server-Bereitstellungen) |
🚀 Schnellstart
Voraussetzungen
Tool | Version | Hinweise |
Python | 3.10+ | Prüfen mit |
pip | Aktuell | Wird mit Python mitgeliefert |
Ein MCP-Client | Beliebig | Claude Desktop, Cursor oder Continue.dev |
Schritt 1 — Klonen
git clone https://github.com/Shadhai/Railway_mcp.git
cd Railway_mcpSchritt 2 — Konfigurieren
# Create and activate a virtual environment (recommended)
python -m venv .venv
source .venv/bin/activate # Linux/Mac
# .venv\Scripts\activate # Windows
# Install dependencies
pip install mcp httpx beautifulsoup4 pydantic tenacitySchritt 3 — Ausführen
# Run directly
python -m src.indian_railways_mcp.server
# Or install as a package and run the entry point
pip install -e .
indian-railways-mcp✅ Erfolg — erwarte diese Ausgabe:
✅ Available tools: 10
- search_stations: Search Indian Railways stations by name or code...
- search_trains: Search Indian Railways trains by number or name...
- get_train_schedule: Get complete train schedule with all stations...
...⚙️ Umgebungskonfiguration
Es sind keine Anmeldedaten erforderlich — jede Upstream-Quelle ist öffentlich zugänglich. Die einzige verwendete Umgebungsvariable konfiguriert den Python-Importpfad:
# ── Runtime ─────────────────────────────────────────────
PYTHONPATH=/path/to/Railway_mcp/src
# <!-- VERIFY: add PORT/NODE_ENV-style vars here only if you front this
# server with a custom HTTP/SSE transport wrapper. Stdio transport
# (the default) needs nothing beyond PYTHONPATH. -->🛠 MCP-Tool-Referenz
Dieser Server kommuniziert über das MCP-stdio-Protokoll, nicht über eine öffentliche REST-API — Tools werden von deinem KI-Client aufgerufen, nicht durch HTTP-Anfragen, die du selbst stellst. Jedes Tool ist einem oder mehreren Upstream-Datenquellen-Aufrufen zugeordnet.
Such-Tools
Tool | Beschreibung | Auth |
| Bahnhofscode(s) nach Name finden, mit Fuzzy-/Groß-/Kleinschreibungs-unabhängiger Übereinstimmung | ❌ |
| Zugnummer(n) nach Name finden, mit Fuzzy-/Groß-/Kleinschreibungs-unabhängiger Übereinstimmung | ❌ |
| Alle Züge auflisten, die zwei Bahnhöfe verbinden | ❌ |
Fahrplan- & Status-Tools
Tool | Beschreibung | Auth |
| Komplette Route: jeder Bahnhof, Ankunfts-/Abfahrtszeit, Entfernung | ❌ |
| Echtzeit-Standort, Verspätungsminuten, letzter Bahnhof | ❌ |
| Bevorstehende Abfahrten an einem bestimmten Bahnhof | ❌ |
Buchungs- & Tarif-Tools
Tool | Beschreibung | Auth |
| PNR-Status, Passagierliste, Wagen/Sitzplatz, Bestätigungsstatus | ❌ |
| Sitzplatzstatus nach Klasse (AVAILABLE / RAC / WL) | ❌ |
| Tarifaufschlüsselung nach Klasse | ❌ |
Bahnsteig-Tools
Tool | Beschreibung | Auth |
| Wagenanordnung an einem bestimmten Bahnsteig | ❌ |
| Finden, an welchem Bahnsteig ein Zug ankommt | ❌ |
📖 Siehe
docs/API_REFERENCE.mdim Repository für vollständige Parameterschemata.
🌐 Datenquellen
ERail.in (Primär)
Endpunkt | Methode | Format | Cache-TTL |
|
| JS/JSON-Array | 24 Stunden |
|
| JS/JSON-Array | 24 Stunden |
|
| HTML-Tabelle | 1 Stunde |
|
| HTML | 2 Minuten |
|
| JSON | 30 Sekunden |
|
| HTML-Tabelle | 2 Minuten |
|
| HTML-Tabelle | 1 Stunde |
|
| HTML-Tabelle | 1 Stunde |
|
| HTML-Tabelle | 2 Minuten |
IndianRailways.info (Sekundär)
Endpunkt | Methode | Format | Cache-TTL |
|
| HTML-Tabelle | 1 Stunde |
|
| HTML | 1 Stunde |
⏱ Caching-Strategie
Datentyp | TTL | Grund |
Bahnhofsliste | 24 Stunden | Ändert sich selten |
Zugliste | 24 Stunden | Ändert sich selten |
Zugfahrplan | 1 Stunde | Gelegentliche Aktualisierungen |
Live-Status | 2 Minuten | Echtzeitdaten |
PNR-Status | 30 Sekunden | Echtzeitdaten |
Sitzplatzverfügbarkeit | 2 Minuten | Häufige Aktualisierungen |
🧭 Anwendungsfälle
🗺️ KI-Reiseplanungs-Assistent
Ein auf Claude Desktop aufgebauter Chatbot nutzt diesen Server, um eine Reise von Anfang bis Ende zu planen — Züge zwischen zwei Städten suchen, Live-Sitzplatzverfügbarkeit prüfen, den Tarif abrufen und den Fahrplan bestätigen, alles aus einem einzigen Gespräch in natürlicher Sprache.
📍 Live-Zug-Tracker für Pendler
Ein pendlerorientierter IVR- oder WhatsApp-Bot fragt get_live_status alle paar Minuten ab, um Passagieren genau mitzuteilen, wie stark ihr Zug verspätet ist und welchen Bahnhof er zuletzt passiert hat.
🎫 PNR-Concierge-Bot
Ein Support-Bot, der in check_pnr integriert ist, beantwortet "ist mein Ticket bestätigt?" sofort, einschließlich Wagen, Sitzplatz und Wartelistenposition pro Passagier — ohne menschlichen Agenten.
🎓 Akademisches / Portfolio-Projekt
Ein Student, der einen MCP-basierten KI-Agenten entwickelt, nutzt dieses Repository als Referenzimplementierung einer mehrschichtigen, gecachten, wiederholungssicheren Scraping-Architektur hinter dem Model Context Protocol.
💡 Nutzungsbeispiele
Vollständige Reiseplanung
from indian_railways_mcp.client import IndianRailwaysClient
client = IndianRailwaysClient()
trains = client.get_trains_between("NDLS", "BCT")
train = trains['trains'][0]
seats = client.check_seat_availability(
train['train_number'], "NDLS", "BCT", "20-Jul-2026"
)
if any(c['status'] == 'AVAILABLE' for c in seats['classes']):
fare = client.get_fare(train['train_number'], "NDLS", "BCT")
print(f"Fare: ₹{fare['classes'][0]['total_fare']}")
schedule = client.get_train_schedule(train['train_number'])
print(f"Travel time: {schedule['travel_time']} hours")Live-Zugverfolgung
status = client.get_live_status("04815")
if status['status'] == 'RUNNING':
print(f"{status['train_name']} last seen at {status['last_station']}, "
f"delayed {status['delay_minutes']} min")PNR-Statusprüfung
pnr = client.check_pnr("4553137968")
for p in pnr['passengers']:
print(f"Passenger {p['serial']}: {p['current_status']} | "
f"Coach {p['coach']} | Berth {p['berth']} ({p['berth_type']})")📁 Projektstruktur
Railway_mcp/
├── 📄 README.md # Main documentation
├── 📄 pyproject.toml # Package configuration
├── 📄 LICENSE # MIT License
├── 📄 .gitignore # Git ignore rules
├── 📁 docs/
│ ├── API_REFERENCE.md # Complete tool/API documentation
│ ├── ARCHITECTURE.md # System architecture
│ └── EXAMPLES.md # Usage examples
├── 📁 src/
│ └── 📁 indian_railways_mcp/
│ ├── __init__.py # Package init
│ ├── server.py # MCP server (10 tools)
│ ├── client.py # HTTP client (all endpoints)
│ ├── parsers.py # HTML/JSON parsers
│ ├── models.py # Pydantic data models
│ └── utils.py # Caching + retry utilities
└── 📁 tests/
├── test_client.py # Client tests
└── test_parsers.py # Parser tests🔌 Client-Integrationen
Bearbeiten Sie Ihre Konfigurationsdatei:
Mac:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
{
"mcpServers": {
"indian-railways": {
"command": "python",
"args": ["-m", "src.indian_railways_mcp.server"],
"cwd": "/path/to/Railway_mcp",
"env": { "PYTHONPATH": "/path/to/Railway_mcp/src" }
}
}
}Starten Sie Claude Desktop neu – Sie sehen ein 🔌-Symbol mit den aufgelisteten Indian Railways-Tools.
Fügen Sie zu ~/.cursor/mcp.json hinzu:
{
"mcpServers": {
"indian-railways": {
"command": "python",
"args": ["-m", "src.indian_railways_mcp.server"],
"cwd": "/path/to/Railway_mcp"
}
}
}Fügen Sie zu ~/.continue/config.json hinzu:
{
"experimental": {
"modelContextProtocolServers": [
{
"transport": {
"type": "stdio",
"command": "python",
"args": ["-m", "src.indian_railways_mcp.server"],
"cwd": "/path/to/Railway_mcp"
}
}
]
}
}npx @modelcontextprotocol/inspector python -m src.indian_railways_mcp.server🐳 Docker-Bereitstellung
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY src/ ./src/
ENV PYTHONPATH=/app
CMD ["python", "-m", "src.indian_railways_mcp.server"]# Build
docker build -t indian-railways-mcp .
# Run (stdio requires interactive mode)
docker run -i indian-railways-mcp/etc/systemd/system/indian-railways-mcp.service:
[Unit]
Description=Indian Railways MCP Server
After=network.target
[Service]
Type=simple
User=mcp
WorkingDirectory=/opt/indian-railways-mcp
Environment=PYTHONPATH=/opt/indian-railways-mcp/src
ExecStart=/usr/bin/python3 -m src.indian_railways_mcp.server
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable indian-railways-mcp
sudo systemctl start indian-railways-mcp
sudo systemctl status indian-railways-mcp🧪 Tests
# Install test dependencies
pip install pytest pytest-cov pytest-mock pytest-asyncio
# Run all tests
pytest tests/ -v
# Run with coverage
pytest tests/ -v --cov=src/indian_railways_mcp --cov-report=html
# Run a specific file / class / test
pytest tests/test_client.py -v
pytest tests/test_client.py::TestPNRStatus -v
pytest tests/test_client.py::TestPNRStatus::test_check_pnr_success -vAbdeckungsübersicht
Modul | Tests | Abdeckung |
| 40+ | ~95% |
| 25+ | ~95% |
| 10+ | ~90% |
| 5+ | ~85% |
Gesamt | 80+ | ~92% |
📈 Leistung
Antwortzeiten (typisch)
Vorgang | Kalt (ms) | Cache (ms) |
Bahnhöfe suchen | 800 | 5 |
Züge suchen | 1000 | 5 |
Zugfahrplan | 1500 | 100 |
Live-Status | 2000 | 200 |
PNR-Status | 1200 | 50 |
Sitzplatzverfügbarkeit | 2000 | 100 |
Speicherbedarf: ~50MB Basis (Python + Abhängigkeiten) · ~65MB mit warmem Bahnhofs-/Zug-Cache · ~80MB Spitze während des HTML-Parsings.
🔒 Sicherheitshinweise
Keine Authentifizierung erforderlich — jede Datenquelle ist öffentlich
Ratenlimit-sicher — integrierter exponentieller Backoff verhindert missbräuchliche Anforderungsmuster
Validierte Eingaben — alle Tool-Argumente durchlaufen Pydantic-Modelle
Keine Persistenz — PNR- und Passagierdaten werden nie auf die Festplatte geschrieben
Nur HTTPS — jede ausgehende Anfrage ist verschlüsselt
🔧 Fehlerbehebung
Symptom | Wahrscheinliche Ursache | Lösung |
|
|
|
| Fehlendes Ausführungsbit |
|
Server beendet sich still | Docker fehlt | Immer mit |
Abhängigkeiten fehlen | Frischer Klon, keine Installation |
|
| Falsche oder fehlerhafte Zugnummer | Überprüfen Sie, ob es eine 5-stellige Nummer über |
| Zug fährt an diesem Tag nicht | Überprüfen Sie die Betriebstage des Zuges |
| Ungültiger Bahnhofscode | Führen Sie zuerst |
| Netzwerkproblem des Upstreams | Automatisch behandelt — 3x Wiederholung mit exponentiellem Backoff |
| Upstream-Seite hat ihre HTML-Struktur geändert | Erfordert ein manuelles Parser-Update in |
| Zu viele Anfragen in einem kurzen Zeitfenster | Backt automatisch zurück; vermeiden Sie enge Polling-Schleifen |
🗺 Roadmap
Kern-Toolset — Bahnhofs-/Zugsuche, Fahrplan, Live-Status
PNR-Status, Sitzplatzverfügbarkeit und Tarifabfrage-Tools
TTL-basierte Caching-Schicht mit Retry/Backoff
Docker- und systemd-Bereitstellungspfade
80+ Testsuite mit ~92% Abdeckung
🚧 Streambarer HTTP/SSE-Transport für entfernte (Nicht-Stdio-)Bereitstellungen
🚧 Mehrsprachige Bahnhofs-/Zugnamensabgleich (Hindi, regionale Schriften)
🚧 Webhook-/Push-Benachrichtigungen für Verspätungen und Gleisänderungen
🚧 Offizielle
llms.txt-basierte Tool-Erkennung für breitere Agent-Frameworks
🤝 Mitwirken
# 1. Fork the repository
# 2. Clone your fork
git clone https://github.com/YOUR_USERNAME/Railway_mcp.git
cd Railway_mcp
# 3. Create a feature branch
git checkout -b feature/your-feature-name
# 4. Make your changes and add tests
pytest tests/ -v
# 5. Commit and push
git commit -m "Add: your feature description"
git push origin feature/your-feature-name
# 6. Open a Pull Request against mainBitte halten Sie Parser-Änderungen durch Tests in tests/test_parsers.py abgedeckt — Änderungen an der HTML-Struktur des Upstreams sind die häufigste Quelle für Regressionen in diesem Projekt.
👥 Mitwirkende
⭐ Sternenverlauf
🤖 KI-bereite Dateien
Dieses Repository enthält Agenten-Erkennungs-Stubs, damit KI-Codierungsassistenten (und MCP-fähige Crawler) das Projekt verstehen können, ohne die gesamte README zu parsen:
llms.txt— maschinenlesbare Projektzusammenfassung für LLM-ToolsAGENTS.md— Anweisungen für Codierungsagenten, die in diesem Repository arbeiten
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read and update your Everway trips and itineraries from any MCP-compatible AI assistant.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
TravelMind: 8 MCP tools for travel (12306 trains, flights, hotels, geocode, planning, policy).
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Shadhai/Railway_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server