@codify-ai/mcp-client 1.0.27 → 1.0.29

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/README.md CHANGED
@@ -2,15 +2,15 @@
2
2
 
3
3
  <div align="center">
4
4
 
5
- ![Version](https://img.shields.io/badge/version-1.0.0-blue.svg)
5
+ ![Version](https://img.shields.io/badge/version-1.0.28-blue.svg)
6
6
  ![License](https://img.shields.io/badge/license-MIT-green.svg)
7
7
  ![Node](https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen.svg)
8
8
 
9
- **Codify MCP 客户端 - 连接 FigmaCursor 的桥梁**
9
+ **Codify MCP 客户端 - 连接 MasterGoIDE / CLI 的桥梁**
10
10
 
11
11
  通过 MCP 协议从远程 Codify 服务器获取代码
12
12
 
13
- [快速开始](#快速开始) · [配置说明](#配置说明) · [功能特性](#功能特性)
13
+ [快速开始](#快速开始) · [功能特性](#功能特性) · [可用工具](#可用工具) · [Codify 仪表盘](https://codify.fun)
14
14
 
15
15
  </div>
16
16
 
@@ -21,33 +21,25 @@
21
21
  - 🔌 **一键安装**:使用 `npx` 无需手动下载
22
22
  - 📡 **MCP 协议**:完美集成 Cursor 等支持 MCP 的 IDE
23
23
  - 🔐 **安全认证**:支持 access_key 认证
24
- - 🛠️ **工具集成**:提供 `getCode` 和 `agent_create_page` 工具
25
- - 📦 **资源访问**:通过 URI `Codify://getCode/{content_id}` 访问代码
26
-
27
- ## 架构说明
28
-
29
- ```
30
- Figma Plugin (WebSocket)
31
-
32
- Codify MCP Server (远程)
33
-
34
- @codify-ai/mcp-client (本包)
35
-
36
- Cursor IDE (本地)
37
- ```
24
+ - 🛠️ **全能工具箱**:包含代码获取、设计稿生成、双向同步等 10+ 个专业工具
25
+ - 📦 **资源访问**:通过 URI `Codify://get_code/{content_id}` 访问代码
38
26
 
39
27
  ## 快速开始
40
28
 
41
- ### 1. 配置 Cursor
29
+ ### 1. 配置 MCP
42
30
 
43
- 编辑 `~/.cursor/mcp.json`(如果文件不存在则创建):
31
+ 例如:编辑 `~/.cursor/mcp.json`(如果文件不存在则创建):
44
32
 
45
33
  ```json
46
34
  {
47
35
  "mcpServers": {
48
36
  "codify": {
49
37
  "command": "npx",
50
- "args": ["-y", "@codify-ai/mcp-client", "--url=https://mcp.codify-api.com"],
38
+ "args": [
39
+ "-y",
40
+ "@codify-ai/mcp-client",
41
+ "--url=https://mcp.codify-api.com"
42
+ ],
51
43
  "env": {
52
44
  "CODIFY_ACCESS_KEY": "sk-your-access-key"
53
45
  }
@@ -56,126 +48,133 @@ Figma Plugin (WebSocket)
56
48
  }
57
49
  ```
58
50
 
59
- ### 2. 重启 Cursor
51
+ ### 2. 重启IDE / CLI
60
52
 
61
- 重启 Cursor 或重新加载 MCP 服务器配置。
53
+ 重启Cursor、VSCode、Trae IDE 或者 CLI 工具,或重新加载 MCP 服务器配置。
62
54
 
63
55
  ### 3. 开始使用
64
56
 
65
- Cursor 中,您可以:
57
+ IDE / CLI 中,您可以:
66
58
 
67
- #### 方式 1:使用 AI 工具调用
59
+ #### 方式 1:将设计稿给其他人(研发)拉取代码到本地
68
60
 
69
- AI 说:
61
+ Codify 插件中选中一个元素,复制的指令然后给到其他人来获取代码。
62
+
63
+ 无需启动 MasterGo,直接在 IDE 中输入该指令即可获取代码。
70
64
 
71
65
  ```
72
- 请使用 getCode 工具获取 code_id 的代码
66
+ codify://getCode/{contentId}
73
67
  ```
74
68
 
75
- #### 方式 2:通过资源 URI 访问
69
+ #### 方式 2:使用 AI 工具进行设计稿与代码的双向交互
76
70
 
77
- 在代码或对话中引用:
71
+ 直接在对话框输入指令,AI 会自动识别并调用工具:
78
72
 
79
- ```
80
- @codify://getCode/code_id
81
- ```
73
+ - "获取 MasterGo 中选中的图层代码" (**get_selection_code**)
74
+ - "使用Codify **design** 工具设计一个深色模式的统计仪表盘" (**design**)
75
+ - "修改设计稿选中的图层,改为红色背景" (**agent_update_node**)
76
+ - "将我选中的图层删除" (**agent_remove_node**)
77
+ - "将我选中的图层,同步到本地代码" (**agent_sync_design**)
78
+ - "对比本地代码与设计稿的差异" (**get_design_diff**)
82
79
 
83
- ## 配置说明
80
+ #### 方式 3:引用核心规范资源
84
81
 
85
- ### 命令行参数
82
+ 在对话中通过或直接输入 URI 引用:
86
83
 
87
- | 参数 | 说明 | 默认值 |
88
- | ----------------- | ----------------- | ---------------------------- |
89
- | `--url=<URL>` | Codify 服务器地址 | `https://mcp.codify-api.com` |
90
- | `--help`, `-h` | 显示帮助信息 | - |
91
- | `--version`, `-v` | 显示版本号 | - |
84
+ - `codify://generation-rules`
85
+ - 逆向转译与代码规范:
86
+ 你需要让 LLM 严格遵守转译代码规范才能完美的将它转译为 MasterGo 设计稿。当你需要将你已有的前端项目转换为设计稿的时候,必须让 LLM 读取此文档。
92
87
 
93
- ### 环境变量
88
+ - `codify://design-philosophy`
89
+ - 核心设计哲学:
90
+ Codify为你总结了一套非常实用的UI设计哲学,它能够让LLM在生成页面的时候,保持优秀的设计审美。
94
91
 
95
- | 变量名 | 说明 | 必需 |
96
- | ------------------- | ----------------------------- | ---- |
97
- | `CODIFY_SERVER_URL` | 服务器地址(可被 --url 覆盖) | 否 |
98
- | `CODIFY_ACCESS_KEY` | 访问密钥 | 是\* |
92
+ ## 可用工具
99
93
 
100
- \*如果服务器启用了认证则必需
94
+ ### 🔍 获取与比对
101
95
 
102
- ## 使用示例
96
+ #### **get_selection_code**
103
97
 
104
- ### 示例 1:连接远程服务器(带认证)
98
+ 获取 MasterGo 中当前选中图层(或指定图层)的代码。支持根节点完整保存,以及子节点自动合并到本地基准 HTML 文件。
105
99
 
106
- ```json
107
- {
108
- "mcpServers": {
109
- "codify": {
110
- "command": "npx",
111
- "args": ["-y", "@codify/mcp-client", "--url=https://codify.example.com"],
112
- "env": {
113
- "CODIFY_ACCESS_KEY": "sk-abc123xyz789"
114
- }
115
- }
116
- }
117
- }
118
- ```
100
+ - **参数**: `projectDir` (必填), `targetNodeId` (可选), `syncToBase` (可选, 默认 true)
101
+ - **示例**: "获取当前选中图层的代码"
119
102
 
120
- ### 示例 2:使用环境变量
103
+ #### **get_design_diff**
121
104
 
122
- ```json
123
- {
124
- "mcpServers": {
125
- "codify": {
126
- "command": "npx",
127
- "args": ["-y", "@codify-api/mcp-client"],
128
- "env": {
129
- "CODIFY_SERVER_URL": "https://codify.example.com",
130
- "CODIFY_ACCESS_KEY": "sk-abc123xyz789"
131
- }
132
- }
133
- }
134
- }
135
- ```
105
+ 获取最新设计稿代码与本地 `.codify` 目录中旧代码的差异 (Diff)。用于全量或局部同步。
136
106
 
137
- ## 可用工具
107
+ - **参数**: `projectDir` (必填), `targetNodeId` (可选), `filePath` (可选)
108
+ - **示例**: "对比最新设计稿,看看有哪些改动"
138
109
 
139
- ### getCode
110
+ #### **get_code_list**
140
111
 
141
- 获取指定频道的代码。
112
+ 列出所有可用的代码列表。
142
113
 
143
- **参数:**
114
+ - **参数**: 无
115
+ - **示例**: "查看我可以拉取的代码列表"
144
116
 
145
- - `content_id` (string, 必需) - 频道 ID
117
+ #### **get_code**
146
118
 
147
- **示例:**
119
+ 通过 `contentId` 获取特定代码并保存到本地。
148
120
 
149
- ```
150
- AI,请使用 getCode 工具获取 demo-channel 的代码
151
- ```
121
+ - **参数**: `contentId` (必填), `projectDir` (必填), `outDir` (必填), `documentId` (可选)
122
+ - **示例**: "从频道 demo-123 获取代码"
152
123
 
153
- ### getCodeList
124
+ ### 🎨 生成与设计
154
125
 
155
- 列出所有可用频道。
126
+ #### **design**
156
127
 
157
- **参数:**
128
+ 根据自然语言需求生成符合 Codify 规范的 HTML+CSS 代码。
158
129
 
159
- **示例:**
130
+ - **参数**: `requirement` (必填)
131
+ - **示例**: "帮我设计一个深色模式的登录页面"
160
132
 
161
- ```
162
- AI,请使用 getCodeList 工具查看所有频道
163
- ```
133
+ #### **agent_create_page**
164
134
 
165
- ## 可用资源
135
+ 将生成的 HTML 代码发送到 MasterGo 插件并创建新页面。
166
136
 
167
- 通过资源 URI 直接访问代码:
137
+ - **参数**: `code` (可选), `filePath` (可选), `projectDir` (必填), `saveCodeToLocal` (可选)
138
+ - **示例**: "在 MasterGo 中创建一个新页面,代码在 ./temp.html"
168
139
 
169
- ```
170
- codify://{content_id}/current
171
- ```
140
+ #### **agent_create_component**
172
141
 
173
- **示例:**
142
+ 创建一个 MasterGo 母版组件或组件集(变体)。
174
143
 
175
- ```
176
- codify://getCode/code_123
177
- codify://getCode/code_456
178
- ```
144
+ - **参数**: `code` (必填)
145
+ - **示例**: "将这段 HTML 创建为 MasterGo 组件"
146
+
147
+ ### 🛠️ 操作与更新
148
+
149
+ #### **agent_update_node**
150
+
151
+ 将修改后的 HTML 代码发回 MasterGo 进行局部更新。**注意:必须包含 `data-node-id`。**
152
+
153
+ - **参数**: `code` (必填), `targetNodeId` (可选), `documentId` (可选)
154
+ - **示例**: "更新选中的按钮颜色为蓝色"
155
+
156
+ #### **agent_sync_design**
157
+
158
+ 将本地完整的静态 HTML 文件内容全量同步覆盖到 MasterGo 画布。
159
+
160
+ - **参数**: `filePath` (必填), `targetNodeId` (必填, 根节点 ID), `documentId` (可选)
161
+ - **示例**: "同步本地 index.html 到设计稿根节点"
162
+
163
+ #### **agent_remove_node**
164
+
165
+ 在 MasterGo 中删除指定的或当前选中的图层。
166
+
167
+ - **参数**: `targetNodeId` (可选), `documentId` (可选)
168
+ - **示例**: "删除选中的图层"
169
+
170
+ ### 👤 系统信息
171
+
172
+ #### **get_user_info**
173
+
174
+ 查看当前登录用户信息、团队信息以及配额使用情况。
175
+
176
+ - **参数**: 无
177
+ - **示例**: "查看我的配额还剩多少"
179
178
 
180
179
  ## 许可证
181
180
 
package/dist/index.js CHANGED
@@ -92,7 +92,6 @@ async function writeResource(resData, targetDir, folderName, ext) {
92
92
  const response = await axios.get(content, { responseType: "arraybuffer" });
93
93
  await fs.writeFile(filePath, response.data);
94
94
  } catch (err) {
95
- console.error(`[Codify MCP] 资源下载失败 ${content}:`, err.message);
96
95
  }
97
96
  } else if (typeof content === "string" && content.startsWith("data:image/")) {
98
97
  const parts = content.split(";base64,");
@@ -140,14 +139,15 @@ async function saveCodeAndResources({
140
139
  }
141
140
  const zh = {
142
141
  createPage: {
143
- description: "将代码发送到 Codify 插件转换为设计稿。\n\n【极致性能要求】若纯 HTML 已保存为本地文件,你必须且只能通过 filePath 传入该文件的绝对路径。严禁使用 Read 工具读取文件内容,严禁将大段代码写入 code 参数。工具底层会自动读取并传输,以节省 Token。只有当代码是你在当前对话中临时生成且尚未写入文件时,才允许使用 code 参数。\n\n⚠️ 逆向转译警告:严禁直接发送 Vue/React 等包含动态绑定 ({{}}) 或框架指令的业务代码!若要将业务代码转为设计稿,必须先执行【逆向转译】(参考 codify://generation-rules),将其转换为带静态假数据的纯 HTML 后再发送。",
142
+ description: `将代码发送到 Codify 插件转换为设计稿。
143
+ 【极致性能要求】若纯 HTML 已保存为本地文件,你必须且只能通过 filePath 传入该文件的绝对路径。严禁使用 Read 工具读取文件内容,严禁将大段代码写入 code 参数。工具底层会自动读取并传输,以节省 Token。`,
144
144
  code: "【可选】要发送的 HTML 代码内容。仅当代码是临时生成且未保存为文件时使用。大段代码严禁使用此参数。",
145
145
  filePath: "【可选】本地 HTML 文件的绝对路径。若文件已存在本地,必须传此参数,工具会自动读取并执行落盘。",
146
146
  projectDir: "【必填】用户当前工作区的根目录绝对路径",
147
147
  saveCodeToLocal: "是否将插件返回的渲染结果保存到本地 .codify 目录(落盘机制)"
148
148
  },
149
149
  updateNode: {
150
- description: "将修改后的 HTML 代码发回 MasterGo 画布进行【局部修改】(如改颜色、加文字、改间距等)。完成代码修改后,你必须同步调用此工具。注意:此工具一次只能同步一个节点及其关联子节点,必须传入 code。",
150
+ description: "将修改后的 HTML 代码发回 MasterGo 画布进行【局部修改】(如改颜色、加文字、改间距等)。⚠️ 【调用前置条件】:你必须且只能在通过 getSelectionCode 拿到该节点的最新代码后进行调用修改!完成代码修改后直接调用此类发送给插件。绝对不要去同步或修改本地基准文件!注意:仅传包含 data-node-id 的那一段 HTML 片段。",
151
151
  documentId: "当前 MasterGo 文档 ID。",
152
152
  documentPageId: "当前 MasterGo 页面 ID。",
153
153
  targetNodeId: "【选填】目标图层 ID (例如 123:456)。如果不传,则默认更新 MasterGo 中当前选中的图层。",
@@ -161,7 +161,7 @@ const zh = {
161
161
  filePath: "【必填】本地静态 HTML 文件的绝对路径(通常位于 .codify/... 目录下)。工具会自动读取内容。严禁传入 .vue/.tsx 业务代码路径!"
162
162
  },
163
163
  getSelectionCode: {
164
- description: "获取 MasterGo 中当前选中图层(或指定图层)的代码。如果你获取的是子节点,工具只会将代码作为纯文本返回给你进行局部修改上下文,绝对不会在本地生成烦人的 HTML 碎片文件!若是根节点则会自动将完整页面代码同步保存到 .codify 目录。",
164
+ description: "获取 MasterGo 中当前选中图层(或指定图层)的代码。⚠️ 【严禁盲改】:用户的每一次修改操作(如改色、改文字等),你都必须首先调用本工具拉取最新的节点代码作为上下文!如果你获取的是子节点,工具只会将代码作为纯文本返回给你进行局部修改上下文,绝对不会在本地生成烦人的 HTML 碎片文件!若是根节点则会自动将完整页面代码同步保存到 .codify 目录。",
165
165
  projectDir: "【必填】用户当前工作区的根目录绝对路径",
166
166
  targetNodeId: "【选填】MasterGo图层ID (例如 123:456)。如果提供,将直接拉取该ID的代码;如果不提供,将拉取当前选中图层的代码。",
167
167
  syncToBase: "【选填】是否将获取到的子图层代码同步回本地 .codify 目录下的基准 HTML 文件(合并更新)。默认为 true。"
@@ -173,7 +173,7 @@ const zh = {
173
173
  getDesignDiff: {
174
174
  description: `获取设计稿与本地代码的差异。
175
175
  【标准双向同步规程】:
176
- 1. 准备:将当前项目业务代码(Vue/React)按 rules.md 规范物理逆推为纯静态 HTML。
176
+ 1. 准备:将当前项目业务代码(Vue/React)按 codify://generation-rules 规范物理逆推为纯静态 HTML。
177
177
  2. 刷新:将转译产物覆盖写入 .codify 目录对应的基准 HTML 文件。
178
178
  3. 比对:调用此工具比对“基准文件”与“画布现状”获得差异列表。
179
179
  4. 决策:展示差异,由用户决定执行“全量同步到设计稿”或“按差异局部同步到项目”。`,
@@ -194,7 +194,7 @@ const zh = {
194
194
  inputSchema: "获取当前用户信息"
195
195
  },
196
196
  getCode: {
197
- description: '【特定场景】通过 contentId 从 Codify 插件获取代码。常规的"获取选中代码"请优先使用 get_selection_code 工具。',
197
+ description: '【特定场景】通过 codify://getCode/{contentId} 从 Codify 插件获取代码。常规的"获取选中代码"请优先使用 get_selection_code 工具。',
198
198
  contentId: "从Codify插件复制图层的指令 (contentId)",
199
199
  documentId: "当前 MasterGo 文档 ID。",
200
200
  documentPageId: "当前 MasterGo 页面 ID。",
@@ -295,10 +295,7 @@ ${generationRules}
295
295
 
296
296
  ## 发送代码:
297
297
  代码生成并审计通过后,请立即调用 agent_create_page 工具发送代码
298
- - agent_create_page({ code: "生成的完整代码", projectDir: "当前工作目录" })
299
- - 不要询问用户,直接执行发送操作
300
-
301
- **请现在开始生成代码。**`
298
+ - agent_create_page({ code: "生成的完整代码", projectDir: "当前工作目录" })`
302
299
  }
303
300
  ]
304
301
  };
@@ -356,16 +353,15 @@ const getCodeListTool = {
356
353
  if (!Array.isArray(data) || data.length === 0) {
357
354
  return { content: [{ type: "text", text: "📋 代码列表为空" }] };
358
355
  }
359
- let resultText = `✅ 成功获取代码列表 (共 ${data.length} 项)
360
-
356
+ const totalCount = data.length;
357
+ let resultText = `✅ 成功获取代码列表 (共 ${totalCount} 项)
361
358
  `;
362
- data.forEach((item, index) => {
363
- resultText += `${index + 1}. **${item.contentId}**
359
+ if (totalCount >= 10) {
360
+ resultText += `⚠️ 仅展示最近更新的前 10 条记录
364
361
  `;
365
- resultText += ` - 长度: ${item.codeLength} 字符 | 创建于: ${item.createdAt || "未知"}
366
-
367
- `;
368
- });
362
+ }
363
+ resultText += `
364
+ ${JSON.stringify(data, null, 2)}`;
369
365
  return { content: [{ type: "text", text: resultText }] };
370
366
  }
371
367
  };
@@ -383,7 +379,12 @@ const getSelectionCodeTool = {
383
379
  * @param args._depth 内部参数,用于防止递归获取根节点时出现无限循环
384
380
  */
385
381
  handler: async (args) => {
386
- const { projectDir, targetNodeId: id, syncToBase = true, _depth = 0 } = args;
382
+ const {
383
+ projectDir,
384
+ targetNodeId: id,
385
+ syncToBase = true,
386
+ _depth = 0
387
+ } = args;
387
388
  if (_depth > 2) {
388
389
  return {
389
390
  content: [
@@ -422,7 +423,6 @@ const getSelectionCodeTool = {
422
423
  parentId
423
424
  } = nodeInfo;
424
425
  if (targetNodeId === rootId) {
425
- console.log(`[getSelectionCode] 当前节点ID: ${targetNodeId}, 根节点ID: ${rootId}`);
426
426
  const saveResult = await saveCodeAndResources({
427
427
  baseDir,
428
428
  documentId,
@@ -447,7 +447,6 @@ const getSelectionCodeTool = {
447
447
  ]
448
448
  };
449
449
  } else {
450
- console.log(`[getSelectionCode] 当前节点ID: ${targetNodeId}, 根节点ID: ${rootId}`);
451
450
  let mergedToFilePath = "";
452
451
  if (syncToBase && documentId && documentPageId) {
453
452
  const targetPageDir = path.join(
@@ -467,9 +466,6 @@ const getSelectionCodeTool = {
467
466
  };
468
467
  rootFile = await findRootFile();
469
468
  if (!rootFile && _depth === 0) {
470
- console.log(
471
- `[getSelectionCode] 基准文件不存在,自动拉取根节点: ${rootId}`
472
- );
473
469
  await getSelectionCodeTool.handler({
474
470
  projectDir,
475
471
  targetNodeId: rootId,
@@ -501,11 +497,10 @@ const getSelectionCodeTool = {
501
497
  mergedToFilePath = rootFilePath;
502
498
  }
503
499
  } catch (err) {
504
- console.error("合并到基准文件操作出错:", err);
505
500
  }
506
501
  }
507
502
  }
508
- await saveCodeAndResources({
503
+ const saveResult = await saveCodeAndResources({
509
504
  baseDir,
510
505
  documentId,
511
506
  documentPageId,
@@ -523,10 +518,14 @@ const getSelectionCodeTool = {
523
518
  - 根节点: ${rootId}`;
524
519
  if (mergedToFilePath) {
525
520
  successText += `
526
- - ⚠️ (自动机制) 子节点最新代码已合并备份至本地基准 HTML: ${mergedToFilePath}`;
521
+ - 自动机制: 子节点最新代码已合并备份至本地基准 HTML: ${mergedToFilePath}`;
527
522
  } else {
528
523
  successText += `
529
- - 💡 提示: 子节点代码已提取到对话上下文中,未生成本地 HTML 碎片文件。可以直接针对返回代码进行修改。`;
524
+ - 提示: 子节点代码已提取到对话上下文中,未生成本地 HTML 碎片文件。可以直接针对返回代码进行修改。`;
525
+ }
526
+ if (targetNodeId !== rootId) {
527
+ successText += `
528
+ - 资源同步: 图片(${saveResult.imageCount}), 图标(${saveResult.svgCount}), 图形(${saveResult.shapeCount})`;
530
529
  }
531
530
  return {
532
531
  content: [
@@ -849,8 +848,6 @@ registerAllTools(mcpServer);
849
848
  try {
850
849
  const transport = new StdioServerTransport();
851
850
  await mcpServer.connect(transport);
852
- console.error(`[Codify MCP] Client connected to ${SERVER_URL}`);
853
851
  } catch (error) {
854
- console.error(`[Codify MCP] Connection failed:`, error.message);
855
852
  process.exit(1);
856
853
  }
package/dist/rules.md CHANGED
@@ -1,4 +1,4 @@
1
- # 📐 HTML + CSS 视觉创构与逆向转译协议 (Visual Generation & Reversal Protocol)
1
+ # 📐 HTML + CSS 逆向转译协议 (Reversal Protocol)
2
2
 
3
3
  ## 🎯 角色与任务目标 (Dual-Core Persona)
4
4
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codify-ai/mcp-client",
3
- "version": "1.0.27",
3
+ "version": "1.0.29",
4
4
  "description": "Codify MCP 客户端 - 连接到远程 Codify MCP 服务器,供 CLI 或 Cursor 等 IDE 使用",
5
5
  "type": "module",
6
6
  "bin": {