@codify-ai/mcp-client 1.0.27 → 1.0.28
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 +87 -98
- package/dist/index.js +33 -23
- package/dist/rules.md +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
<div align="center">
|
|
4
4
|
|
|
5
|
-

|
|
6
6
|

|
|
7
7
|

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