Skip to main content
Glama
mongle250129

korea-life-mcp

by mongle250129
README.md
# korea-life-mcp ๐Ÿ‡ฐ๐Ÿ‡ท

**ํ•œ๊ตญ ์ƒํ™œ ํŠนํ™” ์œ ํ‹ธ๋ฆฌํ‹ฐ MCP ์„œ๋ฒ„** โ€” ์นด์นด์˜ค **PlayMCP** ๊ณต๋ชจ์ „(MCP Player 10) ์ œ์ถœ์šฉ.

์™ธ๋ถ€ API ํ‚คยท๋„คํŠธ์›Œํฌยท๊ฐœ์ธ์ •๋ณด ์กฐํšŒ ์—†์ด **์™„์ „ํžˆ ์ž๊ธฐ์™„๊ฒฐํ˜•**์œผ๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ, MCP Inspector ๊ฒ€์ฆ๊ณผ ์‹ฌ์‚ฌ๊ฐ€ ๊ฐ„๋‹จํ•˜๊ณ  ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.

---

## ์ œ๊ณต ๋„๊ตฌ (15์ข…)

| ๋„๊ตฌ | ์„ค๋ช… | ์˜ˆ์‹œ |
|------|------|------|
| `decompose_hangul` | ํ•œ๊ธ€์„ ์ดˆ/์ค‘/์ข…์„ฑ์œผ๋กœ ๋ถ„ํ•ด | `๊ฐ’` โ†’ ใ„ฑ, ใ…, ใ…„ |
| `chosung` | ์ดˆ์„ฑ ๊ฒ€์ƒ‰์šฉ ๋ฌธ์ž์—ด ์ƒ์„ฑ | `ํ•œ๊ตญ์–ด` โ†’ `ใ…Žใ„ฑใ…‡` |
| `compose_hangul` | ์ž๋ชจ๋ฅผ ์™„์„ฑํ˜• ํ•œ๊ธ€๋กœ ์กฐํ•ฉ | ใ…Ž,ใ…,ใ„ด โ†’ `ํ•œ` |
| `romanize` | ๋กœ๋งˆ์ž ํ‘œ๊ธฐ(์ž์Œ๋™ํ™” ๋ฐ˜์˜) | `์ข…๋กœ` โ†’ `jongno` |
| `number_to_korean` | ์ˆซ์ž โ†’ ํ•œ๊ธ€ (์ฝ๊ธฐ/๊ธˆ์•ก ์ •์ž์ฒด) | `12345` โ†’ `์ผ๋งŒ์ด์ฒœ์‚ผ๋ฐฑ์‚ฌ์‹ญ์˜ค` |
| `korean_to_number` | ํ•œ๊ธ€ ๊ธˆ์•ก โ†’ ์ˆซ์ž | `์ผ๋งŒ์ด์ฒœ์‚ผ๋ฐฑ์‚ฌ์‹ญ์˜ค` โ†’ `12345` |
| `validate_business_number` | ์‚ฌ์—…์ž๋“ฑ๋ก๋ฒˆํ˜ธ ์ฒดํฌ์„ฌ ๊ฒ€์ฆ | `220-81-62517` โ†’ valid |
| `validate_rrn` | ์ฃผ๋ฏผ๋“ฑ๋ก๋ฒˆํ˜ธ ํ˜•์‹/์ฒดํฌ์„ฌ + ์ƒ๋…„์›”์ผยท์„ฑ๋ณ„ ์ถ”์ถœ | ํ˜•์‹ ๊ฒ€์ฆ๋งŒ (์กฐํšŒ X) |
| `korean_holidays` | ์—ฐ๋„๋ณ„ ๊ณตํœด์ผ ๋ชฉ๋ก | `2026` โ†’ ์‹ ์ •, ์„ค๋‚  โ€ฆ |
| `business_days_between` | ๋‘ ๋‚ ์งœ ์‚ฌ์ด ์˜์—…์ผ(์ฃผ๋งยท๊ณตํœด์ผ ์ œ์™ธ) ์ˆ˜ | |
| `d_day` | ๊ธฐ์ค€์ผโ†’๋ชฉํ‘œ์ผ D-day ๊ณ„์‚ฐ | `D-6` |
| `format_phone_number` | ์ „ํ™”๋ฒˆํ˜ธ ํฌ๋งท + ์ข…๋ฅ˜/์ง€์—ญ ํŒ๋ณ„ | `0212345678` โ†’ ์„œ์šธ, `02-1234-5678` |
| `area_convert` | ๋ฉด์  ํ‰โ†”ใŽก ๋ณ€ํ™˜ | `34ํ‰` โ†’ `112.4ใŽก` |
| `korean_age` | ๋งŒ ๋‚˜์ดยท์—ฐ ๋‚˜์ดยท์„ธ๋Š”๋‚˜์ด ๊ณ„์‚ฐ | ์ƒ๋…„์›”์ผ+๊ธฐ์ค€์ผ |
| `won_format` | ์›ํ™” ์ฒœ ๋‹จ์œ„ ํฌ๋งท | `1234567` โ†’ `โ‚ฉ1,234,567` |

> โš ๏ธ **๊ฐœ์ธ์ •๋ณด ์•ˆ์ „**: `validate_rrn`์€ ์–ด๋–ค ์™ธ๋ถ€ ์กฐํšŒ๋„ ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ž…๋ ฅ๋œ ๋ฒˆํ˜ธ์˜ **ํ˜•์‹ยท์ฒดํฌ์„ฌ๋งŒ** ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

---

## 1. ์„ค์น˜ & ๋กœ์ปฌ ์‹คํ–‰

```bash
# ์˜์กด์„ฑ ์„ค์น˜
pip install -r requirements.txt        # ๋˜๋Š”: pip install mcp

# (a) ๋กœ์ปฌ ๊ฐœ๋ฐœ์šฉ stdio ๋ชจ๋“œ โ€” Claude Desktop ๋“ฑ์—์„œ ์ง์ ‘ ์‹คํ–‰
python server.py

# (b) ์›๊ฒฉ(Streamable HTTP) ๋ชจ๋“œ โ€” PlayMCP ๋ฐฐํฌ์™€ ๋™์ผํ•œ ํ˜•ํƒœ
#     ์—”๋“œํฌ์ธํŠธ: http://0.0.0.0:8000/mcp
MCP_TRANSPORT=http python server.py
```

Windows PowerShell์—์„œ HTTP ๋ชจ๋“œ๋กœ ๋„์šฐ๋ ค๋ฉด:

```powershell
$env:MCP_TRANSPORT="http"; python server.py
```

### ํ™˜๊ฒฝ๋ณ€์ˆ˜

| ๋ณ€์ˆ˜ | ๊ธฐ๋ณธ๊ฐ’ | ์„ค๋ช… |
|------|--------|------|
| `MCP_TRANSPORT` | `stdio` | `stdio` / `http`(streamable) / `sse` |
| `HOST` | `0.0.0.0` | HTTP ๋ฐ”์ธ๋“œ ์ฃผ์†Œ |
| `PORT` | `8000` | HTTP ํฌํŠธ |

---

## 2. ์ž์ฒด ํ…Œ์ŠคํŠธ

```bash
python test_tools.py       # ์ˆœ์ˆ˜ ๋กœ์ง 21๊ฐœ ์ผ€์ด์Šค ๊ฒ€์ฆ (21/21 PASS)
```

---

## 3. MCP Inspector๋กœ ๊ฒ€์ฆ (PlayMCP ๋“ฑ๋ก ์ „ ํ•„์ˆ˜)

Inspector๋Š” ๋ณ„๋„ ์„ค์น˜ ์—†์ด `npx`๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

**HTTP(์›๊ฒฉ) ๋ชจ๋“œ ๊ฒ€์ฆ** โ€” PlayMCP ๋“ฑ๋ก ํ˜•ํƒœ์™€ ๋™์ผํ•˜๋ฏ€๋กœ ๊ถŒ์žฅ:

```bash
# ํ„ฐ๋ฏธ๋„ 1: ์„œ๋ฒ„ ์‹คํ–‰
MCP_TRANSPORT=http python server.py

# ํ„ฐ๋ฏธ๋„ 2: Inspector ์‹คํ–‰ ํ›„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘์†
npx @modelcontextprotocol/inspector
#  โ†’ Transport: "Streamable HTTP"
#  โ†’ URL: http://localhost:8000/mcp
#  โ†’ Connect โ†’ Tools ํƒญ์—์„œ 11๊ฐœ ๋„๊ตฌ ํ˜ธ์ถœ ํ…Œ์ŠคํŠธ
```

**stdio ๋ชจ๋“œ ๊ฒ€์ฆ**:

```bash
npx @modelcontextprotocol/inspector python server.py
```

---

## 4. ์นด์นด์˜ค ํด๋ผ์šฐ๋“œ ๋ฐฐํฌ (์›๊ฒฉ ์—”๋“œํฌ์ธํŠธ ๋งŒ๋“ค๊ธฐ)

PlayMCP๋Š” **๊ณต๊ฐœ URL์„ ๊ฐ€์ง„ ์›๊ฒฉ MCP ์„œ๋ฒ„**๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ํฌํ•จ๋œ `Dockerfile`๋กœ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ค์–ด ์นด์นด์˜ค ํด๋ผ์šฐ๋“œ์— ๋ฐฐํฌํ•˜์„ธ์š”.

```bash
# ์ด๋ฏธ์ง€ ๋นŒ๋“œ
docker build -t korea-life-mcp .

# ๋กœ์ปฌ์—์„œ ์ปจํ…Œ์ด๋„ˆ ๋™์ž‘ ํ™•์ธ (http://localhost:8000/mcp)
docker run -p 8000:8000 korea-life-mcp
```

์นด์นด์˜ค ํด๋ผ์šฐ๋“œ์— ๋ฐฐํฌํ•˜๋ฉด `https://<๋ฐœ๊ธ‰๋ฐ›์€-๋„๋ฉ”์ธ>/mcp` ํ˜•ํƒœ์˜ **๊ณต๊ฐœ ์—”๋“œํฌ์ธํŠธ**๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด URL์„ ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

> ๐Ÿ“„ **๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฐํฌ(VM + Docker + ์ž๋™ HTTPS) ๋‹จ๊ณ„๋ณ„ ๊ฐ€์ด๋“œ**: [`deploy/DEPLOY.md`](deploy/DEPLOY.md)
>
> ๊ณต๋ชจ์ „ ๊ทœ์ •์ƒ ์ œ์ถœ๋ฌผ์€ **์นด์นด์˜ค ํด๋ผ์šฐ๋“œ MCP ์„œ๋ฒ„ ์—”๋“œํฌ์ธํŠธ**์—ฌ์•ผ ์ฐธ๊ฐ€ ์ž๊ฒฉ์ด ์ธ์ •๋ฉ๋‹ˆ๋‹ค.

---

## 5. PlayMCP ๋“ฑ๋ก ์ ˆ์ฐจ

