Skip to main content
Glama

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.

korea-mcp answering subway routes from Myeongdong to Seongsu and from Gangnam to Gyeongbokgung

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-mcp

Claude 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

subway_route

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.

subway_station

Look up and translate a station name. Returns every language, the lines that serve it and coordinates.

korea_holidays

Public holidays in a date range, or "is this date a holiday?". Includes substitute holidays and the 2026 additions (Labour Day, Constitution Day).

korea_guide

Practical guides: transit-card, airport, emergency, apps.

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 OpenStreetMap

The 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.

These projects explored parts of this space first. Go give them a star:

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-mcp

Claude Desktop ์›ํด๋ฆญ ์„ค์น˜. korea-mcp.mcpb๋ฅผ ๋‚ด๋ ค๋ฐ›์•„ ์—ด๋ฉด Claude Desktop์— ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

Claude Desktop(์ง์ ‘ ์„ค์ •), Cursor ๋“ฑ. MCP ์„ค์ • ํŒŒ์ผ์— ์•„๋ž˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

{
  "mcpServers": {
    "korea": {
      "command": "npx",
      "args": ["-y", "korea-mcp"]
    }
  }
}

Node.js 20 ์ด์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋„๊ตฌ

๋„๊ตฌ

๊ธฐ๋Šฅ

subway_route

๋‘ ์—ญ ์‚ฌ์ด ๊ฒฝ๋กœ: ๋…ธ์„ , ํ™˜์Šน์—ญ, ํƒˆ ์Šน๊ฐ•์žฅ, ์ •๊ฑฐ์žฅ ์ˆ˜, ์˜ˆ์ƒ ์‹œ๊ฐ„, ์š”๊ธˆ. ์˜์–ดยทํ•œ๊ตญ์–ดยท์ผ๋ณธ์–ดยท์ค‘๊ตญ์–ด ์—ญ๋ช…๊ณผ ๋žœ๋“œ๋งˆํฌ("Hongdae", "COEX")๋ฅผ ์•Œ์•„๋“ฃ๊ณ , ์˜คํƒ€๋„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

subway_station

์—ญ ๊ฒ€์ƒ‰๊ณผ ์—ญ๋ช… ๋ฒˆ์—ญ. ์–ธ์–ด๋ณ„ ์ด๋ฆ„, ์ง€๋‚˜๋Š” ๋…ธ์„ , ์ขŒํ‘œ๋ฅผ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

korea_holidays

๊ธฐ๊ฐ„ ๋‚ด ๊ณตํœด์ผ ์กฐํšŒ, ํŠน์ • ๋‚ ์งœ๊ฐ€ ๊ณตํœด์ผ์ธ์ง€ ํ™•์ธ. ๋Œ€์ฒด๊ณตํœด์ผ๊ณผ 2026๋…„์— ์ƒˆ๋กœ ์ƒ๊ธด ๋…ธ๋™์ ˆยท์ œํ—Œ์ ˆ๋„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

korea_guide

์ƒํ™œ ๊ฐ€์ด๋“œ: transit-card(๊ตํ†ต์นด๋“œ), airport(๊ณตํ•ญ), emergency(๊ธด๊ธ‰์ „ํ™”), apps(์•ฑ)

์ •ํ™•๋„

  • ์—ญ ์ˆœ์„œ์™€ ํ™˜์Šน ์ •๋ณด๋Š” 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 tools
korea_guidePractical Korea guideA

Short, practical guides for visitors and foreign residents in Korea. Topics: airport, apps, emergency, transit-card.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoEnd date YYYY-MM-DD. Default: 365 days after start.
dateNoCheck a single date instead of a range.
fromNoStart date YYYY-MM-DD. Default: today in Korea.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesArrival station, e.g. 'Seongsu', '์„ฑ์ˆ˜'
fromYesDeparture station, e.g. 'Myeongdong', '๋ช…๋™', 'Incheon Airport T1'
allow_expressNoAlso consider express trains (Line 9, Line 1, Suinโ€“Bundangโ€ฆ). Default false; express data is less complete.
airport_expressNoAllow the AREX direct train (Seoul Station โ†” Incheon Airport), which needs a separate ticket. Default false.
fewer_transfersNoPrefer fewer transfers even if slightly slower.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesStation name or landmark, e.g. 'gangnam', '๊ฐ•๋‚จ', 'Hongdae'

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 4 tool updatesv0.1.0
    • First observedkorea_guide
    • First observedkorea_holidays
    • First observedsubway_route
    • First observedsubway_station

TDQS

A4.1/5.0

Scored across 4 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers