关于 figma-bridge-mcp
figma-bridge-mcp 是本地 MCP 服务,可将 AI 客户端连接到 Figma Desktop 中打开的文档。它既能通过 JavaScript 编辑画布,也能读取设计数据、令牌、CSS、组件和截图。
主要功能
- 01创建和修改画布设计
- 02读取节点树与设计令牌
- 03提取 CSS 和组件映射
- 04截取画面并导出图像
- 05支持多个 Figma 会话
- 06通过 localhost 本地运行
适用场景
- 01在 Figma 画布生成 UI 布局
- 02检查选中设计以供实现
- 03将画框信息转换为 CSS
- 04查看截图并迭代设计
MCP 相关
向 MCP 客户端提供五种工具:连接状态、API 与设计指南、基于 JavaScript 的写入、设计读取和规则查询。它通过 Figma Desktop 插件和本地桥接服务连接。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
让 AI 在你的 Figma 画布上绘图,并将设计读回为代码。
面向 Figma Desktop 的双向 Model Context Protocol 桥接工具。
无需 Figma API 密钥。无需云服务。所有操作均在 localhost 上运行。
与 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 插件
- ⬇ 下载插件,并解压到任意位置。
- 在 Figma Desktop 中:Plugins → Development → Import plugin from manifest…,然后选择
manifest.json。 - 运行 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)和平台(mobile390×844、tablet768×1024、desktop1440×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 变量绑定到填充、描边、几何属性、圆角、自动布局间距、排版、字体系列 / 样式、文本内容和可见性。
| 操作 | 返回内容 |
|---|---|
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_PORT | 47451 | 桥接端口。如果端口被占用,将尝试接下来的 9 个端口。 |
FIGMA_MCP_HOST | 127.0.0.1 | 绑定地址。更改此项会暴露一个未经身份验证的桥接服务——请避免更改。 |
FIGMA_MCP_LONG_POLL_MS | 8000 | 空闲轮询保持打开的时长。 |
FIGMA_MCP_ALLOW_PRIVATE_FETCH | unset | 设置为 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 中。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。