Skip to main content
Glama
mahi-v-v

indian-rail-mcp

by mahi-v-v

#indian-rail-mcp

Daten der Indian Railways aus offiziellen Quellen, als typisierte TypeScript-Bibliothek und MCP-Server.

Kein API-Schlüssel. Kein Drittanbieter für Daten. Kein npm-Mittelsmann, der verschwinden kann.

NTESenquiry.indianrail.gov.in

Zugfahrpläne, Live-Betriebsstatus, Wagenposition, Züge zwischen Bahnhöfen, Live-Bahnhofstafeln

IRCTCwww.irctc.co.in

PNR-Status, Sitzplatzverfügbarkeit nach Wagen und Bett


Warum es das gibt

Das beliebte Paket irctc-connect ist veraltet. Sein Autor hat es in railkit umbenannt und hinter eine Registrierung und einen API-Schlüssel gestellt, und die freien Backends, auf die es angewiesen war (bookmytrain.vercel.app, easy-rail.onrender.com) liefern jetzt 404 und 500. Was in diesem Ökosystem noch funktioniert, stützt sich auf ein Scraping einer Drittanbieter-Website mit einem Zugangsdaten, das aus dem Markup dieser Website selbst stammt.

Diese Bibliothek geht direkt an die Quellen, die Indian Railways tatsächlich betreibt.


Related MCP server: Indian Railway MCP

Installation

npm install indian-rail-mcp

Erfordert Node 20+. Die einzige Laufzeitabhängigkeit ist cheerio.

Bibliothek

import {
  getTrainInfo,
  trackTrain,
  searchTrainsBetweenStations,
  getLiveStation,
  getSeatAvailability,
  checkPnrStatus
} from "indian-rail-mcp";

// Full schedule and route
const info = await getTrainInfo("12951");
// -> { trainName: "NDLS TEJAS RAJ", type: "RAJDHANI", runsOn: "Daily",
//      classes: ["1A","2A","3A"], route: [ { stationCode: "MMCT", departure: "17:00", ... }, ... ] }

// Where is it right now (defaults to the journey in progress)
const live = await trackTrain("12626");
// -> { journeyDate, summary: "Arrived at BUTI BORI(BTBR) at 13:27 26-Aug",
//      stops: [...], coachPosition: [ { position: 0, coach: "ENG", classCode: "ENG" }, ... ] }

// Direct trains between two stations — code or full name
await searchTrainsBetweenStations("CAN", "PAY");
await searchTrainsBetweenStations("NEW DELHI", "MMCT");

// Next couple of hours at a station, with delay and platform
await getLiveStation("NDLS");

// Reservation chart: per-coach vacancy, plus berth detail when a class is given
await getSeatAvailability({ trainNumber: "12951", boardingStation: "MMCT", travelClass: "3A" });

Bahnhöfe akzeptieren entweder einen Code oder einen vollständigen NamenNDLS und NEW DELHI funktionieren beide, aufgelöst über den eigenen 8.700-Bahnhöfe-Katalog von NTES. Daten akzeptieren DD-MM-YYYY, DD-MMM-YYYY oder YYYY-MM-DD.

Fehler

Jeder Fehler ist ein typisierter RailError:

Klasse

code

Bedeutung

InvalidInputError

INVALID_INPUT

Ungültiger Bahnhof, Zugnummer oder Datum — lokal erkannt, vor jedem Netzwerkaufruf

NtesError

NTES_ERROR

NTES hat eine ERR<nnn>-Seite zurückgegeben

IrctcError

IRCTC_ERROR

IRCTC hat eine errorMessage zurückgegeben

UpstreamError

UPSTREAM_ERROR

Netzwerkfehler oder nicht analysierbare Antwort

Zu ERR000: NTES gibt für fehlerhafte Eingaben die gleiche generische ERR000-Seite zurück wie für eine echte Störung. Diese Bibliothek validiert daher Bahnhofscodes vor dem Aufruf von NTES gegen den Katalog, sodass ein eigener Tippfehler nie als „der Bahndienst ist ausgefallen“ gemeldet wird. NtesError nennt bewusst beide Möglichkeiten, anstatt eine Störung zu behaupten.

MCP-Server

Sechs Tools: getTrainInfo, trackTrain, searchTrainBetweenStations, getLiveStation, getSeatAvailability, checkPnrStatus.

import { createRailMcpServer } from "indian-rail-mcp/mcp";

const server = createRailMcpServer({ allowPnr: true });
await server.connect(yourTransport);

Bereitstellung auf Vercel

vercel deploy

