Back to Skills
    ๐Ÿฆž

    seoul-subway

    Seoul Subway assistant for real-time arrivals, route planning

    By @dukbong
    View on GitHub
    SKILL.md
    ---
    name: seoul-subway
    description: Seoul Subway assistant for real-time arrivals, route planning, and service alerts (Korean/English)
    model: sonnet
    metadata: {"moltbot":{"emoji":"๐Ÿš‡","requires":{"bins":["curl","jq"]}}}
    homepage: https://github.com/dukbong/seoul-subway
    user-invocable: true
    ---
    
    # Seoul Subway Skill
    
    Query real-time Seoul Subway information. **No API key required** - uses proxy server.
    
    ## Features
    
    | Feature | Description | Trigger Example (KO) | Trigger Example (EN) |
    |---------|-------------|----------------------|----------------------|
    | Real-time Arrival | Train arrival times by station | "๊ฐ•๋‚จ์—ญ ๋„์ฐฉ์ •๋ณด" | "Gangnam station arrivals" |
    | Station Search | Line and station code lookup | "๊ฐ•๋‚จ์—ญ ๋ช‡ํ˜ธ์„ ?" | "What line is Gangnam?" |
    | Route Search | Shortest path with time/fare | "์‹ ๋„๋ฆผ์—์„œ ์„œ์šธ์—ญ" | "Sindorim to Seoul Station" |
    | Service Alerts | Delays, incidents, non-stops | "์ง€ํ•˜์ฒ  ์ง€์—ฐ ์žˆ์–ด?" | "Any subway delays?" |
    | **Last Train** | Last train times by station | "ํ™๋Œ€ ๋ง‰์ฐจ ๋ช‡ ์‹œ์•ผ?" | "Last train to Hongdae?" |
    | **Exit Info** | Exit numbers for landmarks | "์ฝ”์—‘์Šค ๋ช‡ ๋ฒˆ ์ถœ๊ตฌ?" | "Which exit for COEX?" |
    | **Accessibility** | Elevators, escalators, wheelchair lifts | "๊ฐ•๋‚จ์—ญ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ" | "Gangnam elevators" |
    | **Quick Exit** | Best car for facilities | "๊ฐ•๋‚จ์—ญ ๋น ๋ฅธํ•˜์ฐจ" | "Gangnam quick exit" |
    | **Restrooms** | Restroom locations | "๊ฐ•๋‚จ์—ญ ํ™”์žฅ์‹ค" | "Gangnam restrooms" |
    
    ### Natural Language Triggers / ์ž์—ฐ์–ด ํŠธ๋ฆฌ๊ฑฐ
    
    ๋‹ค์–‘ํ•œ ์ž์—ฐ์–ด ํ‘œํ˜„์„ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค:
    
    #### Real-time Arrival / ์‹ค์‹œ๊ฐ„ ๋„์ฐฉ
    | English | ํ•œ๊ตญ์–ด |
    |---------|--------|
    | "When's the next train at Gangnam?" | "๊ฐ•๋‚จ ๋ช‡ ๋ถ„ ๋‚จ์•˜์–ด?" |
    | "Trains at Gangnam" | "๊ฐ•๋‚จ ์—ด์ฐจ" |
    | "Gangnam arrivals" | "๊ฐ•๋‚จ ์–ธ์ œ ์™€?" |
    | "Next train to Gangnam" | "๋‹ค์Œ ์—ด์ฐจ ๊ฐ•๋‚จ" |
    
    #### Route Search / ๊ฒฝ๋กœ ๊ฒ€์ƒ‰
    | English | ํ•œ๊ตญ์–ด |
    |---------|--------|
    | "How do I get to Seoul Station from Gangnam?" | "๊ฐ•๋‚จ์—์„œ ์„œ์šธ์—ญ ์–ด๋–ป๊ฒŒ ๊ฐ€?" |
    | "Gangnam โ†’ Seoul Station" | "๊ฐ•๋‚จ โ†’ ์„œ์šธ์—ญ" |
    | "Gangnam to Seoul Station" | "๊ฐ•๋‚จ์—์„œ ์„œ์šธ์—ญ ๊ฐ€๋Š” ๊ธธ" |
    | "Route from Gangnam to Hongdae" | "๊ฐ•๋‚จ๋ถ€ํ„ฐ ํ™๋Œ€๊นŒ์ง€" |
    
    #### Service Alerts / ์šดํ–‰ ์•Œ๋ฆผ
    | English | ํ•œ๊ตญ์–ด |
    |---------|--------|
    | "Is Line 2 running normally?" | "2ํ˜ธ์„  ์ •์ƒ ์šดํ–‰ํ•ด?" |
    | "Any delays on Line 1?" | "1ํ˜ธ์„  ์ง€์—ฐ ์žˆ์–ด?" |
    | "Subway status" | "์ง€ํ•˜์ฒ  ์ƒํ™ฉ" |
    | "Line 3 alerts" | "3ํ˜ธ์„  ์•Œ๋ฆผ" |
    
    #### Last Train / ๋ง‰์ฐจ ์‹œ๊ฐ„
    | English | ํ•œ๊ตญ์–ด |
    |---------|--------|
    | "Last train to Gangnam?" | "๊ฐ•๋‚จ ๋ง‰์ฐจ ๋ช‡ ์‹œ์•ผ?" |
    | "When is the last train at Hongdae?" | "ํ™๋Œ€์ž…๊ตฌ ๋ง‰์ฐจ ์‹œ๊ฐ„" |
    | "Final train to Seoul Station" | "์„œ์šธ์—ญ ๋ง‰์ฐจ" |
    | "Last train on Saturday?" | "ํ† ์š”์ผ ๋ง‰์ฐจ ์‹œ๊ฐ„" |
    
    #### Exit Info / ์ถœ๊ตฌ ์ •๋ณด
    | English | ํ•œ๊ตญ์–ด |
    |---------|--------|
    | "Which exit for COEX?" | "์ฝ”์—‘์Šค ๋ช‡ ๋ฒˆ ์ถœ๊ตฌ?" |
    | "Exit for Lotte World" | "๋กฏ๋ฐ์›”๋“œ ์ถœ๊ตฌ" |
    | "DDP which exit?" | "DDP ๋ช‡ ๋ฒˆ ์ถœ๊ตฌ?" |
    | "Gyeongbokgung Palace exit" | "๊ฒฝ๋ณต๊ถ ๋‚˜๊ฐ€๋Š” ์ถœ๊ตฌ" |
    
    #### Accessibility / ์ ‘๊ทผ์„ฑ ์ •๋ณด
    | English | ํ•œ๊ตญ์–ด |
    |---------|--------|
    | "Gangnam station elevators" | "๊ฐ•๋‚จ์—ญ ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ" |
    | "Escalators at Seoul Station" | "์„œ์šธ์—ญ ์—์Šค์ปฌ๋ ˆ์ดํ„ฐ" |
    | "Wheelchair lifts at Jamsil" | "์ž ์‹ค์—ญ ํœ ์ฒด์–ด๋ฆฌํ”„ํŠธ" |
    | "Accessibility info for Hongdae" | "ํ™๋Œ€์ž…๊ตฌ ์ ‘๊ทผ์„ฑ ์ •๋ณด" |
    
    #### Quick Exit / ๋น ๋ฅธํ•˜์ฐจ
    | English | ํ•œ๊ตญ์–ด |
    |---------|--------|
    | "Quick exit at Gangnam" | "๊ฐ•๋‚จ์—ญ ๋น ๋ฅธํ•˜์ฐจ" |
    | "Which car for elevator?" | "์—˜๋ฆฌ๋ฒ ์ดํ„ฐ ๋ช‡ ๋ฒˆ์งธ ์นธ?" |
    | "Best car for exit 3" | "3๋ฒˆ ์ถœ๊ตฌ ๊ฐ€๊นŒ์šด ์นธ" |
    | "Fastest exit at Samsung" | "์‚ผ์„ฑ์—ญ ๋น ๋ฅธ ํ•˜์ฐจ ์œ„์น˜" |
    
    #### Restrooms / ํ™”์žฅ์‹ค
    | English | ํ•œ๊ตญ์–ด |
    |---------|--------|
    | "Restrooms at Gangnam" | "๊ฐ•๋‚จ์—ญ ํ™”์žฅ์‹ค" |
    | "Where's the bathroom at Myeongdong?" | "๋ช…๋™์—ญ ํ™”์žฅ์‹ค ์–ด๋””์•ผ?" |
    | "Accessible restroom at Seoul Station" | "์„œ์šธ์—ญ ์žฅ์• ์ธ ํ™”์žฅ์‹ค" |
    | "Baby changing station at Jamsil" | "์ž ์‹ค์—ญ ๊ธฐ์ €๊ท€ ๊ตํ™˜๋Œ€" |
    
    ---
    
    ## First Time Setup / ์ฒซ ์‚ฌ์šฉ ์•ˆ๋‚ด
    
    When you first use this skill, you'll see a permission prompt for the proxy domain.
    
    ์ฒ˜์Œ ์‚ฌ์šฉ ์‹œ ํ”„๋ก์‹œ ๋„๋ฉ”์ธ ์ ‘๊ทผ ํ™•์ธ ์ฐฝ์ด ๋œน๋‹ˆ๋‹ค.
    
    **Select / ์„ ํƒ:** `Yes, and don't ask again for vercel-proxy-henna-eight.vercel.app`
    
    This only needs to be done once. / ํ•œ ๋ฒˆ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    
    ---
    
    ## Proxy API Reference
    
    All API calls go through the proxy server. No API keys needed for users.
    
    ### Base URL
    
    ```
    https://vercel-proxy-henna-eight.vercel.app
    ```
    
    ### 1. Real-time Arrival Info
    
    **Endpoint**
    ```
    GET /api/realtime/{station}?start=0&end=10
    ```
    
    **Parameters**
    
    | Parameter | Required | Description |
    |-----------|----------|-------------|
    | station | Yes | Station name (Korean, URL-encoded) |
    | start | No | Start index (default: 0) |
    | end | No | End index (default: 10) |
    | format | No | `formatted` (markdown, default) or `raw` (JSON) |
    | lang | No | `ko` (default) or `en` |
    
    **Response Fields**
    
    | Field | Description |
    |-------|-------------|
    | `subwayId` | Line ID (1002=Line 2, 1077=Sinbundang) |
    | `trainLineNm` | Direction (e.g., "์„ฑ์ˆ˜ํ–‰ - ์—ญ์‚ผ๋ฐฉ๋ฉด") |
    | `arvlMsg2` | Arrival time (e.g., "4๋ถ„ 20์ดˆ ํ›„") |
    | `arvlMsg3` | Current location |
    | `isFastTrain` | Fast train flag (1=๊ธ‰ํ–‰) |
    
    **Example**
    ```bash
    curl "https://vercel-proxy-henna-eight.vercel.app/api/realtime/๊ฐ•๋‚จ"
    ```
    
    ---
    
    ### 2. Station Search
    
    **Endpoint**
    ```
    GET /api/stations?station={name}&start=1&end=10
    ```
    
    **Parameters**
    
    | Parameter | Required | Description |
    |-----------|----------|-------------|
    | station | Yes | Station name to search |
    | start | No | Start index (default: 1) |
    | end | No | End index (default: 10) |
    
    **Response Fields**
    
    | Field | Description |
    |-------|-------------|
    | `STATION_CD` | Station code |
    | `STATION_NM` | Station name |
    | `LINE_NUM` | Line name (e.g., "02ํ˜ธ์„ ") |
    | `FR_CODE` | External station code |
    
    **Example**
    ```bash
    curl "https://vercel-proxy-henna-eight.vercel.app/api/stations?station=๊ฐ•๋‚จ"
    ```
    
    ---
    
    ### 3. Route Search
    
    **Endpoint**
    ```
    GET /api/route?dptreStnNm={departure}&arvlStnNm={arrival}
    ```
    
    **Parameters**
    
    | Parameter | Required | Description |
    |-----------|----------|-------------|
    | dptreStnNm | Yes | Departure station |
    | arvlStnNm | Yes | Arrival station |
    | searchDt | No | Datetime (yyyy-MM-dd HH:mm:ss) |
    | searchType | No | duration / distance / transfer |
    | format | No | `formatted` (markdown, default) or `raw` (JSON) |
    | lang | No | `ko` (default) or `en` |
    
    **Response Fields**
    
    | Field | Description |
    |-------|-------------|
    | `totalDstc` | Total distance (m) |
    | `totalreqHr` | Total time (seconds) |
    | `totalCardCrg` | Fare (KRW) |
    | `paths[].trainno` | Train number |
    | `paths[].trainDptreTm` | Departure time |
    | `paths[].trainArvlTm` | Arrival time |
    | `paths[].trsitYn` | Transfer flag |
    
    **Example**
    ```bash
    curl "https://vercel-proxy-henna-eight.vercel.app/api/route?dptreStnNm=์‹ ๋„๋ฆผ&arvlStnNm=์„œ์šธ์—ญ"
    ```
    
    ---
    
    ### 4. Service Alerts
    
    **Endpoint**
    ```
    GET /api/alerts?pageNo=1&numOfRows=10&format=enhanced
    ```
    
    **Parameters**
    
    | Parameter | Required | Description |
    |-----------|----------|-------------|
    | pageNo | No | Page number (default: 1) |
    | numOfRows | No | Results per page (default: 10) |
    | lineNm | No | Filter by line |
    | format | No | `default` or `enhanced` (structured response) |
    
    **Response Fields (Default)**
    
    | Field | Description |
    |-------|-------------|
    | `ntceNo` | Notice number |
    | `ntceSj` | Notice title |
    | `ntceCn` | Notice content |
    | `lineNm` | Line name |
    | `regDt` | Registration date |
    
    **Response Fields (Enhanced)**
    
    | Field | Description |
    |-------|-------------|
    | `summary.delayedLines` | Lines with delays |
    | `summary.suspendedLines` | Lines with service suspended |
    | `summary.normalLines` | Lines operating normally |
    | `alerts[].lineName` | Line name (Korean) |
    | `alerts[].lineNameEn` | Line name (English) |
    | `alerts[].status` | `normal`, `delayed`, or `suspended` |
    | `alerts[].severity` | `low`, `medium`, or `high` |
    | `alerts[].title` | Alert title |
    
    **Example**
    ```bash
    # Default format
    curl "https://vercel-proxy-henna-eight.vercel.app/api/alerts"
    
    # Enhanced format with status summary
    curl "https://vercel-proxy-henna-eight.vercel.app/api/alerts?format=enhanced"
    ```
    
    ---
    
    ### 5. Last Train Time
    
    > **์ฐธ๊ณ :** ์ด API๋Š” ์ฃผ์š” ์—ญ 77๊ฐœ์˜ ๋ง‰์ฐจ ์‹œ๊ฐ„์„ ์ •์  ๋ฐ์ดํ„ฐ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    > ์„œ์šธ๊ตํ†ต๊ณต์‚ฌ 2025๋…„ 1์›” ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.
    >
    > **์ง€์› ์—ญ (77๊ฐœ):**
    > ๊ฐ€์‚ฐ๋””์ง€ํ„ธ๋‹จ์ง€, ๊ฐ•๋‚จ, ๊ฐ•๋‚จ๊ตฌ์ฒญ, ๊ฐ•๋ณ€, ๊ฑด๋Œ€์ž…๊ตฌ, ๊ฒฝ๋ณต๊ถ, ๊ณ ์†ํ„ฐ๋ฏธ๋„, ๊ณต๋•, ๊ด‘๋‚˜๋ฃจ, ๊ด‘ํ™”๋ฌธ, ๊ต๋Œ€, ๊ตฌ๋กœ, ๊ตฐ์ž, ๊น€ํฌ๊ณตํ•ญ, ๋…ธ๋Ÿ‰์ง„, ๋‹น์‚ฐ, ๋Œ€๋ฆผ, ๋™๋Œ€๋ฌธ, ๋™๋Œ€๋ฌธ์—ญ์‚ฌ๋ฌธํ™”๊ณต์›, ๋””์ง€ํ„ธ๋ฏธ๋””์–ด์‹œํ‹ฐ, ๋š์„ฌ, ๋งˆํฌ๊ตฌ์ฒญ, ๋ช…๋™, ๋ชจ๋ž€, ๋ชฝ์ดŒํ† ์„ฑ, ๋ณต์ •, ๋ถˆ๊ด‘, ์‚ฌ๊ฐ€์ •, ์‚ฌ๋‹น, ์‚ผ๊ฐ์ง€, ์‚ผ์„ฑ, ์ƒ๋ด‰, ์„œ์šธ๋Œ€์ž…๊ตฌ, ์„œ์šธ์—ญ, ์„ ๋ฆ‰, ์„ฑ์ˆ˜, ์ˆ˜์œ , ์‹œ์ฒญ, ์‹ ๋…ผํ˜„, ์‹ ๋‹น, ์‹ ๋„๋ฆผ, ์‹ ์‚ฌ, ์‹ ์ดŒ, ์•ˆ๊ตญ, ์••๊ตฌ์ •, ์•ฝ์ˆ˜, ์–‘์žฌ, ์—ฌ์˜๋„, ์—ญ์‚ผ, ์—ฐ์‹ ๋‚ด, ์˜๋“ฑํฌ, ์˜ฅ์ˆ˜, ์˜ฌ๋ฆผํ”ฝ๊ณต์›, ์™•์‹ญ๋ฆฌ, ์šฉ์‚ฐ, ์„์ง€๋กœ3๊ฐ€, ์„์ง€๋กœ4๊ฐ€, ์„์ง€๋กœ์ž…๊ตฌ, ์‘์•”, ์ด๋Œ€, ์ด์ดŒ, ์ดํƒœ์›, ์ธ์ฒœ๊ณตํ•ญ1ํ„ฐ๋ฏธ๋„, ์ธ์ฒœ๊ณตํ•ญ2ํ„ฐ๋ฏธ๋„, ์ž ์‹ค, ์ •์ž, ์ข…๊ฐ, ์ข…๋กœ3๊ฐ€, ์ข…ํ•ฉ์šด๋™์žฅ, ์ฒœํ˜ธ, ์ฒญ๋‹ด, ์ถฉ๋ฌด๋กœ, ํŒ๊ต, ํ•ฉ์ •, ํ˜œํ™”, ํ™๋Œ€์ž…๊ตฌ, ํšจ์ฐฝ๊ณต์›์•ž
    
    **Endpoint**
    ```
    GET /api/last-train/{station}?direction=up&weekType=1
    ```
    
    **Parameters**
    
    | Parameter | Required | Description |
    |-----------|----------|-------------|
    | station | Yes | Station name (Korean or English) |
    | direction | No | `up`, `down`, or `all` (default: all) |
    | weekType | No | `1`=Weekday, `2`=Saturday, `3`=Sunday/Holiday (default: auto) |
    
    **Response Fields**
    
    | Field | Description |
    |-------|-------------|
    | `station` | Station name (Korean) |
    | `stationEn` | Station name (English) |
    | `lastTrains[].direction` | Direction (Korean) |
    | `lastTrains[].directionEn` | Direction (English) |
    | `lastTrains[].time` | Last train time (HH:MM) |
    | `lastTrains[].weekType` | Day type (Korean) |
    | `lastTrains[].weekTypeEn` | Day type (English) |
    | `lastTrains[].line` | Line name |
    | `lastTrains[].lineEn` | Line name (English) |
    | `lastTrains[].destination` | Final destination |
    | `lastTrains[].destinationEn` | Destination (English) |
    
    **Example**
    ```bash
    # Auto-detect day type
    curl "https://vercel-proxy-henna-eight.vercel.app/api/last-train/ํ™๋Œ€์ž…๊ตฌ"
    
    # English station name
    curl "https://vercel-proxy-henna-eight.vercel.app/api/last-train/Hongdae"
    
    # Specific direction and day
    curl "https://vercel-proxy-henna-eight.vercel.app/api/last-train/๊ฐ•๋‚จ?direction=up&weekType=1"
    ```
    
    ---
    
    ### 6. Exit Information
    
    > **์ฐธ๊ณ :** ์ด API๋Š” ์ฃผ์š” ์—ญ 77๊ฐœ์˜ ์ถœ๊ตฌ ์ •๋ณด๋ฅผ ์ •์  ๋ฐ์ดํ„ฐ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    >
    > **์ง€์› ์—ญ (77๊ฐœ):**
    > ๊ฐ€์‚ฐ๋””์ง€ํ„ธ๋‹จ์ง€, ๊ฐ•๋‚จ, ๊ฐ•๋‚จ๊ตฌ์ฒญ, ๊ฐ•๋ณ€, ๊ฑด๋Œ€์ž…๊ตฌ, ๊ฒฝ๋ณต๊ถ, ๊ณ ์†ํ„ฐ๋ฏธ๋„, ๊ณต๋•, ๊ด‘๋‚˜๋ฃจ, ๊ด‘ํ™”๋ฌธ, ๊ต๋Œ€, ๊ตฌ๋กœ, ๊ตฐ์ž, ๊น€ํฌ๊ณตํ•ญ, ๋…ธ๋Ÿ‰์ง„, ๋‹น์‚ฐ, ๋Œ€๋ฆผ, ๋™๋Œ€๋ฌธ, ๋™๋Œ€๋ฌธ์—ญ์‚ฌ๋ฌธํ™”๊ณต์›, ๋””์ง€ํ„ธ๋ฏธ๋””์–ด์‹œํ‹ฐ, ๋š์„ฌ, ๋งˆํฌ๊ตฌ์ฒญ, ๋ช…๋™, ๋ชจ๋ž€, ๋ชฝ์ดŒํ† ์„ฑ, ๋ณต์ •, ๋ถˆ๊ด‘, ์‚ฌ๊ฐ€์ •, ์‚ฌ๋‹น, ์‚ผ๊ฐ์ง€, ์‚ผ์„ฑ, ์ƒ๋ด‰, ์„œ์šธ๋Œ€์ž…๊ตฌ, ์„œ์šธ์—ญ, ์„ ๋ฆ‰, ์„ฑ์ˆ˜, ์ˆ˜์œ , ์‹œ์ฒญ, ์‹ ๋…ผํ˜„, ์‹ ๋‹น, ์‹ ๋„๋ฆผ, ์‹ ์‚ฌ, ์‹ ์ดŒ, ์•ˆ๊ตญ, ์••๊ตฌ์ •, ์•ฝ์ˆ˜, ์–‘์žฌ, ์—ฌ์˜๋„, ์—ญ์‚ผ, ์—ฐ์‹ ๋‚ด, ์˜๋“ฑํฌ, ์˜ฅ์ˆ˜, ์˜ฌ๋ฆผํ”ฝ๊ณต์›, ์™•์‹ญ๋ฆฌ, ์šฉ์‚ฐ, ์„์ง€๋กœ3๊ฐ€, ์„์ง€๋กœ4๊ฐ€, ์„์ง€๋กœ์ž…๊ตฌ, ์‘์•”, ์ด๋Œ€, ์ด์ดŒ, ์ดํƒœ์›, ์ธ์ฒœ๊ณตํ•ญ1ํ„ฐ๋ฏธ๋„, ์ธ์ฒœ๊ณตํ•ญ2ํ„ฐ๋ฏธ๋„, ์ž ์‹ค, ์ •์ž, ์ข…๊ฐ, ์ข…๋กœ3๊ฐ€, ์ข…ํ•ฉ์šด๋™์žฅ, ์ฒœํ˜ธ, ์ฒญ๋‹ด, ์ถฉ๋ฌด๋กœ, ํŒ๊ต, ํ•ฉ์ •, ํ˜œํ™”, ํ™๋Œ€์ž…๊ตฌ, ํšจ์ฐฝ๊ณต์›์•ž
    
    **Endpoint**
    ```
    GET /api/exits/{station}
    ```
    
    **Parameters**
    
    | Parameter | Require
    
    ... (truncated)