Build interactive UI applications and React-based widgets for AI models.
MCP Kkebi π
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
- Claude Desktop μ€μ νμΌ μ΄κΈ°:
nano ~/Library/Application\ Support/Claude/claude_desktop_config.json
- λ€μ μ€μ μΆκ°:
{
"mcpServers": {
"my-mcp-app": {
"command": "node",
"args": [
"/Users/user/Downloads/b_ru8Xi2QdWzH-1771717682115/my-mcp-app/dist/index.js"
]
}
}
}
- Claude Desktop μ¬μμ
Windows
μ€μ νμΌ μμΉ: %APPDATA%\Claude\claude_desktop_config.json
π¬ ChatGPTμ μ°κ²°νκΈ°
- ChatGPT μ€μ μμ "Custom Actions" λλ "GPT" μΉμ μΌλ‘ μ΄λ
- 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λ₯Ό μ¬μ©νλ©΄ λ€μμ ν μ μμ΅λλ€:
- λͺ¨λ λꡬμ 리μμ€ λͺ©λ‘ νμΈ
- ν μ€νΈ μ λ ₯μΌλ‘ λꡬ νΈμΆ
- μμ ― 미리보기 λΌμ΄λΈλ‘ νμΈ
- μ½λ λ³κ²½ μ μ¦μ ν« λ¦¬λ‘λ
π μλ‘μ΄ μμ ― μΆκ°νκΈ°
resources/ν΄λμ μ λλ ν 리 μμ±:
mkdir resources/my-widget
types.tsνμΌ μμ±:
export interface MyWidgetProps {
// props μ μ
}
widget.tsxνμΌ μμ±:
import React from "react";
import type { MyWidgetProps } from "./types";
export default function MyWidget(props: MyWidgetProps) {
return {/* μμ ― UI */};
}
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μ λ°°ν¬
- manufact.com μ μ
- GitHub 리ν¬μ§ν 리 μ°κ²°
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 μΈμ¦
- μ¨λ³΄λ© νλ‘μ°
- μλ¬ μ²λ¦¬
- μ¬μ©μ μ€μ κ΄λ¦¬
π μΆκ° 리μμ€
- mcp-use λ¬Έμ
- GitHub 리ν¬μ§ν 리
- ν΄μ»€ν€ μ€νν° λ ν¬
- Inspector (μ¨λΌμΈ)
- MCP 곡μ λ¬Έμ
π€ κΈ°μ¬νκΈ°
μ΄μλ PRμ μΈμ λ νμν©λλ€!
π λΌμ΄μΌμ€
MIT License
π λΉ λ₯Έ μμ μμ½
# 1. μμ‘΄μ± μ€μΉ
npm install
# 2. λΉλ
npm run build
# 3. Claude Desktopμ μ°κ²°
# ~/Library/
Tools (1)
greetDisplays a welcome message to the user.Environment Variables
API_KEYAPI key for external servicesDATABASE_URLDatabase connection stringConfiguration
{"mcpServers": {"my-mcp-app": {"command": "node", "args": ["/path/to/my-mcp-app/dist/index.js"]}}}