indian-rail-mcp
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 — | horarios de trenes, estado de marcha en vivo, posición de vagones, trenes entre estaciones, paneles de estación en vivo |
IRCTC — | 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-mcpRequiere 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 |
| Significado |
|
| Estación, número de tren o fecha incorrectos — detectado localmente, antes de cualquier llamada de red |
|
| NTES devolvió una página |
|
| IRCTC devolvió un |
|
| Fallo de red o respuesta no analizable |
Sobre
ERR000: NTES devuelve la misma página genéricaERR000tanto 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".NtesErrornombra 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 deployvercel.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 |
| Requerida para habilitar |
| 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_KEYesté 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 buildLos 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.
This server cannot be deployed
Maintenance
Related MCP Connectors
Indian Railways IRCTC helps you to view, track trains schedules, ticket status and more.
Plan intercity journeys in India by train, flight or both, with a fare for every travel class.
Live UK rail boards, journey planning, train history, units, lifts, disruptions, punctuality.
Live Polish rail data: boards for every station, delays, PLK disruptions, train punctuality.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables real-time Indian Railways information retrieval, including live train running status, station schedules, and upcoming arrivals/departures.ISC
- AlicenseNot gradedqualityDmaintenanceEnables searching and tracking Indian Railways trains, checking seat availability, live status, delays, and station/train codes.28MIT
- FlicenseNot gradedqualityDmaintenanceEnables checking railway seat availability, berth types, and pricing for Indian trains through natural language queries.-
- FlicenseNot gradedqualityCmaintenanceEnables 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.-