Skip to main content
Glama
mahi-v-v

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.

NTESenquiry.indianrail.gov.in

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

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

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