Skip to main content
Glama
Shadhai

IndianRailwaysMCP

by Shadhai


📑 Inhaltsverzeichnis


Related MCP server: railway-reservation-system-mcp

🎯 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 (python:3.11-slim)

Prozessverwaltung

systemd (Linux-Server-Bereitstellungen)


🚀 Schnellstart

Voraussetzungen

Tool

Version

Hinweise

Python

3.10+

Prüfen mit python --version

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_mcp

Schritt 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 tenacity

Schritt 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

search_stations

Bahnhofscode(s) nach Name finden, mit Fuzzy-/Groß-/Kleinschreibungs-unabhängiger Übereinstimmung

❌

search_trains

Zugnummer(n) nach Name finden, mit Fuzzy-/Groß-/Kleinschreibungs-unabhängiger Übereinstimmung

❌

get_trains_between

Alle Züge auflisten, die zwei Bahnhöfe verbinden

❌

Fahrplan- & Status-Tools

Tool

Beschreibung

Auth

get_train_schedule

Komplette Route: jeder Bahnhof, Ankunfts-/Abfahrtszeit, Entfernung

❌

get_live_status

Echtzeit-Standort, Verspätungsminuten, letzter Bahnhof

❌

get_station_live

Bevorstehende Abfahrten an einem bestimmten Bahnhof

❌

Buchungs- & Tarif-Tools

Tool

Beschreibung

Auth

check_pnr

PNR-Status, Passagierliste, Wagen/Sitzplatz, Bestätigungsstatus

❌

check_seat_availability

Sitzplatzstatus nach Klasse (AVAILABLE / RAC / WL)

❌

get_fare

Tarifaufschlüsselung nach Klasse

❌

Bahnsteig-Tools

Tool

Beschreibung

Auth

get_coach_position

Wagenanordnung an einem bestimmten Bahnsteig

❌

get_platform_locator

Finden, an welchem Bahnsteig ein Zug ankommt

❌

📖 Siehe docs/API_REFERENCE.md im Repository für vollständige Parameterschemata.


🌐 Datenquellen

ERail.in (Primär)

Endpunkt

Methode

Format

Cache-TTL

/js5/IRStations.js

GET

JS/JSON-Array

24 Stunden

/js5/IRTrains.js

GET

JS/JSON-Array

24 Stunden

/train-enquiry/{train}

GET

HTML-Tabelle

1 Stunde

/train-running-status/{train}

GET

HTML

2 Minuten

/pnr-status/{pnr}?format=json

GET

JSON

30 Sekunden

/train-seats/{train}

POST

HTML-Tabelle

2 Minuten

/train-fare/{train}

POST

HTML-Tabelle

1 Stunde

/trains-between-stations/{from}/{to}

POST

HTML-Tabelle

1 Stunde

/station-live/{station}

GET

HTML-Tabelle

2 Minuten

IndianRailways.info (Sekundär)

Endpunkt

Methode

Format

Cache-TTL

/coach_position/

POST

HTML-Tabelle

1 Stunde

/platform_locator/

POST

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.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.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.target
sudo 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 -v

Abdeckungsübersicht

Modul

Tests

Abdeckung

client.py

40+

~95%

parsers.py

25+

~95%

utils.py

10+

~90%

models.py

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

Module not found

PYTHONPATH nicht gesetzt

export PYTHONPATH="/path/to/Railway_mcp/src:$PYTHONPATH" oder pip install -e .

Permission denied bei Server-Skript

Fehlendes Ausführungsbit

chmod +x src/indian_railways_mcp/server.py

Server beendet sich still

Docker fehlt -i-Flag

Immer mit docker run -i indian-railways-mcp ausführen (stdio benötigt interaktiven Modus)

Abhängigkeiten fehlen

Frischer Klon, keine Installation

pip install -r requirements.txt

Invalid Train-Fehler

Falsche oder fehlerhafte Zugnummer

Überprüfen Sie, ob es eine 5-stellige Nummer über search_trains ist

No Data Found

Zug fährt an diesem Tag nicht

Überprüfen Sie die Betriebstage des Zuges

Station Not Found

Ungültiger Bahnhofscode

Führen Sie zuerst search_stations aus, um den Code aufzulösen

Connection Timeout

Netzwerkproblem des Upstreams

Automatisch behandelt — 3x Wiederholung mit exponentiellem Backoff

Parse Error

Upstream-Seite hat ihre HTML-Struktur geändert

Erfordert ein manuelles Parser-Update in parsers.py

Rate Limited

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 main

Bitte 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

Star History Chart


🤖 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-Tools

  • AGENTS.md — Anweisungen für Codierungsagenten, die in diesem Repository arbeiten


Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables real-time Indian Railways information retrieval, including live train running status, station schedules, and upcoming arrivals/departures.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables checking railway seat availability, berth types, and pricing for Indian trains through natural language queries.
    -
  • A
    license
    A
    quality
    C
    maintenance
    MCP server for Indian Railways data, enabling AI agents to search trains, get schedules, live status, PNR info, and more without an API key.
    11
    10 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables querying official Indian Railways data for train schedules, live running status, coach positions, trains between stations, station boards, seat availability, and PNR status.
    8 npm
    MIT