OneWright
Allows AI agents to read and write Figma designs: convert selections into framework-aware code and create or edit frames, text, auto layouts, styles, variables, components, and complete interfaces directly on the canvas.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@OneWrightTurn the selected Figma frame into React code"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Playwright 驱动浏览器,OneWright 驱动 Figma。
OneWright 是什么?
OneWright 通过本地 WebSocket 中继,把一个 MCP 服务器 连接到一个 Figma 插件,让 AI 智能体——Claude Code、Cursor、Codex,或任何支持 MCP 的客户端——能够真正「操作」Figma,而不只是看着它。
它的能力是双向的:
读取——将 Figma 选区转换为「懂框架」的代码,基于忠实且去重的设计上下文(布局、排版、变量、组件)。
写入——直接在画布上创作与编辑:画框、文本、自动布局、样式、变量、组件,乃至完整界面。
一切都运行在你的机器上,通过插件与 Figma 通信,因此不需要 Figma Dev Mode 席位,也不需要付费套餐。
Related MCP server: figma-pilot
为什么选择 OneWright
免费——无需 Figma Dev Mode 或付费席位。官方的 Dev Mode MCP 有门槛,OneWright 没有。
双向——不只是只读。112 个工具覆盖画布的读取与写入,智能体既能实现设计,也能构建设计。
以技术栈优先的代码生成——OneWright 会识别你真实的技术栈(框架 + 样式系统),并复用你已有的组件、设计令牌与图标,而不是吐出一套你得重写的通用标记。
任意 MCP 客户端——Claude Code、Cursor 及其他支持 MCP 的智能体,工作方式完全一致。
开放可扩展——读写工作流以可安装的 技能 形式提供,你可采纳或直接采用。
工作原理
你的 MCP 客户端通过 stdio 与 @figwright/mcp 服务器通信;服务器通过本地 WebSocket 把消息中继到 Figma 插件。多个客户端可以共享同一个插件——它们会选举出一个「领导者」来独占这条连接——并且传输层天生能扛住掉线重连:
┌─────────────────────────────────────────────────────────────────────┐
│ MCP CLIENTS — one per agent │
│ Claude Code · Cursor · Claude · any MCP-capable client │
└─────────────────────────────────────────────────────────────────────┘
│ MCP protocol over stdio
▼
┌─────────────────────────────────────────────────────────────────────┐
│ @figwright/mcp — your client launches one; they elect a leader │
│ │
│ LEADER (owns the single plugin connection) │
│ • WebSocket relay · request idempotency │
│ • routes to the most-recently-active file │
│ • session resume · "busy ≠ dead" heartbeat │
│ • endpoints: /ws (plugin) · /ping (health) · /rpc (followers) │
│ │
│ FOLLOWERS │
│ • forward tool calls to the leader over HTTP /rpc │
│ • take over automatically if the leader exits │
└─────────────────────────────────────────────────────────────────────┘
│ local WebSocket · msgpack (binary)
▼
┌─────────────────────────────────────────────────────────────────────┐
│ FIGMA (desktop or browser) │
│ │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ OneWright plugin │ │
│ │ • UI (Vue 3 iframe): WebSocket client + heartbeat │ │
│ │ • sandbox: executes Figma Plugin API calls │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│ │
│ │ Figma Plugin API │
│ ▼ │
│ Canvas │
└─────────────────────────────────────────────────────────────────────┘OneWright 在设计上就是 以技术栈优先 的:它不采用固定的编译管线,而是把忠实的设计上下文呈现出来,让模型生成契合 你 代码库的代码。figma-codegen 技能把这套方法固化了下来。
插件
Figma 这一侧的插件不是黑盒。它会实时显示每一次调用,让你检查发送给模型的精确载荷,并展示自身的连接健康状态。
而且它会跟随你的 Figma 主题,明亮或暗色皆可。
窗口随你摆放。拖动右下角即可缩放——面板越高,日志可见区域越大,并且尺寸会被记住,下次打开依旧。或者把它放到后台:面板让位给你,但连接保持活跃,这样长时间运行的智能体能持续工作。
快速开始
1. 从本仓库构建并运行服务器
本仓库的 LAN 监听模式尚未发布到 npm,因此请从源码构建服务器:
git clone https://github.com/heyxiaoze/figwright.git
cd figwright
pnpm install
pnpm -C packages/mcp build然后把你的 MCP 客户端指向构建好的服务器。以 Claude Code 为例,把下面内容加入你的 .mcp.json(其他客户端格式相同):
{
"mcpServers": {
"figwright": {
"command": "node",
"args": ["packages/mcp/dist/index.mjs"]
}
}
}若要启用 LAN 模式,请添加一个 env 字段,写入 FIGWRIGHT_HOST 和 FIGWRIGHT_TOKEN——详见 LAN 模式 与 .mcp.json.lan.example。
2. 安装 Figma 插件
该插件尚未上架 Figma 社区市场,请从最新的 Release 安装:
从 最新 GitHub Release 下载插件 zip 并解压。
在 Figma 桌面客户端中:菜单 → 插件 → 开发 → 从清单导入插件…,选择解压后的
manifest.json。
3. 连接
在 Figma 中打开 OneWright 插件(插件 → 开发 → OneWright)。它会自动连接到本地服务器并显示 已连接。让智能体运行 ping 以确认链路通畅。
4.(可选)安装技能
技能 让智能体在恰当的时机调用 OneWright,并遵循这些扎根于上下文的工作流:
npx skills add heyxiaoze/figwright/skills5. 上手试试
在 Figma 中选中一个画框,给你的智能体这样提示:
Code this Figma selection as a React component.
或者反过来:
Build a pricing section in Figma from this spec.
技能
智能体技能编排 OneWright 的工具。它们由模型触发——当任务与描述匹配时,你的智能体会自动加载对应的技能。
技能 | 作用 |
把 Figma 选区转换成懂框架的代码,基于你的技术栈与已有组件。 | |
从代码或描述构建 Figma 设计,复用文件中已有的组件与样式。 |
通过 skills CLI 安装到任意支持的智能体:
npx skills add heyxiaoze/figwright/skills # both
npx skills add https://github.com/heyxiaoze/figwright/tree/main/skills/figma-codegen # one技能需要@figwright/mcp 服务器处于连接状态——离开了它,技能本身没有任何工具可驱动。
工具
OneWright 提供 112 tools(共 112 个 MCP 工具),分为三组:
读取——选区、文档与节点检查、样式、变量、组件、字体、反应(reactions)、动效(motion)状态、截图、原始图片填充资源、PDF 导出,以及动画画框的视频导出(MP4 / GIF / WebM)。
写入——创建并编辑画框、文本、图形、自动布局、效果、样式、变量、组件(含编写布尔/文本/实例替换属性)、页面、反应,以及 Motion 动画(关键帧、动画风格预设、时间轴);外加一个
batch工具可一次性应用大量编辑。上下文夯实——
get_design_context提供忠实且去重的设计上下文;component_map/token_map/icon_map把 Figma 数据与你的代码库关联起来,让代码生成复用你已有的东西;另有design_diff,它能报告设计相对已存基线的变动,使你只更新受影响的代码。
你的 MCP 客户端在连接时会列出全部工具——那才是最权威、最新的清单。
运行要求
一个 MCP 客户端(Claude Code、Cursor……)。
Node.js 20.19+ 或 22.12+——服务器通过
npx作为独立进程运行,因此与你项目构建所用的 Node 版本无关。(这是现代 Node 基线;Node 18/21 以及 22.0–22.11 不受支持。)Figma——免费版即可满足;开发模式下导入插件需要桌面客户端。
安全
OneWright 完全运行在你的机器上:你的客户端通过 stdio 启动服务器,服务器通过 127.0.0.1:3055 上的 WebSocket 把消息中继给插件,数据不会发往任何别处。插件只使用 Figma 公开的 Plugin API,因此它只能访问你当前打开的文件,不会越界。
回环地址本身并不是一道边界——你访问的网页仍可能连上本地端口——因此中继对每一个请求都基于两个网页无法伪造的请求头进行校验:Host(必须指向回环地址,这正是阻止 DNS 重绑定的关键)与 Origin(仅放行插件沙箱内的握手,拒绝来自其他浏览器的请求)。领导者的 HTTP 端点还要求一种不经过 CORS 预检就无法发送的内容类型。更宏观的视角请参见 MCP 安全最佳实践;OneWright 的威胁模型、范围边界以及漏洞私下上报方式,详见 SECURITY.md。
OneWright 不能替代你对智能体行为的审查。 它的写入工具会改动你的 Figma 文件,导出工具会把文件写到智能体所选的路径;一个针对恶意设计或被提示注入操控的智能体,可能滥用这两者。真正起作用的边界,是你 MCP 客户端的工具审批控制。
LAN mode (connect across machines)
默认情况下,中继只监听 127.0.0.1——即仅回环——因此插件必须与你的 MCP 客户端运行在同一台机器上。LAN 模式改为把中继绑定到某个网络接口,这样同一网络下另一台机器上的插件(或通过本机 LAN 地址访问的本机插件)就能连上来。
配置服务器
服务器读取三个环境变量。FIGWRIGHT_PORT 此前已存在;另外两个新变量用于开关 LAN 模式:
变量 | 默认值 | 含义 |
|
| 中继绑定的主机。填一个 LAN IP(如 |
| (自动) | 连接插件必须出示的共享密钥。在 LAN 模式下,若未设置,服务器会在启动时生成一个随机的 24 字节令牌并打印到日志。请设成一个稳定值,这样插件配置在重启后依然有效。 |
|
| 中继端口。 |
.mcp.json 示例(开箱即用的副本见 .mcp.json.lan.example):
{
"mcpServers": {
"figwright": {
"command": "npx",
"args": ["-y", "@figwright/mcp"],
"env": {
"FIGWRIGHT_HOST": "0.0.0.0",
"FIGWRIGHT_TOKEN": "replace-with-a-long-random-string"
}
}
}
}使用 0.0.0.0 时,中继监听所有接口;此时 ping 会返回一个 lanUrl,列出每个可达的 ws://<ip>:<port> 目标。绑定到具体的 LAN IP 则收紧一些。
只读模式(决定对方能读还是能写)
默认情况下,连上来的智能体拥有全部工具,既能读取设计(figma-to-code)也能写回修改(code-to-figma)。当你把服务器开放给另一台机器(例如让一位前端同事远程读取你的 Figma 来生成代码)时,可以用 FIGWRIGHT_READONLY 把它限制为只读——服务器只会向智能体暴露读取类与代码生成辅助类工具,所有写工具(创建 / 编辑 / 删除节点、批量编辑、Motion 写入等)一律不出现,对方因此只能读取、无法改你的文件。
变量 | 默认值 | 含义 |
|
| 设为 |
{
"mcpServers": {
"figwright": {
"command": "node",
"args": ["packages/mcp/dist/index.mjs"],
"env": {
"FIGWRIGHT_HOST": "0.0.0.0",
"FIGWRIGHT_TOKEN": "replace-with-a-long-random-string",
"FIGWRIGHT_READONLY": "true"
}
}
}
}只读模式与 LAN 模式正交:即便走本地 stdio(不开 LAN),也能用它限制本机智能体的权限。在 LAN 下开启只读时,仍建议同时固定
FIGWRIGHT_TOKEN——只读不代表无需认证,对方仍要先凭令牌连上才能读到你的设计。
远程 MCP:让对方智能体直连你的服务器
除了把插件放到另一台机器(见「连接插件」),还有另一种跨机拓扑:把智能体放到另一台机器——你的 Figma 与插件仍在本机,而同事在他的 VSCode(或 Cursor / Claude Code)里通过 MCP 直接连到你的服务器,读取(或读写)你的 Figma。这正是「你决定谁能读、谁能写」的协作场景:服务器在本机 stdio 之外,额外在 http://<你的LAN IP>:3055/mcp 暴露一个 Streamable HTTP 端点,对方 agent 远程连它即可。
前提:服务器的 FIGWRIGHT_HOST 必须绑定非回环地址(你的 LAN IP 或 0.0.0.0)。此时 FIGWRIGHT_TOKEN 自动成为必填——对方 agent 必须在请求里携带它(与插件走的是同一把令牌)。
对方在他的 MCP 客户端里这样配置(以 http 类型为例):
{
"mcp": {
"servers": {
"figwright": {
"type": "http",
"url": "http://192.168.1.42:3055/mcp",
"headers": {
"x-figwright-token": "replace-with-a-long-random-string"
}
}
}
}
}令牌两种携带方式都支持:
x-figwright-token请求头(figwright 原生),或标准的Authorization: Bearer <token>。请用你.mcp.json里那同一个FIGWRIGHT_TOKEN。
权限依旧由 FIGWRIGHT_READONLY 决定:你在本机开启只读,对方连上来就只看到读工具、无法改你的文件——无需在对方机器上做任何额外设置。
该 HTTP 端点与本地 stdio 共用同一进程与端口:本机智能体走 stdio,远端智能体走
/mcp,两者看到的是同一套(按只读策略过滤后的)工具。
防火墙提示:若对方连不上,请确认你 Mac 的防火墙允许入站到
3055端口(macOS:系统设置 → 网络 → 防火墙;或用socketfilterfw)。同一 LAN 内通常无需额外路由配置。
连接插件
最快的方式是使用服务器启动时打印的邀请串(invite):
服务器在 LAN 模式下启动后,日志里会有一行
invite: figwright://connect?host=…&port=3055&token=…。在另一台机器的 Figma 中打开插件,切到 设置(Settings) 标签页,把这一整行粘贴进顶部的「快速连接(邀请)」输入框,点 填入——Host / Port / Token 会一次性自动填好,免去手抄长令牌。
也可以手动逐项填写:
主机(Host)——服务器所在机器的 LAN IP(或
0.0.0.0所报告的网络接口地址之一)。端口(Port)——
FIGWRIGHT_PORT(默认3055)。令牌(Token)——你设置的
FIGWRIGHT_TOKEN(或服务器日志中自动生成的那个)。
保存后,插件会重新连接到远程中继。设置标签页会在主机非回环时强制要求填写令牌;而 恢复为回环 按钮会回到默认的 127.0.0.1:3055 且不含令牌。
连接诊断
连不上时不必瞎猜:设置标签页的 连接诊断 区块会显示当前状态,并把失败原因翻译成人话——
Token 被拒 / 握手失败 → 令牌不对,或服务器没开 LAN 模式;
无法连接 / 超时 → Host 或端口填错、服务器没启动、或本机网络不可达。
你也可以在保存前点 测试连接,用当前表单的 Host / Port / Token 临时握手一次(不影响已保存的连接),立刻知道能不能通。插件顶部的状态条在断开时也会直接显示失败原因。
你也可以让智能体运行 ping:在 LAN 模式下,其结果会包含 lanUrl、token 和一个可直接粘贴的 invite 字段,于是智能体能把连接信息一次性交给你。
LAN 模式下的安全模型
把中继暴露到网络上,会移除默认部署所依赖的回环边界,因此 LAN 模式与安全的「仅本地」部署 并不 等同。为此:
令牌认证是强制的。 每一次 WebSocket 升级都必须以 WebSocket 子协议 和
$hello握手两种方式出示令牌;每一个会改变状态的 HTTP POST(/rpc、/abdicate)都必须携带x-figwright-token请求头。缺少有效令牌的请求会被拒绝(403)。回环模式下则不使用令牌。Host闸门依然开启,只是范围放宽。中继仍会校验Host头——现在除了回环地址,也放行 LAN 地址,但拒绝任何指向外部主机的请求——从而保住 DNS 重绑定防御。只读的/ping仍可被公开访问,便于你发现服务器,但它绝不会泄露超出连接信息之外的内容。链路本地与仅内部的地址会被过滤——在公布的
lanUrl中剔除这类地址,避免你不小心给出一个不可达的目标。
请把令牌当作密码对待:任何人只要得知它(且能访问该端口),就能驱动你的 Figma 插件。请将 LAN 模式置于可信网络之后,固定 FIGWRIGHT_TOKEN,并不要让端口越过防火墙暴露出去。如果你只需要在同一台机器上使用插件,就保持默认的回环绑定——无令牌,也无任何网络暴露面。
常见问题(FAQ)
两者都源于你的 MCP 客户端启动服务器的方式:它直接 spawn 那个 command,而非通过你的交互式 shell,因此它不会继承你在 shell 里设置的任何环境。当 Node 由版本管理器(fnm、nvm、asdf、volta、mise)管理时,这一点最致命——它们通过只在真实终端里才运行的 shell 钩子来配置 PATH 和 npm。这并非 OneWright 特有——任何以 npx 启动的 MCP 服务器都会受影响。下面有两种症状,对应两种不同的修复。
command not found——客户端在 PATH 上找不到 npx / node。
使用绝对路径。 在普通终端里运行
which npx(或which node),把得到的完整路径作为command:{ "mcpServers": { "figwright": { "command": "/Users/you/.local/share/fnm/node-versions/v24.x.x/installation/bin/npx", "args": ["-y", "@figwright/mcp@latest"] } } }或者通过
env传递PATH。 若你的客户端支持按服务器的env,把版本管理器的bin目录加入env.PATH。
-32000 / "Connection closed" / 始终连不上——npx 能跑起来,但服务器在握手前就退出了。
npx … @latest 会在每次启动时都重新从注册表解析包。在直接 spawn 的环境里,这一步可能失败或卡住——npm 配置为空或与预期不同、公司代理或私有注册表在那里未配置、或根本没有网络——于是进程在 MCP 连接前就死掉,客户端便报告连接已关闭。(二进制脚本的 shebang 找不到 node 也会落到这里。)
修复办法是把包安装好,让启动不再需要拉取注册表:
作为项目依赖——最快的解法。 先安装它,然后从配置里去掉
@latest。@latest这个标签正是强制走注册表的元凶;去掉后,npx会直接用node_modules里已有的副本(像 Claude Code 的.mcp.json这种项目级配置,会从你的项目根目录运行):pnpm add -D @figwright/mcp # or: npm i -D @figwright/mcp{ "mcpServers": { "figwright": { "command": "npx", "args": ["-y", "@figwright/mcp"] } } }或者全局安装,直接指向二进制。 安装一次,然后把
command直接指向它——没有npx,也没有每次启动的解析。用which figwright-mcp得到的绝对路径:npm i -g @figwright/mcp which figwright-mcp{ "mcpServers": { "figwright": { "command": "/absolute/path/to/figwright-mcp" } } }
服务器由你的 MCP 客户端启动,因此只有当该客户端开着时它才运行。请检查:
你的 MCP 客户端正在运行,且已配置 OneWright(试试
ping);插件已在同一台机器的同一个 Figma 应用中打开(中继仅本地,
127.0.0.1);没有任何东西阻断本地回环连接(某些防火墙/安全软件会这么做)。
不需要。OneWright 通过插件与 Figma 通信,因此免费版就够——无需 Dev Mode 席位,也无需付费套餐。
这两个环境它都能运行,但可用能力少于 Figma Design——这是因为那些编辑器给插件的权限更少,并非 OneWright 有所保留。
Figma Design——一切功能。
Dev Mode(检查面板)——仅读取与导出。Figma 在该模式下让插件处于只读状态,因此截图、PDF 导出以及所有检查工具都能用,而所有写入都会失败——节点、页面、变量、样式全都如此。这契合代码生成方向;要构建请使用 Design 模式。
FigJam——画框、分区、图形与文本可用;组件、变量、样式以及 Motion 在该编辑器中并不存在,因此针对它们的工具不适用。
get_metadata 会报告编辑器(editorType / mode),任何因编辑器限制而失败的工具也会在错误中说明,于是智能体可以重新规划,而不是盲目重试。
可以。多个 MCP 服务器可以通过领导者/追随者 选举 机制共享同一个插件——一个主导,其余跟随;若领导者退出,会平滑交接。
贡献指南
欢迎贡献。关于如何搭建环境并提交 Pull Request,请参阅 CONTRIBUTING.md;关于架构、仓库布局、技术栈与规范,请参阅 AGENTS.md。
名称由来
figwright 沿用了 -wright 的传统——这是一个古英语词,意为「制造者」或「工匠」:playwright 写戏剧,shipwright 造船,wheelwright 造轮子。这个名字也向自动化的浏览器工具 Playwright 致意。Playwright 驱动浏览器,OneWright 驱动 Figma——一个既读取画布、又把作品创作回画布上的「设计工匠」。
许可证
MIT © Roya
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server connecting AI agents to 100+ apps (Gmail, Slack, Notion, GitHub) via one-click OAuth.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Free public MCP for AI agents — 193 tools, 44 workflows. No API key.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceEnables AI agents like Claude to interact with Figma designs through 50+ tools for creating, styling, and manipulating design elements, components, and variables via a WebSocket relay and Figma plugin.-
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to create, modify, and manage Figma designs through natural language commands via a specialized MCP server and plugin bridge. It supports a wide range of operations including element creation, property modification, component management, and accessibility checks.3 npm106MIT
- AlicenseAqualityAmaintenanceBidirectional MCP bridge enabling AI assistants to draw UI on Figma canvas and read designs back as structured data or code tokens via localhost, requiring Figma Desktop.5222 npm253MIT
- AlicenseBqualityCmaintenanceEnables AI agents to directly control Figma Desktop via MCP, supporting UI creation, editing, prototyping, and variable management with over 60 tools.65860 npm1MIT