Skip to main content
Glama
README.md
# ํ•˜์ฐฎ์•„MCP ๐ŸŽจ

> ์นด์นด์˜ค AGENTIC PLAYER 10 ๊ณต๋ชจ์ „ ์ถœํ’ˆ์ž‘
> ChatGPT๋Š” ์ž˜ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค. **ํ•˜์ฐฎ์•„MCP๋Š” ์ผ๋ถ€๋Ÿฌ ๋ชป ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.** ๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋žŒ๋“ค์€ ๋ชป ๊ทธ๋ฆฐ ๊ฑธ ๋” ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์นด์นด์˜คํ†ก ๋Œ€ํ™”์ฐฝ์—์„œ "๊ณ ์–‘์ด ๊ทธ๋ ค์ค˜"๋ผ๊ณ  ํ•˜๋ฉด, ์ž˜ ๊ทธ๋ฆฐ ๊ทธ๋ฆผ ๋Œ€์‹  **์„  ๋ช‡ ๊ฐœ๋กœ ๋Œ€์ถฉ ๊ทธ๋ฆฐ ํ•˜์ฐฎ์€ ๊ทธ๋ฆผ**์„ ๋Œ๋ ค์ฃผ๋Š” MCP ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

## ๋™์ž‘ ํ๋ฆ„

```
์‚ฌ์šฉ์ž(์นด์นด์˜คํ†ก) โ†’ ChatGPT for Kakao(์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ) โ†’ ํ•˜์ฐฎ์•„MCP
   draw_shabby: 1) ์•ˆ์ „ ํ•„ํ„ฐ โ†’ 2) ํ•˜์ฐฎ์Œ ํ”„๋กฌํ”„ํŠธ ๋ณ€ํ™˜
              โ†’ 3) "์ด ํ”„๋กฌํ”„ํŠธ๋กœ, ๋‹ค๋“ฌ์ง€ ๋ง๊ณ  ๊ทธ๋Œ€๋กœ ๊ทธ๋ ค๋ผ" ์ง€์‹œ + ํ”„๋กฌํ”„ํŠธ ๋ฐ˜ํ™˜
                 โ†’ ํ˜ธ์ŠคํŠธ ChatGPT๊ฐ€ ์‹ค์ œ ์ด๋ฏธ์ง€๋ฅผ ๋ Œ๋”๋ง
```

- **์‹ค์ œ ๋ Œ๋”๋ง์€ ํ˜ธ์ŠคํŠธ ChatGPT๊ฐ€ ๋‹ด๋‹น**ํ•œ๋‹ค. ์ง€์‹œ ๋”ฐ๋ฅด๊ธฐ๊ฐ€ ๊ฐ•ํ•œ ๋ชจ๋ธ์ด๋ผ ํ•˜์ฐฎ์Œ ํ™”ํ’์ด ์ž˜ ๋‚˜์˜ค๊ณ , ์šฐ๋ฆฌ ๋น„์šฉ์€ 0์›.
- MCP์˜ ๊ฐ€์น˜ = **์•ˆ์ „ํ•„ํ„ฐ + ํ•œ๊ธ€์ฃผ์ œโ†’์˜๋ฌธ ํ•˜์ฐฎ์Œ ํ”„๋กฌํ”„ํŠธ ์„ค๊ณ„ + ์ผ๊ด€๋œ ํ™”ํ’ ์ง€์‹œ**.
- ์ œ์–ด ํ๋ฆ„์€ ChatGPTโ†’MCPโ†’๋ฐ˜ํ™˜ **์ผ๋ฐฉํ–ฅ**. MCP๊ฐ€ ChatGPT๋ฅผ ๊ฑฐ๊พธ๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค(์ฃผ๊ฐ์ „๋„ ์—†์Œ).
- (Pollinations ์ง์ ‘ ์ƒ์„ฑ์€ **๋ณธ์„ /ํด๋ฐฑ ์˜ต์…˜**์œผ๋กœ `src/pollinations.ts`์— ๋ณด์กด.)

## Tool: `draw_shabby`

| ํŒŒ๋ผ๋ฏธํ„ฐ | ํƒ€์ž… | ํ•„์ˆ˜ | ์„ค๋ช… |
|---|---|---|---|
| `subject` | string | O | ๊ทธ๋ฆด ๋Œ€์ƒ. ์˜ˆ: "๊ณ ์–‘์ด", "์ถœ๊ทผํ•˜๋Š” ์ง์žฅ์ธ" |
| `mood` | string | X | ๋ถ„์œ„๊ธฐ/๊ฐ์ •. ์˜ˆ: "์Šฌํ”ˆ", "์‹ ๋‚œ" |