vercel.json bindet die Funktion an bom1 (Mumbai) — beide Upstreams befinden sich in Indien, und das ist weit mehr wert, als es aussieht: Warme Anfragen laufen in ~124 ms gegenüber ~885 ms kalt, und indischer Datenverkehr von indischen Egress-IPs ist viel weniger wahrscheinlich, die F5-WAF vor NTES auszulösen.

Umgebung:

Variable

Zweck

RAIL_API_KEY

Erforderlich, um checkPnrStatus zu aktivieren. Aufrufer senden es als x-api-key.

RATE_LIMIT_PER_MINUTE

Pro-IP-Anfragelimit. Standard 30.

Richten Sie einen beliebigen MCP-Client auf https://<your-deployment>/api/mcp mit Streamable HTTP-Transport aus.


PNR und personenbezogene Daten

checkPnrStatus gibt personenbezogene Daten der Fahrgäste zurück — Namen, Alter, Geschlecht, Wagen und Bett.

  • Es ist deaktiviert, sofern RAIL_API_KEY nicht gesetzt und übereinstimmend ist. Es schlägt geschlossen fehl.

  • Die Bibliothek protokolliert, speichert oder persistiert PNR-Antworten nie.

  • Es gibt bewusst keine Stapel- oder Aufzählungshilfen. Ein PNR pro Aufruf, by design.

Wenn Sie dies öffentlich bereitstellen, behalten Sie es so bei. Bitte bauen Sie keinen PNR-Scraper.


Datenquelle und Bedingungen

Alle Daten sind Eigentum der Indian Railways, bereitgestellt vom Centre for Railway Information Systems (CRIS). Dieses Projekt ist nicht mit Indian Railways, CRIS oder IRCTC verbunden, von ihnen unterstützt oder befürwortet.

Lesen Sie dies, bevor Sie bereitstellen:

  • Die NTES-Bedingungen erlauben das Herunterladen von Auszügen für den persönlichen Gebrauch und besagen, dass Sie kein „Softwareprogramm“ verwenden dürfen, um systematisch eine Datenbank von der Website aufzubauen, noch deren Seiten in „ein öffentliches oder privates elektronisches Abrufsystem oder einen Dienst“ aufnehmen dürfen, ohne vorherige schriftliche Genehmigung. Sie besagen auch, dass Bahndaten „nicht für kommerzielle Zwecke verwendet werden sollten“.

  • CRIS erteilt diese Genehmigung auf Anfrage: „Material, das auf dieser Website erscheint, darf nach Einholung der entsprechenden Genehmigung durch eine E-Mail an uns kostenlos reproduziert werden.“ Eine versandfertige Anfrage finden Sie in PERMISSION-REQUEST.md.

  • Genehmigungsstatus für dieses Projekt: beantragt, ausstehend.

  • Die Bedingungen von IRCTC sind strenger, und PNR-Daten sind personenbezogene Daten.

Die Datengenauigkeit ist nach bestem Bemühen und nicht garantiert — NTES' eigener Haftungsausschluss sagt dasselbe. Verlassen Sie sich nicht darauf für etwas Sicherheitskritisches; überprüfen Sie direkt bei den Bahnen.

Seien Sie ein guter Bürger: Die Standardeinstellungen cachen, was stabil ist, begrenzen die Rate pro IP und verwenden eine einzige Upstream-Sitzung. Bitte entfernen Sie diese nicht.


Entwicklung

npm install
npm test          # parser regression tests against recorded fixtures — no network
npm run smoke     # live end-to-end check against NTES and IRCTC
npm run test:mcp  # drives the MCP handler locally: handshake, tools, auth, rate limit
npm run fixtures  # re-record fixtures when upstream markup changes
npm run build

Fixtures in test/fixtures/ sind aufgezeichnetes HTML/JSON. Wenn CRIS ihr Markup ändert, schlägt npm test mit einer spezifischen Assertion fehl, anstatt dass die Tools stillschweigend leere Ergebnisse liefern.

Lizenz

MIT — siehe LICENSE. Die Lizenz deckt nur diesen Quellcode ab, nicht die zugrunde liegenden Bahndaten.

A
license - permissive license
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 Servers

View all related MCP servers

Related MCP Connectors

  • iRail MCP — Belgian rail (SNCB/NMBS) real-time via the community iRail API

  • Real-time BART departures, trip planning, fares, stations, and advisories.

  • Real-time transit stops, routes, arrivals, vehicle positions, and schedules via OneBusAway APIs.

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/mahi-v-v/indian-rail-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server