2026๋…„ 1์›” 28์ผ
Architecture

๐Ÿค– ChatGPT Apps SDK๋ฅผ ํ™œ์šฉํ•œ ์•„๋ชจ๋ ˆ๋ชฐ ํ†ตํ•ฉ - MCP ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ AI ์‡ผํ•‘ ์–ด์‹œ์Šคํ„ดํŠธ ๊ตฌ์ถ•

OpenAI ChatGPT Apps SDK์™€ Model Context Protocol(MCP)์„ ํ™œ์šฉํ•˜์—ฌ ChatGPT ๋‚ด์—์„œ ์•„๋ชจ๋ ˆ๋ชฐ ์ƒํ’ˆ์„ ์ถ”์ฒœํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” AI ์‡ผํ•‘ ์–ด์‹œ์Šคํ„ดํŠธ๋ฅผ ๊ตฌ์ถ•ํ•œ ์•„ํ‚คํ…์ฒ˜์™€ ๊ตฌํ˜„ ๊ณผ์ •์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

ChatGPT
OpenAI
Apps SDK
MCP
Model Context Protocol
AI
E-commerce
Amorepacific
React
Python
FastMCP
๐Ÿค– ChatGPT Apps SDK๋ฅผ ํ™œ์šฉํ•œ ์•„๋ชจ๋ ˆ๋ชฐ ํ†ตํ•ฉ - MCP ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ AI ์‡ผํ•‘ ์–ด์‹œ์Šคํ„ดํŠธ ๊ตฌ์ถ•

๐Ÿ“… ๊ธ€ ๊ฐœ์š”

OpenAI๊ฐ€ ChatGPT์— Apps ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๋ฉด์„œ, AI ์–ด์‹œ์Šคํ„ดํŠธ๊ฐ€ ์ง์ ‘ ์™ธ๋ถ€ ์„œ๋น„์Šค์™€ ์—ฐ๋™ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๊ฐ€๋Šฅ์„ฑ์ด ์—ด๋ ธ์Šต๋‹ˆ๋‹ค. OpenAI์˜ Apps in ChatGPT ์†Œ๊ฐœ์— ๋”ฐ๋ฅด๋ฉด, ๊ฐœ๋ฐœ์ž๋“ค์€ **Model Context Protocol (MCP)**์„ ํ†ตํ•ด ChatGPT์™€ ์ž์‹ ์˜ ์„œ๋น„์Šค๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ์  ๋ฐฐ๊ฒฝ์—์„œ, ์ €ํฌ๋Š” ์•„๋ชจ๋ ˆ๋ชฐ์˜ ์ƒํ’ˆ ์ •๋ณด๋ฅผ ChatGPT์—์„œ ์ง์ ‘ ์กฐํšŒํ•˜๊ณ  ์ถ”์ฒœํ•  ์ˆ˜ ์žˆ๋Š” AI ์‡ผํ•‘ ์–ด์‹œ์Šคํ„ดํŠธ๋ฅผ ๊ตฌ์ถ•ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ChatGPT ๋Œ€ํ™”์ฐฝ์—์„œ ์ž์—ฐ์–ด๋กœ "์ธ๊ธฐ ์ƒํ’ˆ ์ถ”์ฒœํ•ด์ค˜" ๋˜๋Š” "์„คํ™”์ˆ˜ ์ œํ’ˆ ์ฐพ์•„์ค˜"๋ผ๊ณ  ์š”์ฒญํ•˜๋ฉด, ChatGPT๊ฐ€ ์•„๋ชจ๋ ˆ๋ชฐ MCP ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ƒํ’ˆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ ์‹œ๊ฐ์ ์ธ ์œ„์ ฏ์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก ์ด ๊ธ€์—์„œ ๋‹ค๋ฃฐ ๋‚ด์šฉ

  • ChatGPT Apps SDK์™€ MCP(Model Context Protocol) ๊ฐœ์š”
  • ์•„๋ชจ๋ ˆ๋ชฐ MCP ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„
  • Python FastMCP ์„œ๋ฒ„์™€ React Widget ํ†ตํ•ฉ ๊ตฌ์กฐ
  • ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ ๋ฐ ํ†ต์‹  ๋ฉ”์ปค๋‹ˆ์ฆ˜
  • ์‹ค์ œ ๊ตฌํ˜„ ๋ฐ๋ชจ ๋ฐ ์‚ฌ์šฉ ์‚ฌ๋ก€

