Skip to main content
Glama
Shadhai

IndianRailwaysMCP

by Shadhai


📑 Содержание


Related MCP server: railway-reservation-system-mcp

🎯 Назначение и философия

Indian Railways ежедневно запускает более 13 000 поездов, но её данные находятся за непоследовательными HTML-страницами и эндпоинтами с ограничением частоты запросов — из-за чего AI-агентам сложно ответить на простой вопрос вроде «мой поезд опаздывает?»

Indian Railways MCP Server решает эту проблему, нормализуя расписания, статус в реальном времени, PNR, тарифы и данные о местах в единый структурированный MCP-интерфейс, к которому любой AI-ассистент может обращаться напрямую.

  • 🔐 Без авторизации, без секретов — все источники данных публичные; нечего утекать

  • 🧩 Многослойная архитектура — слои сервера, клиента и парсера независимо тестируются и заменяются

  • 📊 Кэширование с учётом TTL — каждый вызов инструмента учитывает окно свежести данных вместо того, чтобы перегружать вышестоящие сайты

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


🏗 Архитектура

graph TD
    Client["🖥️ MCP Client<br/>(Claude Desktop / Cursor / Continue.dev)"] -->|MCP Protocol · stdio| Server

    subgraph Server["🚂 Indian Railways MCP Server"]
        direction TB
        SL["🛠️ Server Layer<br/>Tool registration (10 tools)<br/>Pydantic input validation"]
        CL["🌐 Client Layer<br/>httpx session mgmt<br/>tenacity retry logic<br/>TTL response cache"]
        PL["🔎 Parser Layer<br/>BeautifulSoup HTML parsing<br/>Pydantic JSON parsing<br/>Regex extraction"]
        SL --> CL --> PL
    end

    PL -->|HTTP/HTTPS| ERail[("🗄️ ERail.in<br/>Schedules · Live status<br/>PNR · Seats · Fares")]
    PL -->|HTTP/HTTPS| IRInfo[("🗄️ IndianRailways.info<br/>Coach position<br/>Platform locator")]

Поток данных: MCP-клиент отправляет вызов инструмента через stdio → слой сервера проверяет входные данные с помощью Pydantic → слой клиента выполняет HTTP-запрос с логикой повторных попыток → слой парсера извлекает структурированные данные из HTML/JSON → слой кэша сохраняет результат с TTL → ответ форматируется и возвращается клиенту.


✨ Возможности

Модуль

Возможность

Реальное время

TTL кэша

🔍 Поиск станций и поездов

Поиск по 8 000+ станциям и 10 000+ поездам по названию или коду

❌

24 часа

🚂 Расписание поезда

Полный маршрут со всеми станциями, временем и расстояниями

❌

1 час

📍 Статус движения в реальном времени

Текущее местоположение, задержки и информация о платформе

✅

2 минуты

🎫 Статус PNR

Данные пассажиров, распределение вагонов/мест, информация о поездке

✅

30 секунд

💺 Наличие мест

Наличие по классам — AVAILABLE / RAC / WL

✅

2 минуты

💰 Запрос тарифа

Разбивка тарифа по всем классам поездки

❌

1 час

🔀 Поезда между станциями

Все поезда, соединяющие две станции

❌

1 час

🏢 Станция в реальном времени

Ближайшие отправления с любой станции

✅

2 минуты

🚃 Расположение вагонов

Схема вагонов на платформе любой станции

❌

1 час


🧰 Технологический стек

Слой

Технология

Среда выполнения

Python 3.10+

Протокол

Model Context Protocol (MCP) SDK 1.0+

HTTP-клиент

httpx

Разбор HTML

BeautifulSoup4

Валидация

Pydantic 2.0+

Логика повторных попыток

tenacity (экспоненциальная задержка)

Тестирование

pytest, pytest-cov, pytest-mock, pytest-asyncio

Упаковка

pyproject.toml (установка через pip)

Контейнеризация

Docker (python:3.11-slim)

Управление процессами

systemd (развёртывание на Linux-серверах)


🚀 Быстрый старт

Предварительные требования

Инструмент

Версия

Примечания

Python

3.10+

Проверьте с помощью python --version

pip

Последняя

Поставляется с Python

MCP-клиент

Любой

Claude Desktop, Cursor или Continue.dev

Шаг 1 — Клонирование

git clone https://github.com/Shadhai/Railway_mcp.git
cd Railway_mcp

Шаг 2 — Настройка

# Create and activate a virtual environment (recommended)
python -m venv .venv
source .venv/bin/activate      # Linux/Mac
# .venv\Scripts\activate       # Windows

