subway-mcp
Click on "Deploy 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-mcp수원역 1호선 상행 도착정보 알려줘"
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.
subway-mcp — 수원역 지하철 실시간 도착정보 MCP 서버
수원역의 1호선 / 수인분당선 실시간 도착정보를, Claude 같은 MCP 클라이언트가 조회할 수 있게 해주는 로컬 stdio MCP 서버입니다. 첫 MCP 서버 학습용 프로젝트.
구조
파일 | 역할 |
| FastMCP 서버 + |
| 도착정보 API 호출/파싱 (도메인 로직 격리) |
|
|
| 키 이름만 적어둔 템플릿 |
Related MCP server: ShippingTracker
개발 환경 준비 (uv)
cd C:\Users\admin\HJ\subway-mcp
uv sync # 의존성 설치 + 가상환경 생성실행 / 디버깅 (MCP Inspector)
uv run fastmcp dev server.py # 브라우저로 Inspector 가 열리고 툴을 직접 호출 가능진행 상태 (마일스톤)
M1 — 빈 서버 +
hello더미 툴M2 — 데이터 소스 검증 → TOPIS 확정 (역명은 "수원"으로 조회)
M3 —
get_subway_arrivals(전체 도착정보)M4 —
get_line_arrivals(호선/방향 필터)M5 — Claude Code / Desktop 연결
M6 — 에러 처리·한국어 포맷 (역명 오류/노선 오류/타임아웃/키 없음)
Claude 연결
Claude Code (모든 프로젝트에서 사용):
claude mcp add --scope user subway-info -- uv run --directory C:\Users\admin\HJ\subway-mcp python server.pyClaude Desktop: %APPDATA%\Claude\claude_desktop_config.json 의 mcpServers 에 등록 후 앱 재시작.
{
"mcpServers": {
"subway-info": {
"command": "C:\\Users\\admin\\.local\\bin\\uv.exe",
"args": ["run", "--directory", "C:\\Users\\admin\\HJ\\subway-mcp", "python", "server.py"]
}
}
}키 발급
.env.example 을 .env 로 복사한 뒤 발급받은 서비스키를 넣으세요.
TOPIS: https://data.seoul.go.kr — "지하철 실시간 도착정보" 인증키 신청
Available Tools
2 toolsget_line_arrivalsB
특정 호선만 골라 수원역 실시간 도착정보를 알려준다.
| Name | Required | Description | Default |
|---|---|---|---|
| line | Yes | "1호선" 또는 "수인분당선". | |
| station | No | 조회할 역 이름. 기본값은 "수원역". | 수원역 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description solely carries the burden of behavioral disclosure. It only states 'provides real-time arrival info' without detailing data freshness, update frequency, or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence in Korean, front-loaded with the key purpose and scope. No superfluous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple tool with 2 parameters and an existing output schema, the description is minimally adequate. It identifies the core function but lacks context on the tool's constraints (e.g., station specificity) and expected output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes both parameters. The description adds value by restating the line selection and station focus, but does not provide additional semantic or syntax details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides real-time arrival for Suwon Station for a specific line. However, it does not explicitly differentiate from the sibling tool 'get_subway_arrivals', which might have a broader scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No usage guidelines provided. The description does not indicate when to use this tool versus alternatives, nor any prerequisites or limitations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_subway_arrivalsB
수원역의 1호선·수인분당선 실시간 지하철 도착정보를 모두 알려준다.
| Name | Required | Description | Default |
|---|---|---|---|
| station | No | 조회할 역 이름. 기본값은 "수원역". | 수원역 |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It states the scope (two lines at Suwon Station), which is adequate for a simple retrieval tool. However, it does not disclose additional behavioral details like data freshness, update frequency, or any constraints, though the presence of an output schema may partially compensate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that conveys the purpose efficiently. It is front-loaded with the essential information. However, it could be slightly more structured by separating the station and line scopes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description claims it provides information for 'Suwon Station' (수원역), but the input schema allows the station parameter to be changed to any station name. This creates a mismatch between description and schema, making the description incomplete regarding the tool's actual flexibility. Additionally, no guidance on line-specific usage is given.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the parameter 'station' already described in the schema (name and default value). The description adds no extra semantic information about the parameter, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool provides real-time subway arrival information for Line 1 and Suin-Bundang Line at Suwon Station. The verb 'provides' and the specific resource (arrival info for two lines) are clearly identified. However, it does not explicitly distinguish from the sibling tool 'get_line_arrivals', which may focus on a single line.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives, such as the sibling tool 'get_line_arrivals'. No when-to-use or when-not-to-use information is provided, and no prerequisites or context are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.0- First observed
get_line_arrivals - First observed
get_subway_arrivals
TDQS
Scored across 2 tools
The two tools are distinct: one filters by specific line, the other returns all lines for Suwon station. However, they are closely related and could cause confusion if an agent intends to get arrivals for a line not at Suwon station.
Both use 'get_' prefix and a noun phrase. However, one uses 'line_arrivals' and the other 'subway_arrivals', which are not perfectly parallel (line vs subway). Minor inconsistency.
Two tools is minimal but could be appropriate for a server focused solely on arrivals at a single station. However, the scope feels too narrow for a subway MCP, which typically covers multiple stations and features.
The server only provides arrivals for Suwon station on two lines. It lacks essential functionality like schedules, delays, station lookup, or other stations, making it severely incomplete for a subway information server.
Maintenance
Related MCP Connectors
MCP server for China Railway 12306 ticket availability: schedules and seats by Chinese station name.
Cloudflare Workers MCP server: govdata-korea
나라투어 공식 MCP 서버 — 수원 소재 단체여행 전문 여행사. AI 에이전트에게 회사 프로필, 영업 정보, 카카오톡 상담 링크(UTM 포함)를 제공.
Seoul Open Data MCP — city data for Seoul via the Seoul Open Data Plaza API
Related MCP Servers
- AlicenseBqualityDmaintenanceMCP server that provides Korean weather information using grid coordinates and the Korea Meteorological Administration API, allowing users to query current weather conditions and forecasts for specific locations in Korea.27Apache 2.0
- AlicenseCqualityDmaintenance한국 택배 배송 조회를 위한 MCP 서버 MCP Server for Korean Shipment Tracking21MIT
- FlicenseAqualityDmaintenanceAn MCP server that provides access to the Koleo API for Polish train timetables, including station information, departures, and arrivals. It allows users to search for connections, view train routes, and access real-time timetable data and seat occupancy statistics.147-
- FlicenseNot gradedqualityBmaintenanceThis MCP server provides accessibility risk assessment for Seoul subway trips, considering wheelchair, stroller, and other mobility constraints. It offers tools to check station facilities, elevator status, and calculates risk scores for routes based on a deterministic engine.-