1. [playmcp.kakao.com](https://playmcp.kakao.com/) ์— ์นด์นด์˜ค ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธ
2. ๊ฐœ๋ฐœ์ž ์ฝ˜์†” โ†’ **์ƒˆ MCP ์„œ๋ฒ„ ๋“ฑ๋ก**
3. ์œ„ 4๋‹จ๊ณ„์—์„œ ๋งŒ๋“  **์นด์นด์˜ค ํด๋ผ์šฐ๋“œ ์—”๋“œํฌ์ธํŠธ URL**(`.../mcp`) ์ž…๋ ฅ
4. ์ œ๊ณต๋œ ํ…œํ”Œ๋ฆฟ์— ๋งž์ถฐ ์„œ๋ฒ„ ์ •๋ณด(์ด๋ฆ„ยท์„ค๋ช…ยท๋„๊ตฌ ๋ชฉ๋ก) ์ž‘์„ฑ
5. Inspector ๊ฒ€์ฆ ์™„๋ฃŒ ํ›„ **๊ณต๊ฐœ(Public) ์ „ํ™˜**
6. ๊ณต๋ชจ์ „ ํŽ˜์ด์ง€์—์„œ ์ œ์ถœ โ†’ ์‹ฌ์‚ฌ ๋Œ€๊ธฐ

---

## ์•Œ๋ ค์ง„ ํ•œ๊ณ„

- `romanize`: ์ž๋ชจ ๋งคํ•‘ + ์—ฐ์Œ + **์ž์Œ๋™ํ™”(์œ ์Œํ™”ยท๋น„์Œํ™”) ์ฃผ์š” ๊ทœ์น™**์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค(`์ข…๋กœ`โ†’`jongno`, `์‹ ๋ผ`โ†’`silla`, `ํ˜‘๋ ฅ`โ†’`hyeomnyeok`). ๋‹ค๋งŒ **๊ฒน๋ฐ›์นจ ์—ฐ์Œยท๊ตฌ๊ฐœ์Œํ™”ยทใ…Ž์ถ•์•ฝ** ๋“ฑ ์ผ๋ถ€ ์Œ์šด ๋ณ€๋™์€ ๋‹จ์ˆœํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
- `korean_holidays` / `business_days_between`: **์–‘๋ ฅ ๊ณ ์ • ๊ณตํœด์ผ**์€ ๋ชจ๋“  ์—ฐ๋„ ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, **์Œ๋ ฅ ๊ธฐ๋ฐ˜(์„ค๋‚ ยท์ถ”์„ยท๋ถ€์ฒ˜๋‹˜์˜ค์‹ ๋‚ ) ๋ฐ ๋Œ€์ฒด๊ณตํœด์ผ**์€ `korea_tools.py`์˜ `_LUNAR_TABLE`์— ๋“ฑ๋ก๋œ ์—ฐ๋„(ํ˜„์žฌ 2025ยท2026)๋งŒ ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์—ฐ๋„๋Š” ๊ฒฐ๊ณผ์˜ `note` ํ•„๋“œ๋กœ ์•ˆ๋‚ด๋˜๋ฉฐ, ํ‘œ๋ฅผ ๊ฐฑ์‹ ํ•˜๋ฉด ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.

---

## ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

```
korea-life-mcp/
โ”œโ”€โ”€ server.py          # FastMCP ์„œ๋ฒ„ (๋„๊ตฌ 11์ข… ๋…ธ์ถœ, stdio/http ์ „ํ™˜)
โ”œโ”€โ”€ korea_tools.py     # ์ˆœ์ˆ˜ ๋กœ์ง ํ•จ์ˆ˜ (ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ, ๋„คํŠธ์›Œํฌ ๋ฏธ์‚ฌ์šฉ)
โ”œโ”€โ”€ test_tools.py      # ์ž์ฒด ๊ฒ€์ฆ ์Šคํฌ๋ฆฝํŠธ
โ”œโ”€โ”€ requirements.txt   # ์˜์กด์„ฑ (mcp)
โ”œโ”€โ”€ pyproject.toml     # ํŒจํ‚ค์ง€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
โ”œโ”€โ”€ Dockerfile         # ์นด์นด์˜ค ํด๋ผ์šฐ๋“œ ๋ฐฐํฌ์šฉ ์ปจํ…Œ์ด๋„ˆ
โ””โ”€โ”€ README.md
```