Skip to main content
Glama
README.md
# ๐ŸŽ ๊ธฐํ”„ํŠธ๋ฉ”์ดํŠธ (Gift Mate) โ€” ์„ ๋ฌผ ๊ณ ๋ฏผ ์ข…๊ฒฐ MCP

MZ ๊ฐ์„ฑ ์„ ๋ฌผ ํ๋ ˆ์ดํ„ฐ MCP ์„œ๋ฒ„. [AGENTIC PLAYER 10](https://b.kakao.com/views/PlayMCP/AGENTIC_PLAYER_10) / [PlayMCP](https://playmcp.kakao.com) ์ถœํ’ˆ์šฉ.

## ํ•œ ์ค„ ์†Œ๊ฐœ

> "๋ฒ ํ”„ ์ƒ์ผ, 3๋งŒ์›๋Œ€, ๊ฐ์„ฑ์ ์ธ ๊ฑฐ" โ†’ ์„ ๋ฌผ TOP3 + ์นดํ†ก ๋ฉ”์‹œ์ง€ ์ดˆ์•ˆ๊นŒ์ง€.

## MCP Tools (4๊ฐœ)

| Tool | ์„ค๋ช… |
|------|------|
| `recommend_gift` | ๋„ค์ด๋ฒ„ ์‡ผํ•‘ ์‹ค๊ฒ€์ƒ‰ โ€” ๊ด€๊ณ„ยท์ƒํ™ฉยท์˜ˆ์‚ฐยทvibe ๊ธฐ๋ฐ˜ ์„ ๋ฌผ ์ถ”์ฒœ |
| `draft_gift_message` | ์นดํ†ก/DM์šฉ ๋ฉ”์‹œ์ง€ ์ดˆ์•ˆ (5๊ฐ€์ง€ tone) |
| `compare_gifts` | ์„ ๋ฌผ A vs B ๊ฐ€๊ฒฉยท์‡ผํ•‘๋ชฐ ๋น„๊ต (์‹ค๊ฒ€์ƒ‰) |
| `gift_by_vibe` | vibe๋งŒ์œผ๋กœ ๋„ค์ด๋ฒ„ ์‡ผํ•‘ ์‹ค๊ฒ€์ƒ‰ |

## PlayMCP ๋“ฑ๋ก ์ •๋ณด (์ดˆ์•ˆ)

- **์„œ๋ฒ„ ์ด๋ฆ„**: ๊ธฐํ”„ํŠธ๋ฉ”์ดํŠธ โ€” ์„ ๋ฌผ ๊ณ ๋ฏผ ์ข…๊ฒฐ
- **Endpoint**: `https://<your-domain>/mcp`
- **์Šคํƒ€ํ„ฐ ๋ฉ”์‹œ์ง€**:
  ```
  ๋ญ ์‚ฌ์ค„์ง€ ๊ณ ๋ฏผ์ด์•ผ? ๐ŸŽ
  ๋ˆ„๊ตฌํ•œํ…Œ, ์–ด๋–ค ์ƒํ™ฉ(์ƒ์ผ/์ทจ์—…/100์ผ/๊ทธ๋ƒฅ), ์˜ˆ์‚ฐ(์ปคํ”ผ๊ฐ’~flex), vibe(ํž™ํ•œ/๊ฐ์„ฑ/๋ฐˆ๋งž์ถค) ์•Œ๋ ค์ค˜!
  ```

## ๋กœ์ปฌ ์‹คํ–‰

```bash
cd kakao_mcp_server
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

# ๋„ค์ด๋ฒ„ API ํ‚ค ์„ค์ • (ํ•„์ˆ˜)
cp .env.example .env
# .env์— NAVER_CLIENT_ID, NAVER_CLIENT_SECRET ์ž…๋ ฅ

export NAVER_CLIENT_ID=...
export NAVER_CLIENT_SECRET=...

PYTHONPATH=src uvicorn gift_mate.server:app --host 0.0.0.0 --port 8080
```

### ๋„ค์ด๋ฒ„ API ํ‚ค ๋ฐœ๊ธ‰

1. [Naver Developers](https://developers.naver.com/apps/#/register) โ†’ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก
2. **์‚ฌ์šฉ API**์—์„œ **๊ฒ€์ƒ‰** ์ฒดํฌ
3. Client ID / Client Secret ๋ณต์‚ฌ
4. Railway ๋ฐฐํฌ ์‹œ **Variables**์— `NAVER_CLIENT_ID`, `NAVER_CLIENT_SECRET` ๋“ฑ๋ก

- Health: http://localhost:8080/health
- MCP endpoint: http://localhost:8080/mcp

## Docker

```bash
docker build -t gift-mate-mcp .
docker run -p 8080:8080 gift-mate-mcp
```

## ์นด์นด์˜ค ํด๋ผ์šฐ๋“œ ๋ฐฐํฌ

1. Dockerfile๋กœ ์ด๋ฏธ์ง€ ๋นŒ๋“œ ํ›„ ์นด์นด์˜ค ํด๋ผ์šฐ๋“œ MCP Endpoint์— ๋ฐฐํฌ
2. PlayMCP ์ฝ˜์†” โ†’ ์ƒˆ MCP ์„œ๋ฒ„ ๋“ฑ๋ก โ†’ Endpoint URL ์ž…๋ ฅ
3. ์ž„์‹œ ๋“ฑ๋ก์œผ๋กœ ํ…Œ์ŠคํŠธ โ†’ **๋“ฑ๋ก ๋ฐ ์‹ฌ์‚ฌ ์š”์ฒญ**
4. ์‹ฌ์‚ฌ ํ†ต๊ณผ ํ›„ **์ „์ฒด ๊ณต๊ฐœ** โ†’ [Player ์˜ˆ์„  ์ฐธ์—ฌ](https://b.kakao.com/views/PlayMCP/AGENTIC_PLAYER_10)

## ์˜ˆ์‚ฐ ํ‚ค์›Œ๋“œ

| ํ‚ค์›Œ๋“œ | ๋ฒ”์œ„ |
|--------|------|
| ์ปคํ”ผ๊ฐ’ | ~1๋งŒ |
| ๋ฐฐ๋ฏผํ•œ๋ผ | 1~2.5๋งŒ |
| ๋„ค์ผ/ํ—ค์–ด | 2.5~5๋งŒ |
| ์‹ ๋ฐœํ•œ์ผค๋ ˆ | 5~10๋งŒ |
| flex | 10๋งŒ+ |

## vibe ํ‚ค์›Œ๋“œ

`ํž™ํ•œ` ยท `์‹ค์šฉ` ยท `๊ฐ์„ฑ` ยท `ํ‚ฌ๋Ÿฌํ…œ` ยท `๋ฐˆ๋งž์ถค` ยท `MZ๊ณต๊ฐ`

## ๋ฐ๋ชจ ์‹œ๋‚˜๋ฆฌ์˜ค

```
์œ ์ €: "์ฒซ ์ถœ๊ทผํ•œ ํ›„๋ฐฐํ•œํ…Œ 3๋งŒ์›๋Œ€ ์‹ค์šฉ์ ์ธ ์„ ๋ฌผ ์ถ”์ฒœํ•ด์ค˜"
โ†’ recommend_gift(relationship=ํ›„๋ฐฐ, occasion=์ทจ์—…, budget=๋ฐฐ๋ฏผํ•œ๋ผ, vibe=์‹ค์šฉ)

์œ ์ €: "๋ฏธ๋‹ˆ ํ–ฅ์ˆ˜ ๋“€์˜ค๋กœ ์นดํ†ก ๋ฉ”์‹œ์ง€ mz_slang ํ†ค์œผ๋กœ ์จ์ค˜"
โ†’ draft_gift_message(recipient_name=๋ฏผ์ˆ˜, gift_name=๋ฏธ๋‹ˆ ํ–ฅ์ˆ˜, tone=mz_slang)
```

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

```
src/gift_mate/
โ”œโ”€โ”€ server.py        # FastMCP + FastAPI
โ”œโ”€โ”€ recommender.py   # ๊ฒ€์ƒ‰์–ด ์กฐํ•ฉ + ์˜ˆ์‚ฐ ํ•„ํ„ฐ๋ง
โ”œโ”€โ”€ naver_search.py  # ๋„ค์ด๋ฒ„ ์‡ผํ•‘ API ํด๋ผ์ด์–ธํŠธ
โ”œโ”€โ”€ messages.py      # MZ ํ†ค ๋ฉ”์‹œ์ง€ ํ…œํ”Œ๋ฆฟ
โ””โ”€โ”€ models.py
```

## ๋ณธ์„  ํ™•์žฅ ์•„์ด๋””์–ด (Kakao Tools Widget)

- ์„ ๋ฌผ ์นด๋“œ UI>
 3์žฅ ์Šฌ๋ผ์ด๋“œ UI
- ์นด์นด์˜ค ์„ ๋ฌผํ•˜๊ธฐ ๊ฒ€์ƒ‰ ๋งํฌ ์—ฐ๋™
- "์˜ค๋Š˜์˜ vibe" ๋žœ๋ค ์„ ๋ฌผ ๋ฃฐ๋ ›