Skip to main content
Glama
Shadhai

IndianRailwaysMCP

by Shadhai


📑 Índice de Contenidos


🎯 Propósito y Filosofía

Indian Railways opera más de 13.000 trenes al día, pero sus datos viven detrás de páginas HTML inconsistentes y endpoints con límite de tasa — lo que dificulta que los agentes de IA respondan a una pregunta tan simple como "¿va retrasado mi tren?"

Indian Railways MCP Server resuelve esto normalizando horarios, estado en vivo, PNR, tarifas y datos de asientos en una única interfaz MCP estructurada que cualquier asistente de IA puede consultar directamente.

  • 🔐 Sin autenticación, sin secretos — todas las fuentes de datos son públicas; no hay nada que filtrar

  • 🧩 Arquitectura en capas — las capas de servidor, cliente y analizador son independientemente comprobables y sustituibles

  • 📊 Caché con TTL — cada llamada de herramienta respeta una ventana de frescura de datos en lugar de golpear los sitios upstream

  • Resiliente por defecto — los reintentos con retroceso exponencial absorben la inestabilidad upstream para que tu agente no se bloquee a mitad de conversación


🏗 Arquitectura

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")]

Flujo de datos: el cliente MCP envía una llamada de herramienta a través de stdio → la capa de Servidor valida la entrada con Pydantic → la capa de Cliente emite una solicitud HTTP con lógica de reintento → la capa de Analizador extrae datos estructurados de HTML/JSON → la capa de Caché almacena el resultado con un TTL → la respuesta se formatea y se devuelve al cliente.


✨ Características

Módulo

Capacidad

Tiempo Real

TTL de Caché

🔍 Búsqueda de Estaciones y Trenes

Busca más de 8.000 estaciones y 10.000 trenes por nombre o código

24 horas

🚂 Horario de Tren

Ruta completa con todas las estaciones, horarios y distancias

1 hora

📍 Estado de Circulación en Vivo

Ubicación en tiempo real, retrasos e información de andén

2 minutos

🎫 Estado de PNR

Detalles de pasajeros, asignación de coche/plaza, información del viaje

30 segundos

💺 Disponibilidad de Asientos

Disponibilidad por clase — AVAILABLE / RAC / WL

2 minutos

💰 Consulta de Tarifas

Desglose de tarifas en todas las clases de viaje

1 hora

🔀 Trenes Entre Estaciones

Todos los trenes que conectan dos estaciones

1 hora

🏢 Estación en Vivo

Próximas salidas desde cualquier estación

2 minutos

🚃 Posición de Coches

Disposición de coches en el andén de cualquier estación

1 hora


🧰 Stack Tecnológico

Capa

Tecnología

Runtime

Python 3.10+

Protocolo

Model Context Protocol (MCP) SDK 1.0+

Cliente HTTP

httpx

Análisis de HTML

BeautifulSoup4

Validación

Pydantic 2.0+

Lógica de Reintento

tenacity (retroceso exponencial)

Pruebas

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

Empaquetado

pyproject.toml (instalable con pip)

Contenedores

Docker (python:3.11-slim)

Gestión de Procesos

systemd (despliegues en servidores Linux)


🚀 Inicio Rápido

Requisitos Previos

Herramienta

Versión

Notas

Python

3.10+

Compruébalo con python --version

pip

Última

Incluida con Python

Un cliente MCP

Cualquiera

Claude Desktop, Cursor o Continue.dev

Paso 1 — Clonar

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

Paso 2 — Configurar

# 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

Paso 3 — Ejecutar

# 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

✅ Éxito — espera esta salida:

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

⚙️ Configuración de Entorno

No se requieren credenciales — todas las fuentes upstream son de acceso público. La única variable de entorno en uso configura la ruta de importación de 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. -->

🛠 Referencia de Herramientas MCP

Este servidor se comunica a través del protocolo MCP stdio, no mediante una API REST pública — las herramientas las invoca tu cliente de IA, no mediante solicitudes HTTP que hagas tú. Cada herramienta se asigna a una o más llamadas a fuentes de datos upstream.

Herramientas de Descubrimiento

