Skip to main content
Glama
Shadhai

IndianRailwaysMCP

by Shadhai


📑 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 (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


-
license - not tested
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

View all MCP Connectors

Latest Blog Posts

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