Skip to main content
Glama
Shadhai

IndianRailwaysMCP

by Shadhai


📑 目录


Related MCP server: railway-reservation-system-mcp

🎯 目的与理念

印度铁路每天运行超过 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 的 AI 代理的学生,将此仓库作为 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 · HTML 解析期间峰值约 80MB。


🔒 安全说明

  • 无需身份验证 — 所有数据源均为公开数据

  • 限流安全 — 内置指数退避机制可防止滥用性请求模式

  • 输入验证 — 所有工具参数均通过 Pydantic 模型校验

  • 无持久化 — PNR 和乘客数据从不写入磁盘

  • 仅使用 HTTPS — 所有出站请求均经过加密


🔧 故障排查

症状

可能原因

修复方法

Module not found

PYTHONPATH 未设置

export PYTHONPATH="/path/to/Railway_mcp/src:$PYTHONPATH" 或 pip install -e .

服务器脚本权限被拒绝

缺少执行权限

chmod +x src/indian_railways_mcp/server.py

服务器静默退出

Docker 缺少 -i 标志

始终使用 docker run -i indian-railways-mcp 运行(stdio 需要交互模式)

依赖缺失

全新克隆,未安装

pip install -r requirements.txt

Invalid Train 错误

列车编号错误或格式不正确

通过 search_trains 验证是否为 5 位数字

No Data Found

列车当天不运行

查看列车的运行日期

Station Not Found

无效的车站代码

先运行 search_stations 解析代码

Connection Timeout

上游网络问题

自动处理 — 3 次重试并带指数退避

Parse Error

上游网站更改了 HTML 结构

需要在 parsers.py 中手动更新解析器

Rate Limited

短时间内请求过多

自动退避;避免紧密的轮询循环


🗺 路线图

  • 核心工具集 — 车站/列车搜索、时刻表、实时状态

  • PNR 状态、座位余票和票价查询工具

  • 基于 TTL 的缓存层,带重试/退避机制

  • Docker + systemd 部署路径

  • 80+ 测试套件,覆盖率约 92%

  • 🚧 用于远程(非 stdio)部署的可流式 HTTP/SSE 传输

  • 🚧 多语言车站/列车名称匹配(印地语、地区文字)

  • 🚧 用于延误和站台变更的 Webhook/推送提醒

  • 🚧 基于官方 llms.txt 的工具发现,以支持更广泛的代理框架


🤝 贡献指南

# 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 历史

Star History Chart


🤖 AI 就绪文件

此仓库附带代理发现存根,使 AI 编码助手(以及支持 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