# Install dependencies
pip install mcp httpx beautifulsoup4 pydantic tenacity

Шаг 3 — Запуск

# Run directly
python -m src.indian_railways_mcp.server

# Or install as a package and run the entry point
pip install -e .
indian-railways-mcp

✅ Успех — ожидайте такой вывод:

✅ Available tools: 10
  - search_stations: Search Indian Railways stations by name or code...
  - search_trains: Search Indian Railways trains by number or name...
  - get_train_schedule: Get complete train schedule with all stations...
  ...

⚙️ Конфигурация окружения

Учётные данные не требуются — все вышестоящие источники общедоступны. Единственная используемая переменная окружения настраивает путь импорта Python:

# ── Runtime ─────────────────────────────────────────────
PYTHONPATH=/path/to/Railway_mcp/src

# <!-- VERIFY: add PORT/NODE_ENV-style vars here only if you front this
#      server with a custom HTTP/SSE transport wrapper. Stdio transport
#      (the default) needs nothing beyond PYTHONPATH. -->

🛠 Справочник MCP-инструментов

Этот сервер общается по протоколу MCP stdio, а не через публичный REST API — инструменты вызываются вашим AI-клиентом, а не HTTP-запросами, которые вы отправляете сами. Каждый инструмент сопоставляется с одним или несколькими вызовами вышестоящих источников данных.

Инструменты поиска

Инструмент

Описание

Авторизация

search_stations

Поиск кода(ов) станции по названию с нечётким/регистронезависимым сопоставлением

❌

search_trains

Поиск номера(ов) поезда по названию с нечётким/регистронезависимым сопоставлением

❌

get_trains_between

Список всех поездов, соединяющих две станции

❌

Инструменты расписания и статуса

Инструмент

Описание

Авторизация

get_train_schedule

Полный маршрут: каждая станция, время прибытия/отправления, расстояние

❌

get_live_status

Текущее местоположение, минуты задержки, последняя станция

❌

get_station_live

Ближайшие отправления на указанной станции

❌

Инструменты бронирования и тарифов

Инструмент

Описание

Авторизация

check_pnr

Статус PNR, список пассажиров, вагон/место, состояние подтверждения

❌

check_seat_availability

Наличие мест по классам (AVAILABLE / RAC / WL)

❌

get_fare

Разбивка тарифа по классам

❌

Инструменты платформы

Инструмент

Описание

Авторизация

get_coach_position

Схема вагонов на конкретной платформе

❌

get_platform_locator

Определение платформы прибытия поезда

❌

📖 Полные схемы параметров см. в docs/API_REFERENCE.md в репозитории.


🌐 Источники данных

ERail.in (основной)

Эндпоинт

Метод

Формат

TTL кэша

/js5/IRStations.js

GET

JS/JSON-массив

24 часа

/js5/IRTrains.js

GET

JS/JSON-массив

24 часа

/train-enquiry/{train}

GET

HTML-таблица

1 час

/train-running-status/{train}

GET

HTML

2 минуты

/pnr-status/{pnr}?format=json

GET

JSON

30 секунд

/train-seats/{train}

POST

HTML-таблица

2 минуты

/train-fare/{train}

POST

HTML-таблица

1 час

/trains-between-stations/{from}/{to}

POST

HTML-таблица

1 час

/station-live/{station}

GET

HTML-таблица

2 минуты

IndianRailways.info (вторичный)

Эндпоинт

Метод

Формат

TTL кэша

/coach_position/

POST

HTML-таблица

1 час

/platform_locator/

POST

HTML

1 час


⏱ Стратегия кэширования

Тип данных

TTL

Причина

Список станций

24 часа

Редко меняется

Список поездов

24 часа

Редко меняется

Расписание поезда

1 час

Эпизодические обновления

Статус в реальном времени

2 минуты

Данные реального времени

Статус PNR

30 секунд

Данные реального времени

Наличие мест

2 минуты

Частые обновления


🧭 Варианты использования

🗺️ AI-ассистент планирования путешествий

Чат-бот на базе Claude Desktop использует этот сервер для планирования поездки от начала до конца — поиск поездов между двумя городами, проверка наличия мест в реальном времени, получение тарифа и подтверждение расписания — всё в одном разговоре на естественном языке.

📍 Трекер поездов в реальном времени для пассажиров

Ориентированный на пассажиров IVR- или WhatsApp-бот опрашивает get_live_status каждые несколько минут, чтобы сообщать пассажирам точную задержку их поезда и последнюю пройденную станцию.

🎫 PNR-бот-консьерж

