Skip to main content
Glama

MCP Kkebi πŸš€

MCP TypeScript React License

ChatGPT와 Claudeμ—μ„œ μ‹€ν–‰λ˜λŠ” μΈν„°λž™ν‹°λΈŒ UI μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μΆ•ν•˜λŠ” MCP μ•±μž…λ‹ˆλ‹€.

πŸ”— Repository: github.com/mimsut/mcp_kkebi

✨ νŠΉμ§•

  • 🎨 μΈν„°λž™ν‹°λΈŒ μœ„μ ―: React 기반의 μ•„λ¦„λ‹€μš΄ UI μ»΄ν¬λ„ŒνŠΈ

  • πŸ€– AI 톡합: ChatGPT와 Claudeμ—μ„œ λ°”λ‘œ μ‚¬μš© κ°€λŠ₯

  • ⚑️ λΉ λ₯Έ 개발: TypeScript + Hot Reload

  • πŸ“¦ μ‰¬μš΄ 배포: Manufact Cloud 지원

  • πŸ”§ ν™•μž₯ κ°€λŠ₯: μƒˆλ‘œμš΄ 도ꡬ와 μœ„μ ― μ‰½κ²Œ μΆ”κ°€

πŸš€ λΉ λ₯Έ μ‹œμž‘

# Clone
git clone https://github.com/mimsut/mcp_kkebi.git
cd mcp_kkebi

# μ„€μΉ˜
npm install

# 개발 λͺ¨λ“œ
npm run dev

# λΉŒλ“œ
npm run build

πŸ“¦ ν”„λ‘œμ νŠΈ ꡬ쑰

my-mcp-app/
β”œβ”€β”€ src/
β”‚   └── index.ts              # MCP μ„œλ²„ μ§„μž…μ  (TypeScript)
β”œβ”€β”€ dist/
β”‚   └── index.js              # λΉŒλ“œλœ μ„œλ²„ (JavaScript)
β”œβ”€β”€ resources/
β”‚   β”œβ”€β”€ example-widget/       # 예제 μœ„μ ―
β”‚   β”‚   β”œβ”€β”€ widget.tsx        # React μ»΄ν¬λ„ŒνŠΈ
β”‚   β”‚   └── types.ts          # Props νƒ€μž…
β”‚   └── counter-widget/       # μΈν„°λž™ν‹°λΈŒ μΉ΄μš΄ν„° μœ„μ ―
β”‚       β”œβ”€β”€ widget.tsx
β”‚       └── types.ts
β”œβ”€β”€ package.json
β”œβ”€β”€ tsconfig.json
β”œβ”€β”€ mcp-config.json           # MCP μ„€μ • 파일
└── README.md

πŸ—οΈ μ•„ν‚€ν…μ²˜

  • Server: MCP 도ꡬ(tools)와 λ¦¬μ†ŒμŠ€(resources) μ •μ˜ (src/index.ts)

  • Widget: resources/ ν΄λ”μ˜ React μ»΄ν¬λ„ŒνŠΈλ‘œ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ Œλ”λ§

  • Protocol: MCPκ°€ μžλ™μœΌλ‘œ 톡신 처리

πŸš€ μ‹œμž‘ν•˜κΈ°

1. μ˜μ‘΄μ„± μ„€μΉ˜

npm install

2. λΉŒλ“œ

npm run build

3. 개발 λͺ¨λ“œ μ‹€ν–‰ (ν•« λ¦¬λ‘œλ“œ)

npm run dev

4. ν”„λ‘œλ•μ…˜ μ‹€ν–‰

npm start

πŸ”§ Claude Desktop에 μ—°κ²°ν•˜κΈ°

macOS

  1. Claude Desktop μ„€μ • 파일 μ—΄κΈ°:

nano ~/Library/Application\ Support/Claude/claude_desktop_config.json
  1. λ‹€μŒ μ„€μ • μΆ”κ°€:

{
  "mcpServers": {
    "my-mcp-app": {
      "command": "node",
      "args": [
        "/Users/user/Downloads/b_ru8Xi2QdWzH-1771717682115/my-mcp-app/dist/index.js"
      ]
    }
  }
}
  1. Claude Desktop μž¬μ‹œμž‘

Windows

