07. MCP κΈ°λ° μλν νμ΄νλΌμΈ μ λ΅
μ λ΅ κ°μ
Figma MCP + AI Agent + CI/CDλ₯Ό κ²°ν©νμ¬, λμμΈ λ³κ²½μ΄ λ°μνλ©΄ μ¬λ κ°μ
μ΅μνλ‘ μ½λ PRμ΄ μλ μμ±λλ νμ΄νλΌμΈμ ꡬμΆνλ μ λ΅μ
λλ€.
"λμμΈ β μ½λ"μ μΌλ°©ν΅νμ μλνν©λλ€.
[λμμ΄λκ° Figma λ³κ²½]
β
βΌ
[Figma Webhook (FILE_UPDATE)]
β
βΌ
[GitHub Actions Workflow]
β
βΌ
[AI Agent + Framelink MCP]
- λ³κ²½λ λ
Έλ μλ³
- μ½λ μμ±/μμ
β
βΌ
[μλ PR μμ±]
- λ³κ²½ diff
- Storybook μκ° νκ· κ²°κ³Ό
- Code Connect λ§€ν κ²μ¦
β
βΌ
[μ¬λ 리뷰 β λ¨Έμ§ β λ°°ν¬]
Plain Text
볡μ¬
ν΅μ¬ λꡬ
β’
Figma Webhooks (Planλ³ κ°μ©)
β’
GitHub Actions
β’
Framelink MCP (μλ² νκ²½μμ μ€ν κ°λ₯)
β’
Claude Code SDK / Copilot CLI / OpenAI Agents SDK λ± ν€λλ¦¬μ€ AI
β’
Chromatic / Playwright (μκ° νκ· κ²μ¦)
μ μ© μλ리μ€
β’
λμμΈ λ³κ²½ λΉλκ° λ§€μ° λμ
β’
μ»΄ν¬λνΈ λ¨μκ° λͺ
νν λμμΈ μμ€ν
β’
κ°λ ₯ν μλ ν
μ€νΈ νκ²½ 보μ
β’
AI λΉμ©μ κ°μν μ μλ κ·λͺ¨
λ¨κ³λ³ ꡬμΆ
1) Figma Webhook μ€μ
curl -X POST <https://api.figma.com/v2/webhooks> \\
-H "X-Figma-Token: $FIGMA_TOKEN" \\
-d '{
"event_type": "FILE_UPDATE",
"file_key": "abcXYZ",
"endpoint": "<https://api.your-org.com/figma-webhook>",
"passcode": "secret"
}'
Bash
볡μ¬
2) Webhook μμ β GitHub Actions Trigger
β’
μμ μλ²(μ: Cloudflare Workers)μμ λ³κ²½ κ²μ¦
β’
GitHub repository_dispatch μ΄λ²€νΈ λ°μ
3) GitHub Actions: AI Agent μ€ν
on:
repository_dispatch:
types: [figma-update]
jobs:
sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run AI Agent with MCP
run: |
npx @anthropic/claude-code \\
--mcp-config .mcp/figma.json \\
--prompt "$(cat .ai/sync-prompt.md)" \\
--file-key ${{ github.event.client_payload.file_key }}
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
FIGMA_TOKEN: ${{ secrets.FIGMA_TOKEN }}
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6
with:
title: "π¨ Figma sync: ${{ github.event.client_payload.file_name }}"
body: ${{ steps.ai.outputs.summary }}
branch: figma-sync/${{ github.run_id }}
YAML
볡μ¬
4) AI ν둬ννΈ μ€κ³ (.ai/sync-prompt.md)
λΉμ μ Figma β React μλ λκΈ°ν μμ΄μ νΈμ
λλ€.
μ§μΉ¨:
1. Figma fileμ λ³κ²½λ μ»΄ν¬λνΈλ₯Ό μλ³νμΈμ (mcp.get_figma_data)
2. μ½λ μΈ‘ src/components/ μ λμ μ»΄ν¬λνΈλ₯Ό μ°ΎμΌμΈμ
3. λ³κ²½ μ¬νμ μ μ©νλ, λ€μ κ·μΉ μ€μ:
- λμμΈ ν ν°λ§ μ¬μ© (hex μ§μ μ
λ ₯ κΈμ§)
- κΈ°μ‘΄ props μκ·Έλμ² μ μ§
- Storybook μ€ν 리λ ν¨κ» μ
λ°μ΄νΈ
4. λ³κ²½ μμ½μ PR descriptionμ μμ±
5. λΆνμ€ν λ³κ²½μ μ½λ©νΈλ‘ νκΈ° (`// AI: κ²ν νμ`)
Plain Text
볡μ¬
5) PR κ²μ¦ κ²μ΄νΈ
β’
Storybook λΉλ
β’
Chromatic μκ° νκ· (λ³κ²½ μλ νμΈ)
β’
TypeScript μ»΄νμΌ
β’
ESLint
β’
Code Connect λ§€ν κ²μ¦ (figma connect parse)
β’
μ¬λ 리뷰 νμ
6) λ¨Έμ§ β λ°°ν¬
β’
Vercel/Netlify μλ λ°°ν¬
β’
Slack/Discord μλ¦Ό
μ₯μ
β’
λμμΈ λ³κ²½μ μ¦κ° λ°μ
β’
μ¬λμ λ¨μ μμ
μ κ±°
β’
μΆμ κ°λ₯μ±: λͺ¨λ λ³κ²½μ΄ PRλ‘ κΈ°λ‘λ¨
β’
νμ₯μ±: μ»΄ν¬λνΈ μκ° λ§μμλ‘ κ°μΉ β
νκ³
β’
AI μ λ’°μ±: μλμ λ€λ₯Έ λ³κ²½ λ°μ κ°λ₯ β κ²μ΄νΈ νμ
β’
λΉμ©: AI API + Figma Plan + CI λΉμ©
β’
볡μ‘ν μΈνλΌ: μ΄μν νμ
β’
Webhook κ°μ©μ±: Figma Plan μμ‘΄
β’
μ μ»΄ν¬λνΈ μ κ· μμ±λ³΄λ€λ κΈ°μ‘΄ μ»΄ν¬λνΈ μ
λ°μ΄νΈμ κ°ν¨
μμ μ₯μΉ
β’
Auto-merge μ λ κΈμ§ β νμ μ¬λ 리뷰
β’
λ³κ²½ μν₯ λΆμ: μ΄λ€ νμ΄μ§/μ¬μ©μ²μ μν₯ κ°λμ§ μλ μ½λ©νΈ
β’
Rollback μ μ°¨ μ¬μ μ μ
β’
μΉ΄λ리 λ°°ν¬: PR λ¨Έμ§ ν μΌλΆ νΈλν½μλ§ μ°μ λ°°ν¬
λ€λ₯Έ μ λ΅κ³Όμ κ²°ν©
β’
04 (Design Tokens): ν ν° λ³κ²½μ λ³λ νμ΄νλΌμΈμΌλ‘ λΆλ¦¬
β’
05 (Storybook SoT): μκ° νκ·λ‘ λ³κ²½ κ²μ¦
β’
06 (Library Registry): μλ PRμ΄ ν¨ν€μ§ λ²μ λ ν¨κ» bump
