figma-mcp-stdio 1.0.13 → 1.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.js +31 -20
- package/package.json +1 -1
package/build/index.js
CHANGED
|
@@ -12,9 +12,6 @@ const server = new FastMCP({
|
|
|
12
12
|
version: getVersion(),
|
|
13
13
|
});
|
|
14
14
|
/**
|
|
15
|
-
* 7. 优化JSON数据,合并图层,生成新的 JSON 数据,识别JSON中卡片(Frame/Group),如果识别到模块,则合并模块内的所有节点如果模块没有 Frame/Group 包裹,而是子元素与其他元素平级,聚合元素结合图片辅助检查
|
|
16
|
-
- 检查初步分组是否合理(是否把两个卡片误合并?是否遗漏了卡片阴影等元素?)。
|
|
17
|
-
- 如果需要,调整分组。
|
|
18
15
|
*/
|
|
19
16
|
const taskList = [
|
|
20
17
|
"你是一个专业的Figma页面生成工程师,请严格执行以下步骤,Figma设计稿生成页面,确保页面样式与设计稿一致,并实现设计稿中的交互逻辑和用户体验;每执行一步都输出执行结果",
|
|
@@ -32,9 +29,10 @@ const taskList = [
|
|
|
32
29
|
'【前期准备】:',
|
|
33
30
|
"1. 使用能够获取Figma设计稿数据的工具提取页面的JSON结构数据,注入上下文中,数据名称 figmaJson",
|
|
34
31
|
"2. 页面整体的nodeId节点ID需要转换,使用【Figma节点ID转换规则】来获取转换规则, 使用【下载Figma图片工具】下载页面截图",
|
|
35
|
-
`3.
|
|
36
|
-
-
|
|
37
|
-
-
|
|
32
|
+
`3. 按照规则下载图片
|
|
33
|
+
- ⚠️ 重要提示:不要额外下载类型为IMAGE的图片
|
|
34
|
+
- 若有用户输入的图片描述,则使用【下载Figma图片工具】下载对应图片
|
|
35
|
+
- 若无用户输入的图片描述,则执行【获取打标图片节点ID】工具,获取打标图片节点ID
|
|
38
36
|
- 若存在打标图片节点ID, 则使用【下载Figma图片工具】下载图片,仅下载这些打标图片节点(不下载其内部图片)
|
|
39
37
|
- 若不存在打标图片节点ID, 则不下载图片
|
|
40
38
|
【注】下载图片时统一使用 PNG 格式,语义化命名,用于替换生成页面中的节点,下载的图片保存到编辑文件同级的images目录下`,
|
|
@@ -42,14 +40,31 @@ const taskList = [
|
|
|
42
40
|
"5. 调用【获取组件库信息任务】,从知识库中获取组件库信息",
|
|
43
41
|
"6. 使用【获取图片详情工具】获取截图详情,并注入到上下文中,数据名称 imageDetails",
|
|
44
42
|
"【生成页面】:",
|
|
45
|
-
`
|
|
43
|
+
`9. 根据截图详情imageDetails内容生成页面,结合 figmaJson数据优化样式,截图为主,figmaJson 数据为辅。分段生成代码,例如template、script、scss,防止任务过大超时
|
|
46
44
|
- ⚠️ 重要提示:样式生成时gap转换为margin、font-weight: 600转换为font-weight: bold
|
|
47
45
|
`,
|
|
46
|
+
'【页面优化】:',
|
|
47
|
+
`10. 使用【页面优化工具】优化页面`,
|
|
48
48
|
"【自检流程】:",
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
`12. 执行UI还原度对比流程,执行【还原度对比】工具自检
|
|
50
|
+
- ⚠️ 重要提示:不允许跳过,必须执行
|
|
51
|
+
`,
|
|
52
|
+
"13. 再次执行UI还原度对比流程,执行【还原度对比】工具自检",
|
|
52
53
|
];
|
|
54
|
+
// 问题修复工具
|
|
55
|
+
server.addTool({
|
|
56
|
+
name: "page_optimization",
|
|
57
|
+
description: "页面优化工具",
|
|
58
|
+
execute: async (args) => {
|
|
59
|
+
return String(`
|
|
60
|
+
你是一个专业的页面优化工程师,请严格执行以下步骤,每执行一步都输出执行结果
|
|
61
|
+
【优化规则】:
|
|
62
|
+
1、样式生成时gap转换为margin、font-weight: 600转换为font-weight: bold
|
|
63
|
+
2、如存在design-token样式,如 Base/FontSize/20 斜杠分割的格式,使用design-token的原始值(如 Base/FontSize/20),无需转换为变量,打包工具会自动转换
|
|
64
|
+
3、最外层容器不要设置为375px、1440px等固定宽度,响应式布局,宽度为100%
|
|
65
|
+
`);
|
|
66
|
+
},
|
|
67
|
+
});
|
|
53
68
|
// 自动生成页面工具-印尼专用
|
|
54
69
|
server.addTool({
|
|
55
70
|
name: "figma_generate_page_tasks",
|
|
@@ -121,7 +136,6 @@ server.addTool({
|
|
|
121
136
|
// 优先使用参数中的 API 密钥,然后尝试环境变量
|
|
122
137
|
const tinyApiKey = args.tinyApiKey || process.env.TINY_API_KEY;
|
|
123
138
|
const compressionMethod = tinyApiKey ? "TinyPNG" : "Sharp压缩";
|
|
124
|
-
console.error(`开始批量压缩 ${args.imagePaths.length} 个图片,使用 ${compressionMethod}`);
|
|
125
139
|
// 批量处理图片,支持并发
|
|
126
140
|
const results = await processBatchImages(args.imagePaths, tinyApiKey, args.quality, args.concurrent);
|
|
127
141
|
// 统计结果
|
|
@@ -197,10 +211,6 @@ server.addTool({
|
|
|
197
211
|
imageAbsolutePath: z.string().describe("本地图片的绝对路径"),
|
|
198
212
|
}),
|
|
199
213
|
execute: async (args) => {
|
|
200
|
-
// 使用 console.error 输出调试信息,避免干扰 MCP 的 JSON-RPC 通信
|
|
201
|
-
console.error('=== get-image-to-base64 调试信息 ===');
|
|
202
|
-
console.error('参数:', JSON.stringify(args, null, 2));
|
|
203
|
-
console.error('图片路径:', args.imageAbsolutePath);
|
|
204
214
|
const { imageAbsolutePath } = args;
|
|
205
215
|
const base64 = await getImageToBase64(imageAbsolutePath);
|
|
206
216
|
return {
|
|
@@ -218,16 +228,18 @@ server.addTool({
|
|
|
218
228
|
description: "还原度对比工具",
|
|
219
229
|
execute: async (args) => {
|
|
220
230
|
return String(`
|
|
221
|
-
|
|
222
|
-
|
|
231
|
+
⚠️ 重要提示:不允许跳过,必须执行,采用@cursor/browser浏览器工具进行对比,查看当前项目readme了解启动和访问项目的方式,查看当前项目的路由配置了解访问路径,项目启动后,通过navigate工具访问页面
|
|
232
|
+
你是一名 UI 验收专家,具备像素级别的视觉识别能力
|
|
233
|
+
使用能控制网页浏览器的工具@cursor/browser将当前 UI(只截取当前视窗,fullPage=false) 与截图对比
|
|
223
234
|
【前置准备】
|
|
224
|
-
- 可查看当前项目readme了解如何启动和访问
|
|
225
235
|
- 若是移动端项目,设计稿采用375px设计,选取一个对应的机型进行UI截图
|
|
226
236
|
- 若是官网项目,则无需选取机型,浏览器窗口宽度调整为1440px
|
|
227
237
|
【重点对比场景】
|
|
238
|
+
⚠️ 重要提示: 严格执行以下对比禁止跳过
|
|
228
239
|
- 调整间距、颜色和排版以保持一致
|
|
240
|
+
- 检查是否有横向或纵向溢出,如果溢出则调整样式,让内容自然撑开
|
|
229
241
|
- 调用获取图片详情工具获取UI详情(右图)与截图详情imageDetails包含内容(左图)对比,与左图比右图相对应的按钮、文字是否都存在
|
|
230
|
-
-
|
|
242
|
+
- 若有按钮或文本不存在,通过滚动模拟用户行为,每屏单独截图对比,若还存在截断,此时不要调整视口高度,检查容器实际情况调整样式,通过修改容器的高度或宽度,让内容自然撑开
|
|
231
243
|
- 【弹窗】:调整弹窗的高度,让内容展示全
|
|
232
244
|
- 【注意】:即使元素在 DOM 中存在,UI 详情中也可能未正确展示。
|
|
233
245
|
在覆盖组件库样式时,应检查当前 CSS 的实现方式(如使用 style 内联样式或 style 模块化样式),以确保样式覆盖生效
|
|
@@ -472,7 +484,6 @@ async function simpleImageCompress(imagePath, quality = 80) {
|
|
|
472
484
|
.toBuffer();
|
|
473
485
|
break;
|
|
474
486
|
}
|
|
475
|
-
console.error(`Sharp压缩完成: ${extension} 格式, 质量: ${quality}`);
|
|
476
487
|
return compressedBuffer;
|
|
477
488
|
}
|
|
478
489
|
catch (error) {
|