๐ŸŽฏ ChatGPT Apps SDK์™€ MCP ๊ฐœ์š”

๐Ÿค– Apps in ChatGPT๋ž€?

OpenAI์˜ ๊ณต์‹ ๋ฐœํ‘œ์— ๋”ฐ๋ฅด๋ฉด, ChatGPT Apps๋Š” AI ์–ด์‹œ์Šคํ„ดํŠธ๊ฐ€ ์™ธ๋ถ€ ์„œ๋น„์Šค์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ChatGPT๋Š” ๋‹จ์ˆœํ•œ ๋Œ€ํ™”ํ˜• AI๋ฅผ ๋„˜์–ด์„œ ์‹ค์ œ ์•ก์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—์ด์ „ํŠธ๋กœ ์ง„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ํŠน์ง•:

  • Model Context Protocol (MCP): ChatGPT์™€ ์™ธ๋ถ€ ์„œ๋น„์Šค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ
  • Widget ๊ธฐ๋ฐ˜ UI: ์„œ๋ฒ„์—์„œ ๋ฐ˜ํ™˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ์ ์ธ ์œ„์ ฏ์œผ๋กœ ๋ Œ๋”๋ง
  • ์ž์—ฐ์–ด ์ธํ„ฐํŽ˜์ด์Šค: ์‚ฌ์šฉ์ž๋Š” ์ž์—ฐ์–ด๋กœ ์š”์ฒญํ•˜๊ณ , ChatGPT๊ฐ€ ์ ์ ˆํ•œ Tool์„ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ

๐Ÿ”Œ Model Context Protocol (MCP)

MCP๋Š” ChatGPT์™€ ์™ธ๋ถ€ ์„œ๋น„์Šค ๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•œ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•ต์‹ฌ ๊ฐœ๋…์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

  • Tools: ChatGPT๊ฐ€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜ (์˜ˆ: get_popular_products, search_products)
  • Resources: Widget UI ๋งˆํฌ์—…์„ ์ œ๊ณตํ•˜๋Š” ๋ฆฌ์†Œ์Šค (์˜ˆ: ui://widget/product-carousel.html)
  • Streamable HTTP: HTTP ๊ธฐ๋ฐ˜์˜ ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ๋ฉ”์ปค๋‹ˆ์ฆ˜

๐Ÿ—๏ธ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„

์•„๋ชจ๋ ˆ๋ชฐ ChatGPT Apps ํ†ตํ•ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

์•„๋ชจ๋ ˆ๋ชฐ ChatGPT Apps ํ†ตํ•ฉ ์•„ํ‚คํ…์ฒ˜ - ChatGPT Client, MCP Server, Widget UI, External API ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„

๐Ÿ“Š ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ ์š”์†Œ

1. MCP Server (Python FastMCP)

  • ์—ญํ• : ChatGPT์™€์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๋Š” ์„œ๋ฒ„
  • ๊ธฐ์ˆ  ์Šคํƒ: Python, FastMCP, Pydantic, uvicorn
  • ์ฃผ์š” ๊ธฐ๋Šฅ:
    • Tool ๋ชฉ๋ก ์ œ๊ณต (list_tools)
    • Resource ๋ชฉ๋ก ์ œ๊ณต (list_resources)
    • Tool ์‹คํ–‰ ์ฒ˜๋ฆฌ (call_tool)
    • Resource ์ฝ๊ธฐ ์ฒ˜๋ฆฌ (read_resource)

2. Widget UI (React + TypeScript)

  • ์—ญํ• : ์ƒํ’ˆ ์ •๋ณด๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” ์œ„์ ฏ
  • ๊ธฐ์ˆ  ์Šคํƒ: React, TypeScript, Vite, Tailwind CSS
  • ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ:
    • ProductCarousel: ์ธ๊ธฐ ์ƒํ’ˆ ์บ๋Ÿฌ์…€ (Inline Carousel)
    • ProductCard: ๋‹จ์ผ ์ƒํ’ˆ ์ƒ์„ธ ์นด๋“œ (Inline Card)
    • CartSummary: ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์š”์•ฝ (Inline Card)

3. Product Service

  • ์—ญํ• : Amoremall API Gateway๋ฅผ ํ†ตํ•œ ์ƒํ’ˆ ์ •๋ณด Data API์™€์˜ ํ†ต์‹  ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ
  • ๊ธฐ๋Šฅ:
    • ์ธ๊ธฐ ์ƒํ’ˆ ์กฐํšŒ
    • ์ƒํ’ˆ ๊ฒ€์ƒ‰
    • ์ƒํ’ˆ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ

4. Amoremall API Gateway

  • ์—ญํ• : ์ƒํ’ˆ ์ •๋ณด Data API์™€์˜ ํ†ต์‹ ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฒŒ์ดํŠธ์›จ์ด
  • ๊ธฐ๋Šฅ:
    • API ์š”์ฒญ ๋ผ์šฐํŒ… ๋ฐ ์ธ์ฆ ์ฒ˜๋ฆฌ
    • ์ƒํ’ˆ ์ •๋ณด Data ์กฐํšŒ ๋ฐ ๋ฐ˜ํ™˜

๐Ÿ”„ ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ

ChatGPT์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค:

์•„๋ชจ๋ ˆ๋ชฐ ChatGPT Apps ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ - ์‚ฌ์šฉ์ž ์š”์ฒญ๋ถ€ํ„ฐ Widget ๋ Œ๋”๋ง๊นŒ์ง€์˜ ์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

๐Ÿ”‘ ํ•ต์‹ฌ ํ†ต์‹  ๋ฉ”์ปค๋‹ˆ์ฆ˜

1. Tool ์ •์˜ ๋ฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ

๊ฐ Tool์€ _meta ํ•„๋“œ์— Widget ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

types.Tool(
    name="get_popular_products",
    description="์•„๋ชจ๋ ˆ๋ชฐ์—์„œ ์ธ๊ธฐ ์žˆ๋Š” ์ถ”์ฒœ ์ƒํ’ˆ ๋ชฉ๋ก์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.",
    inputSchema={...},
    _meta={
        "openai/outputTemplate": "ui://widget/product-carousel.html",
        "openai/widgetAccessible": True,
    }
)

2. Tool ์‹คํ–‰ ๊ฒฐ๊ณผ

Tool ์‹คํ–‰ ์‹œ structuredContent์— ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

types.CallToolResult(
    content=[types.TextContent(type="text", text="์ธ๊ธฐ ์ƒํ’ˆ์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.")],
    structuredContent={
        "products": [...],
        "meta": {...}
    }
)

3. Widget HTML ๋กœ๋“œ

ChatGPT๋Š” outputTemplate URI๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Resource๋ฅผ ์š”์ฒญํ•˜๊ณ , HTML์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ป ๊ตฌํ˜„ ์ƒ์„ธ

๐Ÿ MCP Server ๊ตฌํ˜„

FastMCP ๊ธฐ๋ฐ˜ ์„œ๋ฒ„ ๊ตฌ์กฐ:

from mcp.server.fastmcp import FastMCP

mcp = FastMCP(
    name="amoremall-app",
    stateless_http=True,
)

# Tool ๋ชฉ๋ก ์ œ๊ณต
@mcp._mcp_server.list_tools()
async def _list_tools() -> List[types.Tool]:
    return [
        types.Tool(
            name="get_popular_products",
            description="...",
            inputSchema=GET_POPULAR_PRODUCTS_SCHEMA,
            _meta={
                "openai/outputTemplate": "ui://widget/product-carousel.html",
                "openai/widgetAccessible": True,
            }
        )
    ]

# Tool ์‹คํ–‰ ์ฒ˜๋ฆฌ
async def _call_tool_request(req: types.CallToolRequest) -> types.ServerResult:
    tool_name = req.params.name
    arguments = req.params.arguments or {}
    
    if tool_name == "get_popular_products":
        # Amoremall API Gateway๋ฅผ ํ†ตํ•ด ์ƒํ’ˆ ์ •๋ณด Data API ํ˜ธ์ถœ
        products = await product_service.get_popular_products(
            category=arguments.get("category", "all"),
            limit=arguments.get("limit", 6),
        )
        return types.ServerResult(
            types.CallToolResult(
                structuredContent={
                    "products": [p.model_dump() for p in products],
                }
            )
        )

โš›๏ธ Widget UI ๊ตฌํ˜„

React ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ:

// widgets/src/components/ProductCarousel.tsx
export const ProductCarousel = memo(function ProductCarousel({ products }) {
  return (
    <div className="product-carousel">
      {products.map((product) => (
        <ProductCard key={product.onlineProdSn} product={product} />
      ))}
    </div>
  );
});

// widgets/src/entries/product-carousel.tsx
import { ProductCarousel } from '@/components';
import { useOpenAI } from '@/hooks';

function App() {
  const { toolOutput } = useOpenAI<{ products: Product[] }>();
  return <ProductCarousel products={toolOutput?.products || []} />;
}

Vite ๋นŒ๋“œ ์„ค์ •:

Widget์€ Vite์˜ Single File Plugin์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹จ์ผ HTML ํŒŒ์ผ๋กœ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค:

// vite.config.ts
export default defineConfig({
  plugins: [
    viteSingleFile({ removeViteModuleLoader: true }),
  ],
  build: {
    rollupOptions: {
      input: 'src/entries/product-carousel.tsx',
      output: {
        entryFileNames: '[name].html',
      },
    },
  },
});

๐ŸŽฌ ์‹ค์ œ ์‚ฌ์šฉ ๋ฐ๋ชจ

๋‹ค์Œ์€ ChatGPT์—์„œ ์•„๋ชจ๋ ˆ๋ชฐ ์ƒํ’ˆ์„ ์กฐํšŒํ•˜๋Š” ์‹ค์ œ ์‚ฌ์šฉ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค:

์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค:

  1. ์ธ๊ธฐ ์ƒํ’ˆ ์ถ”์ฒœ

    ์‚ฌ์šฉ์ž: "@amoremall ์ธ๊ธฐ์žˆ๋Š” ์ƒํ’ˆ์„ ์ถ”์ฒœํ•ด์ค˜"
    ChatGPT: [ProductCarousel ์œ„์ ฏ ํ‘œ์‹œ]
    
  2. ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๊ฒ€์ƒ‰

    ์‚ฌ์šฉ์ž: "์Šคํ‚จ์ผ€์–ด ๋ฒ ์ŠคํŠธ์…€๋Ÿฌ ๋ณด์—ฌ์ค˜"
    ChatGPT: [์Šคํ‚จ์ผ€์–ด ์นดํ…Œ๊ณ ๋ฆฌ์˜ ์ธ๊ธฐ ์ƒํ’ˆ ์บ๋Ÿฌ์…€ ํ‘œ์‹œ]
    
  3. ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰

    ์‚ฌ์šฉ์ž: "์„คํ™”์ˆ˜ ์ œํ’ˆ ์ฐพ์•„์ค˜"
    ChatGPT: [์„คํ™”์ˆ˜ ๋ธŒ๋žœ๋“œ ์ƒํ’ˆ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์บ๋Ÿฌ์…€ ํ‘œ์‹œ]
    
  4. ์ƒํ’ˆ ์ƒ์„ธ ์กฐํšŒ

    ์‚ฌ์šฉ์ž: "์ด ์ƒํ’ˆ์˜ ์ƒ์„ธ ์ •๋ณด ์•Œ๋ ค์ค˜"
    ChatGPT: [ProductCard ์œ„์ ฏ์œผ๋กœ ์ƒ์„ธ ์ •๋ณด ํ‘œ์‹œ]
    

โœจ ์ฃผ์š” ํŠน์ง• ๋ฐ ์ด์ 

๐ŸŽฏ 1. ์ž์—ฐ์–ด ์ธํ„ฐํŽ˜์ด์Šค

์‚ฌ์šฉ์ž๋Š” ๋ณต์žกํ•œ ๊ฒ€์ƒ‰ ์กฐ๊ฑด์„ ์ž…๋ ฅํ•  ํ•„์š” ์—†์ด, ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€ํ™”๋กœ ์›ํ•˜๋Š” ์ƒํ’ˆ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿš€ 2. ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์—ฐ๋™

ChatGPT๊ฐ€ ์ง์ ‘ ์•„๋ชจ๋ ˆ๋ชฐ API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ตœ์‹  ์ƒํ’ˆ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽจ 3. ์‹œ๊ฐ์  ์œ„์ ฏ UI

ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ ์‘๋‹ต์„ ๋„˜์–ด์„œ, ์‹ค์ œ ์ƒํ’ˆ ์ด๋ฏธ์ง€์™€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ ์œ„์ ฏ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”ง 4. ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜

์ƒˆ๋กœ์šด Tool๊ณผ Widget์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •

ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ

  • Python 3.10 ์ด์ƒ
  • Node.js 20 ์ด์ƒ
  • pnpm (ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €)
  • ngrok (ChatGPT ์—ฐ๋™์šฉ)

์„ค์น˜ ๋ฐ ์‹คํ–‰

# 1. Python ๊ฐ€์ƒํ™˜๊ฒฝ ์„ค์ •
cd apps/amoremall-in-sdk
uv venv
source .venv/bin/activate
uv pip install -e ".[dev]"

# 2. Widget UI ์˜์กด์„ฑ ์„ค์น˜
cd widgets
pnpm install
pnpm build:all

# 3. MCP ์„œ๋ฒ„ ์‹คํ–‰
cd ..
python -m server.main

# 4. ngrok ํ„ฐ๋„ ์„ค์ • (ChatGPT ์—ฐ๋™์šฉ)
ngrok http 8787 --host-header=localhost:8787

# 5. ChatGPT์— ์ปค๋„ฅํ„ฐ ๋“ฑ๋ก
# Settings โ†’ Connectors โ†’ Create
# URL: https://YOUR_NGROK_URL/mcp

๐Ÿ“‹ OpenAI Guidelines ์ค€์ˆ˜

UX Principles

  • โœ… Atomic actions: ๊ฐ Tool์€ ๋‹จ์ผ ๋ชฉ์  ์ˆ˜ํ–‰
  • โœ… Conversational leverage: ์ž์—ฐ์–ด ์š”์ฒญ ์ง€์›
  • โœ… Native fit: ChatGPT ๋Œ€ํ™” ํ๋ฆ„์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ†ตํ•ฉ
  • โœ… readOnlyHint: ์ฝ๊ธฐ ์ „์šฉ Tool์€ readOnlyHint=True ์„ค์ •

UI Guidelines

  • โœ… Display Modes: Inline Carousel, Inline Card ์‚ฌ์šฉ
  • โœ… System Colors: ChatGPT ์‹œ์Šคํ…œ ์ƒ‰์ƒ ์‚ฌ์šฉ
  • โœ… Typography: ์‹œ์Šคํ…œ ํฐํŠธ ์Šคํƒ ์‚ฌ์šฉ
  • โœ… Accessibility: WCAG AA ์ค€์ˆ˜, ํ‚ค๋ณด๋“œ ์ ‘๊ทผ์„ฑ
  • โœ… MIME Type: text/html+skybridge ์‚ฌ์šฉ

๐ŸŽ‰ ๋งˆ๋ฌด๋ฆฌ

ChatGPT Apps SDK์™€ MCP๋ฅผ ํ™œ์šฉํ•œ ์•„๋ชจ๋ ˆ๋ชฐ ํ†ตํ•ฉ์„ ํ†ตํ•ด, AI ์–ด์‹œ์Šคํ„ดํŠธ๊ฐ€ ์‹ค์ œ ์‡ผํ•‘ ์„œ๋น„์Šค์™€ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์‹œ๊ฐ„ ์ƒํ’ˆ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๊ฒฝํ—˜์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋‹จ์ˆœํ•œ ์ •๋ณด ์ œ๊ณต์„ ๋„˜์–ด์„œ, AI๊ฐ€ ์‹ค์ œ ์•ก์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์—์ด์ „ํŠธ๋กœ ์ง„ํ™”ํ•˜๋Š” ๋ฏธ๋ž˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ํŠนํžˆ ์ด์ปค๋จธ์Šค ๋ถ„์•ผ์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž์—ฐ์–ด๋กœ ์›ํ•˜๋Š” ์ƒํ’ˆ์„ ์ฐพ๊ณ , AI๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถ”์ฒœํ•˜๊ณ  ๋น„๊ตํ•ด์ฃผ๋Š” ์ฐจ์„ธ๋Œ€ ์‡ผํ•‘ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ญ ํ–ฅํ›„ ์ „๋ง

  • ๊ฐœ์ธํ™” ์ถ”์ฒœ: ์‚ฌ์šฉ์ž์˜ ๋Œ€ํ™” ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋งž์ถคํ˜• ์ƒํ’ˆ ์ถ”์ฒœ
  • ์žฅ๋ฐ”๊ตฌ๋‹ˆ ํ†ตํ•ฉ: ChatGPT ๋‚ด์—์„œ ์ง์ ‘ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ
  • ๊ฒฐ์ œ ์—ฐ๋™: AI ์–ด์‹œ์Šคํ„ดํŠธ๋ฅผ ํ†ตํ•œ ์›ํด๋ฆญ ๊ฒฐ์ œ ๊ฒฝํ—˜
  • ๋ฉ€ํ‹ฐ ๋ธŒ๋žœ๋“œ ํ™•์žฅ: ์•„๋ชจ๋ ˆ๋ชฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ๋ธŒ๋žœ๋“œ์™€์˜ ํ†ตํ•ฉ

๐Ÿ™ ๊ฐ์‚ฌ์˜ ๋ง์”€

์ด ๊ธ€์„ ์ฝ์œผ์‹œ๋Š” ๋ถ„๋“ค๊ป˜์„œ๋„ ์œ„ ๊ธ€์ด ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”— ๊ด€๋ จ ๋งํฌ

๐Ÿค–

OpenAI Apps in ChatGPT

ChatGPT Apps SDK ๊ณต์‹ ์†Œ๊ฐœ ๋ฐ ๊ฐ€์ด๋“œ

์›น์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ โ†’
๐Ÿ“š

OpenAI Apps SDK Quickstart

MCP ์„œ๋ฒ„ ๊ตฌ์ถ•์„ ์œ„ํ•œ ๋น ๋ฅธ ์‹œ์ž‘ ๊ฐ€์ด๋“œ

์›น์‚ฌ์ดํŠธ ๋ฐฉ๋ฌธ โ†’
๐Ÿ’ป

OpenAI Apps SDK Examples

๊ณต์‹ ์˜ˆ์ œ ์ฝ”๋“œ ๋ฐ ๊ตฌํ˜„ ์ฐธ๊ณ  ์ž๋ฃŒ

GitHub ๋ฐฉ๋ฌธ โ†’

๐Ÿท๏ธ ํƒœ๊ทธ

#chatgpt

#openai

#apps_sdk

#mcp

#ai

#ecommerce

#amorepacific

#react

#python