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 分