Mcp Design System Extractor

io.github.freema由 GitHub 帳號 freema 發布v1.3.0更新於 Nov 7, 2026

MCP server for Storybook design systems — extract component HTML, styles and metadata.

概覽

AI 產生的概覽

本機 MCP 伺服器,讀取 Storybook 設計系統,讓助理列出、搜尋並擷取元件 HTML、樣式與主題權杖。

可以做什麼
  • 依名稱、標題、分類或用途列出與搜尋元件,支援精簡輸出與分頁
  • 擷取元件 story 的渲染 HTML,可選擇包含 CSS,或僅列出可用變體
  • 分析某個元件內部使用了哪些其他元件
  • 讀取主題資訊,例如顏色、間距、字體排版與 CSS 變數
  • 抓取並歸類同一網域下外部 CSS 檔案中的設計權杖
  • 檢視、輪詢與取消背景佇列中的長時間擷取工作
適用情境
當你以既有 Storybook 設計系統開發或遷移介面,希望助理找到合適的元件、複製其標記並對齊現有樣式與權杖時使用。適合以現有元件拼裝新頁面,或在其他框架中重建某個元件等前端工作。
執行需求
透過 npx 或全域 npm 安裝後在本機執行。需要 Node.js 22.12+ 以及供 Puppeteer 使用的 Chrome/Chromium。需要一個執行中的 Storybook 7-10 實例(開發伺服器或透過 HTTP 提供的靜態建置),位址由 STORYBOOK_URL 指定(預設
安裝前請注意
將 NODE_TLS_REJECT_UNAUTHORIZED 設為 0 會關閉該行程內所有 Node 連線的 TLS 憑證驗證,建議優先使用受信任憑證。伺服器會以無頭 Chrome 渲染頁面並從 Storybook 主機抓取 CSS,請只連線你信任的實例。DEBUG 會在 stderr 輸出詳細日誌。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Mcp Design System Extractor,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

MCP Design System Extractor

A Model Context Protocol (MCP) server that extracts component information from Storybook design systems. Connects to Storybook instances and extracts HTML, styles, and component metadata.

[Demo]

Installation

Using Claude CLI (Recommended)

bash
claude mcp add design-system npx mcp-design-system-extractor@latest \  --env STORYBOOK_URL=http://localhost:6006

With self-signed certificate:

bash
claude mcp add design-system npx mcp-design-system-extractor@latest \  --env STORYBOOK_URL=https://my-storybook.example.com \  --env NODE_TLS_REJECT_UNAUTHORIZED=0

Using npm

bash
npm install -g mcp-design-system-extractor

Then configure in your MCP client (see Environment Variables).

From Source

bash
git clone https://github.com/freema/mcp-design-system-extractor.gitcd mcp-design-system-extractornpm install && npm run buildnpm run setup  # Interactive setup for Claude Desktop

Key Dependencies

  • Puppeteer: Uses headless Chrome for dynamic JavaScript component rendering
  • Chrome/Chromium: Required for Puppeteer (automatically handled in Docker)
  • Works with built Storybook distributions
[Design System Extractor MCP server]

Features

  • List Components: Get all available components from your Storybook with compact mode
  • Extract HTML: Get the rendered HTML of any component (async or sync mode)
  • Search Components: Find components by name, title, category, or purpose
  • Component Dependencies: Analyze which components are used within other components
  • Theme Information: Extract design system theme (colors, spacing, typography)
  • External CSS Analysis: Fetch and analyze CSS files to extract design tokens
  • Async Job Queue: Long-running operations run in background with job tracking

Environment Variables

VariableDescriptionDefault
STORYBOOK_URLURL of your Storybook instancehttp://localhost:6006
NODE_TLS_REJECT_UNAUTHORIZEDSet to 0 to skip SSL certificate verification (for self-signed certs)1

Example with self-signed certificate:

json
{  "mcpServers": {    "design-system": {      "command": "node",      "args": ["/path/to/dist/index.js"],      "env": {        "STORYBOOK_URL": "https://my-storybook.example.com",        "NODE_TLS_REJECT_UNAUTHORIZED": "0"      }    }  }}

Usage

See DEVELOPMENT.md for detailed setup instructions.

Available Tools (9 total)

Core Tools

  1. list_components

    • Lists all available components from the Storybook instance
    • Use compact: true for minimal output (reduces response size)
    • Filter by category parameter
    • Supports pagination with page and pageSize (default: 20)
  2. get_component_html

    • Extracts HTML from a specific component story
    • Async by default: Returns job_id, use job_status to poll for results
    • Set async: false for synchronous mode (uses timeout parameter)
    • Use variantsOnly: true to get list of available variants (sync, fast)
    • Optional includeStyles: true for CSS extraction (Storybook CSS filtered out)
    • Story ID format: "component-name--story-name" or just "component-name" (auto-resolves to default variant)
  3. search_components

    • Search components by name, title, category, or purpose
    • query: Search term (use "*" for all)
    • purpose: Find by function ("form inputs", "navigation", "feedback", "buttons", etc.)
    • searchIn: "name", "title", "category", or "all" (default)
    • Supports pagination with page and pageSize

Component Analysis Tools

  1. get_component_dependencies
    • Analyzes rendered HTML to find which other components are used internally
    • Detects React components, web components, and CSS class patterns
    • Requires story ID format: "component-name--story-name"

Design System Tools

  1. get_theme_info

    • Extracts design system theme (colors, spacing, typography, breakpoints)
    • Gets CSS custom properties/variables
    • Use includeAll: true for all CSS variables
  2. get_external_css

    • DEFAULT: Returns only design tokens + file stats (avoids token limits)
    • Extracts & categorizes tokens: colors, spacing, typography, shadows
    • Use includeFullCSS: true only when you need full CSS content
    • Security-protected: only accepts URLs from same domain as Storybook

Job Management Tools

  1. job_status

    • Check status of an async job
    • Returns: status, result (when completed), error (when failed)
    • Poll this after calling get_component_html in async mode
  2. job_cancel

    • Cancel a queued or running job
    • Returns whether cancellation was successful
  3. job_list

    • List all jobs with their status
    • Filter by status: "all" (default), "active" (queued/running), "completed"
    • Returns job list + queue statistics

Example Usage

typescript
// List all components (compact mode recommended)await list_components({ compact: true });
// Search for componentsawait search_components({ query: "button", searchIn: "name" });
// Find components by purposeawait search_components({ purpose: "form inputs" });
// Get variants for a componentawait get_component_html({  componentId: "button",  variantsOnly: true});// Returns: { variants: ["primary", "secondary", "disabled"] }
// Get HTML (async mode - default)await get_component_html({ componentId: "button--primary" });// Returns: { job_id: "job_xxx", status: "queued" }
// Poll for resultawait job_status({ job_id: "job_xxx" });// Returns: { status: "completed", result: { html: "...", classes: [...] } }
// Get HTML (sync mode)await get_component_html({  componentId: "button--primary",  async: false,  timeout: 30000});// Returns: { html: "...", classes: [...] }
// Get HTML with stylesawait get_component_html({  componentId: "button--primary",  async: false,  includeStyles: true});
// Check all running jobsawait job_list({ status: "active" });
// Extract theme infoawait get_theme_info({ includeAll: false });
// Get design tokens from CSSawait get_external_css({  cssUrl: "https://my-storybook.com/assets/main.css"});

AI Assistant Usage Tips

  1. Start with discovery: Use list_components with compact: true
  2. Get variants first: Use get_component_html with variantsOnly: true
  3. Use async for HTML: Default async mode prevents timeouts on large components
  4. Poll job_status: Check job completion before reading results
  5. Search by purpose: Use search_components with purpose parameter

Example Prompts

Once connected, you can use natural language prompts with Claude:

[MCP Servers Connected]

Component Discovery:

Show me all available button components in the design system

Building New Features:

I need to create a user profile card. Find relevant componentsfrom the design system and show me their HTML structure.

Design System Analysis:

Extract the color palette and typography tokens from the design system.I want to ensure my new component matches the existing styles.

Component Migration:

Get the HTML and styles for the "alert" component. I need torecreate it in a different framework while keeping the same look.

Multi-Tool Workflow:

First list all form-related components, then get the HTML forthe input and select components. I'm building a registration form.

How It Works

Connects to Storybook via /index.json and /iframe.html endpoints. Uses Puppeteer with headless Chrome for dynamic JavaScript rendering. Long-running operations use an in-memory job queue with max 2 concurrent jobs and 1-hour TTL for completed jobs.

Troubleshooting

  • Ensure Storybook is running and STORYBOOK_URL is correct
  • Use list_components first to see available components
  • For large components, use async mode (default) and poll job_status
  • Check /index.json endpoint directly in browser
  • SSL certificate errors: Set NODE_TLS_REJECT_UNAUTHORIZED=0 for self-signed certificates
  • See DEVELOPMENT.md for detailed troubleshooting

Requirements

  • Node.js 22.12+
  • Chrome/Chromium (for Puppeteer)
  • Running Storybook instance (see below for supported versions)

Supported Storybook versions

Storybook 7, 8, 9 and 10. The server reads the story index from /index.json, falling back to /stories.json, and renders stories through /iframe.html?id=<storyId> — endpoints that have been stable across all four major versions.

Storybook 6 and earlier are not supported: they predate /index.json and use a different story-id scheme.

Both a dev server (npm run storybook) and a built static Storybook served over HTTP will work.

Development

See DEVELOPMENT.md for detailed development instructions.

Author

Created by Tomáš Grasl

License

MIT

來源:README.md,提交 e30ea7b

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

2
  1. v1.3.0最新Nov 7, 2026
  2. v1.2.0Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分