Skip to main content
Glama

korea-mcp 🇰🇷

npm License: MIT korea-mcp MCP server

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.

If korea-mcp helped you get around, a ⭐ helps other travelers find it.

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.

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.

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.

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.

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

ActivityNo data
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers