IndianRailwaysMCP
📑 Í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 ( |
Gestión de Procesos | systemd (despliegues en servidores Linux) |
🚀 Inicio Rápido
Requisitos Previos
Herramienta | Versión | Notas |
Python | 3.10+ | Compruébalo con |
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_mcpPaso 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 tenacityPaso 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 |
| Encuentra el/los código(s) de estación por nombre, con coincidencia difusa/sin distinción de mayúsculas | ❌ |
| Encuentra el/los número(s) de tren por nombre, con coincidencia difusa/sin distinción de mayúsculas | ❌ |
| Lista todos los trenes que conectan dos estaciones | ❌ |
Herramientas de Horario y Estado
Herramienta | Descripción | Auth |
| Ruta completa: cada estación, hora de llegada/salida, distancia | ❌ |
| Ubicación en tiempo real, minutos de retraso, última estación | ❌ |
| Próximas salidas en una estación determinada | ❌ |
Herramientas de Reserva y Tarifas
Herramienta | Descripción | Auth |
| Estado de PNR, lista de pasajeros, coche/plaza, estado de confirmación | ❌ |
| Estado de asientos por clase (AVAILABLE / RAC / WL) | ❌ |
| Desglose de tarifas por clase | ❌ |
Herramientas de Andén
Herramienta | Descripción | Auth |
| Disposición de coches en un andén específico | ❌ |
| Localiza en qué andén llega un tren | ❌ |
📖 Consulta
docs/API_REFERENCE.mden el repositorio para ver los esquemas completos de parámetros.
🌐 Fuentes de Datos
ERail.in (Principal)
Endpoint | Método | Formato | TTL de Caché |
|
| Matriz JS/JSON | 24 horas |
|
| Matriz JS/JSON | 24 horas |
|
| Tabla HTML | 1 hora |
|
| HTML | 2 minutos |
|
| JSON | 30 segundos |
|
| Tabla HTML | 2 minutos |
|
| Tabla HTML | 1 hora |
|
| Tabla HTML | 1 hora |
|
| Tabla HTML | 2 minutos |
IndianRailways.info (Secundaria)
Endpoint | Método | Formato | TTL de Caché |
|
| Tabla HTML | 1 hora |
|
| 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.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" }
}
}
}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.targetsudo 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 -vResumen de cobertura
Módulo | Pruebas | Cobertura |
| 40+ | ~95% |
| 25+ | ~95% |
| 10+ | ~90% |
| 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 |
|
|
|
| Falta el bit de ejecución |
|
El servidor sale silenciosamente | Falta la bandera | Ejecuta siempre con |
Faltan dependencias | Clonado reciente, sin instalación |
|
Error | Número de tren incorrecto o mal formado | Verifica que sea un número de 5 dígitos mediante |
| El tren no circula ese día | Comprueba los días de operación del tren |
| Código de estación no válido | Ejecuta |
| Problema de red del proveedor | Se gestiona automáticamente: 3 reintentos con retroceso exponencial |
| El sitio del proveedor cambió su HTML | Requiere una actualización manual del analizador en |
| 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.txtoficial 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 mainManté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
🤖 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 LLMAGENTS.md— instrucciones para agentes de codificación que trabajen en este repositorio
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