IndianRailwaysMCP
📑 목차
🎯 목적 및 철학
인도 철도는 하루 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_mcp2단계 — 설정
# 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 tenacity3단계 — 실행
# 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 클라이언트에 의해 호출됩니다. 각 도구는 하나 이상의 상위 데이터 소스 호출에 매핑됩니다.
검색 도구
도구 | 설명 | 인증 |
| 이름으로 역 코드를 찾기, 퍼지/대소문자 무시 매칭 | ❌ |
| 이름으로 열차 번호를 찾기, 퍼지/대소문자 무시 매칭 | ❌ |
| 두 역을 연결하는 모든 열차 나열 | ❌ |
시간표 및 상태 도구
도구 | 설명 | 인증 |
| 전체 경로: 모든 역, 도착/출발 시각, 거리 | ❌ |
| 실시간 위치, 지연 분, 마지막 역 | ❌ |
| 주어진 역의 예정 출발 | ❌ |
예약 및 요금 도구
도구 | 설명 | 인증 |
| 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 기반 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.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% |
📈 성능
응답 시간 (일반적)
작업 | 콜드 (ms) | 캐시됨 (ms) |
역 검색 | 800 | 5 |
열차 검색 | 1000 | 5 |
열차 시간표 | 1500 | 100 |
실시간 상태 | 2000 | 200 |
PNR 상태 | 1200 | 50 |
좌석 가용성 | 2000 | 100 |
메모리 사용량: ~50MB 기본 (Python + 의존성) · ~65MB 역/열차 캐시 워밍 시 · ~80MB HTML 파싱 중 최대.
🔒 보안 참고 사항
인증 불필요 — 모든 데이터 소스는 공개입니다
속도 제한 안전 — 내장된 지수 백오프로 과도한 요청 패턴을 방지합니다
입력값 검증 — 모든 도구 인수는 Pydantic 모델을 통과합니다
영구 저장 없음 — PNR 및 승객 데이터는 디스크에 기록되지 않습니다
HTTPS 전용 — 모든 외부 요청은 암호화됩니다
🔧 문제 해결
증상 | 예상 원인 | 해결 방법 |
|
|
|
서버 스크립트에서 | 실행 비트 누락 |
|
서버가 조용히 종료됨 | Docker에 | 항상 |
의존성 누락 | 새 클론, 설치 안 됨 |
|
| 잘못되었거나 형식이 잘못된 열차 번호 |
|
| 해당 날짜에 열차가 운행하지 않음 | 열차 운행 요일 확인 |
| 잘못된 역 코드 |
|
| 업스트림 네트워크 문제 | 자동 처리됨 — 지수 백오프로 3회 재시도 |
| 업스트림 사이트가 HTML 구조 변경 |
|
| 짧은 시간에 너무 많은 요청 | 자동 백오프; 빡빡한 폴링 루프 피하기 |
🗺 로드맵
핵심 도구 세트 — 역/열차 검색, 시간표, 실시간 상태
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 구조 변경이 이 프로젝트에서 가장 흔한 회귀 원인입니다.
👥 기여자
⭐ 스타 기록
🤖 AI 지원 파일
이 저장소에는 에이전트 검색 스텁이 포함되어 있어 AI 코딩 어시스턴트(및 MCP 인식 크롤러)가 전체 README를 파싱하지 않고도 프로젝트를 이해할 수 있습니다:
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