Skip to main content
Glama
Shadhai

IndianRailwaysMCP

by Shadhai


📑 목차


🎯 목적 및 철학

인도 철도는 하루 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 도구 참조

이 서버는 공개 REST API가 아닌 MCP stdio 프로토콜로 통신합니다 — 도구는 직접 HTTP 요청을 보내는 것이 아니라 AI 클라이언트에 의해 호출됩니다. 각 도구는 하나 이상의 상위 데이터 소스 호출에 매핑됩니다.

검색 도구

도구

설명

인증

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%


📈 성능

응답 시간 (일반적)

작업

콜드 (ms)

캐시됨 (ms)

역 검색

800

5

열차 검색

1000

5

열차 시간표

1500

100

실시간 상태

2000

200

PNR 상태

1200

50

좌석 가용성

2000

100

메모리 사용량: ~50MB 기본 (Python + 의존성) · ~65MB 역/열차 캐시 워밍 시 · ~80MB HTML 파싱 중 최대.


🔒 보안 참고 사항

  • 인증 불필요 — 모든 데이터 소스는 공개입니다

  • 속도 제한 안전 — 내장된 지수 백오프로 과도한 요청 패턴을 방지합니다

  • 입력값 검증 — 모든 도구 인수는 Pydantic 모델을 통과합니다

  • 영구 저장 없음 — PNR 및 승객 데이터는 디스크에 기록되지 않습니다

  • HTTPS 전용 — 모든 외부 요청은 암호화됩니다


🔧 문제 해결

증상

예상 원인

해결 방법

Module not found

PYTHONPATH 미설정

export PYTHONPATH="/path/to/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는 대화형 모드 필요)

의존성 누락

새 클론, 설치 안 됨

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 배포 경로

  • ~92% 커버리지의 80+ 테스트 스위트

  • 🚧 원격(비-stdio) 배포를 위한 Streamable HTTP/SSE 전송

  • 🚧 다국어 역/열차 이름 매칭 (힌디어, 지역 문자)

  • 🚧 지연 및 플랫폼 변경에 대한 웹훅/푸시 알림

  • 🚧 더 넓은 에이전트 프레임워크를 위한 공식 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 History Chart


🤖 AI 지원 파일

이 저장소에는 에이전트 검색 스텁이 포함되어 있어 AI 코딩 어시스턴트(및 MCP 인식 크롤러)가 전체 README를 파싱하지 않고도 프로젝트를 이해할 수 있습니다:

  • llms.txt — LLM 도구용 기계 판독 가능 프로젝트 요약

  • AGENTS.md — 이 저장소에서 작업하는 코딩 에이전트를 위한 지침


-
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