Handles door-to-door Korean transit routing using ODsay LIVE API with Kakao geocoding, so you can ask Claude for subway, bus, and walking directions between any two addresses in Korea. It geocodes your start and end points first (because ODsay only accepts coordinates), then returns up to three routes with total time, fare, transfer count, and step-by-step segments including the walking portions from your door to the first station and last station to destination. The setup requires an ODsay API key with IP whitelisting, but Kakao geocoding runs through a hosted proxy so you don't need your own key there. Good for anyone building Korean transit tools or bots, though watch the 1,000 daily call limit on the free tier.
npx -y skills add nomadamas/k-skill --skill korean-transit-route --agent claude-codeInstalls into .claude/skills of the current project.
한국 대중교통(지하철+버스+도보) 도어투도어 길찾기 스킬. ODsay LIVE API + Kakao Local geocoding.
ODSAY_API_KEY 가 있으면 사용. 없으면 ~/.config/k-skill/secrets.env 에서 로드.k-skill-proxy 경유로 호출하므로 사용자 쪽 KAKAO_REST_API_KEY 는 불필요하다. self-host proxy 운영자만 KAKAO_REST_API_KEY 를 서버에 설정한다.자연어 입력에서 출발/도착을 추출. 좌표가 없으면 반드시 geocoding 먼저 (ODsay는 좌표만 받음).
기본 hosted proxy를 사용한다. Proxy가 Kakao Local REST API 키를 서버에서만 주입하고, caller apiKey 는 무시한다.
https://k-skill-proxy.nomadamas.org/v1/kakao-local/geocode?q=<주소/장소명>address.json → 결과 없으면 keyword.json응답 documents[0].x(경도), .y(위도) 사용.
import os, urllib.parse, urllib.request, json
PROXY=os.environ.get('KSKILL_PROXY_BASE_URL','https://k-skill-proxy.nomadamas.org').rstrip('/')
def geocode(q):
url=PROXY+'/v1/kakao-local/geocode?q='+urllib.parse.quote(q)
with urllib.request.urlopen(url,timeout=10) as resp:
d=json.loads(resp.read())
if d.get('documents'):
doc=d['documents'][0]
return float(doc['x']), float(doc['y']), doc.get('place_name') or doc.get('address_name')
return None
지하철역명만 정확히 알 때는 ODsay searchStation 도 OK 하지만, 도어투도어 결과를 원하면 실제 출발지/도착지 좌표를 써야 첫/끝 도보 구간이 계산됨.
set -a; . ~/.config/k-skill/secrets.env; set +a
KEY=$(python3 -c "import os,urllib.parse;print(urllib.parse.quote(os.environ['ODSAY_API_KEY'],safe=''))")
curl -s "https://api.odsay.com/v1/api/searchPubTransPathT?apiKey=${KEY}&SX=${SX}&SY=${SY}&EX=${EX}&EY=${EY}&OPT=0&SearchPathType=${TYPE}"
Parameters:
SX,SY 출발 경도/위도, EX,EY 도착 경도/위도 (WGS84)OPT: 0 추천순(기본), 4 최소시간, 5 최소환승SearchPathType: 0 지하철+버스, 1 지하철만, 2 버스만result.path[] 배열, 각 path:
pathType: 1=지하철, 2=버스, 3=지하철+버스info.totalTime(분), info.payment(원), info.subwayTransitCount, info.busTransitCount, info.totalWalk(m), info.firstStartStation, info.lastEndStationsubPath[]: 구간별. trafficType 1=지하철 2=버스 3=도보. 지하철이면 lane[0].name, startName, endName, passStopList.stations[](경유역)subPath 의 각 구간을 trafficType 별로 표시. 첫/끝 도보 구간은 출발지·도착지에서 역까지 실제 도보를 의미하므로 반드시 포함.
🚇 범안로95번길 32 → SKT타워
경로 1: 54분 · 1,950원 · 환승 2회 · 도보 688m
🚶 도보 1분
🚌 19번 부천범박힐스테이트 → 역곡역 (9분)
🚶 도보 2분
🚇 1호선 역곡 → 종각 (15정거장, 35분)
🚶 도보 7분
3개 이내 경로 비교 권장. OPT=4(최소시간) / OPT=5(최소환승) 옵션을 사용자가 선호 표시하면 그쪽으로 호출.
좌표 모르고 역명만 아는 경우 — searchStation 으로 변환:
curl -s "https://api.odsay.com/v1/api/searchStation?apiKey=${KEY}&stationName=강남&CID=1000"
CID=1000 = 수도권. 결과 result.station[].x,y 가 좌표.
searchPubTransPathT + searchStation 호출이 합산되니 한 질문당 호출 최소화.error 키 있으면 즉시 사용자에게 표시(ApiKey/IP 문제 진단에 유용).error 응답: msg 필드를 그대로 사용자에게 표시하고, ApiKey 미등록 또는 IP 화이트리스트 누락 가능성을 안내한다.juliusbrussee/caveman
mattpocock/skills
shadcn/improve
obra/superpowers
forrestchang/andrej-karpathy-skills
vercel-labs/skills