Skip to main content
Glama
indian-rail-mcp

indian-rail-mcp

by mahi-v-v

indian-rail-mcp

Datos de Indian Railways de fuentes oficiales, como una biblioteca TypeScript tipada y un servidor MCP.

Sin clave API. Sin proveedor de datos de terceros. Sin intermediario npm que pueda desaparecer.

NTES — enquiry.indianrail.gov.in

horarios de trenes, estado de marcha en vivo, posición de vagones, trenes entre estaciones, paneles de estación en vivo

IRCTC — www.irctc.co.in

estado de PNR, disponibilidad de asientos por vagón y por litera


Por qué existe esto

El popular paquete irctc-connect está obsoleto. Su autor lo renombró a railkit y lo puso detrás de un registro y una clave API, y los backends gratuitos de los que dependía (bookmytrain.vercel.app, easy-rail.onrender.com) ahora devuelven 404 y 500. Cualquier cosa que siga funcionando en ese ecosistema se apoya en un raspado de un sitio de terceros usando una credencial extraída del propio marcado de ese sitio.

Esta biblioteca va directamente a las fuentes que Indian Railways realmente opera.


Related MCP server: Indian Railway MCP

Instalación

npm install indian-rail-mcp

Requiere Node 20+. La única dependencia en tiempo de ejecución es cheerio.

Biblioteca

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" });

Las estaciones aceptan un código o un nombre completo — tanto NDLS como NEW DELHI funcionan, resueltos contra el catálogo propio de NTES de 8.700 estaciones. Las fechas aceptan DD-MM-YYYY, DD-MMM-YYYY o YYYY-MM-DD.

Errores

Cada fallo es un RailError tipado:

Clase

code

Significado

InvalidInputError

INVALID_INPUT

Estación, número de tren o fecha incorrectos — detectado localmente, antes de cualquier llamada de red

NtesError

NTES_ERROR

NTES devolvió una página ERR<nnn>

IrctcError

IRCTC_ERROR

IRCTC devolvió un errorMessage

UpstreamError

UPSTREAM_ERROR

Fallo de red o respuesta no analizable

Sobre ERR000: NTES devuelve la misma página genérica ERR000 tanto para entrada malformada como para una interrupción real. Por lo tanto, esta biblioteca valida los códigos de estación contra el catálogo antes de llamar a NTES, de modo que tu propio error tipográfico nunca se te informe como "el servicio ferroviario está caído". NtesError nombra deliberadamente ambas posibilidades en lugar de afirmar una interrupción.

Servidor MCP

Seis herramientas: getTrainInfo, trackTrain, searchTrainBetweenStations, getLiveStation, getSeatAvailability, checkPnrStatus.

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

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

Desplegar en Vercel

vercel deploy

vercel.json fija la función a bom1 (Mumbai) — ambos upstreams están en India, y eso vale mucho más de lo que parece: las solicitudes en caliente tardan ~124 ms frente a ~885 ms en frío, y el tráfico indio desde IPs de salida indias tiene muchas menos probabilidades de activar el WAF F5 que está delante de NTES.

Entorno:

Variable

Propósito

RAIL_API_KEY

Requerida para habilitar checkPnrStatus. Los llamadores la envían como x-api-key.

RATE_LIMIT_PER_MINUTE

Límite de solicitudes por IP. Por defecto 30.

Apunta cualquier cliente MCP a https://<tu-despliegue>/api/mcp usando transporte Streamable HTTP.


PNR y datos personales

checkPnrStatus devuelve datos personales de los pasajeros — nombres, edades, género, vagón y litera.

  • Está deshabilitado a menos que RAIL_API_KEY esté configurada y coincida. Falla de forma segura.

  • La biblioteca nunca registra, almacena en caché ni persiste respuestas de PNR.

  • Deliberadamente no hay helpers de lote o enumeración. Un PNR por llamada, por diseño.

Si despliegas esto públicamente, mantenlo así. Por favor, no construyas un raspador de PNR.


Fuente de datos y términos

Todos los datos son propiedad de Indian Railways, servidos por el Centre for Railway Information Systems (CRIS). Este proyecto no está afiliado, respaldado ni apoyado por Indian Railways, CRIS o IRCTC.

Lee esto antes de desplegar:

  • Los Términos y Condiciones de NTES permiten descargar extractos para uso personal, y establecen que no puedes usar "ningún programa de software" para construir sistemáticamente una base de datos del sitio, ni incluir sus páginas en "cualquier sistema o servicio de recuperación electrónica público o privado", sin permiso escrito previo. También establecen que los datos ferroviarios "no deben usarse con fines comerciales".

  • CRIS otorga ese permiso a petición: "El material presentado en este sitio web puede reproducirse de forma gratuita después de obtener el permiso adecuado enviándonos un correo." Una solicitud lista para enviar está en PERMISSION-REQUEST.md.

  • Estado del permiso para este proyecto: solicitado, pendiente.

  • Los términos de IRCTC son más estrictos, y los datos de PNR son datos personales.

La precisión de los datos es de mejor esfuerzo y no está garantizada — el propio descargo de responsabilidad de NTES dice lo mismo. No confíes en ello para nada crítico para la seguridad; verifica directamente con los ferrocarriles.

Sé un buen ciudadano: los valores predeterminados almacenan en caché lo que es estable, limitan la velocidad por IP y reutilizan una única sesión upstream. Por favor, no los elimines.


Desarrollo

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

Los fixtures en test/fixtures/ son HTML/JSON grabados. Cuando CRIS cambia su marcado, npm test falla con una aserción específica en lugar de que las herramientas devuelvan silenciosamente resultados vacíos.

Licencia

MIT — ver LICENSE. La licencia cubre solo este código fuente, no los datos ferroviarios subyacentes.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables real-time Indian Railways information retrieval, including live train running status, station schedules, and upcoming arrivals/departures.
    ISC
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables checking railway seat availability, berth types, and pricing for Indian trains through natural language queries.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to query real-time Indian Railways data including train schedules, live status, PNR status, seat availability, fares, and coach positions via the Model Context Protocol.
    -