open-pencil
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseOpenPencil
OpenPencil
CLI and MCP server for .fig design files. Two modes of operation:
- App mode — connect to the running OpenPencil editor (omit the file argument)
- Headless mode — work with .fig files directly (pass a file path)
bash
undefined用于处理.fig设计文件的CLI和MCP服务器,支持两种运行模式:
- 应用模式 —— 连接到运行中的OpenPencil编辑器(无需传入文件参数)
- 无头模式 —— 直接处理本地.fig文件(传入文件路径即可)
bash
undefinedApp mode — operates on the document open in the editor
应用模式 —— 对编辑器中打开的文档执行操作
bun open-pencil tree
bun open-pencil tree
Headless mode — operates on a .fig file
无头模式 —— 对本地.fig文件执行操作
bun open-pencil tree design.fig
The app exposes an automation bridge on `http://127.0.0.1:7600` when running. The CLI auto-connects to it when no file path is provided.bun open-pencil tree design.fig
应用运行时会在`http://127.0.0.1:7600`暴露自动化桥接接口,未指定文件路径时CLI会自动连接到该接口。CLI Commands
CLI 命令
Inspect
查看
bash
undefinedbash
undefinedDocument overview — pages, node counts, fonts
文档概览 —— 包含页面、节点数量、字体信息
bun open-pencil info design.fig
bun open-pencil info design.fig
Node tree — shows hierarchy with types and sizes
节点树 —— 展示层级结构、节点类型和尺寸
bun open-pencil tree design.fig
bun open-pencil tree --page "Components" --depth 3 # app mode, specific page
bun open-pencil tree design.fig
bun open-pencil tree --page "Components" --depth 3 # 应用模式下查看指定页面,深度为3
List pages
列出所有页面
bun open-pencil pages design.fig
bun open-pencil pages design.fig
Detailed node properties — fills, strokes, effects, layout, text
节点详细属性 —— 填充、描边、效果、布局、文本信息
bun open-pencil node design.fig --id 1:23
bun open-pencil node --id 1:23 # app mode
bun open-pencil node design.fig --id 1:23
bun open-pencil node --id 1:23 # 应用模式
List design variables and collections
列出设计变量和变量集合
bun open-pencil variables design.fig
bun open-pencil variables --collection "Colors" --type COLOR
undefinedbun open-pencil variables design.fig
bun open-pencil variables --collection "Colors" --type COLOR
undefinedSearch
搜索
bash
undefinedbash
undefinedFind by name (partial match, case-insensitive)
按名称搜索(部分匹配,不区分大小写)
bun open-pencil find design.fig --name "Button"
bun open-pencil find design.fig --name "Button"
Find by type
按类型搜索
bun open-pencil find --type FRAME # app mode
bun open-pencil find design.fig --type TEXT --page "Home"
bun open-pencil find --type FRAME # 应用模式
bun open-pencil find design.fig --type TEXT --page "Home"
Combine filters
组合筛选条件
bun open-pencil find design.fig --name "Card" --type COMPONENT --limit 50
Node types: `FRAME`, `TEXT`, `RECTANGLE`, `ELLIPSE`, `VECTOR`, `GROUP`, `COMPONENT`, `COMPONENT_SET`, `INSTANCE`, `SECTION`, `LINE`, `STAR`, `POLYGON`, `SLICE`, `BOOLEAN_OPERATION`bun open-pencil find design.fig --name "Card" --type COMPONENT --limit 50
节点类型:`FRAME`、`TEXT`、`RECTANGLE`、`ELLIPSE`、`VECTOR`、`GROUP`、`COMPONENT`、`COMPONENT_SET`、`INSTANCE`、`SECTION`、`LINE`、`STAR`、`POLYGON`、`SLICE`、`BOOLEAN_OPERATION`Export
导出
bash
undefinedbash
undefinedPNG (default)
PNG格式(默认)
bun open-pencil export design.fig -o hero.png
bun open-pencil export -o hero.png # app mode — exports from running editor
bun open-pencil export design.fig -o hero.png
bun open-pencil export -o hero.png # 应用模式 —— 从运行中的编辑器导出
Specific node at 2x
导出指定节点,2倍分辨率
bun open-pencil export design.fig --node 1:23 -s 2 -o button@2x.png
bun open-pencil export design.fig --node 1:23 -s 2 -o button@2x.png
JPG with quality
指定质量导出JPG
bun open-pencil export design.fig -f jpg -q 85 -o preview.jpg
bun open-pencil export design.fig -f jpg -q 85 -o preview.jpg
SVG
SVG格式
bun open-pencil export design.fig -f svg --node 1:23 -o icon.svg
bun open-pencil export design.fig -f svg --node 1:23 -o icon.svg
JSX (OpenPencil format — renderable back into .fig)
JSX格式(OpenPencil格式 —— 可重新渲染回.fig文件)
bun open-pencil export design.fig -f jsx -o component.jsx
bun open-pencil export design.fig -f jsx -o component.jsx
JSX (Tailwind — React component with Tailwind classes)
JSX格式(Tailwind风格 —— 带Tailwind类的React组件)
bun open-pencil export design.fig -f jsx --style tailwind -o component.tsx
bun open-pencil export design.fig -f jsx --style tailwind -o component.tsx
Page thumbnail
页面缩略图
bun open-pencil export design.fig --thumbnail --width 1920 --height 1080
bun open-pencil export design.fig --thumbnail --width 1920 --height 1080
Specific page
导出指定页面
bun open-pencil export --page "Components" -o components.png
undefinedbun open-pencil export --page "Components" -o components.png
undefinedAnalyze
分析
bash
undefinedbash
undefinedColor palette — usage frequency, similar colors
调色板分析 —— 包含使用频率、相似色信息
bun open-pencil analyze colors design.fig
bun open-pencil analyze colors --similar --threshold 10 # app mode
bun open-pencil analyze colors design.fig
bun open-pencil analyze colors --similar --threshold 10 # 应用模式
Typography — font families, sizes, weights
排版分析 —— 包含字体族、字号、字重信息
bun open-pencil analyze typography design.fig --group-by size
bun open-pencil analyze typography design.fig --group-by size
Spacing — gap and padding values, grid compliance
间距分析 —— 包含间距、内边距值、栅格合规性
bun open-pencil analyze spacing design.fig --grid 8
bun open-pencil analyze spacing design.fig --grid 8
Clusters — repeated patterns that could be components
组件簇分析 —— 可识别可转化为组件的重复模式
bun open-pencil analyze clusters design.fig --min-count 3
undefinedbun open-pencil analyze clusters design.fig --min-count 3
undefinedEval (Figma Plugin API)
执行(Figma Plugin API)
Execute JavaScript against the document using the full Figma Plugin API:
bash
undefined可通过完整的Figma Plugin API对文档执行JavaScript代码:
bash
undefinedRead-only — query the document
只读模式 —— 查询文档信息
bun open-pencil eval design.fig -c 'figma.currentPage.findAll(n => n.type === "TEXT").length'
bun open-pencil eval design.fig -c 'figma.currentPage.findAll(n => n.type === "TEXT").length'
App mode — modifies the live document in the editor
应用模式 —— 实时修改编辑器中的文档
bun open-pencil eval -c '
const buttons = figma.currentPage.findAll(n => n.name === "Button");
buttons.forEach(b => { b.cornerRadius = 8 });
buttons.length + " buttons updated"
'
bun open-pencil eval -c '
const buttons = figma.currentPage.findAll(n => n.name === "Button");
buttons.forEach(b => { b.cornerRadius = 8 });
buttons.length + " buttons updated"
'
Modify and save to file
修改后保存到原文件
bun open-pencil eval design.fig -w -c '
const texts = figma.currentPage.findAll(n => n.type === "TEXT");
texts.forEach(t => { t.fontSize = 16 });
'
bun open-pencil eval design.fig -w -c '
const texts = figma.currentPage.findAll(n => n.type === "TEXT");
texts.forEach(t => { t.fontSize = 16 });
'
Save to a different file
保存为新文件
bun open-pencil eval design.fig -o modified.fig -c '...'
bun open-pencil eval design.fig -o modified.fig -c '...'
Read code from stdin
从标准输入读取代码
echo 'figma.currentPage.children.map(n => n.name)' | bun open-pencil eval design.fig --stdin
The eval environment provides `figma` with the Figma Plugin API: `figma.currentPage`, `figma.createFrame()`, `figma.createText()`, `figma.getNodeById()`, etc.echo 'figma.currentPage.children.map(n => n.name)' | bun open-pencil eval design.fig --stdin
执行环境提供了完整Figma Plugin API的`figma`对象:支持`figma.currentPage`、`figma.createFrame()`、`figma.createText()`、`figma.getNodeById()`等方法。JSON Output
JSON输出
Every command supports for machine-readable output:
--jsonbash
bun open-pencil info design.fig --json
bun open-pencil find --name "Button" --json # app mode
bun open-pencil analyze colors design.fig --json所有命令都支持参数输出机器可读的格式:
--jsonbash
bun open-pencil info design.fig --json
bun open-pencil find --name "Button" --json # 应用模式
bun open-pencil analyze colors design.fig --jsonMCP Server
MCP服务器
Stdio (Claude Desktop, Cursor)
标准输入输出(适配Claude Desktop、Cursor)
Add to your MCP config:
json
{
"mcpServers": {
"open-pencil": {
"command": "npx",
"args": ["openpencil-mcp"]
}
}
}添加到你的MCP配置中:
json
{
"mcpServers": {
"open-pencil": {
"command": "npx",
"args": ["openpencil-mcp"]
}
}
}HTTP (multi-session, remote)
HTTP模式(多会话、远程访问)
bash
export PORT=3100
export OPENPENCIL_MCP_AUTH_TOKEN=secret # optional auth
export OPENPENCIL_MCP_CORS_ORIGIN="*" # optional CORS
export OPENPENCIL_MCP_ROOT=/path/to/files # restrict file access
npx openpencil-mcp-httpbash
export PORT=3100
export OPENPENCIL_MCP_AUTH_TOKEN=secret # 可选身份验证
export OPENPENCIL_MCP_CORS_ORIGIN="*" # 可选CORS配置
export OPENPENCIL_MCP_ROOT=/path/to/files # 限制文件访问路径
npx openpencil-mcp-httpMCP Workflow
MCP工作流
- Open a file — or
open_file { path: "/path/to/design.fig" }new_document {} - Query — ,
get_page_tree,find_nodes,get_node, etc.list_pages - Modify — (JSX),
render,set_fill,set_layout, etc.create_shape - Save —
save_file { path: "/path/to/output.fig" }
- 打开文件 —— 或
open_file { path: "/path/to/design.fig" }new_document {} - 查询 —— 、
get_page_tree、find_nodes、get_node等list_pages - 修改 —— (JSX)、
render、set_fill、set_layout等create_shape - 保存 ——
save_file { path: "/path/to/output.fig" }
MCP Tools (86 total)
MCP工具(共86个)
Read (11): , , , , , , , , , ,
get_selectionget_page_treeget_nodefind_nodesget_componentslist_pagesswitch_pageget_current_pagepage_boundsselect_nodeslist_fontsCreate (7): , , , , , ,
create_shaperendercreate_componentcreate_instancecreate_pagecreate_vectorcreate_sliceModify (19): , , , , , , , , , , , , , , , , , , ,
set_fillset_strokeset_effectsupdate_nodeset_layoutset_constraintsset_rotationset_opacityset_radiusset_min_maxset_textset_fontset_font_rangeset_text_resizeset_visibleset_blendset_lockedset_stroke_alignset_text_propertiesset_layout_childStructure (16): , , , , , , , , , , , , , , , ,
delete_nodeclone_noderename_nodereparent_nodegroup_nodesungroup_nodeflatten_nodesnode_to_componentnode_boundsnode_movenode_resizenode_ancestorsnode_childrennode_treenode_bindingsnode_replace_witharrange_nodesVariables (11): , , , , , , , , , ,
list_variableslist_collectionsget_variablefind_variablescreate_variableset_variabledelete_variablebind_variableget_collectioncreate_collectiondelete_collectionVector & Export (13): , , , , , , , , , , , , ,
boolean_unionboolean_subtractboolean_intersectboolean_excludepath_getpath_setpath_scalepath_flippath_moveviewport_getviewport_setviewport_zoom_to_fitexport_svgexport_imageAnalyze (7): , , , , , ,
analyze_colorsanalyze_typographyanalyze_spacinganalyze_clustersdiff_creatediff_showevalFile (3): , ,
open_filesave_filenew_document读取类(11个): 、、、、、、、、、、
get_selectionget_page_treeget_nodefind_nodesget_componentslist_pagesswitch_pageget_current_pagepage_boundsselect_nodeslist_fonts创建类(7个): 、、、、、、
create_shaperendercreate_componentcreate_instancecreate_pagecreate_vectorcreate_slice修改类(19个): 、、、、、、、、、、、、、、、、、、、
set_fillset_strokeset_effectsupdate_nodeset_layoutset_constraintsset_rotationset_opacityset_radiusset_min_maxset_textset_fontset_font_rangeset_text_resizeset_visibleset_blendset_lockedset_stroke_alignset_text_propertiesset_layout_child结构类(16个): 、、、、、、、、、、、、、、、、
delete_nodeclone_noderename_nodereparent_nodegroup_nodesungroup_nodeflatten_nodesnode_to_componentnode_boundsnode_movenode_resizenode_ancestorsnode_childrennode_treenode_bindingsnode_replace_witharrange_nodes变量类(11个): 、、、、、、、、、、
list_variableslist_collectionsget_variablefind_variablescreate_variableset_variabledelete_variablebind_variableget_collectioncreate_collectiondelete_collection矢量与导出类(13个): 、、、、、、、、、、、、、
boolean_unionboolean_subtractboolean_intersectboolean_excludepath_getpath_setpath_scalepath_flippath_moveviewport_getviewport_setviewport_zoom_to_fitexport_svgexport_image分析类(7个): 、、、、、、
analyze_colorsanalyze_typographyanalyze_spacinganalyze_clustersdiff_creatediff_showeval文件类(3个): 、、
open_filesave_filenew_documentJSX Rendering (via render
tool or eval
)
renderevalJSX渲染(通过render
工具或eval
)
renderevalCreate entire component trees in one call:
jsx
<Frame name="Card" w={320} h="hug" flex="col" gap={16} p={24} bg="#FFF" rounded={16}>
<Text size={18} weight="bold">Title</Text>
<Text size={14} color="#666">Description text</Text>
<Frame flex="row" gap={8}>
<Frame w={80} h={36} bg="#3B82F6" rounded={8} justify="center" items="center">
<Text size={14} color="#FFF" weight="600">Action</Text>
</Frame>
</Frame>
</Frame>Elements: , , , , , , , , ,
FrameRectangleEllipseTextLineStarPolygonVectorGroupInstanceLayout shorthands:
| Prop | Meaning |
|---|---|
| Width, height (number or |
| |
| Item spacing |
| Padding |
| |
| |
| Fill color (hex) |
| Corner radius |
| Stroke color and weight |
| 0–1 |
| Text properties |
单次调用即可创建完整的组件树:
jsx
<Frame name="Card" w={320} h="hug" flex="col" gap={16} p={24} bg="#FFF" rounded={16}>
<Text size={18} weight="bold">Title</Text>
<Text size={14} color="#666">Description text</Text>
<Frame flex="row" gap={8}>
<Frame w={80} h={36} bg="#3B82F6" rounded={8} justify="center" items="center">
<Text size={14} color="#FFF" weight="600">Action</Text>
</Frame>
</Frame>
</Frame>支持元素: 、、、、、、、、、
FrameRectangleEllipseTextLineStarPolygonVectorGroupInstance布局简写属性:
| 属性 | 含义 |
|---|---|
| 宽度、高度(数值或 |
| |
| 元素间距 |
| 内边距 |
| |
| |
| 填充颜色(十六进制) |
| 圆角半径 |
| 描边颜色和宽度 |
| 透明度(0–1) |
| 文本属性 |
Node IDs
节点ID
Format: (e.g., ). Get IDs from , , or commands.
session:local1:23findtreenode格式为(例如),可通过、或命令获取ID。
会话ID:本地ID1:23findtreenodeTips
使用提示
- Omit the file path to work with the document open in the running OpenPencil editor
- Start with to understand the document structure
info - Use for a quick overview without overwhelming output
tree --depth 2 - Use to discover reusable components
find --type COMPONENT - Use to find near-duplicate colors to merge
analyze colors --similar - Export specific nodes with instead of full pages for faster results
--node - The command gives you the full Figma Plugin API for anything the CLI doesn't cover
eval - Use when piping output to other tools
--json - In app mode, modifications are reflected live in the editor
eval
- 省略文件路径即可对运行中的OpenPencil编辑器内打开的文档执行操作
- 推荐先使用命令了解文档结构
info - 使用可以快速获取概览,避免输出内容过多
tree --depth 2 - 使用可以查找可复用的组件
find --type COMPONENT - 使用可以查找近似重复的颜色,方便合并统一
analyze colors --similar - 导出时使用指定特定节点而非整页导出,速度更快
--node - 命令提供了完整的Figma Plugin API,可实现CLI未覆盖的所有功能
eval - 当需要将输出管道到其他工具时使用参数
--json - 应用模式下,的修改会实时同步到编辑器中
eval