Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP KkebiShow me the counter widget to test the interactive React UI."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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 install2. λΉλ
npm run build3. κ°λ° λͺ¨λ μ€ν (ν« λ¦¬λ‘λ)
npm run dev4. νλ‘λμ μ€ν
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.jsInspectorμμ νμΈ
MCP Inspectorλ₯Ό μ¬μ©νλ©΄ λ€μμ ν μ μμ΅λλ€:
λͺ¨λ λꡬμ 리μμ€ λͺ©λ‘ νμΈ
ν μ€νΈ μ λ ₯μΌλ‘ λꡬ νΈμΆ
μμ ― 미리보기 λΌμ΄λΈλ‘ νμΈ
μ½λ λ³κ²½ μ μ¦μ ν« λ¦¬λ‘λ
π μλ‘μ΄ μμ ― μΆκ°νκΈ°
resources/ν΄λμ μ λλ ν 리 μμ±:
mkdir resources/my-widgettypes.tsνμΌ μμ±:
export interface MyWidgetProps {
// props μ μ
}widget.tsxνμΌ μμ±:
import React from "react";
import type { MyWidgetProps } from "./types";
export default function MyWidget(props: MyWidgetProps) {
return <div>{/* μμ ― UI */}</div>;
}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 μΈμ¦
μ¨λ³΄λ© νλ‘μ°
μλ¬ μ²λ¦¬
μ¬μ©μ μ€μ κ΄λ¦¬
π μΆκ° 리μμ€
π€ κΈ°μ¬νκΈ°
μ΄μλ 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 μ±μ λ§λ€ μ€λΉκ° λμμ΅λλ€! πβ¨
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.