ํ”„๋กฌํ”„ํŠธ๋Š” ๊ณ ์ •๋œ ๋‹จ์ผ "ํ•˜์ฐฎ์Œ" ๋ฌธ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, `subject`(+`mood`)๋งŒ ์น˜ํ™˜๋œ๋‹ค. (`src/shabby.ts`)

**๋ฐ˜ํ™˜**: `content`์— ๋ Œ๋”๋ง ์ง€์‹œ ํ…์ŠคํŠธ("์ด ํ”„๋กฌํ”„ํŠธ๋กœ, ๋‹ค๋“ฌ์ง€ ๋ง๊ณ  ๊ทธ๋Œ€๋กœ ๊ทธ๋ ค๋ผ" + IMAGE PROMPT),
`structuredContent`์— `render_prompt` / `subject` / `mood` / `render_rules`. ์‹ค์ œ ์ด๋ฏธ์ง€๋Š” ํ˜ธ์ŠคํŠธ ChatGPT๊ฐ€ ์ƒ์„ฑํ•œ๋‹ค.
์•ˆ์ „์„ฑ ์œ„๋ฐ˜ ์‹œ์—๋Š” ๊ทธ๋ฆผ ๋Œ€์‹  ์นœ์ ˆํ•œ ๊ฑฐ๋ถ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

## ์ „์†ก ๋ฐฉ์‹ (PlayMCP ์ค€์ˆ˜)

- **Streamable HTTP (stateless)**. ์—”๋“œํฌ์ธํŠธ `POST /mcp`, ํ—ฌ์Šค์ฒดํฌ `GET /healthz`.
- ํฌํŠธ๋Š” `PORT` ํ™˜๊ฒฝ๋ณ€์ˆ˜(๊ธฐ๋ณธ 3000). Remote(๊ณต๊ฐœ URL) MCP ์„œ๋ฒ„๋กœ ๋ฐฐํฌ.
- ์„ธ์…˜ ์—†์Œ โ†’ ์š”์ฒญ๋งˆ๋‹ค ์ƒˆ server/transport ์ธ์Šคํ„ด์Šค.

## ๊ฐœ๋ฐœ / ์‹คํ–‰

```bash
npm install
npm run build

npm start                  # Streamable HTTP MCP ์„œ๋ฒ„ ๊ธฐ๋™ (http://localhost:3000/mcp)
node dist/test-client.js   # HTTP๋กœ ์„œ๋ฒ„ ๋„์›Œ ํ•ธ๋“œ์…ฐ์ดํฌ + tools/call ๊ฒ€์ฆ
npm run smoke              # ํ”„๋กฌํ”„ํŠธ ๋ณ€ํ™˜ ๋กœ์ง + (ํด๋ฐฑ)Pollinations ํ˜ธ์ถœ ๊ฒ€์ฆ
```

### MCP Inspector ์ ๊ฒ€ (ํ•„์ˆ˜)

```bash
npm start                                  # ํ•œ ํ„ฐ๋ฏธ๋„์—์„œ ์„œ๋ฒ„ ๊ธฐ๋™
npx @modelcontextprotocol/inspector        # ๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์—์„œ Inspector ์‹คํ–‰
#  โ†’ Transport: "Streamable HTTP", URL: http://localhost:3000/mcp ๋กœ ์—ฐ๊ฒฐ
```

## ์†Œ์Šค ๊ตฌ์กฐ

| ํŒŒ์ผ | ์—ญํ•  |
|---|---|
| `src/index.ts` | Streamable HTTP(stateless) ์ง„์ž…์  (Node ๋‚ด์žฅ http) |
| `src/server.ts` | MCP ์„œ๋ฒ„ + `draw_shabby` ํˆด ์ •์˜(annotations ํฌํ•จ) |
| `src/shabby.ts` | ํ•˜์ฐฎ์Œ ํ”„๋กฌํ”„ํŠธ(๊ณ ์ • ๋ฌธ๊ตฌ + subject/mood ์น˜ํ™˜) โ€” ํ•ต์‹ฌ ๊ฒฝ์Ÿ๋ ฅ |
| `src/safety.ts` | ์ž…๋ ฅ ์•ˆ์ „ ํ•„ํ„ฐ(ํ•œ/์˜ ๊ธˆ์ง€์–ด + ์šฐํšŒ ์ •๊ทœํ™”) |
| `src/pollinations.ts` | (ํด๋ฐฑ) Pollinations URL ์กฐ๋ฆฝ + ์žฌ์‹œ๋„ + base64 ๋ณ€ํ™˜ |
| `Dockerfile` | PlayMCP in KC ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ์šฉ(๋ฉ€ํ‹ฐ์Šคํ…Œ์ด์ง€) |

