subway-congestion-mcp
Optional integration with Kakao REST API for additional geocoding or mapping capabilities.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@subway-congestion-mcp강남역 지금 혼잡해?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🚇 지하철 혼잡도 알리미 MCP 서버
서울 지하철 1~8호선의 혼잡도 정보를 제공하는 Model Context Protocol (MCP) 서버
출퇴근 시간대에 지하철이 얼마나 혼잡한지 미리 알고, 가장 쾌적한 시간에 이동할 수 있도록 도와주는 똑똑한 비서입니다.
📋 목차
Related MCP server: seoul-essentials
✨ 주요 기능
1. 🔍 경로 검색
"강남역에서 역삼역 가려는데"
→ 최적 경로 + 혼잡도 정보 + 대안 경로 2개 제시2. 📊 역 혼잡도 조회
"강남역 지금 혼잡해?"
→ 실시간 혼잡도 + 다음 열차 도착 시간3. ⏰ 도착 시간 계산
"강남에서 역삼까지 9시까지 도착해야 해"
→ 필요한 출발 시간 + 그 시간대 혼잡도4. 🚆 열차 도착 정보
"강남역 열차 언제 와?"
→ 다음 3개 열차 도착 시간 + 각 혼잡도5. 🔔 지하철 이슈 검색
"2호선 지금 지연돼?"
→ 최신 운행 이슈, 고장, 시위 정보🎯 왜 이 프로젝트인가?
기존 앱의 한계
네이버/카카오맵: 혼잡도 정보 없음
서울교통공사 앱: 실시간 정보만 제공, 예측 불가
우리의 차별점
✅ 통계 기반 예측: 과거 데이터로 시간대별 혼잡도 예측
✅ 의사결정 지원: "지금 vs 30분 후" 비교 제공
✅ 대화형 인터페이스: Claude와 자연어로 소통
✅ 대안 제시: 단순 정보 → 최적 선택 추천
🚀 시작하기
필수 요구사항
Python 3.10 이상
pip 또는 uv (권장)
Claude Desktop (MCP 클라이언트)
API 키 2개 (무료, 필수):
ODsay API Key
서울시 Open API Key
(선택) Kakao REST API Key
설치 방법
1단계: 저장소 복제
git clone https://github.com/yourusername/subway-congestion-mcp.git
cd subway-congestion-mcp2단계: 가상환경 생성 (권장)
# uv 사용 (권장 - 빠름)
uv venv
source .venv/bin/activate # Mac/Linux
# 또는
.venv\Scripts\activate # Windows
# 또는 일반 venv
python -m venv .venv
source .venv/bin/activate3단계: 의존성 설치
# uv 사용
uv pip install -e .
# 또는 pip 사용
pip install -e .4단계: 환경 설정
cp .env.example .env
# .env 파일을 열어서 API 키 입력5단계: 데이터 다운로드
python scripts/download_data.py6단계: 테스트
pytest7단계: 실행
# 가상환경 활성화 상태에서 실행
python -m subway_congestion_mcpAPI 키 발급
1. ODsay API (대중교통 경로 검색)
발급 사이트: https://lab.odsay.com
회원가입 (무료)
"API 사용 신청" 클릭
앱 정보 입력:
앱 이름:
지하철 혼잡도 알리미사용 목적:
개인 프로젝트플랫폼:
Web/Mobile
API 키 복사 →
.env파일의ODSAY_API_KEY에 붙여넣기
제한: 하루 1,000건 (무료)
2. 서울시 Open API (실시간 도착 정보)
발급 사이트: https://data.seoul.go.kr
회원가입 (무료)
상단 메뉴 "인증키 신청" 클릭
"활용 신청" 버튼 클릭
인증키 복사 →
.env파일의SEOUL_API_KEY에 붙여넣기
제한: 하루 1,000건 (무료)
설정
.env 파일 예시
# ODsay API (필수)
ODSAY_API_KEY=your_odsay_api_key_here
# 서울시 Open API (필수)
SEOUL_API_KEY=your_seoul_api_key_here
# 로그 레벨 (DEBUG, INFO, WARNING, ERROR)
LOG_LEVEL=INFO
# 캐시 TTL (초)
CACHE_TTL=300Claude Desktop 설정
Mac: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"subway-congestion": {
"command": "uv",
"args": [
"--directory",
"/절대경로/subway-congestion-mcp",
"run",
"subway-congestion-mcp"
]
}
}
}또는 일반 Python 사용 시:
{
"mcpServers": {
"subway-congestion": {
"command": "python",
"args": [
"-m",
"subway_congestion_mcp"
],
"env": {
"PYTHONPATH": "/절대경로/subway-congestion-mcp/src"
}
}
}
}설정 후 Claude Desktop을 재시작하세요.
💬 사용 방법
예제 1: 경로 검색
사용자: "강남역에서 역삼역 가려는데"
Claude:
🚇 최적 경로: 2호선 상선 직통 (1역, 2분)
• 강남역: 혼잡도 152% (매우혼잡) ⛔
• 역삼역: 혼잡도 148% (혼잡) 🔴
📌 대안 경로:
1. 9호선 환승 (12분) - 혼잡도 정보 없음
2. 146번 버스 (15분) - 혼잡도 정보 없음
💡 2호선이 가장 빠르지만 현재 매우 혼잡합니다.📁 폴더 구조
subway-congestion-mcp/
├── README.md # 👈 지금 보고 있는 파일
├── pyproject.toml # 프로젝트 메타데이터 및 의존성
├── .env.example # 환경 변수 템플릿
├── .gitignore # Git 제외 파일
│
├── src/
│ └── subway_congestion_mcp/ # 메인 패키지
│ ├── __init__.py
│ ├── __main__.py # MCP 서버 진입점
│ │
│ ├── server.py # MCP 서버 설정
│ │
│ ├── tools/ # MCP 도구 정의
│ │ ├── __init__.py
│ │ ├── search_route.py # 경로 검색
│ │ ├── get_station_congestion.py # 역 혼잡도 조회
│ │ ├── get_route_congestion.py # 경로 혼잡도 + 시간 계산
│ │ ├── get_train_arrival.py # 열차 도착 정보
│ │ └── search_issues.py # 지하철 이슈 검색
│ │
│ ├── services/ # 비즈니스 로직
│ │ ├── __init__.py
│ │ ├── odsay_service.py # ODsay API 호출
│ │ ├── seoul_metro_service.py # 서울시 API 호출
│ │ ├── congestion_service.py # 혼잡도 계산 로직
│ │ └── cache_service.py # 캐싱 레이어
│ │
│ ├── data/ # 데이터 처리
│ │ ├── __init__.py
│ │ ├── loader.py # CSV 데이터 로더
│ │ ├── parser.py # 데이터 파싱
│ │ └── validator.py # 데이터 검증
│ │
│ ├── utils/ # 유틸리티
│ │ ├── __init__.py
│ │ ├── logger.py # 로깅 설정
│ │ ├── time_utils.py # 시간 변환
│ │ ├── error_handler.py # 에러 핸들링
│ │ └── constants.py # 상수 정의
│ │
│ └── models/ # 데이터 모델 (Pydantic)
│ ├── __init__.py
│ ├── route.py # 경로 관련 모델
│ ├── station.py # 역 관련 모델
│ └── congestion.py # 혼잡도 관련 모델
│
├── data/ # 정적 데이터
│ ├── congestion/ # 혼잡도 CSV 파일
│ │ ├── line1.csv
│ │ ├── line2.csv
│ │ └── ...
│ └── stations.json # 역 정보 (좌표, 노선 등)
│
├── tests/ # 테스트 코드
│ ├── __init__.py
│ ├── test_services/ # 서비스 테스트
│ │ ├── test_odsay_service.py
│ │ └── test_congestion_service.py
│ └── test_tools/ # 도구 테스트
│ ├── test_search_route.py
│ └── test_get_station_congestion.py
│
├── scripts/ # 유틸리티 스크립트
│ ├── download_data.py # CSV 데이터 다운로드
│ └── validate_env.py # 환경 변수 검증
│
└── logs/ # 로그 파일 (gitignore)🛠 기술 스택
핵심 기술
Python 3.10+ - 런타임
MCP SDK - Model Context Protocol
Pydantic - 데이터 검증
pandas - CSV 데이터 처리
주요 라이브러리
[project]
dependencies = [
"mcp>=0.9.0", # MCP SDK
"pydantic>=2.0.0", # 데이터 검증
"pandas>=2.0.0", # CSV 처리
"requests>=2.31.0", # HTTP 클라이언트
"python-dateutil>=2.8.2", # 날짜/시간 처리
"python-dotenv>=1.0.0", # 환경 변수
]
[project.optional-dependencies]
dev = [
"pytest>=7.4.0", # 테스트 프레임워크
"pytest-asyncio>=0.21.0", # 비동기 테스트
"black>=23.0.0", # 코드 포맷팅
"ruff>=0.1.0", # 린팅
"mypy>=1.5.0", # 타입 체킹
]👨💻 개발 가이드
개발 서버 실행
# MCP Inspector로 테스트
npx @modelcontextprotocol/inspector uv --directory . run subway-congestion-mcp
# 또는 직접 실행
python -m subway_congestion_mcp테스트
# 전체 테스트
pytest
# 특정 파일 테스트
pytest tests/test_services/test_congestion_service.py
# 커버리지 확인
pytest --cov=subway_congestion_mcp --cov-report=html코드 품질
# 포맷팅
black src/
# 린팅
ruff check src/
# 타입 체킹
mypy src/로그 확인
# 실시간 로그
tail -f logs/app.log
# 에러 로그만
tail -f logs/error.log🐛 문제 해결
Q1. MCP 서버가 Claude Desktop에 연결되지 않아요
확인 사항:
claude_desktop_config.json경로가 정확한가?절대 경로를 사용했는가?
가상환경이 활성화되어 있는가?
Claude Desktop을 재시작했는가?
디버깅:
# 직접 실행해보기
cd /절대경로/subway-congestion-mcp
source .venv/bin/activate
python -m subway_congestion_mcp
# 로그 확인
cat ~/Library/Logs/Claude/mcp*.logQ2. API 호출이 실패해요
확인 사항:
.env파일에 API 키가 정확히 입력되었는가?API 키가 유효한가?
인터넷 연결이 정상인가?
디버깅:
# 스크립트로 API 키 테스트
python scripts/test_api_keys.pyQ3. 혼잡도 데이터가 없다고 나와요
확인 사항:
CSV 데이터를 다운로드했는가?
python scripts/download_data.pydata/congestion/폴더에 파일이 있는가?1~8호선 역인가? (9호선 미지원)
📊 성능 최적화
캐싱 전략
혼잡도 데이터: 메모리 캐시 (pandas DataFrame)
실시간 도착 정보: 30초 TTL
경로 검색 결과: 10분 TTL
에러 핸들링
# Retry 데코레이터
@retry(max_attempts=3, backoff=exponential)
async def call_api():
...
# Fallback 전략
try:
return await get_realtime_data()
except APIError:
return get_statistical_data() # 통계 데이터로 대체🔒 보안
✅ API 키는
.env파일에만 저장하고.gitignore로 커밋 제외✅ 키 유출 시 즉시 재발급 및 폐기
✅ 샘플 설정은
.env.example만 공유✅ 민감한 정보는 로그에 남기지 않음
✅ 의존성은
pyproject.toml에서 관리
📈 로드맵
v1.0 (현재) - MVP
✅ 기본 5가지 도구 구현
✅ 1~8호선 지원
✅ 통계 기반 혼잡도
v1.1 (예정)
⬜ 9호선, 신분당선 지원
⬜ 대안 역 추천
⬜ 웹 인터페이스
v2.0 (계획)
⬜ 개인화 기능
⬜ 알림 설정
⬜ 통계 대시보드
🤝 기여하기
Fork the repository
Create your feature branch (
git checkout -b feature/AmazingFeature)Commit your changes (
git commit -m 'Add some AmazingFeature')Push to the branch (
git push origin feature/AmazingFeature)Open a Pull Request
📝 라이센스
MIT License - 자유롭게 사용하세요!
💬 연락처
문의사항이나 제안사항이 있으시면:
GitHub Issues
Email: kimjinjuind@gmail.com
Made with ❤️ for Seoul Subway Commuters
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.
Latest Blog Posts
- 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/jinjukimink/subway-congestion-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server