figma-mcp-stdio 0.1.3 → 0.1.5
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 +63 -24
- package/package.json +1 -1
package/build/index.js
CHANGED
|
@@ -11,7 +11,29 @@ const server = new FastMCP({
|
|
|
11
11
|
name: "My Server",
|
|
12
12
|
version: getVersion(),
|
|
13
13
|
});
|
|
14
|
-
//
|
|
14
|
+
// 自动生成页面工具
|
|
15
|
+
server.addTool({
|
|
16
|
+
name: "figma_generate_page_tasks",
|
|
17
|
+
description: "获取Figma生成页面所需要的任务列表",
|
|
18
|
+
execute: async (args) => {
|
|
19
|
+
return String(`
|
|
20
|
+
1. 使用能够获取Figma设计稿数据的工具提取页面的JSON结构数据
|
|
21
|
+
2. 页面整体的nodeId节点ID需要转换,使用【Figma节点ID转换规则】来获取转换规则,使用【下载Figma图片工具】下载页面的截图
|
|
22
|
+
3. 根据用户输入的图片描述,使用【下载Figma图片工具】下载图片,入参的图片格式为png格式,语义化命名,用于替换生成页面中的节点,下载的图片保存到编辑文件同级的images目录下
|
|
23
|
+
4. 使用【批量压缩图片工具】对下载的所有图片文件进行压缩优化,减少文件大小提升页面加载性能
|
|
24
|
+
5. 使用【获取图片详情工具】获取截图详情,根据详情内容生成页面,结合JSON数据优化样式,截图为主,JSON数据为辅
|
|
25
|
+
6. 使用terminal命令删除页面截图(保存在images下的),只保留用户指定下载的图片资源文件
|
|
26
|
+
7. 确保生成的页面具有响应式特性,宽度设置为100%而非固定的设计稿尺寸(如375px)
|
|
27
|
+
|
|
28
|
+
质量要求:
|
|
29
|
+
- 交互功能:实现设计稿中的交互逻辑和用户体验
|
|
30
|
+
- 图片处理:正确替换和优化图片资源,语义化命名
|
|
31
|
+
- 完整样式:包含渐变背景、阴影效果、圆角、动画等所有视觉元素
|
|
32
|
+
- 响应式设计:确保在不同设备上的良好显示效果
|
|
33
|
+
`);
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
// 批量图片压缩工具
|
|
15
37
|
server.addTool({
|
|
16
38
|
name: "compress_multiple_images",
|
|
17
39
|
description: "批量压缩多个本地图片文件,保存到原地址",
|
|
@@ -61,35 +83,52 @@ server.addTool({
|
|
|
61
83
|
}
|
|
62
84
|
},
|
|
63
85
|
});
|
|
64
|
-
//
|
|
65
|
-
// Tools 使服务器能够向客户端公开可执行功能
|
|
86
|
+
// Figma节点ID转换规则
|
|
66
87
|
server.addTool({
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
// 实际执行AI请求的逻辑,返回的内容格式影响AI对结果的理解和后续操作
|
|
88
|
+
name: "figma_transform_node_id",
|
|
89
|
+
description: "Figma节点ID转换规则",
|
|
90
|
+
parameters: z.object({
|
|
91
|
+
nodeId: z.string().describe("Figma设计稿中的节点ID"),
|
|
92
|
+
}),
|
|
73
93
|
execute: async (args) => {
|
|
74
94
|
return String(`
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
3. 根据用户输入的图片描述,使用能够下载Figma图片资源的工具下载指定图片为png格式,用于替换生成页面中的节点,下载的图片保存到编辑文件同级的images目录下
|
|
78
|
-
4. 使用能够批量压缩图片的工具对下载的所有图片文件进行压缩优化,减少文件大小提升页面加载性能
|
|
79
|
-
5. 结合JSON数据和截图生成高还原度的页面代码,优先参考截图进行视觉还原,其次参考JSON数据补充细节信息
|
|
80
|
-
6. 清理临时文件,使用terminal命令删除页面截图文件,只保留用户指定下载的图片资源文件
|
|
81
|
-
7. 确保生成的页面具有响应式特性,宽度设置为100%而非固定的设计稿尺寸(如375px)
|
|
82
|
-
|
|
83
|
-
质量要求:
|
|
84
|
-
- 高还原度:严格按照Figma设计稿的视觉效果和布局进行还原
|
|
85
|
-
- 交互功能:实现设计稿中的交互逻辑和用户体验
|
|
86
|
-
- 图片处理:正确替换和优化图片资源
|
|
87
|
-
- 完整样式:包含渐变背景、阴影效果、圆角、动画等所有视觉元素
|
|
88
|
-
- 响应式设计:确保在不同设备上的良好显示效果
|
|
95
|
+
${args.nodeId}如果是以 - 分割,就改为 : 冒号分割
|
|
96
|
+
举例:30473-13383 应该转换为 30473:13383
|
|
89
97
|
`);
|
|
90
98
|
},
|
|
91
99
|
});
|
|
92
|
-
//
|
|
100
|
+
// 获取图片详情工具
|
|
101
|
+
server.addTool({
|
|
102
|
+
name: "get-image-to-base64",
|
|
103
|
+
description: "获取图片详情",
|
|
104
|
+
parameters: z.object({
|
|
105
|
+
imageAbsolutePath: z.string().describe("本地图片的绝对路径"),
|
|
106
|
+
}),
|
|
107
|
+
execute: async (args) => {
|
|
108
|
+
const { imageAbsolutePath } = args;
|
|
109
|
+
const base64 = await getImageToBase64(imageAbsolutePath);
|
|
110
|
+
return {
|
|
111
|
+
content: [{
|
|
112
|
+
type: "image",
|
|
113
|
+
data: base64,
|
|
114
|
+
mimeType: "image/png",
|
|
115
|
+
}]
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
// 辅助函数 读取本地绝对路径图片并转为base64字符串
|
|
120
|
+
/**
|
|
121
|
+
* 读取本地绝对路径图片并转为base64字符串
|
|
122
|
+
* @param imageAbsolutePath 本地图片绝对路径
|
|
123
|
+
* @returns base64字符串(不带data:image/...;base64,前缀)
|
|
124
|
+
*/
|
|
125
|
+
const getImageToBase64 = async (imageAbsolutePath) => {
|
|
126
|
+
// 读取图片为Buffer
|
|
127
|
+
const imageBuffer = await fs.readFileSync(path.resolve(imageAbsolutePath));
|
|
128
|
+
// 转为base64字符串
|
|
129
|
+
return imageBuffer.toString("base64");
|
|
130
|
+
};
|
|
131
|
+
// 辅助函数 批量压缩图片
|
|
93
132
|
async function processBatchImages(imagePaths, tinyApiKey, quality, concurrent) {
|
|
94
133
|
const results = [];
|
|
95
134
|
// 限制并发数量
|