μ„€μ • 파일 μœ„μΉ˜: %APPDATA%\Claude\claude_desktop_config.json

πŸ’¬ ChatGPT에 μ—°κ²°ν•˜κΈ°

  1. ChatGPT μ„€μ •μ—μ„œ "Custom Actions" λ˜λŠ” "GPT" μ„Ήμ…˜μœΌλ‘œ 이동

  2. MCP μ„œλ²„ μΆ”κ°€:

    • μ„œλ²„ URL: 둜컬 λ˜λŠ” 배포된 URL

    • ν”„λ‘œν† μ½œ: MCP (Model Context Protocol)

🎨 μœ„μ ― μ‚¬μš©ν•˜κΈ°

Example Widget

ν™˜μ˜ λ©”μ‹œμ§€μ™€ κΈ°λ³Έ 정보λ₯Ό ν‘œμ‹œν•˜λŠ” κ°„λ‹¨ν•œ μœ„μ ―μž…λ‹ˆλ‹€.

μ‚¬μš©λ²•:

widget://example

νŠΉμ§•:

  • κ·ΈλΌλ””μ–ΈνŠΈ λ°°κ²½

  • ν™˜μ˜ λ©”μ‹œμ§€

  • μƒνƒœ ν‘œμ‹œ

Counter Widget

μ‚¬μš©μž μƒν˜Έμž‘μš©μ„ λ³΄μ—¬μ£ΌλŠ” μΈν„°λž™ν‹°λΈŒ μΉ΄μš΄ν„° μœ„μ ―μž…λ‹ˆλ‹€.

μ‚¬μš©λ²•:

widget://counter

νŠΉμ§•:

  • 증가/κ°μ†Œ λ²„νŠΌ

  • μ΄ˆκΈ°ν™” κΈ°λŠ₯

  • μ‹€μ‹œκ°„ μƒνƒœ μ—…λ°μ΄νŠΈ

  • λΆ€λ“œλŸ¬μš΄ μ• λ‹ˆλ©”μ΄μ…˜

πŸ› οΈ 도ꡬ (Tools)

greet

μ‚¬μš©μžμ—κ²Œ ν™˜μ˜ λ©”μ‹œμ§€λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„°:

  • name (string, ν•„μˆ˜): μ‚¬μš©μž 이름

예제:

{
  "name": "홍길동"
}

응닡:

μ•ˆλ…•ν•˜μ„Έμš”, ν™κΈΈλ™λ‹˜! MCP 앱에 μ˜€μ‹  것을 ν™˜μ˜ν•©λ‹ˆλ‹€! πŸŽ‰

πŸ§ͺ ν…ŒμŠ€νŠΈν•˜κΈ°

둜컬 ν…ŒμŠ€νŠΈ

# 개발 λͺ¨λ“œλ‘œ μ‹€ν–‰
npm run dev

# λ‹€λ₯Έ ν„°λ―Έλ„μ—μ„œ MCP Inspector μ‚¬μš©
npx @modelcontextprotocol/inspector node dist/index.js

Inspectorμ—μ„œ 확인

MCP Inspectorλ₯Ό μ‚¬μš©ν•˜λ©΄ λ‹€μŒμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  • λͺ¨λ“  도ꡬ와 λ¦¬μ†ŒμŠ€ λͺ©λ‘ 확인

  • ν…ŒμŠ€νŠΈ μž…λ ₯으둜 도ꡬ 호좜

  • μœ„μ ― 미리보기 라이브둜 확인

  • μ½”λ“œ λ³€κ²½ μ‹œ μ¦‰μ‹œ ν•« λ¦¬λ‘œλ“œ

πŸ“ μƒˆλ‘œμš΄ μœ„μ ― μΆ”κ°€ν•˜κΈ°

  1. resources/ 폴더에 μƒˆ 디렉토리 생성:

mkdir resources/my-widget
  1. types.ts 파일 생성:

export interface MyWidgetProps {
  // props μ •μ˜
}
  1. widget.tsx 파일 생성:

import React from "react";
import type { MyWidgetProps } from "./types";

export default function MyWidget(props: MyWidgetProps) {
  return <div>{/* μœ„μ ― UI */}</div>;
}
  1. src/index.ts에 λ¦¬μ†ŒμŠ€ ν•Έλ“€λŸ¬ μΆ”κ°€:

