mcpField
F
figma-bridge-mcp

figma-bridge-mcp

本地服务
github.com/nguyendinhphongdx其他01 天前更新

关于 figma-bridge-mcp

figma-bridge-mcp 是本地 MCP 服务,可将 AI 客户端连接到 Figma Desktop 中打开的文档。它既能通过 JavaScript 编辑画布,也能读取设计数据、令牌、CSS、组件和截图。

主要功能

  1. 01创建和修改画布设计
  2. 02读取节点树与设计令牌
  3. 03提取 CSS 和组件映射
  4. 04截取画面并导出图像
  5. 05支持多个 Figma 会话
  6. 06通过 localhost 本地运行

适用场景

  1. 01在 Figma 画布生成 UI 布局
  2. 02检查选中设计以供实现
  3. 03将画框信息转换为 CSS
  4. 04查看截图并迭代设计

MCP 相关

向 MCP 客户端提供五种工具:连接状态、API 与设计指南、基于 JavaScript 的写入、设计读取和规则查询。它通过 Figma Desktop 插件和本地桥接服务连接。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"nguyendinhphongdx-figma-bridge": {
"command": "npx",
"args": [
"-y",
"@hanoilab/figma-bridge-mcp"
]
}
}
}
启动命令npx -y @hanoilab/figma-bridge-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@hanoilab/figma-bridge-mcp2.6.1

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

figma-bridge-mcp — Figma MCP 桥接工具
让 AI 在你的 Figma 画布上绘图,并将设计读回为代码。

面向 Figma Desktop 的双向 Model Context Protocol 桥接工具。
无需 Figma API 密钥。无需云服务。所有操作均在 localhost 上运行。

npm CI Node MCP Registry License: MIT

快速开始 · 工作原理 · 工具 · 安全模型 · 故障排除 · 更新日志

与 Figma, Inc. 无关联,未经其认可或赞助。“Figma”是 Figma, Inc. 的商标,在此仅用于描述兼容性。


概述

figma-bridge-mcp 将 AI 助手连接到你在 Figma Desktop 中打开的文档。

✍️ 写入AI 通过 figma.* API 运行 JavaScript,以创建画框、文本、矢量、组件、变量和原型。
👀 读取AI 提取节点树、解析后的设计令牌、CSS、组件映射和屏幕截图,可直接用于设计转代码。
🔒 本地运行桥接工具仅监听 127.0.0.1。任何内容都不会离开你的设备。
🧩 支持任何 MCP 客户端✅ 已通过 Claude Code 和 Antigravity 测试。🔧 兼容 Cursor、VS Code、Windsurf、Zed 及任何 stdio MCP 客户端。

需要 Figma Desktop。 插件通过 localhost 与服务通信,而 Figma 网页应用不允许这样做。


工作原理

三个部分协同工作:你的 AI 客户端、MCP 服务(Node)和 Figma 插件(运行在 Figma Desktop 内)。插件会轮询服务,因此无需向 Figma 发起任何入站连接。

flowchart LR
  subgraph Client["AI client"]
    A["Claude Code · Cursor · Windsurf<br/>VS Code · Antigravity · any MCP client"]
  end
  subgraph Server["figma-bridge-mcp  (Node)"]
    B["MCP server<br/>5 tools · stdio"]
    C["Code sandbox<br/>runs figma_write code"]
    D["HTTP bridge<br/>127.0.0.1:47451"]
  end
  subgraph Figma["Figma Desktop"]
    E["Plugin UI<br/>long-poll client"]
    F["Plugin main thread<br/>66 operations"]
    G[("Figma document")]
  end
  A <-->|"MCP / stdio"| B
  B --> C
  C --> D
  B --> D
  D <-->|"HTTP long-poll"| E
  E <-->|postMessage| F
  F <--> G
一次往返

服务会让每次轮询保持打开状态,最长 8 s;一旦有工作排队,就立即响应,因此延迟通常低于 100 ms。

sequenceDiagram
  autonumber
  participant AI as AI client
  participant S as MCP server
  participant B as Bridge :47451
  participant P as Figma plugin
  AI->>S: figma_write { code }
  S->>S: run code in sandbox
  S->>B: queue operation (create, modify, …)
  P->>B: GET /poll  (held up to 8 s)
  B-->>P: operations
  P->>P: apply to the Figma document
  P->>B: POST /response { id, data }
  B-->>S: resolve operation
  S-->>AI: result + logs
同时打开多个 Figma 文件

每个打开的插件实例都会注册自己的 会话。传入可选的 sessionId 至 figma_write / figma_read,即可指定目标文件;如果该会话未连接,调用会失败,而不会写入其他文件。


快速开始

1 · 将 MCP 服务添加到你的客户端
Claude Code
claude mcp add figma-bridge-mcp -- npx @hanoilab/figma-bridge-mcp          # this project
claude mcp add --scope user figma-bridge-mcp -- npx @hanoilab/figma-bridge-mcp   # all projects
Claude Desktop

编辑 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows):

{
  "mcpServers": {
    "figma": { "command": "npx", "args": ["-y", "@hanoilab/figma-bridge-mcp"] }
  }
}
Cursor

编辑 .cursor/mcp.json(项目级)或 ~/.cursor/mcp.json(全局),并添加与 Claude Desktop 所示相同的 mcpServers 配置块。

VS Code / GitHub Copilot

编辑 .vscode/mcp.json,或添加到 settings.json:

{
  "mcp": {
    "servers": {
      "figma": { "command": "npx", "args": ["-y", "@hanoilab/figma-bridge-mcp"] }
    }
  }
}
Windsurf

编辑 ~/.codeium/windsurf/mcp_config.json,并添加与 Claude Desktop 所示相同的 mcpServers 配置块。

Antigravity (Google)

在 Agent 面板中选择 “…”菜单 → 管理 MCP 服务 → 查看原始配置,然后将相同的 mcpServers 配置块添加到 mcp_config.json。

从源代码运行
git clone https://github.com/nguyendinhphongdx/figma-bridge-mcp
cd figma-bridge-mcp && npm install
# point your MCP client at: node /path/to/figma-bridge-mcp/server/index.js

编辑配置后,请重启客户端。 MCP 服务仅在启动时加载。

2 · 安装 Figma 插件
  1. ⬇ 下载插件,并解压到任意位置。
  2. 在 Figma Desktop 中:Plugins → Development → Import plugin from manifest…,然后选择 manifest.json。
  3. 运行 Plugins → Development → Bridge MCP for Figma。

插件连接到服务后,窗口会显示一个绿色圆点。

3 · 连接并设计

告诉你的助手:

“连接到 figma-bridge-mcp”

它会调用 figma_status,并确认文件、页面和插件版本。然后只需描述你的需求:

“绘制一个带有 Apple 和 Google 登录按钮的移动端登录界面。”

flowchart LR
  P["Your prompt"] --> D["figma_docs<br/>load API + design rules"]
  D --> R["figma_read<br/>inspect the canvas"]
  R --> W["figma_write<br/>draw / modify"]
  W --> S["figma_read screenshot<br/>verify"]
  S -->|"needs fixes"| W
  S -->|"looks right"| Done(["Done"])
提示词创意与技巧
提示词执行结果
“绘制一个带有社交按钮的移动端登录界面”一个包含输入框和按钮的 390×844 画框
“读取选中的画框并描述设计”提取所选内容的颜色、排版和间距
“将我选中的画框转换为 Tailwind”读取节点树并生成代码
“创建一个带有 KPI 卡片的深色仪表盘”包含统计数据和图表的完整布局
“截取当前画框的屏幕截图”生成可供 AI 分析的内嵌图片
  • 指定样式(dark、glassmorphism、minimal white)和平台(mobile 390×844、tablet 768×1024、desktop 1440×900)。
  • 迭代修改:“放大按钮”可修改现有节点——AI 会先读取,再进行修改。
  • 使用选区:选中一个画框,然后询问“改进这个设计”。
更新
npx @hanoilab/figma-bridge-mcp@latest --version   # prints the new version and the plugin path

重启客户端,然后从输出的路径重新导入 manifest.json(Plugins → Development → Manage plugins in development)。Figma 插件不会自动更新。运行 figma_status 并检查 pluginVersion 是否匹配。


工具

该服务提供五个 MCP 工具。

工具用途
figma_status检查连接、活动文件/页面和会话。请先调用。
figma_docs完整的 API 参考和设计规则。绘制前调用。
figma_write运行 JavaScript,使用 figma.* API 创建或修改设计。
figma_read提取设计数据:树、令牌、CSS、组件和屏幕截图。
figma_rules包含颜色令牌、文本样式、变量和组件的 Markdown 规则表。每个会话调用一次。
设计转代码
flowchart LR
  F["Select a frame<br/>in Figma"] --> A["get_design_context<br/>layout · tokens · typography"]
  F --> B["get_css<br/>ready-to-paste CSS"]
  F --> C["get_component_map<br/>instances + import paths"]
  A --> AI(["AI generates<br/>React · Vue · Swift · Tailwind"])
  B --> AI
  C --> AI
figma_write — 47 项操作

代码在包含 figma 对象的沙盒中运行;每次调用相互独立,因此请在每次调用开始时重新查询节点 ID。

const root = await figma.create({
  type: "FRAME", name: "Dashboard", width: 1440, height: 900, fill: "#0f172a",
});
const sidebar = await figma.create({
  type: "FRAME", name: "Sidebar", parentId: root.id,
  width: 240, height: 900, fill: "#1e293b", stroke: "#334155", strokeWeight: 1,
});
await figma.create({
  type: "TEXT", parentId: sidebar.id, x: 20, y: 24,
  content: "My App", fontSize: 16, fontWeight: "SemiBold", fill: "#f8fafc",
});
区域操作
节点create(FRAME、RECTANGLE、ELLIPSE、LINE、TEXT、SVG、VECTOR、IMAGE)· modify · delete(单个或 ids: [])· query · append · clone · group / ungroup · flatten · resize · batch(最多 50 项操作)
页面与视图status · listPages · setPage · createPage · set_selection · set_viewport
组件listComponents · createComponent · instantiate(支持按图层设置 overrides)· setComponentProperties · swapComponent · addComponentProperty · bindComponentProperty · unbindComponentProperty · removeComponentProperty
令牌与样式setupDesignTokens(在一次幂等调用中设置颜色、数字、字体、文本样式和模式)· 变量集合 / 模式 / 值 · applyVariable · applyTextStyle · setFrameVariableMode · createPaintStyle · createTextStyle
图像与图标loadImage(url) · loadIcon(name) · loadIconIn(name) — 在服务端执行,支持 7 个图标库的回退机制(Ionicons → Fluent → Bootstrap → Phosphor → Tabler → Lucide)
原型设计setReactions / removeReactions(单击、悬停、按下 → 导航、叠加、替换;支持 Smart Animate 等)· setScrollBehavior
create / modify 的样式属性
属性示例
纯色填充"#6C5CE7"、"#6C5CE780"(8 位十六进制)或 "rgba(108,92,231,0.5)"
渐变{ type: "LINEAR_GRADIENT", angle: 135, stops: [{ pos: 0, color: "#7C3AED" }, { pos: 1, color: "#EC4899" }] }(也支持 RADIAL_GRADIENT)
圆角cornerRadius: 12 或 topLeftRadius / topRightRadius / bottomLeftRadius / bottomRightRadius
效果[{ type: "DROP_SHADOW", color: "#00000026", offset: {x:0,y:8}, radius: 24 }] — 也支持 INNER_SHADOW、LAYER_BLUR、BACKGROUND_BLUR
矢量路径d: "M 150 7 A 143 143 0 1 1 29.26 226.62" — SVG 弧线会转换为贝塞尔曲线
插入位置insertIndex: 2 会将节点放置在其父节点中的指定索引位置

applyVariable 可将 FLOAT、COLOR、STRING 和 BOOLEAN 变量绑定到填充、描边、几何属性、圆角、自动布局间距、排版、字体系列 / 样式、文本内容和可见性。

### `figma_read` — 19 项操作
操作返回内容
get_selection · get_design · get_page_nodes选区、画框/页面或顶层画框的节点树
get_design_context面向 AI 优化的载荷:弹性布局、解析为 var(--name) 的填充令牌、带样式名称的排版、组件实例
get_component_map · get_unmapped_components每个实例的集合名称、变体标签和建议导入路径;尚未映射代码的实例
get_node_detail单个节点的属性,其中变量和样式已解析为名称和值,并附有完整的实例覆盖列表
get_css可直接使用的节点 CSS 字符串
screenshot · export_image · export_svg内嵌 PNG、base64 PNG/JPG(format、scale)或 SVG 标记
get_styles · get_variables · get_local_components · get_viewport本地样式、设计令牌(所有模式)、组件、视口
getReactions · getComponentProperties节点的原型交互;组件或实例的变体、布尔值、文本和实例替换属性
search_nodes · scan_design按类型、名称、颜色、字体、尺寸查找节点;渐进扫描大型文件

默认跳过隐藏图层;在 get_selection、get_design、search_nodes 或 scan_design 中传入 includeHidden: true 即可包含隐藏图层。

使用现有设计系统

先读取,再绘制,然后绑定到现有内容:

const vars = await figma.get_variables();
const varMap = {};
vars.collections.forEach(c => c.variables.forEach(v => { varMap[v.name] = v.id; }));

const card = await figma.create({
  type: "FRAME", name: "Card", width: 360, height: 200,
  layoutMode: "VERTICAL", paddingTop: 16, paddingLeft: 16, paddingBottom: 16, paddingRight: 16, itemSpacing: 12,
});
await figma.applyVariable({ nodeId: card.id, field: "fill", variableId: varMap["bg-surface"] });
await figma.applyVariable({ nodeId: card.id, field: "cornerRadius", variableId: varMap["radius-md"] });

优先使用 figma.instantiate({ componentId, parentId, overrides }),而不是重绘现有组件;使用 setFrameVariableMode 将画框固定到某个模式,以便并排预览浅色和深色模式。完整参考只需调用一次 figma_docs 即可获取。