Herramienta

Descripción

Auth

search_stations

Encuentra el/los código(s) de estación por nombre, con coincidencia difusa/sin distinción de mayúsculas

search_trains

Encuentra el/los número(s) de tren por nombre, con coincidencia difusa/sin distinción de mayúsculas

get_trains_between

Lista todos los trenes que conectan dos estaciones

Herramientas de Horario y Estado

Herramienta

Descripción

Auth

get_train_schedule

Ruta completa: cada estación, hora de llegada/salida, distancia

get_live_status

Ubicación en tiempo real, minutos de retraso, última estación

get_station_live

Próximas salidas en una estación determinada

Herramientas de Reserva y Tarifas

Herramienta

Descripción

Auth

check_pnr

Estado de PNR, lista de pasajeros, coche/plaza, estado de confirmación

check_seat_availability

Estado de asientos por clase (AVAILABLE / RAC / WL)

get_fare

Desglose de tarifas por clase

Herramientas de Andén

Herramienta

Descripción

Auth

get_coach_position

Disposición de coches en un andén específico

get_platform_locator

Localiza en qué andén llega un tren

📖 Consulta docs/API_REFERENCE.md en el repositorio para ver los esquemas completos de parámetros.


🌐 Fuentes de Datos

ERail.in (Principal)

Endpoint

Método

Formato

TTL de Caché

/js5/IRStations.js

GET

Matriz JS/JSON

24 horas

/js5/IRTrains.js

GET

Matriz JS/JSON

24 horas

/train-enquiry/{train}

GET

Tabla HTML

1 hora

/train-running-status/{train}

GET

HTML

2 minutos

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

GET

JSON

30 segundos

/train-seats/{train}

POST

Tabla HTML

2 minutos

/train-fare/{train}

POST

Tabla HTML

1 hora

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

POST

Tabla HTML

1 hora

/station-live/{station}

GET

Tabla HTML

2 minutos

IndianRailways.info (Secundaria)

Endpoint

Método

Formato

TTL de Caché

/coach_position/

POST

Tabla HTML

1 hora

/platform_locator/

POST

HTML

1 hora


⏱ Estrategia de Caché

Tipo de Dato

TTL

Motivo

Lista de Estaciones

24 horas

Cambia raramente

Lista de Trenes

24 horas

Cambia raramente

Horario de Tren

1 hora

Actualizaciones ocasionales

Estado en Vivo

2 minutos

Datos en tiempo real

Estado de PNR

30 segundos

Datos en tiempo real

Disponibilidad de Asientos

2 minutos

Actualizaciones frecuentes


🧭 Casos de Uso

🗺️ Asistente de Planificación de Viajes con IA

Un chatbot construido sobre Claude Desktop utiliza este servidor para planificar un viaje de principio a fin — buscando trenes entre dos ciudades, comprobando la disponibilidad de asientos en vivo, consultando la tarifa y confirmando el horario, todo desde una única conversación en lenguaje natural.

📍 Rastreador de Trenes en Vivo para Viajeros

Un bot de IVR o WhatsApp orientado a viajeros consulta get_live_status cada pocos minutos para informar a los pasajeros exactamente cuánto retraso lleva su tren y qué estación fue la última que pasó.

🎫 Bot Conserje de PNR

Un bot de soporte integrado con check_pnr responde al instante a la pregunta "¿está confirmado mi billete?", incluyendo coche, plaza y posición en lista de espera por pasajero — sin necesidad de un agente humano.

🎓 Proyecto Académico / de Portafolio

Un estudiante que construye un agente de IA basado en MCP utiliza este repositorio como implementación de referencia de una arquitectura de scraping en capas, con caché y segura ante reintentos, detrás del Model Context Protocol.


💡 Ejemplos de uso

Planificación completa de viajes

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

Seguimiento de trenes en vivo

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

Consulta de estado de 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']})")

📁 Estructura del proyecto

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

🔌 Integraciones con clientes

Edita tu archivo de configuración:

  • 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" }
    }
  }
}

Reinicia Claude Desktop: verás un icono 🔌 con las herramientas de Indian Railways listadas.

Añade a ~/.cursor/mcp.json:

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

Añade a ~/.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

🐳 Despliegue con 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

🧪 Pruebas

# 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

Resumen de cobertura

Módulo

Pruebas

Cobertura

client.py

40+

~95%

parsers.py

25+

~95%

utils.py

10+

~90%

models.py

5+

~85%

Total

80+

~92%


📈 Rendimiento

Tiempos de respuesta (típicos)

Operación

En frío (ms)

En caché (ms)

Buscar estaciones

800

5

Buscar trenes

1000

5

Horario de tren

1500

100

Estado en vivo

2000

200

Estado de PNR

1200

50

Disponibilidad de asientos

2000

100

Huella de memoria: ~50MB base (Python + dependencias) · ~65MB con la caché de estaciones/trenes activa · ~80MB pico durante el análisis de HTML.


🔒 Notas de seguridad

  • No se requiere autenticación — todas las fuentes de datos son públicas

  • Seguro frente a límites de tasa — el retroceso exponencial integrado evita patrones de solicitud abusivos

  • Entradas validadas — todos los argumentos de las herramientas pasan por modelos Pydantic

  • Sin persistencia — los datos de PNR y pasajeros nunca se escriben en disco

  • Solo HTTPS — cada solicitud saliente está cifrada


🔧 Solución de problemas

Síntoma

Causa probable

Solución

Module not found

PYTHONPATH no configurado

export PYTHONPATH="/ruta/a/Railway_mcp/src:$PYTHONPATH" o pip install -e .

Permission denied en el script del servidor

Falta el bit de ejecución

chmod +x src/indian_railways_mcp/server.py

El servidor sale silenciosamente

Falta la bandera -i en Docker

Ejecuta siempre con docker run -i indian-railways-mcp (stdio necesita modo interactivo)

Faltan dependencias

Clonado reciente, sin instalación

pip install -r requirements.txt

Error Invalid Train

Número de tren incorrecto o mal formado

Verifica que sea un número de 5 dígitos mediante search_trains

No Data Found

El tren no circula ese día

Comprueba los días de operación del tren

Station Not Found

Código de estación no válido

Ejecuta search_stations primero para resolver el código

Connection Timeout

Problema de red del proveedor

Se gestiona automáticamente: 3 reintentos con retroceso exponencial

Parse Error

El sitio del proveedor cambió su HTML

Requiere una actualización manual del analizador en parsers.py

Rate Limited

Demasiadas solicitudes en poco tiempo

Retrocede automáticamente; evita bucles de sondeo muy ajustados


🗺 Hoja de ruta

  • Conjunto de herramientas principal: búsqueda de estaciones/trenes, horarios, estado en vivo

  • Herramientas de consulta de PNR, disponibilidad de asientos y tarifas

  • Capa de caché basada en TTL con reintentos/retroceso

  • Rutas de despliegue con Docker y systemd

  • Suite de más de 80 pruebas con ~92% de cobertura

  • 🚧 Transporte HTTP/SSE transmisible para despliegues remotos (no stdio)

  • 🚧 Coincidencia de nombres de estaciones/trenes en varios idiomas (hindi, escrituras regionales)

  • 🚧 Alertas webhook/push para cambios de retraso y plataforma

  • 🚧 Descubrimiento de herramientas basado en llms.txt oficial para marcos de agentes más amplios


🤝 Contribuciones

# 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

Mantén los cambios del analizador cubiertos por pruebas en tests/test_parsers.py: los cambios en la estructura HTML del proveedor son la fuente más común de regresiones en este proyecto.


👥 Colaboradores


⭐ Historial de estrellas

Gráfico de historial de estrellas


🤖 Archivos listos para IA

Este repositorio incluye stubs de descubrimiento de agentes para que los asistentes de codificación de IA (y los rastreadores compatibles con MCP) puedan entender el proyecto sin analizar el README completo:

  • llms.txt — resumen del proyecto legible por máquina para herramientas LLM

  • AGENTS.md — instrucciones para agentes de codificación que trabajen en este repositorio


-
license - not tested
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 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).

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/Shadhai/Railway_mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server