Skip to main content
Glama
aransword

storybook-mcp

by aransword
README.md
# πŸ“˜ Storybook MCP Server πŸš€

이 μ„œλ²„λŠ” **Model Context Protocol (MCP)** 을 톡해  
AI μ—μ΄μ „νŠΈ(**Cline, Roo Code, Claude Desktop** λ“±)κ°€  
둜컬 **Storybook μ»΄ν¬λ„ŒνŠΈ λͺ…μ„Έλ₯Ό 직접 읽고 뢄석**ν•  수 μžˆλ„λ‘ λ•λŠ” λ„κ΅¬μž…λ‹ˆλ‹€.

---

## ✨ μ£Όμš” κΈ°λŠ₯ (Core Features)

### πŸ” 슀마트 μ»΄ν¬λ„ŒνŠΈ 탐색
- `configure.mdx`와 같은 λ‹¨μˆœ λ¬Έμ„œλŠ” μ œμ™Έ
- **μ‹€μ œ μ‚¬μš© μ˜ˆμ‹œ(Story)κ°€ μ‘΄μž¬ν•˜λŠ” μ§„μ§œ UI μ»΄ν¬λ„ŒνŠΈλ§Œ** μ„ λ³„ν•˜μ—¬ λͺ©λ‘ 제곡

### πŸ“‹ Props λͺ…μ„Έ μΆ”μΆœ
- μ»΄ν¬λ„ŒνŠΈμ˜ **Docs νŽ˜μ΄μ§€** 뢄석
- `ArgsTable`에 μ •μ˜λœ Props의  
  **이름 / μ„€λͺ… / κΈ°λ³Έκ°’**을 μ •ν™•ν•˜κ²Œ μΆ”μΆœ

### πŸ’» μ†ŒμŠ€ μ½”λ“œ μΆ”μΆœ
- Docs νŽ˜μ΄μ§€μ˜ **β€œShow code” λ²„νŠΌμ„ μžλ™ 클릭**
- 각 μŠ€ν† λ¦¬λ³„ **μ‹€μ œ React / JSX κ΅¬ν˜„ μ˜ˆμ‹œ μ½”λ“œ** μˆ˜μ§‘

### 🧠 μžλ™ ν™˜κ²½ λŒ€μ‘
- Docs 탭이 μ—†λŠ” μ»΄ν¬λ„ŒνŠΈμ˜ 경우  
  **Story(Canvas) νƒ­μœΌλ‘œ μžλ™ μ „ν™˜**ν•˜μ—¬ μœ μ—°ν•˜κ²Œ 처리

---

## βš™οΈ μ„€μΉ˜ 및 μ„€μ • (Setup)

### 1️⃣ 사전 μš”κ΅¬ 사항
- **Node.js** μ„€μΉ˜
- 뢄석 λŒ€μƒ ν”„λ‘œμ νŠΈμ˜ **Storybook μ‹€ν–‰ 쀑**
  - κΈ°λ³Έ URL: `http://localhost:6006`

---

### 2️⃣ MCP μ„€μ • (Configuration)

`claude_desktop_config.json` λ˜λŠ”  
VS Code의 MCP μ„€μ • 파일(Cline μ„€μ • λ“±)에 μ•„λž˜ λ‚΄μš©μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.

```json
{
  "mcpServers": {
    "storybook-mcp": {
      "command": "node",
      "args": [
        "-y",
        "@woori-fisa-6th/storybook-mcp"
      ],
      "env": {
        "STORYBOOK_URL": "storybook_url_to_access"
      }
    }
  }
}
```

## 🧰 도ꡬ λͺ…μ„Έ (Tool Definitions)

---

### 1️⃣ `list_storybook_components`

**μ„€λͺ…**  
μ„€μ •λœ Storybook URL의 `index.json`을 λΆ„μ„ν•˜μ—¬  
**μŠ€ν† λ¦¬κ°€ μ‘΄μž¬ν•˜λŠ” 유효 μ»΄ν¬λ„ŒνŠΈ λͺ©λ‘**을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

**λ™μž‘ 방식**
- `configure.mdx` λ“± λ‹¨μˆœ λ¬Έμ„œ μŠ€ν† λ¦¬ μ œμ™Έ
- μ‹€μ œ Storyκ°€ μ‘΄μž¬ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈλ§Œ 필터링

**λ°˜ν™˜ 데이터**
- `name` : μ»΄ν¬λ„ŒνŠΈ 이름
- `url` : 접속 κ°€λŠ₯ν•œ Docs λ˜λŠ” Story νŽ˜μ΄μ§€ URL
- `hasDocs` : Docs νŽ˜μ΄μ§€ 쑴재 μ—¬λΆ€ (`true | false`)
- `availableStories` : ν¬ν•¨λœ μŠ€ν† λ¦¬ 이름 λͺ©λ‘

---

### 2️⃣ `analyze_storybook_props`

**인자**
- `url` *(string)* : 뢄석할 μ»΄ν¬λ„ŒνŠΈμ˜ Docs νŽ˜μ΄μ§€ μ£Όμ†Œ

**μ„€λͺ…**  
Puppeteerλ₯Ό μ‚¬μš©ν•˜μ—¬ νŽ˜μ΄μ§€κ°€ μ™„μ „νžˆ λ Œλ”λ§λ  λ•ŒκΉŒμ§€ λŒ€κΈ°ν•œ ν›„,  
`ArgsTable (.docblock-argstable)`에 μ •μ˜λœ **μ‹€μ œ Props 정보**λ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€.

**λ™μž‘ 방식**
- Docs νƒ­ μžλ™ μ§„μž…
- Props ν…Œμ΄λΈ” λ Œλ”λ§ 감지 ν›„ 데이터 μˆ˜μ§‘

**λ°˜ν™˜ 데이터**
- `name` : Prop 이름
- `description` : Prop μ„€λͺ…
- `defaultValue` : κΈ°λ³Έκ°’

---

### 3️⃣ `extract_component_stories`

**인자**
- `url` *(string)* : μ»΄ν¬λ„ŒνŠΈ Docs νŽ˜μ΄μ§€ μ£Όμ†Œ

**μ„€λͺ…**  
μ»΄ν¬λ„ŒνŠΈμ˜ μ‹€μ œ κ΅¬ν˜„ μ˜ˆμ‹œλ₯Ό μ–»κΈ° μœ„ν•΄  
νŽ˜μ΄μ§€ λ‚΄ λͺ¨λ“  **β€œShow code” λ²„νŠΌμ„ μžλ™μœΌλ‘œ 클릭**ν•˜μ—¬  
μŠ€ν† λ¦¬λ³„ μ†ŒμŠ€ μ½”λ“œλ₯Ό μˆ˜μ§‘ν•©λ‹ˆλ‹€.

**λ™μž‘ 방식**
- Docs νƒ­ μš°μ„  μ‹œλ„
- Docsκ°€ 없을 경우 Canvas(Story) νƒ­μœΌλ‘œ μžλ™ μ „ν™˜
- 각 μŠ€ν† λ¦¬μ˜ μ½”λ“œ 블둝 μΆ”μΆœ

**λ°˜ν™˜ 데이터**
- `stories` : μŠ€ν† λ¦¬ λ°°μ—΄
  - `name` : μŠ€ν† λ¦¬ 이름
  - `code` : ν•΄λ‹Ή μŠ€ν† λ¦¬μ˜ React / JSX μ†ŒμŠ€ μ½”λ“œ

---