Служебный бот, интегрированный с check_pnr, мгновенно отвечает на вопрос «мой билет подтверждён?», включая вагон, место и позицию в листе ожидания для каждого пассажира — без участия человека-оператора.

🎓 Академический / портфолио-проект

Студент, создающий ИИ-агента на основе MCP, использует этот репозиторий как эталонную реализацию многоуровневой, кэшируемой и отказоустойчивой архитектуры скрейпинга за протоколом Model Context Protocol.


💡 Примеры использования

Полное планирование поездки

from indian_railways_mcp.client import IndianRailwaysClient

client = IndianRailwaysClient()

trains = client.get_trains_between("NDLS", "BCT")
train = trains['trains'][0]

seats = client.check_seat_availability(
    train['train_number'], "NDLS", "BCT", "20-Jul-2026"
)

if any(c['status'] == 'AVAILABLE' for c in seats['classes']):
    fare = client.get_fare(train['train_number'], "NDLS", "BCT")
    print(f"Fare: ₹{fare['classes'][0]['total_fare']}")

schedule = client.get_train_schedule(train['train_number'])
print(f"Travel time: {schedule['travel_time']} hours")

Отслеживание поезда в реальном времени

status = client.get_live_status("04815")

if status['status'] == 'RUNNING':
    print(f"{status['train_name']} last seen at {status['last_station']}, "
          f"delayed {status['delay_minutes']} min")

Проверка статуса PNR

pnr = client.check_pnr("4553137968")

for p in pnr['passengers']:
    print(f"Passenger {p['serial']}: {p['current_status']} | "
          f"Coach {p['coach']} | Berth {p['berth']} ({p['berth_type']})")

📁 Структура проекта

Railway_mcp/
├── 📄 README.md                     # Main documentation
├── 📄 pyproject.toml                # Package configuration
├── 📄 LICENSE                       # MIT License
├── 📄 .gitignore                    # Git ignore rules
├── 📁 docs/
│   ├── API_REFERENCE.md             # Complete tool/API documentation
│   ├── ARCHITECTURE.md              # System architecture
│   └── EXAMPLES.md                  # Usage examples
├── 📁 src/
│   └── 📁 indian_railways_mcp/
│       ├── __init__.py              # Package init
│       ├── server.py                # MCP server (10 tools)
│       ├── client.py                # HTTP client (all endpoints)
│       ├── parsers.py               # HTML/JSON parsers
│       ├── models.py                # Pydantic data models
│       └── utils.py                 # Caching + retry utilities
└── 📁 tests/
    ├── test_client.py               # Client tests
    └── test_parsers.py              # Parser tests

🔌 Интеграции с клиентами

Отредактируйте ваш конфигурационный файл:

  • Mac: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

  • Linux: ~/.config/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "indian-railways": {
      "command": "python",
      "args": ["-m", "src.indian_railways_mcp.server"],
      "cwd": "/path/to/Railway_mcp",
      "env": { "PYTHONPATH": "/path/to/Railway_mcp/src" }
    }
  }
}

Перезапустите Claude Desktop — вы увидите значок 🔌 со списком инструментов Indian Railways.

Добавьте в ~/.cursor/mcp.json:

{
  "mcpServers": {
    "indian-railways": {
      "command": "python",
      "args": ["-m", "src.indian_railways_mcp.server"],
      "cwd": "/path/to/Railway_mcp"
    }
  }
}

Добавьте в ~/.continue/config.json:

{
  "experimental": {
    "modelContextProtocolServers": [
      {
        "transport": {
          "type": "stdio",
          "command": "python",
          "args": ["-m", "src.indian_railways_mcp.server"],
          "cwd": "/path/to/Railway_mcp"
        }
      }
    ]
  }
}
npx @modelcontextprotocol/inspector python -m src.indian_railways_mcp.server

🐳 Развёртывание в Docker

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY src/ ./src/

ENV PYTHONPATH=/app

CMD ["python", "-m", "src.indian_railways_mcp.server"]
# Build
docker build -t indian-railways-mcp .

# Run (stdio requires interactive mode)
docker run -i indian-railways-mcp

/etc/systemd/system/indian-railways-mcp.service:

[Unit]
Description=Indian Railways MCP Server
After=network.target

[Service]
Type=simple
User=mcp
WorkingDirectory=/opt/indian-railways-mcp
Environment=PYTHONPATH=/opt/indian-railways-mcp/src
ExecStart=/usr/bin/python3 -m src.indian_railways_mcp.server
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable indian-railways-mcp
sudo systemctl start indian-railways-mcp
sudo systemctl status indian-railways-mcp

🧪 Тестирование

# Install test dependencies
pip install pytest pytest-cov pytest-mock pytest-asyncio

# Run all tests
pytest tests/ -v

# Run with coverage
pytest tests/ -v --cov=src/indian_railways_mcp --cov-report=html

# Run a specific file / class / test
pytest tests/test_client.py -v
pytest tests/test_client.py::TestPNRStatus -v
pytest tests/test_client.py::TestPNRStatus::test_check_pnr_success -v

Сводка по покрытию

Модуль

Тесты

Покрытие

client.py

40+

~95%

parsers.py

25+

~95%

utils.py

10+

~90%

models.py

5+

~85%

Итого

80+

~92%


📈 Производительность

Время отклика (типичное)

Операция

Холодный (мс)

Кэшированный (мс)

Поиск станций

800

5

Поиск поездов

1000

5

Расписание поезда

1500

100

Статус движения

2000

200

Статус PNR

1200

50

Наличие мест

2000

100

Объём памяти: ~50MB базовая (Python + зависимости) · ~65MB с прогретым кэшем станций/поездов · ~80MB пиковое при разборе HTML.


🔒 Примечания по безопасности

  • Аутентификация не требуется — все источники данных являются публичными

  • Безопасно в отношении лимитов запросов — встроенный экспоненциальный backoff предотвращает злоупотребление частотой запросов

  • Валидируемые входные данные — все аргументы инструментов проходят через модели Pydantic

  • Без сохранения данных — PNR и данные пассажиров никогда не записываются на диск

  • Только HTTPS — каждый исходящий запрос шифруется


🔧 Устранение неполадок

Симптом

Причина

Решение

Module not found

PYTHONPATH не задан

export PYTHONPATH="/путь/к/Railway_mcp/src:$PYTHONPATH" или pip install -e .

Ошибка «Permission denied» в скрипте сервера

Отсутствует бит исполнения

chmod +x src/indian_railways_mcp/server.py

Сервер молча завершает работу

В Docker отсутствует -i

Всегда запускайте с docker run -i indian-railways-mcp (для stdio нужен интерактивный режим)

Ошибка Invalid Train

Неверный или повреждённый номер поезда

Убедитесь, что номер пятизначный, через search_trains

Station Not Found

Станция отсутствует в базе

Сначала выполните search_stations, чтобы найти нужную станцию

Ошибка Connection Timeout

Сетевая проблема на стороне источника данных

Автоповтор 3 раза с экспоненциальной задержкой

Rate Limited

Слишком много запросов за короткий промежуток

Встроенный механизм backoff подождёт и повторит запрос

No Data Found

Поезд не курсирует в этот день

Проверьте дни курсирования поезда

Сайт источника изменил HTML-структуру

Устаревшие парсеры

Обновите селекторы в parsers.py


🗺 Дорожная карта

  • Поддержка тарифов и наличия мест для всех классов обслуживания

  • Многоязычный поиск станций (хинди, тамильский, бенгальский)

  • Webhook-уведомления о задержках поездов

  • Автоматическое обновление расписания по сезону


🤝 Участие

# 1. Fork the repository
# 2. Clone your fork
git clone https://github.com/YOUR_USERNAME/Railway_mcp.git
cd Railway_mcp

# 3. Create a feature branch
git checkout -b feature/your-feature-name

# 4. Make your changes and add tests
pytest tests/ -v

# 5. Commit and push
git commit -m "Add: your feature description"
git push origin feature/your-feature-name

# 6. Open a Pull Request against main

Пожалуйста, держите изменения парсеров покрытыми тестами в tests/test_parsers.py — изменения HTML-структуры вышестоящего сайта — самый частый источник регрессий в этом проекте.


👥 Контрибьюторы


⭐ История звёзд

Star History Chart


🤖 Файлы для ИИ-агентов

В репозитории есть заглушки для обнаружения агентами, чтобы ИИ-ассистенты для программирования (и MCP-совместимые краулеры) могли понять проект без чтения всего README:

  • llms.txt — машиночитаемая сводка проекта для LLM-инструментов

  • AGENTS.md — инструкции для агентов, работающих с кодом в этом репозитории


Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables real-time Indian Railways information retrieval, including live train running status, station schedules, and upcoming arrivals/departures.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables checking railway seat availability, berth types, and pricing for Indian trains through natural language queries.
    -
  • A
    license
    A
    quality
    C
    maintenance
    MCP server for Indian Railways data, enabling AI agents to search trains, get schedules, live status, PNR info, and more without an API key.
    11
    10 npm
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables querying official Indian Railways data for train schedules, live running status, coach positions, trains between stations, station boards, seat availability, and PNR status.
    8 npm
    MIT