IndianRailwaysMCP
📑 Содержание
🎯 Назначение и философия
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 ( |
Управление процессами | systemd (развёртывание на Linux-серверах) |
🚀 Быстрый старт
Предварительные требования
Инструмент | Версия | Примечания |
Python | 3.10+ | Проверьте с помощью |
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-запросами, которые вы отправляете сами. Каждый инструмент сопоставляется с одним или несколькими вызовами вышестоящих источников данных.
Инструменты поиска
Инструмент | Описание | Авторизация |
| Поиск кода(ов) станции по названию с нечётким/регистронезависимым сопоставлением | ❌ |
| Поиск номера(ов) поезда по названию с нечётким/регистронезависимым сопоставлением | ❌ |
| Список всех поездов, соединяющих две станции | ❌ |
Инструменты расписания и статуса
Инструмент | Описание | Авторизация |
| Полный маршрут: каждая станция, время прибытия/отправления, расстояние | ❌ |
| Текущее местоположение, минуты задержки, последняя станция | ❌ |
| Ближайшие отправления на указанной станции | ❌ |
Инструменты бронирования и тарифов
Инструмент | Описание | Авторизация |
| Статус PNR, список пассажиров, вагон/место, состояние подтверждения | ❌ |
| Наличие мест по классам (AVAILABLE / RAC / WL) | ❌ |
| Разбивка тарифа по классам | ❌ |
Инструменты платформы
Инструмент | Описание | Авторизация |
| Схема вагонов на конкретной платформе | ❌ |
| Определение платформы прибытия поезда | ❌ |
📖 Полные схемы параметров см. в
docs/API_REFERENCE.mdв репозитории.
🌐 Источники данных
ERail.in (основной)
Эндпоинт | Метод | Формат | TTL кэша |
|
| JS/JSON-массив | 24 часа |
|
| JS/JSON-массив | 24 часа |
|
| HTML-таблица | 1 час |
|
| HTML | 2 минуты |
|
| JSON | 30 секунд |
|
| HTML-таблица | 2 минуты |
|
| HTML-таблица | 1 час |
|
| HTML-таблица | 1 час |
|
| HTML-таблица | 2 минуты |
IndianRailways.info (вторичный)
Эндпоинт | Метод | Формат | TTL кэша |
|
| HTML-таблица | 1 час |
|
| 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.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.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.targetsudo 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Сводка по покрытию
Модуль | Тесты | Покрытие |
| 40+ | ~95% |
| 25+ | ~95% |
| 10+ | ~90% |
| 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 — каждый исходящий запрос шифруется
🔧 Устранение неполадок
Симптом | Причина | Решение |
|
|
|
Ошибка «Permission denied» в скрипте сервера | Отсутствует бит исполнения |
|
Сервер молча завершает работу | В Docker отсутствует | Всегда запускайте с |
Ошибка | Неверный или повреждённый номер поезда | Убедитесь, что номер пятизначный, через |
| Станция отсутствует в базе | Сначала выполните |
Ошибка | Сетевая проблема на стороне источника данных | Автоповтор 3 раза с экспоненциальной задержкой |
| Слишком много запросов за короткий промежуток | Встроенный механизм backoff подождёт и повторит запрос |
| Поезд не курсирует в этот день | Проверьте дни курсирования поезда |
Сайт источника изменил HTML-структуру | Устаревшие парсеры | Обновите селекторы в |
🗺 Дорожная карта
Поддержка тарифов и наличия мест для всех классов обслуживания
Многоязычный поиск станций (хинди, тамильский, бенгальский)
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-структуры вышестоящего сайта — самый частый источник регрессий в этом проекте.
👥 Контрибьюторы
⭐ История звёзд
🤖 Файлы для ИИ-агентов
В репозитории есть заглушки для обнаружения агентами, чтобы ИИ-ассистенты для программирования (и MCP-совместимые краулеры) могли понять проект без чтения всего README:
llms.txt— машиночитаемая сводка проекта для LLM-инструментовAGENTS.md— инструкции для агентов, работающих с кодом в этом репозитории
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read and update your Everway trips and itineraries from any MCP-compatible AI assistant.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
TravelMind: 8 MCP tools for travel (12306 trains, flights, hotels, geocode, planning, policy).
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/Shadhai/Railway_mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server