korea-mcp
The server's subway routing data is generated from OpenStreetMap route relations, providing station order, transfer information, and line data for the Seoul metropolitan area. This data is bundled offline and used by the subway_route and subway_station tools.
korea-mcp ๐ฐ๐ท
English ยท ํ๊ตญ์ด
Let your AI agent get you around Korea. Subway routes in English, fares, public holidays and practical tips, as an MCP server for Claude, Cursor, ChatGPT and any MCP client.
No API key. No Korean phone number. Works offline.

You: How do I get from Myeongdong to Seongsu by subway?
Agent: Take Line 4 from Myeongdong (๋ช
๋) on the platform whose next stop is
Chungmuro (์ถฉ๋ฌด๋ก). Ride 2 stops to Dongdaemun History & Culture Park.
Transfer to Line 2 towards Sindang (์ ๋น) and ride 6 stops to Seongsu (์ฑ์).
About 22 minutes, โฉ1,550 with a T-money card.Why Google Maps fails in Korea
If you have visited Korea, you know: Google Maps can't give you walking or driving directions here, and its transit results are often incomplete. Korea restricts exporting map data, so locals use Naver Map and KakaoMap instead.
That's fine for people, but bad for AI agents. Naver and Kakao don't offer a public transit-routing API, and their other APIs need a Korean developer account. So when you ask an AI "how do I get to Seongsu?", it guesses.
korea-mcp fixes the basics with open data bundled in the package:
660 stations on 25 lines across Seoul, Incheon and Gyeonggi, with names in English, Korean, Japanese and Chinese
a route planner that knows transfers, platform direction and estimated time
the official distance-based fare formula
Korean public holidays, including substitute holidays
short, practical guides on T-money, airport transfers, emergency numbers and the apps that work
Related MCP server: Where's My Train?
Install
Claude Code
claude mcp add korea -- npx -y korea-mcpClaude Desktop, one click. Download korea-mcp.mcpb and open it. Claude Desktop installs it as an extension.
Claude Desktop (manual), Cursor and other MCP clients. Add this to your MCP config (claude_desktop_config.json, .cursor/mcp.json, โฆ):
{
"mcpServers": {
"korea": {
"command": "npx",
"args": ["-y", "korea-mcp"]
}
}
}Requires Node.js 20+.
Tools
Tool | What it does |
| Route between two stations: lines, transfers, the platform to use, stops, minutes and fare. Accepts English, ํ๊ตญ์ด, ๆฅๆฌ่ช, ไธญๆ and landmarks ("Hongdae", "COEX", "Incheon Airport T1"). Tolerates typos. |
| Look up and translate a station name. Returns every language, the lines that serve it and coordinates. |
| Public holidays in a date range, or "is this date a holiday?". Includes substitute holidays and the 2026 additions (Labour Day, Constitution Day). |
| Practical guides: |
Things to ask
"I land at Incheon T2 at 9pm. How do I get to my hotel near Hongdae?"
"What's the fastest way from Gangnam to Gyeongbokgung, and how much is it?"
"Is anything closed in Korea the week of September 24, 2026?"
"How do I top up a T-money card?"
"What does ์์ง๋ก์ ๊ตฌ mean in English, and which lines stop there?"
Accuracy
Here is what this server knows, and what it only estimates:
Station order and transfers come from OpenStreetMap and are reliable.
Ride times are estimates. They're based on distance, line speed and about 7 minutes per transfer, calibrated against published journey times. There is no live timetable.
Fares use the official integrated distance formula for adults (โฉ1,550 base with a card, effective 2025-06-28). Lines with their own surcharges (Shinbundang, AREX, GTX-A) are flagged in the response, not added to the total.
Express trains are off by default because express stopping patterns in OSM are incomplete. Turn them on with
allow_express.
Found a wrong route? Open an issue with the two stations. That's the most useful bug report there is.
Roadmap
These are planned optional extras that need free API keys. Everything above keeps working without them.
Real-time train arrivals (Seoul Open Data)
Place search ("cafรฉs near Seongsu", "pharmacy open now") via the Kakao Local API
Bus and door-to-door routing via ODsay
A hosted remote server, so there is nothing to install
Busan, Daegu, Daejeon and Gwangju metros
Guides for longer stays: ARC, bank accounts, phone plans, health insurance
See docs/api-keys.md for how keys will work.
Development
npm install
npm test # route, fare and holiday tests
npm run dev # run the server with tsx
npm run data:subway # rebuild data/subway.json from OpenStreetMapThe subway dataset is generated by scripts/build-subway.mjs from OpenStreetMap route relations. Line definitions and name overrides are in that script. The speed model is in src/subway/route.ts.
Contributions in any language are welcome. Issues and PRs in Korean are fine too.
Credits & related projects
These projects explored parts of this space first. Go give them a star:
naeryeo: Korean transit routing CLI and MCP using ODsay
seoul-essentials: public facilities for foreign visitors in Seoul
kakao-navigation-mcp-server, mcp-server-kakao-map, and the Naver Maps MCP servers
awesome-mcp-korea: a list of Korean MCP servers
License
The code is MIT. The subway data is ยฉ OpenStreetMap contributors, under ODbL 1.0.
ํ๊ตญ์ด
English ยท ํ๊ตญ์ด
์ธ๊ตญ์ธ ์น๊ตฌ๊ฐ AIํํ "๋ช ๋์์ ์ฑ์ ์ด๋ป๊ฒ ๊ฐ?"๋ผ๊ณ ๋ฌผ์ผ๋ฉด, ์ ๋๋ก ๋ ๋ต์ด ๋์ค๊ฒ ํ๋ MCP ์๋ฒ์ ๋๋ค.
์งํ์ฒ ๊ฒฝ๋ก์ ์๊ธ, ๊ณตํด์ผ, ์ํ ์ ๋ณด๋ฅผ ์์ดยทํ๊ตญ์ดยท์ผ๋ณธ์ดยท์ค๊ตญ์ด๋ก ์๋ ค์ค๋๋ค. Claude, Cursor, ChatGPT ๋ฑ MCP๋ฅผ ์ง์ํ๋ ๋ชจ๋ AI ์์ด์ ํธ์์ ์ธ ์ ์์ด์.
API ํค ์์ด, ํ๊ตญ ํด๋ํฐ ๋ฒํธ ์์ด, ์คํ๋ผ์ธ์์ ๋์ํฉ๋๋ค.
์ ๋ง๋ค์๋
ํ๊ตญ์์๋ ๊ตฌ๊ธ ์ง๋๋ก ๋๋ณดยท์๋์ฐจ ๊ธธ์ฐพ๊ธฐ๋ฅผ ํ ์ ์๊ณ , ๋์ค๊ตํต ์ ๋ณด๋ ๋ถ์ ํํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ง๋ ๋ฐ์ดํฐ์ ๊ตญ์ธ ๋ฐ์ถ ์ ํ ๋๋ฌธ์ด์์. ๊ทธ๋์ ํ๊ตญ ์ฌ๋๋ค์ ๋ค์ด๋ฒ ์ง๋์ ์นด์นด์ค๋งต์ ์๋๋ค.
๊ทธ๋ฐ๋ฐ AI ์์ด์ ํธ์๊ฒ๋ ์ด๊ฒ ๋ฌธ์ ์ ๋๋ค. ๋ค์ด๋ฒ์ ์นด์นด์ค๋ ๋์ค๊ตํต ๊ธธ์ฐพ๊ธฐ API๋ฅผ ์ธ๋ถ์ ๊ณต๊ฐํ์ง ์๊ณ , ๋ค๋ฅธ API๋ ํ๊ตญ ๊ฐ๋ฐ์ ๊ณ์ ์ด ์์ด์ผ ์ธ ์ ์์ด์. ๊ฒฐ๊ตญ AI๊ฐ ๊ฒฝ๋ก๋ฅผ ์ง์ด๋ด๊ฒ ๋ฉ๋๋ค.
korea-mcp๋ ๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ํจํค์ง์ ๋ด์ฅํด์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์๋๊ถ(์์ธยท์ธ์ฒยท๊ฒฝ๊ธฐ) 25๊ฐ ๋ ธ์ , 660๊ฐ ์ญ๊ณผ 4๊ฐ ๊ตญ์ด ์ญ๋ช
ํ์น, ํ ์น๊ฐ์ฅ ๋ฐฉํฅ, ์์ ์์ ์๊ฐ์ ์๋ ค์ฃผ๋ ๊ฒฝ๋ก ํ์
๊ณต์ ๊ฑฐ๋ฆฌ๋น๋ก ์๊ธ ๊ณ์ฐ
๋์ฒด๊ณตํด์ผ๊น์ง ํฌํจํ ํ๊ตญ ๊ณตํด์ผ
ํฐ๋จธ๋, ๊ณตํญ ์ด๋, ๊ธด๊ธ์ ํ, ํ๊ตญ์์ ์ธ ๋งํ ์ฑ ์๋ด
์ค์น
Claude Code
claude mcp add korea -- npx -y korea-mcpClaude Desktop ์ํด๋ฆญ ์ค์น. korea-mcp.mcpb๋ฅผ ๋ด๋ ค๋ฐ์ ์ด๋ฉด Claude Desktop์ ํ์ฅ ํ๋ก๊ทธ๋จ์ผ๋ก ์ค์น๋ฉ๋๋ค.
Claude Desktop(์ง์ ์ค์ ), Cursor ๋ฑ. MCP ์ค์ ํ์ผ์ ์๋ ๋ด์ฉ์ ์ถ๊ฐํ์ธ์.
{
"mcpServers": {
"korea": {
"command": "npx",
"args": ["-y", "korea-mcp"]
}
}
}Node.js 20 ์ด์์ด ํ์ํฉ๋๋ค.
๋๊ตฌ
๋๊ตฌ | ๊ธฐ๋ฅ |
| ๋ ์ญ ์ฌ์ด ๊ฒฝ๋ก: ๋ ธ์ , ํ์น์ญ, ํ ์น๊ฐ์ฅ, ์ ๊ฑฐ์ฅ ์, ์์ ์๊ฐ, ์๊ธ. ์์ดยทํ๊ตญ์ดยท์ผ๋ณธ์ดยท์ค๊ตญ์ด ์ญ๋ช ๊ณผ ๋๋๋งํฌ("Hongdae", "COEX")๋ฅผ ์์๋ฃ๊ณ , ์คํ๋ ์ฒ๋ฆฌํฉ๋๋ค. |
| ์ญ ๊ฒ์๊ณผ ์ญ๋ช ๋ฒ์ญ. ์ธ์ด๋ณ ์ด๋ฆ, ์ง๋๋ ๋ ธ์ , ์ขํ๋ฅผ ์๋ ค์ค๋๋ค. |
| ๊ธฐ๊ฐ ๋ด ๊ณตํด์ผ ์กฐํ, ํน์ ๋ ์ง๊ฐ ๊ณตํด์ผ์ธ์ง ํ์ธ. ๋์ฒด๊ณตํด์ผ๊ณผ 2026๋ ์ ์๋ก ์๊ธด ๋ ธ๋์ ยท์ ํ์ ๋ ํฌํจํฉ๋๋ค. |
| ์ํ ๊ฐ์ด๋: |
์ ํ๋
์ญ ์์์ ํ์น ์ ๋ณด๋ OpenStreetMap ๊ธฐ๋ฐ์ด๋ผ ์ ๋ขฐํ ์ ์์ต๋๋ค.
์์ ์๊ฐ์ ์ถ์ ์น์ ๋๋ค. ์ญ ๊ฐ ๊ฑฐ๋ฆฌ, ๋ ธ์ ๋ณ ์๋, ํ์น ์ฝ 7๋ถ์ผ๋ก ๊ณ์ฐํ๊ณ ๊ณต๊ฐ๋ ์์ ์๊ฐ์ ๋ง์ถฐ ๋ณด์ ํ์ด์. ์ค์๊ฐ ์๊ฐํ๋ ์๋๋๋ค.
์๊ธ์ 2025๋ 6์ 28์ผ๋ถํฐ ์ ์ฉ๋ ์๋๊ถ ํตํฉ ๊ฑฐ๋ฆฌ๋น๋ก์ (๊ตํต์นด๋ ์ฑ์ธ ๊ธฐ๋ณธ 1,550์)๋ฅผ ๋ฐ๋ฆ ๋๋ค. ์ ๋ถ๋น์ , ๊ณตํญ์ฒ ๋, GTX-A์ฒ๋ผ ๋ณ๋ ์๊ธ์ด ๋ถ๋ ๋ ธ์ ์ ์๋ต์ ์๋ด๋ง ํ๊ณ ํฉ๊ณ์๋ ๋ฃ์ง ์์ต๋๋ค.
๊ธํ์ ๊ธฐ๋ณธ์ผ๋ก ๊บผ์ ธ ์์ต๋๋ค. OSM์ ๊ธํ ์ ์ฐจ ์ ๋ณด๊ฐ ๋ถ์์ ํ๊ธฐ ๋๋ฌธ์ด์์. ์ฐ๋ ค๋ฉด
allow_express์ต์ ์ ์ผ์ธ์.
ํ๋ฆฐ ๊ฒฝ๋ก๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์ถ๋ฐ์ญ๊ณผ ๋์ฐฉ์ญ์ ์ ์ด์ ์ด์๋ก ์๋ ค์ฃผ์ธ์. ๊ฐ์ฅ ๋์์ด ๋๋ ์ ๋ณด์ ๋๋ค.
๋ก๋๋งต
์๋ ๊ธฐ๋ฅ์ ๋ฌด๋ฃ API ํค๊ฐ ์์ผ๋ฉด ์ธ ์ ์๋ ์ ํ ๊ธฐ๋ฅ์ผ๋ก ์ถ๊ฐํ ์์ ์ ๋๋ค. ํค๊ฐ ์์ด๋ ๊ธฐ์กด ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ๋์ํด์.
์ค์๊ฐ ์งํ์ฒ ๋์ฐฉ ์ ๋ณด (์์ธ ์ด๋ฆฐ๋ฐ์ดํฐ๊ด์ฅ)
์ฅ์ ๊ฒ์ ("์ฑ์ ๊ทผ์ฒ ์นดํ", "์ง๊ธ ๋ฌธ ์ฐ ์ฝ๊ตญ"), ์นด์นด์ค ๋ก์ปฌ API ์ฌ์ฉ
๋ฒ์ค๋ฅผ ํฌํจํ ์ถ๋ฐ์งโ๋์ฐฉ์ง ๊ฒฝ๋ก (ODsay)
์ค์น ์์ด ์ฐ๋ ์๊ฒฉ ์๋ฒ
๋ถ์ฐยท๋๊ตฌยท๋์ ยท๊ด์ฃผ ๋์์ฒ ๋
์ฅ๊ธฐ ์ฒด๋ฅ์์ฉ ๊ฐ์ด๋: ์ธ๊ตญ์ธ๋ฑ๋ก์ฆ, ์ํ ๊ณ์ข, ํด๋ํฐ ๊ฐํต, ๊ฑด๊ฐ๋ณดํ
ํค ์ฌ์ฉ ๋ฐฉ์์ docs/api-keys.md๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๊ฐ๋ฐ
npm install
npm test # ๊ฒฝ๋กยท์๊ธยท๊ณตํด์ผ ํ
์คํธ
npm run dev # tsx๋ก ์๋ฒ ์คํ
npm run data:subway # OpenStreetMap์์ data/subway.json ๋ค์ ์์ฑ์ด์์ PR์ ํ๊ตญ์ด๋ก ๋จ๊ธฐ์ ๋ ๋ฉ๋๋ค. ์์ด ์ญ๋ช ์ค๋ฅ, ๋น ์ง ๋ ธ์ , ๊ฐ์ด๋ ๋ด์ฉ ๋ณด์ ๊ฐ์ ๊ธฐ์ฌ๋ฅผ ํนํ ํ์ํด์.
์ฐธ๊ณ ํ๋ก์ ํธ
์ด ๋ถ์ผ๋ฅผ ๋จผ์ ๋ค๋ฃฌ ํ๋ก์ ํธ๋ค์ ๋๋ค. ์์ Credits ๋ชฉ๋ก์ ์ฐธ๊ณ ํ์ธ์.
๋ผ์ด์ ์ค
์ฝ๋๋ MIT, ์งํ์ฒ ๋ฐ์ดํฐ๋ ยฉ OpenStreetMap contributors์ด๋ฉฐ ODbL 1.0์ ๋ฐ๋ฆ ๋๋ค.
Available Tools
4 toolskorea_guidePractical Korea guideA
Short, practical guides for visitors and foreign residents in Korea. Topics: airport, apps, emergency, transit-card.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | 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 discloses that the output is 'short, practical guides' (implying static reference content, not live/mutating data), which is useful, but it says nothing about language, format, or personalization.
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?
Two sentences with zero filler; the purpose is front-loaded and the topic enumeration follows immediately. Every element earns its place.
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?
For a simple one-enum-parameter lookup tool with no output schema and no annotations, the description is nearly sufficient: it tells the agent what comes back and what topics exist. Minor gaps remain around output format and language, but nothing critical for correct invocation is missing.
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 0%, but the single parameter is an enum whose values the description simply restates ('airport, apps, emergency, transit-card'). The enum values are largely self-descriptive, so the description adds little semantic depth beyond the schema's own enum list.
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?
States a specific resource (short, practical guides for visitors and foreign residents in Korea) with a clear verb-implied action of retrieving them. The topic list further scopes the content. It does not explicitly contrast itself with siblings like subway_route or korea_holidays, but the topic framing makes its domain distinct.
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?
Usage is implied by 'for visitors and foreign residents' and the topic list, but there is no explicit when-to-use, when-not, or routing to siblings such as subway_route for transit directions or korea_holidays for holidays. An agent can infer the context but must decide on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
korea_holidaysKorean public holidaysA
List South Korean public holidays (including substitute holidays) in a date range, or check whether a date is a holiday. Useful for planning: many shops, banks and offices close, and transport is crowded around Seollal and Chuseok.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date YYYY-MM-DD. Default: 365 days after start. | |
| date | No | Check a single date instead of a range. | |
| from | No | Start date YYYY-MM-DD. Default: today in Korea. |
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 usefully discloses a non-obvious behavioral trait โ substitute holidays are included โ and that the tool has two modes (range vs single-date check). However, it says nothing about precedence when both 'date' and 'from'/'to' are supplied, timezone handling, or whether the range returns every calendar day or only holiday entries, which matters for a zero-annotation tool.
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?
Two sentences with no filler: the first defines the action and modes, the second justifies usage. The critical capability statement is front-loaded, and no sentence restates the tool name or title.
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?
For a simple read-only lookup with three optional, fully documented parameters and no output schema, the description covers purpose, scope, and practical relevance adequately. The remaining gap โ what happens if 'date' and 'from'/'to' are combined, and the shape of returned holiday records โ is minor but non-zero, so this falls short of 5.
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%, so the schema already documents all three parameters including their defaults and date format. The description's split between 'date range' and 'check a single date' maps onto the schema's two modes but adds no format, default, or precedence detail beyond it. Baseline 3 applies when the schema does the heavy lifting.
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?
States specific verbs and resource: lists South Korean public holidays in a date range, or checks a single date. It also names the scope qualifier 'including substitute holidays' and 'South Korean', which cleanly separates it from the unrelated siblings (subway_route, subway_station, korea_guide). The two operating modes are stated up front so an agent can pick the right invocation mode without opening the schema.
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?
Gives clear usage context ('useful for planning: many shops, banks and offices close, and transport is crowded around Seollal and Chuseok'), which tells the agent when this tool matters. It does not name alternatives or explicit exclusions, but the sibling tools are unrelated domains, so no routing ambiguity exists. Clear context without the 'when-not' clause keeps this at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
subway_routeSubway routeA
Plan a subway/metro trip in the Seoul Metropolitan Area (Seoul, Incheon, Gyeonggi) between two stations. Accepts station names in English, Korean, Japanese or Chinese, plus common landmarks (Hongdae, COEX, Incheon Airport). Returns lines to take, where to transfer, which direction to board, estimated minutes and fare. Works offline, no API key.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Arrival station, e.g. 'Seongsu', '์ฑ์' | |
| from | Yes | Departure station, e.g. 'Myeongdong', '๋ช ๋', 'Incheon Airport T1' | |
| allow_express | No | Also consider express trains (Line 9, Line 1, SuinโBundangโฆ). Default false; express data is less complete. | |
| airport_express | No | Allow the AREX direct train (Seoul Station โ Incheon Airport), which needs a separate ticket. Default false. | |
| fewer_transfers | No | Prefer fewer transfers even if slightly slower. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden, and it does disclose the return contents (lines, transfer points, boarding direction, minutes, fare) and an operational trait (works offline, no API key). It omits error behavior for unrecognized or ambiguous station names and says nothing about data freshness for fares/times.
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?
Three sentences, zero waste: purpose and scope first, accepted inputs second, outputs and the offline capability third. Every sentence earns its place and the most important information is front-loaded.
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?
With no annotations and no output schema, the description compensates by describing both the operational model (offline, no key) and the return payload. For a read-only planning tool this covers everything an agent needs before calling it.
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 documents all five parameters and their defaults, putting the baseline at 3. The description adds genuine meaning by stating that station names are accepted in English, Korean, Japanese and Chinese and that landmarks like Hongdae, COEX and Incheon Airport are valid inputs โ helpful beyond the schema's example strings.
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 gives a specific verb and resource โ 'Plan a subway/metro trip ... between two stations' โ plus a precise geographic scope (Seoul, Incheon, Gyeonggi). It is functionally distinguishable from subway_station, but it never names or contrasts with any sibling tool, so it falls short of the top tier.
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?
Usage context is clear: this is the tool for trip planning within the Seoul Metropolitan Area, accepting multi-language station names and landmarks. However, there are no explicit exclusions (e.g., 'not for other cities') and no routing to alternatives such as subway_station.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
subway_stationFind subway stationA
Look up a Seoul-area subway station by name in English, Korean, Japanese or Chinese (typos tolerated). Returns official names in each language, the lines serving it and coordinates. Use this to translate station names.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Station name or landmark, e.g. 'gangnam', '๊ฐ๋จ', 'Hongdae' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses accepted input languages, that typos are tolerated, and what the response contains (names per language, lines, coordinates). It says nothing about error behavior for unknown stations or any rate/scope limits, so it stops short of fully covering the behavioral profile.
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?
Three short sentences, front-loaded with the lookup action and immediately followed by input tolerance, return contents, and the primary use case. No filler or repetition.
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?
There is no output schema, so the description supplies the return shape itself (per-language official names, serving lines, coordinates), and the single input parameter is fully covered by the schema. Nothing needed to invoke it correctly is missing.
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% for the single required query parameter, so the baseline is 3. The description adds value beyond the schema by stating that all four scripts are accepted and that typos are tolerated, which the schema description (examples only) does not convey.
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?
States a specific verb and resource ('look up a Seoul-area subway station by name') with a clear geographic scope. It implicitly separates itself from subway_route by focusing on name lookup rather than trip planning, but it never names or contrasts a sibling explicitly.
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?
One usage cue is given: 'Use this to translate station names.' That implies the intended scenario but offers no when-not guidance and does not mention how it relates to subway_route or korea_guide when an agent is choosing between them.
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.
4 tool updates
v0.1.0- First observed
korea_guide - First observed
korea_holidays - First observed
subway_route - First observed
subway_station
TDQS
Scored across 4 tools
Each tool targets a clearly distinct purpose: subway_route plans a trip, subway_station retrieves station metadata, korea_holidays handles public holiday queries, and korea_guide provides topical guides. There is no overlap in intent, so an agent can easily select the right tool.
All tool names follow a consistent snake_case pattern with a domain prefix and a noun (subway_route, subway_station, korea_holidays, korea_guide). The convention is predictable and readable throughout.
Four tools fall comfortably within the ideal 3โ15 range, and each earns its place by covering a distinct aspect of the Korea travel domain. The set is focused without feeling thin or bloated.
The surface covers core subway navigation, station lookup, holidays, and practical guide topics, which handles many visitor needs. However, broader Korea coverage (e.g., buses, intercity rail, weather) is absent, leaving minor gaps that agents may need to work around.
Maintenance
Related MCP Connectors
Hong Kong public transport trips (MTR, bus, minibus, ferry), live times, fares and border queues.
Korea tide times (42 stations) plus fishing, mudflat, beach, surf and scuba forecasts.
Seoul Open Data MCP โ city data for Seoul via the Seoul Open Data Plaza API
Korea travel & K-pop live data for agents: concerts, Seoul trip packs, crowd, subway, airport.
Related MCP Servers
- AlicenseBqualityDmaintenanceProvides access to Seoul public data including subway passenger statistics and cultural event information through a Model Context Protocol server.21MIT
- AlicenseNot gradedqualityBmaintenanceProvides real-time NYC subway information including train arrivals, station search, service alerts, and nearby station finder using live MTA data with intelligent location handling.7MIT
- AlicenseAqualityDmaintenanceProvides real-time Korean subway information including station search and train timetables through the TAGO API from Korea's Ministry of Land, Infrastructure and Transport.328 npm1MIT
- FlicenseNot gradedqualityCmaintenance22,000+ public facility data for foreign tourists in Seoul โ restrooms, pharmacies, WiFi, AEDs, tourist info centers, and subway timetables. Bilingual (Korean/English).-