server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
  // ...
  if (uri === "widget://my-widget") {
    return {
      contents: [{
        uri: "widget://my-widget",
        mimeType: "application/vnd.mcp.widget+json",
        text: JSON.stringify({
          type: "my-widget",
          props: { /* props */ },
        }),
      }],
    };
  }
  // ...
});

🌐 λ°°ν¬ν•˜κΈ°

Manufact Cloud에 배포

  1. manufact.com 접속

  2. GitHub 리포지토리 μ—°κ²°

  3. main λΈŒλžœμΉ˜μ— push β†’ μžλ™ 배포

λ˜λŠ” CLI μ‚¬μš©:

npx @mcp-use/cli deploy

ν™˜κ²½ λ³€μˆ˜ μ„€μ •

ν”„λ‘œλ•μ…˜ ν™˜κ²½μ—μ„œ ν•„μš”ν•œ ν™˜κ²½ λ³€μˆ˜κ°€ μžˆλ‹€λ©΄ .env 파일 생성:

# .env
API_KEY=your_api_key
DATABASE_URL=your_database_url

🎯 평가 κΈ°μ€€ (해컀톀)

ν”„λ‘œμ νŠΈλŠ” λ‹€μŒ κΈ°μ€€μœΌλ‘œ ν‰κ°€λ©λ‹ˆλ‹€:

1. 독창성 (30점) 🌟

  • μƒˆλ‘œμš΄ κ°œλ…μ˜ μ°½μ˜μ„±

  • "이런 것도 MCP μ•±μœΌλ‘œ λ§Œλ“€ 수 μžˆκ΅¬λ‚˜!" ν•˜λŠ” 놀라움

2. μ‹€μš©μ„± (30점) πŸ’‘

  • μ‹€μ œ 문제 ν•΄κ²° λ˜λŠ” μ›Œν¬ν”Œλ‘œμš° κ°œμ„ 

  • μ‚¬μš©μžμ—κ²Œ μ‹€μ§ˆμ μΈ κ°€μΉ˜ 제곡

3. μœ„μ ―-λͺ¨λΈ μƒν˜Έμž‘μš© (20점) πŸ”„

  • useCallTool(), sendFollowUpMessage() λ“± μ–‘λ°©ν–₯ 톡신 ν™œμš©

  • state(), setState() ν™œμš©

  • μœ„μ ―κ³Ό AI λͺ¨λΈ κ°„μ˜ 효과적인 μƒν˜Έμž‘μš©

4. UI/UX (10점) 🎨

  • μ„Έλ ¨λ˜κ³  직관적인 κ²½ν—˜

  • λ°˜μ‘ν˜• λ””μžμΈ

  • μ ‘κ·Όμ„±

5. ν”„λ‘œλ•μ…˜ μ€€λΉ„ (10점) πŸš€

  • OAuth 인증

  • μ˜¨λ³΄λ”© ν”Œλ‘œμš°

  • μ—λŸ¬ 처리

  • μ‚¬μš©μž μ„€μ • 관리

πŸ“š μΆ”κ°€ λ¦¬μ†ŒμŠ€

🀝 κΈ°μ—¬ν•˜κΈ°

μ΄μŠˆλ‚˜ PR은 μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€!

πŸ“„ λΌμ΄μ„ΌμŠ€

MIT License


πŸŽ‰ λΉ λ₯Έ μ‹œμž‘ μš”μ•½

# 1. μ˜μ‘΄μ„± μ„€μΉ˜
npm install

# 2. λΉŒλ“œ
npm run build

# 3. Claude Desktop에 μ—°κ²°
# ~/Library/Application Support/Claude/claude_desktop_config.json νŽΈμ§‘

# 4. Claude Desktop μž¬μ‹œμž‘

# 5. Claudeμ—μ„œ ν…ŒμŠ€νŠΈ
# "greet" 도ꡬ ν˜ΈμΆœν•˜κ±°λ‚˜ μœ„μ ― ν‘œμ‹œ μš”μ²­

이제 ChatGPT와 Claudeμ—μ„œ μ‹€ν–‰λ˜λŠ” λ©‹μ§„ μΈν„°λž™ν‹°λΈŒ MCP 앱을 λ§Œλ“€ μ€€λΉ„κ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€! πŸš€βœ¨