安全模型

此桥接没有登录机制,因此访问权限由网络边界控制;figma_write 代码按与用户相同的信任级别对待。

flowchart LR
  R["HTTP request"] --> O{"Origin missing<br/>or 'null'?"}
  O -->|no| X1["403 — web page"]
  O -->|yes| H{"Host is<br/>loopback?"}
  H -->|no| X2["403 — DNS rebinding"]
  H -->|yes| A{"Operation on<br/>the allowlist?"}
  A -->|no| X3["400"]
  A -->|yes| Q["Queued for the plugin"]
层保护措施
网络仅绑定到 127.0.0.1。携带网页 Origin 或非环回 Host 的请求会收到 403,因此你打开的网站无法控制此桥接。
允许列表仅接受 66 个指定操作,且只接受 MCP 路径和 /exec 上的请求。
沙盒figma_write 在 Node vm 上下文中运行,不接收任何主机对象——只有字符串可以跨越边界;且无法使用 require、process、fs 或 fetch。它针对已知的构造函数逃逸方式进行了加固,但 vm 并非进程边界:请勿运行不可信代码。
出站获取loadImage / loadIcon 仅获取公开的 http(s) URL;会阻止私有、环回和链路本地目标,包括重定向后的目标。
会话如果指定的 sessionId 未连接,则会报错,绝不会静默回退到其他文件。
限制请求正文最大 5 MB · 沙盒执行时间 30 s · 每次插件操作 60–90 s。

发现漏洞?请参阅 SECURITY.md。


配置

变量默认值用途
FIGMA_MCP_PORT47451桥接端口。如果端口被占用,将尝试接下来的 9 个端口。
FIGMA_MCP_HOST127.0.0.1绑定地址。更改此项会暴露一个未经身份验证的桥接服务——请避免更改。
FIGMA_MCP_LONG_POLL_MS8000空闲轮询保持打开的时长。
FIGMA_MCP_ALLOW_PRIVATE_FETCHunset设置为 1,允许 loadImage 访问私有/环回主机(例如本地资源服务)。

故障排查

症状解决方法
Plugin not connected在 Figma Desktop 中运行插件(Plugins → Development → Bridge MCP for Figma)。网页应用无法连接到 localhost。
AI 客户端中缺少工具编辑 MCP 配置后,完全重启客户端。
绿点始终未出现检查是否有其他程序占用端口 47451,或设置 FIGMA_MCP_PORT 并重新导入插件。
47451–47460 中的所有端口都显示“正在使用”使用 netstat -ano | findstr :47451 查找占用端口的进程。如果是你遗留的进程,可使用 npx -y kill-port 47451 释放端口(这会终止占用端口的任何进程,所以请先检查),也可以通过 FIGMA_MCP_PORT 选择其他端口。
插件和服务版本不一致升级后重新导入 manifest.json;插件不会自动更新。
Session "…" is not connected目标 Figma 文件已关闭,或其插件已停止。打开文件,或省略 sessionId 以使用当前活动文件。
figma_write 中出现 variable is not defined每次调用彼此独立。每次调用开始时都要重新查询节点 ID。
未找到 Icon "…"使用 kebab-case 格式的 Ionicons 名称(notifications、chevron-back、lock-closed)。

项目结构

figma-bridge-mcp/
├── server/                 npm package: MCP server + bridge
│   ├── index.js            MCP entry (stdio) and tool handlers
│   ├── bridge-server.js    HTTP bridge: long-poll, sessions, origin gate
│   ├── code-executor.js    sandbox for figma_write
│   ├── figma-proxy.js      the figma.* API seen by user code
│   ├── http-fetch.js       guarded fetch for images and icons
│   ├── allowed-ops.js      operation allowlist
│   └── docs/               reference served by figma_docs
├── src/plugin/             plugin source (plain files, concatenated)
├── plugin/                 manifest.json, ui.html, code.js (generated)
└── scripts/                build, test runner, regression tests

开发

npm install
npm run build:plugin    # src/plugin/*.js  →  plugin/code.js  (generated — never edit by hand)
npm test                # every scripts/test-*.mjs; no live Figma needed

插件文件串联后共享同一作用域;文件顺序由 scripts/lib/plugin-files.mjs 决定。更改任何内容前,请参阅 CLAUDE.md,了解需要知晓的不变量。

**发布:**在 package.json 中提升 version,将 CHANGELOG.md 顶部标题重命名为 ## [x.y.z] — date,然后推送到 main。CI 会运行测试、发布到 npm、为提交打标签、创建附带插件 zip 的 GitHub Release,并更新 MCP Registry。


许可证

MIT © nguyendinhphongdx。本项目从 TranHoaiHung/figma-ui-mcp 分叉而来;原始版权声明保留在 LICENSE 中。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。