Skip to main content
Glama
mahi-v-v

indian-rail-mcp

by mahi-v-v

indian-rail-mcp

Данные Indian Railways из официальных источников, в виде типизированной TypeScript-библиотеки и MCP-сервера.

Без API-ключа. Без стороннего поставщика данных. Без npm-посредника, который может исчезнуть.

NTESenquiry.indianrail.gov.in

расписания поездов, статус движения в реальном времени, схема вагонов, поезда между станциями, живые табло станций

IRCTCwww.irctc.co.in

статус PNR, наличие мест по вагонам и по полкам


Зачем это существует

Популярный пакет irctc-connect устарел. Его автор переименовал его в railkit и спрятал за регистрацией и API-ключом, а бесплатные бэкенды, на которые он полагался (bookmytrain.vercel.app, easy-rail.onrender.com), теперь возвращают 404 и 500. Всё, что ещё работает в этой экосистеме, опирается на скрейпинг стороннего сайта с использованием учётных данных, взятых из разметки самого этого сайта.

Эта библиотека идёт напрямую к источникам, которыми фактически управляет Indian Railways.


Related MCP server: Indian Railway MCP

Установка

npm install indian-rail-mcp

Требуется Node 20+. Единственная зависимость времени выполнения — cheerio.

Библиотека

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

Станции принимают либо код, либо полное названиеNDLS и NEW DELHI оба работают, разрешаются по собственному каталогу NTES из 8 700 станций. Даты принимаются в формате DD-MM-YYYY, DD-MMM-YYYY или YYYY-MM-DD.

Ошибки

Каждый сбой — это типизированная ошибка RailError:

Класс

code

Значение

InvalidInputError

INVALID_INPUT

Неверная станция, номер поезда или дата — отлавливается локально, до любого сетевого вызова

NtesError

NTES_ERROR

NTES вернул страницу ERR<nnn>

IrctcError

IRCTC_ERROR

IRCTC вернул errorMessage

UpstreamError

UPSTREAM_ERROR

Сетевая ошибка или неразбираемый ответ

О ERR000: NTES возвращает одну и ту же общую страницу ERR000 как на некорректный ввод, так и на реальный сбой. Поэтому эта библиотека проверяет коды станций по каталогу до вызова NTES, чтобы ваша собственная опечатка никогда не была сообщена вам как «железнодорожный сервис недоступен». NtesError намеренно называет обе возможности, а не заявляет о сбое.

MCP-сервер

Шесть инструментов: getTrainInfo, trackTrain, searchTrainBetweenStations, getLiveStation, getSeatAvailability, checkPnrStatus.

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

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

Деплой на Vercel

vercel deploy

vercel.json закрепляет функцию за bom1 (Мумбаи) — оба вышестоящих сервиса находятся в Индии, и это значит гораздо больше, чем кажется: тёплые запросы выполняются за ~124 мс против ~885 мс холодных, а индийский трафик с индийских исходящих IP-адресов с гораздо меньшей вероятностью вызовет срабатывание F5 WAF перед NTES.

Окружение:

Переменная

Назначение

RAIL_API_KEY

Требуется для включения checkPnrStatus. Вызывающие отправляют его как x-api-key.

RATE_LIMIT_PER_MINUTE

Ограничение запросов на IP. По умолчанию 30.

Укажите любому MCP-клиенту адрес https://<your-deployment>/api/mcp с транспортом Streamable HTTP.


PNR и персональные данные

checkPnrStatus возвращает персональные данные пассажиров — имена, возраст, пол, вагон и место.

  • Он отключён, если RAIL_API_KEY не задан и не совпадает. Он закрывается при ошибке.

  • Библиотека никогда не логирует, не кэширует и не сохраняет ответы PNR.

  • Намеренно нет пакетных или перечислительных помощников. Один PNR за вызов — так задумано.

Если вы разворачиваете это публично, сохраняйте такой подход. Пожалуйста, не создавайте PNR-скрейпер.


Источник данных и условия

Все данные являются собственностью Indian Railways, предоставляются Центром информационных систем железных дорог (CRIS). Этот проект не связан с Indian Railways, CRIS или IRCTC, не одобрен ими и не поддерживается ими.

Прочтите это перед развёртыванием:

  • Условия использования NTES разрешают загрузку выдержек для личного использования и гласят, что вы не можете использовать «любую компьютерную программу» для систематического создания базы данных с сайта, а также включать его страницы в «любую публичную или частную электронную поисковую систему или сервис» без предварительного письменного разрешения. Также указано, что железнодорожные данные «не должны использоваться в коммерческих целях».

  • CRIS предоставляет такое разрешение по запросу: «Материалы, представленные на этом веб-сайте, могут воспроизводиться бесплатно после получения соответствующего разрешения путём отправки нам письма». Готовый к отправке запрос находится в PERMISSION-REQUEST.md.

  • Статус разрешения для этого проекта: запрошено, ожидается.

  • Условия IRCTC строже, а данные PNR являются персональными данными.

Точность данных — это лучшие усилия, и она не гарантируется; собственный дисклеймер NTES говорит то же самое. Не полагайтесь на это ни для чего критически важного; проверяйте напрямую в железнодорожной службе.

Будьте добропорядочным пользователем: настройки по умолчанию кэшируют то, что стабильно, ограничивают частоту по IP и используют одну сессию вышестоящего сервиса. Пожалуйста, не удаляйте это.


Разработка

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

Фикстуры в test/fixtures/ — это записанные HTML/JSON. Когда CRIS меняет свою разметку, npm test завершается с конкретным утверждением, а не тихо возвращает пустые результаты.

Лицензия

MIT — см. LICENSE. Лицензия покрывает только этот исходный код, а не базовые железнодорожные данные.

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