Claude连接Penpot MCP server进行AI原型设计
1. Penpot MCP调研
资料来源:https://help.penpot.app/mcp/
1.1 Penpot MCP 能做什么
Penpot MCP server 把支持 MCP 的 AI 客户端连接到你的 Penpot 文件。连接后,AI Agent 可以用自然语言与设计稿交互,同时辅助设计和开发两类任务。因为 Agent 可以读取和修改 Penpot 文件结构(组件、样式、tokens、页面、图层等),所以既能自动化创意工作,也能做"维护性"工作,实现设计与代码之间的双向工作流。
① 设计类任务(Design tasks)怎么做:
- 创建间距/排版/颜色 tokens,并统一应用到整个文件
- 生成组件变体(component set 变大时也能保持整洁)
- 按命名规范批量重命名图层(或审计命名一致性)
- 整理组件与文件结构(页面、分组、库)
- 审计设计系统的一致性与冗余(样式、组件、使用情况)
- 跨文件应用大范围视觉修改(如整体换色板)
- 基于现有设计系统创建新页面(design-to-design)
典型提示词写法:先用只读提示词确认连接正常(“列出文件里的所有页面”、“分析并总结这个设计的结构”、“列出所有颜色样式并说明用途”),再逐步过渡到轻量写操作(“基于这个页面创建一套主色 color token”、“按统一命名规范重命名图层,应用前先说明你要改什么”)。
② 开发类任务(Developer tasks)怎么做:
- 从页面中提取布局结构和关键 UI 元数据
- 从设计稿生成 HTML/CSS(语义化、模块化,design-to-code)
- 检查 tokens 和样式,翻译成代码变量
- 导出资源(如只导出文件中用到的图标)
- 把组件映射到代码:对齐命名/标识符并记录规则
- 根据设计变更更新前端样式(必要时反向同步)
- 原型化交互,验证 design-to-code 的翻译质量
1.2 Penpot MCP 怎么工作
架构与数据流:三部分组成
- MCP server:向 AI 客户端暴露工具的服务。接收客户端请求并转发给 Penpot。
- Penpot 内的 MCP plugin(插件):运行在 Penpot 内部,把你当前打开的文件连接到 MCP server,是 server 能访问"当前聚焦页面"的关键。
- MCP client:你输入提示词的工具(Cursor、Claude Code、Copilot 类等),通过 server URL + MCP key(本地模式下则用当前激活的 Penpot 浏览器会话)连接 MCP server。
基础概念:
- Integrations 页面:MCP 在
Your account → Integrations → MCP Server下配置,可启用/禁用、获取 server URL、管理 MCP key。 - MCP key:个人、不可恢复的令牌,用于 AI 客户端向 MCP server 认证。每个用户同一时间只能有一个 key(远程模式使用)。
- 当前聚焦页面:MCP 永远作用于你在 Penpot 中聚焦的页面;切换聚焦页面(即使在另一个浏览器窗口),MCP 上下文跟着走。
- Active MCP tab:MCP 同时只能在一个浏览器标签页中激活,多开 Penpot 时须明确指定哪个标签拥有 MCP。
工具与能力:本地 MCP 当前暴露 5 个工具——execute_code、high_level_overview、penpot_api_info、export_shape、import_image。远程 MCP 不暴露本地文件系统访问:import_image 本地路径不可用;export_shape 可用但受限(如不能直接导出到本地文件路径)。
安全提醒:MCP 连接后,AI 客户端可以执行会修改当前聚焦页面的写操作(创建、重命名、移动、删除、改样式等)。建议:先跑只读操作验证配置;让 Agent 先描述打算做的修改再应用;用小步可逆的操作代替"全量重构"式的大请求。
1.3 Claude Code 如何通过 MCP client 连接 Penpot MCP server
官方给 Claude Code 的连接方式:
- 打开 Claude Code 的 MCP 配置
- 添加 Penpot server,使用 http transport + 对应模式的 URL
- 重启 Claude Code 或重新加载工具
{
"mcpServers": {
"penpot": {
"transport": "http",
"url": "REMOTE_OR_LOCAL_URL"
}
}
}
- 远程模式 URL:
https://<your-penpot-domain>/mcp/stream?userToken=YOUR_MCP_KEY(官方 SaaS 域名是design.penpot.app) - 本地模式 URL:
http://localhost:4401/mcp(无需 key,用浏览器激活会话认证)
其他客户端对照:Cursor 用 mcpServers + "type": "http";VS Code/Copilot 用 mcp.servers + "transport": "http";Codex/OpenCode 用 servers + transport.type: http。
最终检查:在 Penpot 中打开文件,用 File → MCP Server → Connect 连接插件,先跑一个只读提示词验证工具已列出。
1.4 远程 MCP server 怎么用
远程 MCP 是最简单的起步方式:官方托管,本机不需要安装/运行任何东西,适合大多数用户;代价是没有本地文件系统权限,只能操作 Penpot 暴露的内容(设计文件、库、tokens 等)。
5 步快速开始:
- Enable MCP:
Your account → Integrations → MCP Server,启用功能(状态按用户记忆,跨会话保留) - Generate your MCP key:生成 key,只显示一次,务必妥善保存
- Copy the server URL:同一页面复制已内嵌
userToken=你的MCP key的 server URL - Add the server to your MCP client:在 Cursor/Claude Code 等客户端添加指向该 URL 的 server
- Open a Penpot file and connect:在 Penpot 打开设计文件,
File → MCP Server → Connect连接插件
完成后,AI 客户端应能列出 Penpot 工具。日常使用:启用 MCP → 连接插件 → 客户端里先只读提示词(list/inspect/analyze)、再写操作。MCP 始终作用于活动 Penpot 标签页中当前聚焦的页面。
管理要点:
- 启用/禁用:Status 开关,禁用时 Agent 即无法修改文件(即使客户端仍配置着)
- 重新生成 key:旧 key 立即失效,用旧 key 的客户端会停止工作,需要更新配置
- key 过期:连接失败,需重新生成 key 清除错误状态
- 安全:key 当密码用,不要出现在截图/日志/代码示例中;疑似泄露立即重新生成
模型建议:用强模型 + 高质量推理配置;理解图片必须用视觉语言模型(VLM,大多数商用 LLM 都是);官方推荐始终使用 frontier 模型,任务越复杂模型对结果质量影响越大。
1.5 本地 MCP server 怎么用
本地 MCP 面向需要更多控制权或需要访问本地资源的高级用户,运行在你自己的机器上,可通过 npm 包直接启动(无需克隆整个 Penpot 仓库),可提供受控的本地文件系统访问(读/写资源文件等,取决于配置)。
安装与激活(npm 路径):
- 确认已安装 Node.js(官方测试 v22,v20 应该也可用)
- 终端启动 MCP server 和 plugin server:
npx @penpot/mcp@stable
使用期间保持该终端运行。
3. 打开 https://design.penpot.app 及任意设计文件
4. Plugins → Load from URL,加载:http://localhost:4400/manifest.json
5. 运行插件并点击 Connect to MCP server,确认插件显示 Connected,工作期间保持插件窗口打开
注意:部分 Chromium 系浏览器可能拦截 https://design.penpot.app 到 http://localhost 的连接;遇到时显式允许本地网络访问,或改用 Firefox。
连接与使用:客户端使用 http://localhost:4401/mcp(HTTP transport,无 MCP key,认证用当前激活的 Penpot 浏览器会话)。日常管理:Ctrl+C 停止 server(不干净就从系统进程管理器结束 Node.js 进程);插件断开后重新从 manifest.json 加载并再次 Connect。
远程 vs 本地 对比:
| 维度 | 远程 MCP | 本地 MCP |
|---|---|---|
| 运行位置 | 官方托管 | 本机 |
| 门槛 | 低,适合大多数人 | 需会用终端 |
| 文件系统访问 | 无 | 可受控访问本地文件 |
| URL | https://<domain>/mcp/stream?userToken=KEY |
http://localhost:4401/mcp |
| 认证 | MCP key(userToken) | 激活的 Penpot 浏览器会话 |
| import_image 本地路径 | 不可用 | 可用 |
| export_shape 到本地路径 | 不可用 | 可用 |
1.6 故障排查(Troubleshooting)
连接失败时按顺序检查:
- 重启 MCP server 进程
- 在 Penpot 中重启插件连接
- 重启 MCP 客户端(或触发其 MCP server 重连)
- 使用 MCP 期间保持 Penpot 中插件窗口打开
其他求助渠道:GitHub issue、Penpot Community 论坛、官方邮件。官方还推荐参考:Good prompting practices(设计)、token-aware 提示词技巧、设计文件结构与最佳实践、Penpot MCP 视频播放列表。
2. Claude Code + Penpot MCP 实操说明
以下是在本地 Claude Code 环境里配置和使用 Penpot MCP 工具与技能的实操记录。
2.1 mcp client配置
在claude code环境里配置mcp client, 在系统目录下创建: .mcp.json。
错误的mcp client配置:
{
"mcpServers": {
"penpot": {
"url": "http://localhost:9001/mcp/stream?userToken=eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0.U_taj6nw-FOw_8144b-SyH1DKyPv7vU7EzH8E6DX2fPXnhaVOe0LGQ.RxJn-7w4m95309h6.YeNOB32bwaWygFFeHMUY7AGXUvYQpZRGhG8etZgbUMUn9_AGxrVeaEw3MC879VtlvoR0aHtMnNil6Rqba4pNiCTuRJ2GesP0ZSLseaFUgb8RU1QhVtOqyMNi7LwK22mhejCINtPWo7XUBb-lf5jcrfWNkWuvvcM54Sgjy1JPacDAcqGyV1D-XKMuOZea8xG9V1oK6U4tv29c.ZP7gqyvIh1sUwLPHkeQrlQ"
}
}
}
正确的mcp client配置:
{
"mcpServers": {
"penpot": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"http://localhost:9001/mcp/stream?userToken=eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0.U_taj6nw-FOw_8144b-SyH1DKyPv7vU7EzH8E6DX2fPXnhaVOe0LGQ.RxJn-7w4m95309h6.YeNOB32bwaWygFFeHMUY7AGXUvYQpZRGhG8etZgbUMUn9_AGxrVeaEw3MC879VtlvoR0aHtMnNil6Rqba4pNiCTuRJ2GesP0ZSLseaFUgb8RU1QhVtOqyMNi7LwK22mhejCINtPWo7XUBb-lf5jcrfWNkWuvvcM54Sgjy1JPacDAcqGyV1D-XKMuOZea8xG9V1oK6U4tv29c.ZP7gqyvIh1sUwLPHkeQrlQ",
"--allow-http"
]
}
}
}
验证是否连接正常:
(base) PS D:\ai\llmmaster> claude mcp list
plugin:everything-claude-code:github: npx -y @modelcontextprotocol/server-github@2025.4.8 - ✓ Connected
plugin:everything-claude-code:context7: npx -y @upstash/context7-mcp@2.1.4 - ✓ Connected
plugin:everything-claude-code:exa: https://mcp.exa.ai/mcp (HTTP) - ✓ Connected
plugin:everything-claude-code:memory: npx -y @modelcontextprotocol/server-memory@2026.1.26 - ✓ Connected
plugin:everything-claude-code:playwright: npx -y @playwright/mcp@0.0.69 --extension - ✓ Connected
plugin:everything-claude-code:sequential-thinking: npx -y @modelcontextprotocol/server-sequential-thinking@2025.12.18 - ✓
Connected
gitnexus: D:\app\nvm4w\nodejs\gitnexus.cmd mcp - ✗ Failed to connect
penpot: npx -y mcp-remote http://localhost:9001/mcp/stream?userToken=eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMjU2R0NNIn0.U_taj6nw-FOw_8
144b-SyH1DKyPv7vU7EzH8E6DX2fPXnhaVOe0LGQ.RxJn-7w4m95309h6.YeNOB32bwaWygFFeHMUY7AGXUvYQpZRGhG8etZgbUMUn9_AGxrVeaEw3MC879VtlvoR0a
HtMnNil6Rqba4pNiCTuRJ2GesP0ZSLseaFUgb8RU1QhVtOqyMNi7LwK22mhejCINtPWo7XUBb-lf5jcrfWNkWuvvcM54Sgjy1JPacDAcqGyV1D-XKMuOZea8xG9V1oK
6U4tv29c.ZP7gqyvIh1sUwLPHkeQrlQ --allow-http - ✓ Connected
2.2 Penpot MCP 工具
claude penpot mcp工具主要是用于设计稿交互操作.
┌─────────────────────┬─────────────────────────────────┐
│ 工具 │ 用途 │
├─────────────────────┼─────────────────────────────────┤
│ high_level_overview │ Penpot 工具使用总览(必须先读) │
├─────────────────────┼─────────────────────────────────┤
│ penpot_api_info │ 查询 Penpot API 类型/成员文档 │
├─────────────────────┼─────────────────────────────────┤
│ execute_code │ 在 Penpot 插件上下文执行 JS │
├─────────────────────┼─────────────────────────────────┤
│ export_shape │ 将 shape 导出为 PNG/SVG │
└─────────────────────┴─────────────────────────────────┘
Penpot MCP 工具集是底层执行模式——没有封装好的 create_page 等高级工具,而是通过 execute_code 直接在 Penpot 插件上下文中跑 JavaScript。这意味着自由度更高,但 Prompt 策略需要调整。
2.3 Penpot 技能安装
直接使用penpot mcp 工具太原始,操作太复杂繁琐,需要使用skill进行包装和简化,故安装一个skill。ar27111994/penpot-mcp是目前最成熟的 Penpot MCP Skill,S 级社区项目,直接基于官方 Penpot Plugin API 文档构建,专门为 Claude Code 优化。
安装命令:
npx skills add ar27111994/penpot-mcp
2.4 Openpot系统创建项目
Penpot MCP 的工作原理是:通过浏览器插件与当前已打开的 Penpot 文件通信。没有文件 = 没有操作目标。
因此先创建一个新项目,然后打开一个新文件,命名是什么不重要,我就简单命名为v1.0。
验证是否就绪
在 Claude Code 中,让 Claude 执行:
请通过 execute_code 获取当前 Penpot 文件的名称和 ID,确认连接正常。
如果返回了文件名和 ID,说明一切就绪,可以开始设计。
一句话:先手动在 Penpot Web 里创建 Project → File → 保持打开,然后 Claude Code 才能通过 MCP 往里面画原型。
2.5 设计原型
在claude code cli输入:
请读取项目 openspec/specs/ 下的所有 spec.md 文件,解析其中的 Requirements 和 GIVEN/WHEN/THEN Scenarios,推断出所有需要的前端页面和交互流程。然后在当前 Penpot 文件中:
1. 创建一套完整的设计系统(颜色、字体、组件)
2. 按推断出的页面清单,逐个创建高保真原型页面
3. 根据 Scenarios 中的用户操作流程,添加页面跳转交互
要求:所有文本中文,桌面端 1440×900,每个 Scenario 的初始状态、用户操作、系统反馈都要在原型中体现。
由于是对以往界面功能做一个重新原型设计,时间很漫长,中途可以看到Penpot系统界面上不断进行自动设计,添加新生成的界面,最后出来结果,Claude Code cli输出:
全部 14 项任务完成。最终汇报: 完成情况 Penpot 文件:LLM Master 智能视觉分析平台原型(10 个页面、27 个 1440×900 画板) 1. 设计系统(01 设计系统页) - 颜色 token:主色 #2563EB、成功/错误/警告/信息色、深色侧边栏 #0F172A 等 20+ 色板 - 字体:Noto Sans SC(中文,全字重)+ JetBrains Mono(代码/数字) - 组件库:按钮(5 种变体)、输入框、标签、开关、表格、提示条、上传区、空状态、卡片、KV 字段 2. 高保真页面(每页 3 态,覆盖 spec 全部 Scenario) ┌───────────────┬───────────────────────────────────────────────────────────────────────────────────────┐ │ 页面 │ 状态覆盖 │ ├───────────────┼───────────────────────────────────────────────────────────────────────────────────────┤ │ 首页 │ 8 功能卡片导航 │ ├───────────────┼───────────────────────────────────────────────────────────────────────────────────────┤ │ 语音识别 │ 初始 / 录音中+50MB 超限 / 识别结果+<0.5s 提示 │ ├───────────────┼───────────────────────────────────────────────────────────────────────────────────────┤ │ 人脸登录验证 │ 摄像头 640×480 / 验证通过(0.91≥0.75)/ 验证失败(0.42<0.75)+异常场景 │ ├───────────────┼───────────────────────────────────────────────────────────────────────────────────────┤ │ 人脸检测分析 │ 5 参数(buffalo_l/640/0.4/50/embedding)/ 分析中 / 3 人脸结果+标注图+512 维向量 │ ├───────────────┼───────────────────────────────────────────────────────────────────────────────────────┤ │ YOLO 目标检测 │ 参数 0.25/640/300 / 3 目标卡片(中英文类别+裁剪子图)/ 超时错误"检测超时,请稍后重试" │ ├───────────────┼───────────────────────────────────────────────────────────────────────────────────────┤ │ 图片分析 │ 4 预设类别+max_tokens 4096/temperature 0.3 / 报告+原始 JSON / 多轮对话 3 轮 │ ├───────────────┼───────────────────────────────────────────────────────────────────────────────────────┤ │ 视频异常分析 │ 500MB 上传+摄像头 / 采集 8/16 帧 / 风险评分 72+事件列表+"未检测到异常"态 │ ├───────────────┼───────────────────────────────────────────────────────────────────────────────────────┤ │ OCR 文字识别 │ ≤10MB 上传 / 6 行结果表格(置信度+坐标)+完整文本 / "未识别到文字" │ ├───────────────┼───────────────────────────────────────────────────────────────────────────────────────┤ │ 员工管理 │ 列表(20 条/页 ID 降序+分页)/ 表单+身份证重复 400 红框 / 空状态+删除确认弹窗 │ └───────────────┴───────────────────────────────────────────────────────────────────────────────────────┘ 3. 交互跳转:共 141 个 click 交互 - 首页 8 卡片 → 各功能页初始态 - 每页侧边栏 9 导航热区 + 返回按钮 → 首页 - 页内状态流:开始录音→录音中→结果、开始验证→通过/失败、开始分析→分析中→结果、重试检测、新增员工→表单→保存回列表、重新上传等 需要注意 1. 无法截图验证:Penpot 渲染导出服务(localhost:9001)未运行,所有 shape 均通过 API 数据验证(数量/位置/命名),但视觉细节请在 Penpot UI 中查看。 2. 交互已写入:API 调用全部成功、审计计数正确,但插件读回 destination 引用显示为空(已知的 API 读模型限制)。建议打开 Penpot 原型模式(Prototype)点击验证,如有跳转失效告诉我具体位置,我可以立即修复。
2.6 把 Penpot 原型拉到本地 Git 仓库
2.6.1 Claude Code + MCP 自动化导出(批量操作)
请通过 Penpot MCP 完成以下批量导出任务:
1. 导出当前文件的所有 Design Tokens 为 JSON,保存到本地 penpot-assets/tokens/design-tokens.json
2. 导出所有页面的画板为 PNG(1x 和 2x),保存到 penpot-assets/exports/pages/
3. 导出所有组件为 SVG,保存到 penpot-assets/exports/components/
4. 读取当前文件结构,生成一份《设计资产清单》Markdown 文档
请分批执行,每批不超过 10 个操作。
失败了,提示MCP tool不支持导出功能, 只把design-tokens.json导出来了,还有设计资产清单文档, 相当于把第1,4点执行成功。
但是提示:让我用「插件内序列化 SVG + @resvg/resvg-js 栅格化」的替代方案自动产出。 故继续执行:
2. 导出所有页面的画板为 PNG(1x 和 2x),保存到 penpot-assets/exports/pages/
执行很长时间,最后终于成功:
画板 PNG 导出任务全部完成。
根因与修复:排查发现之前 8 个板 panic、9 个板渲染空白其实是同一个 bug —— 序列化器误用了
boardX/boardY(画布绝对坐标,三行画板在画布上分别位于 y=0 / -1000 /
-2000),导致第二行内容整体移出画布(渲染为空白)、第三行触发 resvg 崩溃。改用画板相对坐标 s.x/s.y 后重序列化全部 27
板并重转,ok=27 fail=0。
交付物(penpot-assets/exports/pages/,共 54 个文件,7.7MB):
- 27 个画板 × 1x(1440×900)/ 2x(2880×1800),命名如 ASR-03_识别结果@2x.png
- 已校验:无空白文件(最小 49KB)、IHDR 尺寸正确、3 个原问题板(IA-02 / YD-03 /
ASR-03)目检渲染正常(中文、布局、状态色均正确)
收尾:design-asset-inventory.md 导出状态已更新(含实现路线与命名规则);临时文件(_server.js、_exporter/、中间
_svg/)已清理,本地接收服务已停止。
继续执行第3步导出:
3. 导出所有组件为 SVG,保存到 penpot-assets/exports/components/
出现输出上下文超限,一次输出超过我设置的8K:
Thought for 24m 21s, called penpot (ctrl+o to expand)
⎿ API Error: Claude's response exceeded the 8192 output token maximum. To configure this behavior, set the
CLAUDE_CODE_MAX_OUTPUT_TOKENS environment variable.
改为分批导出:
修复之前的任务:导出 DS-02 组件库为 SVG
问题:
1. 之前因返回数据量过大导致 token 超限
2. DS-02 中的"组件"是平铺元素,非 Penpot Component 对象
新策略:
1. 先用 execute_code 执行轻量查询,只获取元素名称和 ID,不获取样式属性
2. 我确认分组规则后,再按组批量导出
3. 每批最多导出 3 个 SVG,避免超时
请现在执行 Step 1:获取 DS-02 画板中所有元素的名称列表和 ID。
第3步导出SVG成功:
Step 1 完成。116 个元素清单已取得(上方工具输出),引用已缓存到 storage.ds02kids,后续按序号取用,无需再全文件扫描。
注意:所有元素短 ID 前缀相同(53b0bcca,文件级前缀),无法用于区分——实际定位用序号(000–115)。
分组规则提案(请确认)
DS-02 是平铺元素(无嵌套组),"组件" = 功能相关的兄弟元素集合。按视觉组合归组如下:
┌─────────┬───────────────────────────────────────┬────────────────────────────────────┬────────────────────────────────┐
│ 组 │ 组件(文件名) │ 包含序号 │ 尺寸 │
├─────────┼───────────────────────────────────────┼────────────────────────────────────┼────────────────────────────────┤
│ │ btn-开始验证 / btn-次要按钮 / │ 004+005 / 007+008 / 010+011 / │ │
│ 按钮 ×6 │ btn-删除 / btn-确认通过 / │ 013+014 / 016+017 / 019+020 │ 96×40(删除 68×40) │
│ │ btn-文字按钮 / btn-禁用状态 │ │ │
├─────────┼───────────────────────────────────────┼────────────────────────────────────┼────────────────────────────────┤
│ │ input-占位态 / input-已输入 / │ 026+027 / 029+030 / 032+033 / │ │
│ 输入框 │ input-数字 / input-参数 / │ 034+035 / 037+038+039 / │ 280×38、140×38、120×38、190×36 │
│ ×7 │ input-错误态 / input-下拉模型 / │ 044+045+046 / 048+049+050 │ 等 │
│ │ input-下拉embedding │ │ │
├─────────┼───────────────────────────────────────┼────────────────────────────────────┼────────────────────────────────┤
│ 开关 ×2 │ toggle-开 / toggle-关 │ 052+053 / 055+056 │ 44×24 │
├─────────┼───────────────────────────────────────┼────────────────────────────────────┼────────────────────────────────┤
│ 标签 ×6 │ tag-通过 / tag-失败 / tag-处理中 / │ 059+060 / 061+062 / 063+064 / │ 46~124 × 24(正常 60×22) │
│ │ tag-降级 / tag-COCO80类 / tag-正常 │ 065+066 / 067+068 / 100+101 │ │
├─────────┼───────────────────────────────────────┼────────────────────────────────────┼────────────────────────────────┤
│ 表格 ×1 │ table │ 089–095(表头)+ 103–110(行1)+ │ 1288×132 │
│ │ │ 111–115(斑马纹/边框) │ │
├─────────┼───────────────────────────────────────┼────────────────────────────────────┼────────────────────────────────┤
│ 可选 │ card-01~`card-05` │ 003 / 024 / 041 / 070 / 088 │ 各区块白色容器背景 │
│ 卡片 ×5 │ │ │ │
└─────────┴───────────────────────────────────────┴────────────────────────────────────┴────────────────────────────────┘
核心组件共 27 个(去重后标签 6 个:表中两个 tag:正常 完全相同只导出 1 次);含卡片则 32 个。
默认排除:text: 开头的区块标题与规格注释(primary/danger/高度 40 等)、card 容器背景(除非勾选可选项)。
技术方案:组件为平铺兄弟元素,无需 <g>
嵌套;坐标归零到组件包围盒原点,有阴影的元素(卡片)外扩阴影余量。落盘走本地接收服务(与 PNG 导出同一路线)——每次
execute_code 只返回成功计数(几十字节),不回传 SVG 内容,所以不存在 token 超限问题,27 个可一次 POST 完成,无需 3 个一批。
请确认:① 分组与排除规则是否 OK;② 是否导出 5 个 card 背景;③ 文件名前缀/命名是否要调整。确认后我即执行。
确认,真正执行导出:
确认:1,OK, 2. 导出, 3. 不用调整。
执行吧。
组件 SVG 导出完成。
交付:penpot-assets/exports/components/ 共 31 个 SVG
┌──────────┬──────┬─────────────────────────────────────────────────────────────────────────┐
│ 组件 │ 数量 │ 文件 │
├──────────┼──────┼─────────────────────────────────────────────────────────────────────────┤
│ 按钮 │ 6 │ btn-开始验证 / 次要按钮 / 删除 / 确认通过 / 文字按钮 / 禁用状态 │
├──────────┼──────┼─────────────────────────────────────────────────────────────────────────┤
├──────────┼──────┼─────────────────────────────────────────────────────────────────────────┤
│ 输入框 │ 7 │ input-占位态 / 已输入 / 数字 / 参数 / 错误态 / 下拉模型 / 下拉embedding │
├──────────┼──────┼─────────────────────────────────────────────────────────────────────────┤
│ 开关 │ 2 │ toggle-开 / 关 │
├──────────┼──────┼─────────────────────────────────────────────────────────────────────────┤
│ 标签 │ 6 │ tag-通过 / 失败 / 处理中 / 降级 / COCO80类 / 正常 │
├──────────┼──────┼─────────────────────────────────────────────────────────────────────────┤
│ 提示条 │ 4 │ banner-错误 / 成功 / 警告 / 信息 │
├──────────┼──────┼─────────────────────────────────────────────────────────────────────────┤
│ 表格 │ 1 │ table(1288×132,含表头、行数据、状态标签) │
├──────────┼──────┼─────────────────────────────────────────────────────────────────────────┤
│ 卡片背景 │ 5 │ card-01 ~ 05(带阴影的含 feDropShadow 滤镜与外扩留白) │
└──────────┴──────┴─────────────────────────────────────────────────────────────────────────┘
保真核验:期间发现 table 组尾部有 3 个不透明 #B1B2B5 矩形,对照 DS-02 画板 PNG
确认这正是画布实际渲染(表格内容被设计残留矩形覆盖),SVG 忠实还原,未擅自修改。按钮文本位置等亦逐一与画布比对一致。
收尾:临时接收服务(9999 端口)已停止,_server.js 已删除;design-asset-inventory.md 第 6 节组件行已更新为「✅ 已完成(31
个组件)」并附实现说明。至此该文件全部设计资产(tokens JSON + 54 个画板 PNG + 31 个组件 SVG)导出完毕。
✻ Sautéed for 50m 32s
收尾:临时接收服务(9999 端口)已停止,_server.js 已删除;design-asset-inventory.md 第 6 节组件行已更新为「✅ 已完成(31
个组件)」并附实现说明。至此该文件全部设计资产(tokens JSON + 54 个画板 PNG + 31 个组件 SVG)导出完毕。
不懂前端开发,继续学习一下:
这个项目在Penpot系统上生成的所有东西,都导出完毕了吗?目前有3个目录tokens, componects,
pages,分析一下里面的内容,是否有导出缺失。还有,这些导出的东西,各是是什么作用啊?
核对完成。以下是完整分析。
一、三个目录的内容与作用
目录: tokens/
内容: design-tokens.json(W3C DTCG 格式):品牌色 5、功能色 11、中性色 13、字体 2、字号 5、字重 3、行高 2、间距 5、圆角
3、阴影 1
大小: 5.5 KB
作用: 代码级设计系统。用于生成 CSS 变量 / Tailwind 主题 / UI 库配置,保证开发代码的色值、字体、间距与设计严格一致
────────────────────────────────────────
目录: exports/pages/
内容: 27 画板 × 2(@1x 1440×900 + @2x 2880×1800)= 54 个 PNG,覆盖设计系统 2 板 + 首页 + 8 功能模块各 3 状态
大小: 7.7 MB
作用: 视觉对照基准。开发时逐像素比对、设计评审、验收截图。位图,不能反推代码
────────────────────────────────────────
目录: exports/components/
内容: 31 个 SVG:按钮 ×6、输入框 ×7、开关 ×2、标签 ×6、提示条 ×4、表格 ×1、卡片背景 ×5
大小: 50 KB
作用: 矢量组件参照。SVG 是矢量+文本,可直接查看色值/圆角/坐标,也可作为内联 SVG 使用,用于实现组件样式
二、导出完整性核对(全文件扫描:11 页 / 27 画板 / 2517 元素)
┌──────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────────────┐
│ Penpot 中的内容 │ 导出状态 │
├──────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 画板(27 个) │ ✅ 54 个 PNG 一一对应,无缺失 │
├──────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ Design Tokens(DS-01 板) │ ✅ 完整 │
├──────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 组件(DS-02 板 31 组) │ ✅ 完整 │
├──────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 图片 / 图标类资产 │ ✅ 无缺失——全部 2517 个元素均为矢量图形+文本,0 │
│ │ 个图片填充,不存在需要单独导出的位图资产 │
├──────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────┤
├──────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ Design Tokens(DS-01 板) │ ✅ 完整 │
├──────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 组件(DS-02 板 31 组) │ ✅ 完整 │
├──────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 图片 / 图标类资产 │ ✅ 无缺失——全部 2517 个元素均为矢量图形+文本,0 │
│ │ 个图片填充,不存在需要单独导出的位图资产 │
├──────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────────────┤
│ 交互/原型数据(141 个 │ ⚠️ 唯一未导出的内容 │
│ click→navigate-to) │ │
└──────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────────────┘
三、顺带发现的 3 个小问题
1. exports/pages/ 里混入 1 个无关文件 bash.exe.stackdump(Windows bash 崩溃转储,非导出产物),建议删除;
2. Penpot「04 人脸登录验证」页有一个游离元素:100×100 的 Ellipse,不在任何画板内,是设计残留(未进入任何导出,不影响产物);
3. 清单文档第 3 节中性色数量写 12,实际 JSON 为 13 个,可顺手修正。
结论
视觉与设计系统层面的导出已全部完成,无缺失。 唯一没导出的是 141
条原型交互(页面跳转关系)——如果前端开发路由时需要「哪个元素点击后跳到哪个画板」的对照,可以补一份交互清单(JSON 或
Markdown)。
需要我执行哪些后续操作?① 删除 bash.exe.stackdump;② 在 Penpot 里删掉残留的 Ellipse;③ 补导出 141 条交互清单;④
修正文档中性色计数。
2.6.2 手动导出
手工操作太麻烦,不考虑。
2.6.3 Locofy Lightning 插件(一键生成 Vue 代码)
类似手工操作,不是自动生成到git仓库目录下,不直接,不考虑。
2.7 编写前端系统
继续边问边学:
❯ 这些导出的文件有什么用?我怎么才能使用这些文件和对应openspec文件,通过claude code
来自动编写前端系统代码,做一个基于vue3框架的可运行的web系统来?给一个操作步骤方案。
回答:
项目现状已摸清,关键发现:frontend/ 已有一个功能完整的旧版 Vue3(13 个 view、6774 行、已接 FastAPI 7000
端口),所以你的任务不是"从零生成",而是**"用 Penpot 设计系统重构现有前端的视觉层 + 补设计系统基建"**。这反而让 Claude Code
自动化更可靠(业务逻辑和 API 层不用动)。
一、导出文件 × 使用环节对照
┌─────────────────────────────┬─────────────────────────────────────────────┬───────────────────────────────────────────┐
│ 文件 │ 性质 │ 在开发中的用法 │
├─────────────────────────────┼─────────────────────────────────────────────┼───────────────────────────────────────────┤
│ tokens/design-tokens.json │ 设计真值(色值/字体/间距/圆角/阴影) │ Step 1 生成 tokens.css(CSS 变量),全局 │
│ │ │ 唯一颜色来源,禁止代码里再写死 hex │
├─────────────────────────────┼─────────────────────────────────────────────┼───────────────────────────────────────────┤
│ exports/components/*.svg(3 │ 组件规格书(SVG 源码即可读文本:精确色值、 │ Step 2 让 Claude Code 读 SVG 源码 → │
│ 1 个) │ 圆角、字号、坐标) │ 逐个实现 ui/ 基础组件 │
├─────────────────────────────┼─────────────────────────────────────────────┼───────────────────────────────────────────┤
│ exports/pages/*.png(54 │ │ Step 3/4 每做一个页面,把对应 PNG │
│ 张) │ 视觉验收基准 │ 路径写进 prompt(Claude Code │
│ │ │ 能看图),做完截图对比 │
├─────────────────────────────┼─────────────────────────────────────────────┼───────────────────────────────────────────┤
│ design-asset-inventory.md │ 导航地图(哪个画板对应哪个页面/状态) │ 全程检索"我该参照哪张图" │
├─────────────────────────────┼─────────────────────────────────────────────┼───────────────────────────────────────────┤
│ openspec/specs/*/spec.md(1 │ 需求真值(Requirement + WHEN/THEN 场景,含 │ Step 4 │
│ 0 份) │ API 端点) │ 每个模块的行为规格,验收标准直接来自 │
│ │ │ Scenario │
└─────────────────────────────┴─────────────────────────────────────────────┴───────────────────────────────────────────┘
二、操作步骤方案(6 步,每步 = 一个 Claude Code 任务)
Step 0 · 准备(手动,10 分钟)
cd D:\ai\llmmaster\backend && 启动 FastAPI(7000 端口,参考 backend/run.sh)
cd D:\ai\llmmaster\frontend && npm run dev # 3001 端口,已配好 /api 代理
打开 http://localhost:3001 截一张"改造前"全家福存底,用于最后对比。
Step 1 · 设计令牌落地
- 输入:penpot-assets/tokens/design-tokens.json
- 产物:frontend/src/styles/tokens.css(CSS 变量 --color-brand-primary 等 3 组 30 色 + 字体/间距/圆角/阴影);改写 main.css
引用变量
- 验收:npm run build 通过;全项目 grep 不到 tokens.css 之外的硬编码 hex
- Prompt 示例:
▎ 读取 penpot-assets/tokens/design-tokens.json,在 frontend/src/styles/tokens.css 中生成 W3C 命名对应的 CSS
自定义属性(:root),并把 main.css 中所有硬编码颜色替换为变量引用。不要引入新依赖。
Step 2 · 基础组件库(最关键的一步)
- 输入:31 个 SVG + design-asset-inventory.md 第 4 节
- 产物:frontend/src/components/ui/:Button.vue(primary/secondary/danger/success/ghost/disabled 6
变体)、Input.vue(占位/已输入/错误态/下拉 等)、Tag.vue(6 色)、Toggle.vue、Banner.vue(4
类可关闭)、Card.vue(阴影)、DataTable.vue
- 验收:每个组件一个 vitest 快照测试;建一个临时 DevComponentsView 预览页目检
- Prompt 示例:
▎ 以 penpot-assets/exports/components/ 下 31 个 SVG 的源码为唯一样式规格(色值、圆角、字号、padding 必须与 SVG
完全一致),实现 frontend/src/components/ui/ 下的 Button/Input/Tag/Toggle/Banner/Card/DataTable 组件,使用 tokens.css
变量。每个组件附 vitest 测试。
Step 3 · 全局布局
- 输入:首页@1x.png(深色侧栏 #0F172A + 8 功能入口 + 顶栏)
- 产物:App.vue 布局重构 + router/index.js 路由表对齐(8 模块 + 首页)
- 验收:侧栏导航高亮、跳转、返回首页全部可用
Step 4 · 8 个功能模块逐个对齐(8 个任务,建议一个会话做一个)
每个模块的固定输入包:3 张状态 PNG + 1 份 spec.md + 现有 View + ui 组件
┌──────┬───────────┬──────────────┬──────────────────────────────┬──────────────────────────────────────┐
│ 顺序 │ 模块 │ 参照图 │ spec │ 改造对象 │
├──────┼───────────┼──────────────┼──────────────────────────────┼──────────────────────────────────────┤
│ 1 │ 语音识别 │ ASR-01/02/03 │ speech-to-text │ AsrView │
├──────┼───────────┼──────────────┼──────────────────────────────┼──────────────────────────────────────┤
│ 2 │ OCR 识别 │ OCR-01/02/03 │ ocr-recognize │ OcrRecognizeView │
├──────┼───────────┼──────────────┼──────────────────────────────┼──────────────────────────────────────┤
│ 3 │ 员工管理 │ EM-01/02/03 │ employee-management │ EmployeeList/Form │
├──────┼───────────┼──────────────┼──────────────────────────────┼──────────────────────────────────────┤
│ 4 │ 人脸检测 │ FD-01/02/03 │ face-detect │ FaceDetectView │
├──────┼───────────┼──────────────┼──────────────────────────────┼──────────────────────────────────────┤
│ 5 │ 人脸验证 │ FV-01/02/03 │ face-verify │ FaceVerifyView │
├──────┼───────────┼──────────────┼──────────────────────────────┼──────────────────────────────────────┤
│ 6 │ YOLO 检测 │ YD-01/02/03 │ yolo-detect / yolo-detection │ YOLODetectView │
├──────┼───────────┼──────────────┼──────────────────────────────┼──────────────────────────────────────┤
│ 7 │ 视频异常 │ VA-01/02/03 │ video-anomaly-analysis │ VideoAnalyzeView │
├──────┼───────────┼──────────────┼──────────────────────────────┼──────────────────────────────────────┤
│ 8 │ 图片分析 │ IA-01/02/03 │ image-analysis │ ImageAnalysisView(1158 行,最后做) │
└──────┴───────────┴──────────────┴──────────────────────────────┴──────────────────────────────────────┘
- Prompt 模板(每模块替换参数):
▎ 重构 frontend/src/views/AsrView.vue,使其与 penpot-assets/exports/pages/ASR-01_初始状态@1x.png、ASR-02_…、ASR-03_…
三张设计图一致(1440×900)。行为规格以 openspec/specs/speech-to-text/spec.md 的全部 Scenario 为准。样式只用 tokens.css 变量和
ui/ 组件,保留现有 services/api.js 调用逻辑。完成后 npm run test 必须通过。
- 每模块验收:① 三状态截图与设计 PNG 目检一致;② spec 中每个 Scenario 可走通;③ API 真实调用成功。
Step 5 · 交互与细节收尾
- 141 条原型跳转主要是侧栏/返回首页/状态流转,Step 3/4 已覆盖大部分;如需要精确对照,让我先导出交互清单 JSON
- 处理上次发现的残留:删 bash.exe.stackdump、Penpot 里删 Ellipse
Step 6 · 整体验收
3. 一次一个模块,做完验收再下一个:避免 8 个模块一起改导致上下文爆炸、互相覆盖(你之前导出任务 token
超限就是大任务一次性做的教训)。
四、需要你拍板的 2 件事
4. 样式方案:CSS 变量(推荐,零新依赖,现有 main.css 直接演进)还是 TailwindCSS(需新装依赖、改构建配置)?
5. 改造策略:原地重写现有 view(推荐,保留 API 逻辑和路由结构)还是另起新目录 src-v2 并行开发?
确认后,我建议从 Step 1 + Step 2 开始(一个会话内可完成),你只需把上面的 Prompt 粘给 Claude Code(或告诉我"开始执行 Step
1",我直接做)。
再问:
说明更正一下:frontend确实是我已经开发完成的前端web系统,但是它是我手工开发的;现在主要尝试使用claude code + openspec +
penpot mcp进行原型设计, 然后用penpot系统导出的东西,使用claude
code来自动编写前端web系统,看看是否成功,我们可以创建frontend2来放新前端系统代码。你再根据我的需求分析一下,更新一下方案。
回答:
明白了——这是一个流水线可行性实验:openspec(需求)+ Penpot 导出资产(设计)→ Claude Code → 可运行的
frontend2,验证这条自动化路径是否走得通。frontend/ 保持不动,只作为后端 API 的现成参照。方案更新如下。
一、实验定义(先定标准,否则"是否成功"无法判定)
┌──────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ 项 │ 内容 │
├──────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 输入 │ ① penpot-assets/ 三个目录 + 清单文档 ② openspec/specs/ 10 份 spec ③ 后端 API 端点(spec 里已含 │
│ │ /api/...,另可参照 frontend/src/services/api.js 的现成清单) │
├──────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 输出 │ frontend2/:可 npm run dev 运行、8 大功能模块可走通、视觉贴近设计的 Vue3 系统 │
├──────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 成功判据 │ ① 功能:每个模块的 spec Scenario 基本走通 ② 视觉:截图与设计 PNG 明显同构(不必像素级) ③ │
│ │ 人工干预次数(实验核心指标:几次纠正才收敛) ④ 效率:每模块耗时/token ⑤ 构建/测试通过 │
├──────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 实验纪律 │ 代码尽量让 Claude Code 生成;每次人工纠正都记录(纠正内容 + │
│ │ 原因),最后汇总成实验报告——干预点分布就是这条流水线的短板地图 │
└──────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
二、执行步骤(frontend2 从零)
Step 0 · 环境准备(手动/我代做,10 分钟,不计入实验)
# 后端(7000)保持运行
cd D:\ai\llmmaster && mkdir frontend2 # 脚手架:Vite+Vue3+router+axios
# vite 端口 3002,proxy /api → 127.0.0.1:7000(与 frontend 同款配置)
脚手架建议直接搭好(复制 frontend 的 package.json/vite.config,清空 src),把"搭脚手架"这个无关变量排除在实验外。
Step 1 · 写 frontend2/CLAUDE.md 实验宪法(1 个任务)
这是整条流水线的"控制变量",内容:
- 技术栈锁定:Vue3 + CSS 变量(禁 Tailwind/禁 UI 库,减少变量)
- 设计真值路径:tokens.json / components SVG / pages PNG 各自用途
- 硬性规则:颜色只准用 --token 变量;组件必须来自 ui/;每个 view 头部注释标明对应的 3 张设计图路径
- 验收命令:npm run build + npm run test
Step 2 · 设计令牌(实验任务 1)
tokens.json → src/styles/tokens.css。验收:build 通过、无裸 hex。
Step 3 · ui 组件库(实验任务 2,最吃设计资产的环节)
31 个 SVG 源码 → src/components/ui/(Button/Input/Tag/Toggle/Banner/Card/DataTable)。
这一步直接检验"SVG 作为组件规格书"是否够用——如果 Claude Code 从 SVG 读出的样式有偏差,就是第一个干预点,记录下来。
Step 4 · 布局 + 路由(实验任务 3)
首页@1x.png → App.vue 布局(深色侧栏 8 入口)+ 路由表。
Step 5 · 8 模块逐个生成(实验任务 4–11,一个会话一个模块)
每个模块固定 prompt 模板:
▎ 在 frontend2 中实现 XX 模块:视图规格参照 penpot-assets/exports/pages/XX-01/02/03 三张 PNG(1440×900),行为规格以
▎ openspec/specs/xx/spec.md 全部 Scenario 为准,API 端点见 spec 中 /api 路径。样式只用 tokens 变量 + ui 组件。完成后 build 与
▎ test 必须通过。
顺序按复杂度递增:ASR → OCR → 员工管理 → 人脸检测 → 人脸验证 → YOLO → 视频异常 → 图片分析。
每模块完成后:Playwright/浏览器截图 vs 设计 PNG 目检 → 记录差异 → 一次纠正 prompt → 再截图 → 收敛即下一模块。
Step 6 · 整体验收 + 实验报告(实验任务 12)
- 27 画板截图 vs 设计图总对比
- 产出 docs/frontend2-experiment.md:各步干预点清单、失败案例、token
消耗、结论(这条流水线在什么粒度上可用、什么粒度上必须人兜底、导出资产是否足够——若某处必须回 Penpot MCP
实时查数据,说明导出物需补强)
三、与上一版方案的差异
┌──────────────────────────────────────────────┬─────────────────────────────────────────────────────────────────────────┐
│ 变化点 │ 原因 │
├──────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────┤
│ 前端从零(frontend2),不再复用 frontend 的 │ 实验要测"自动生成"能力,复用旧代码会让结果失真 │
│ view/组件 │ │
├──────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────┤
│ frontend 降级为参照物:API │ 你的手工系统是最好的"标准答案",验收时可比对功能行为 │
│ 端点清单、行为正确性对照 │ │
├──────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────┤
│ 增加实验记录机制(干预点 + 耗时 + token) │ "看看是否成功"需要量化结论,不是凭感觉 │
├──────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────┤
│ 脚手架、CLAUDE.md 不计入实验任务 │ 排除无关变量,只测"资产 → 代码"这一段 │
├──────────────────────────────────────────────┼─────────────────────────────────────────────────────────────────────────┤
│ 评估中加入"导出资产是否够用"维度 │ 若 Claude Code 频繁回查 Penpot │
│ │ MCP,说明导出物(SVG/PNG/tokens)缺信息,反哺导出流程 │
└──────────────────────────────────────────────┴─────────────────────────────────────────────────────────────────────────┘
四、需要你拍板(4 个,都是实验前置变量)
1. 脚手架:我直接搭好 frontend2 骨架(推荐),还是让 Claude Code 连脚手架一起生成?
2. 样式:CSS 变量(推荐)还是 Tailwind?
3. 测试:每模块配 vitest 测试(更严谨但费 token),还是只做 build + 截图目检(更省)?
4. 启动时机:现在就从 Step 0 + Step 1 开始执行?
你回复这 4 点后我立即开工。
开工:
1. 让 Claude Code 连脚手架一起生成;
2. 样式:CSS 变量;
3. 测试:每模块配 vitest 测试(更严谨但费 token);
4. 启动时机:现在就从 Step 0 + Step 1 开始执行!
最后生成前端代码倒是很顺利,一个可运行的web系统就轻松出来了。






对我这种以前打死不做前端开发的人来说,做一点要求不高的web管理系统,现在也不用求人了。
2.8 总结
本次从openspec(需求)开始,Claude Code连接Penpot MCP server, 用需求spec去驱动Penpot系统进行原型设计, 在用Claude Code连接Penpot MCP server导出Penpot生成的资产(设计)到git仓库目录penpot-assets里,最后Claude Code利用openspec和penpot-assets进行编码,生成基于Vite+Vue3+router+axios脚手架的可运行的frontend2前端系统代码,验证这条自动化路径是走得通的,而且效果还不错。
更多推荐




所有评论(0)