## ๋ฐฐํฌ (PlayMCP in KC โ†’ PlayMCP ๋“ฑ๋ก)

1. **PlayMCP in KC**: Git ์†Œ์Šค ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€(`Dockerfile`)๋กœ ๋ฐฐํฌ โ†’ **Endpoint URL** ๋ฐœ๊ธ‰.
2. **PlayMCP ๋“ฑ๋ก**: Endpoint ์ž…๋ ฅ โ†’ "์ •๋ณด ๋ถˆ๋Ÿฌ์˜ค๊ธฐ" ์„ฑ๊ณต โ†’ **"์ž„์‹œ ๋“ฑ๋ก"**(์•„์ง ์‹ฌ์‚ฌ์š”์ฒญ X) โ†’ ๋„๊ตฌํ•จ ์ถ”๊ฐ€ โ†’ **AI์ฑ„ํŒ… ํ…Œ์ŠคํŠธ**.
3. ํ…Œ์ŠคํŠธ OK โ†’ "์‹ฌ์‚ฌ ์š”์ฒญ"(1~2์ผ, ์ตœ๋Œ€ 7์ผ) โ†’ ์Šน์ธ โ†’ **"์ „์ฒด ๊ณต๊ฐœ"** โ†’ ์ƒ์„ธํŽ˜์ด์ง€ URL ๋ณต์‚ฌ.
4. ๊ณต๋ชจ์ „ ํŽ˜์ด์ง€ "Player ์˜ˆ์„  ์ฐธ์—ฌ" ๋น„์ฆˆํผ ์ ‘์ˆ˜(์ตœ๋Œ€ 2๊ฐœ, **7/14 ๋งˆ๊ฐ, 7/7 ์ œ์ถœ ๊ถŒ์žฅ**).

### ๋‚จ์€ ํ™•์ธ์‚ฌํ•ญ

- [ ] **(๋ฆฌ์Šคํฌ)** PlayMCP **AI์ฑ„ํŒ… ํ…Œ์ŠคํŠธ**์—์„œ ํ˜ธ์ŠคํŠธ๊ฐ€ โ‘  ํ”„๋กฌํ”„ํŠธ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๊ณ  โ‘ก "๋‹ค๋“ฌ์ง€ ๋งˆ" ์ง€์‹œ๋ฅผ ๋”ฐ๋ฅด๋Š”์ง€ ์‹ค์ธก โ†’ ์•ˆ ๋˜๋ฉด Pollinations ์ง์ ‘ ์ƒ์„ฑ(ํด๋ฐฑ)์œผ๋กœ ์ „ํ™˜.
- [ ] ๋ฐ๋ชจ ์‹œ๋‚˜๋ฆฌ์˜ค ์ •๋ฆฌ(์ œ์ถœ์šฉ).

## ๋ณธ์„  TODO (์˜ˆ์„  ์ดํ›„)

- [ ] **์‚ฌ์ง„ โ†’ ์‚ฌ์ง„ (image-to-image)**: ์‚ฌ์šฉ์ž๊ฐ€ ์ฒจ๋ถ€ํ•œ ์‚ฌ์ง„์„ ํ•˜์ฐฎ๊ฒŒ redraw. Pollinations `kontext`/`nanobanana` ๋ชจ๋ธ ํ•„์š” โ€” `enter.pollinations.ai` ๊ฐ€์ž… + API ํ† ํฐ + Pollen ํฌ๋ ˆ๋”ง ์†Œ๋ชจ(์œ ๋ฃŒ, ๋‹จ ๋งค์šฐ ์ €๋ ด/์ผ์ผ ๋ฌด๋ฃŒ grant ์žˆ์Œ). ์ž…๋ ฅ ์ด๋ฏธ์ง€๋Š” ๊ณต๊ฐœ URL์ด์–ด์•ผ ํ•จ(ํŒŒ์ผ ์—…๋กœ๋“œ X). ์˜ˆ์„ ์€ ๋ฌด๋ฃŒยท๋ฌด์ œํ•œ textโ†’image(Flux) ์œ ์ง€, ๋ณธ์„ ์—์„œ ์นด์นด์˜ค ์ง€์› ํฌ๋ ˆ๋”ง์œผ๋กœ ๋„์ž… ๊ฒ€ํ† .