hachanha-mcp
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) ์ ์ง, ๋ณธ์ ์์ ์นด์นด์ค ์ง์ ํฌ๋ ๋ง์ผ๋ก ๋์
๊ฒํ .
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessSyncing