ms-vite-plugin 1.1.20 → 1.1.22
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/dist/mcp/httpapi-docs-service.d.ts +66 -0
- package/dist/mcp/httpapi-docs-service.js +203 -0
- package/dist/mcp/httpapi-tools.d.ts +9 -0
- package/dist/mcp/httpapi-tools.js +346 -0
- package/dist/mcp/runtime-tools.js +21 -97
- package/dist/mcp/tool-utils.d.ts +0 -30
- package/dist/mcp/tool-utils.js +0 -74
- package/dist/mcp/tools.js +2 -0
- package/docs/SKILL.md +147 -0
- package/docs/httpapi/api.md +2411 -0
- package/docs/mcp-agent-description.md +133 -0
- package/package.json +1 -1
|
@@ -34,20 +34,33 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.registerRuntimeTools = registerRuntimeTools;
|
|
37
|
-
const z = __importStar(require("zod/v4"));
|
|
38
37
|
const fsExtra = __importStar(require("fs-extra"));
|
|
39
38
|
const os = __importStar(require("os"));
|
|
40
39
|
const path = __importStar(require("path"));
|
|
40
|
+
const z = __importStar(require("zod/v4"));
|
|
41
41
|
const packager_1 = require("../packager");
|
|
42
42
|
const project_1 = require("../project");
|
|
43
|
-
const project_2 = require("./project");
|
|
44
43
|
const device_config_1 = require("./device-config");
|
|
45
44
|
const device_log_1 = require("./device-log");
|
|
45
|
+
const project_2 = require("./project");
|
|
46
46
|
const tool_utils_1 = require("./tool-utils");
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
/**
|
|
48
|
+
* 解析工具输出文件路径
|
|
49
|
+
* @param outputPath 用户指定的可选输出路径
|
|
50
|
+
* @param fileNamePrefix 临时文件名前缀
|
|
51
|
+
* @param extension 文件扩展名(不含点)
|
|
52
|
+
* @returns 返回最终输出文件绝对路径
|
|
53
|
+
* @example
|
|
54
|
+
* resolveOutputPath(undefined, "ms-mcp-screenshot", "jpg")
|
|
55
|
+
*/
|
|
56
|
+
function resolveOutputPath(outputPath, fileNamePrefix, extension) {
|
|
57
|
+
if (outputPath && outputPath.trim()) {
|
|
58
|
+
return path.resolve(outputPath.trim());
|
|
59
|
+
}
|
|
60
|
+
return path.join(os.tmpdir(), `${fileNamePrefix}-${Date.now()}-${Math.random()
|
|
61
|
+
.toString(36)
|
|
62
|
+
.slice(2, 8)}.${extension}`);
|
|
63
|
+
}
|
|
51
64
|
/**
|
|
52
65
|
* 注册设备与项目执行工具
|
|
53
66
|
* @param server MCP 服务实例
|
|
@@ -148,83 +161,6 @@ function registerRuntimeTools(server) {
|
|
|
148
161
|
}
|
|
149
162
|
return (0, tool_utils_1.createTextToolResult)(`当前默认设备: ${config.ip}:${config.port}`);
|
|
150
163
|
});
|
|
151
|
-
server.registerTool("get_active_app_info", {
|
|
152
|
-
title: "Get Active App Info",
|
|
153
|
-
description: "获取当前激活应用信息。",
|
|
154
|
-
inputSchema: {},
|
|
155
|
-
}, async () => {
|
|
156
|
-
const target = await (0, tool_utils_1.resolveRuntimeHttpTarget)();
|
|
157
|
-
const payload = await (0, tool_utils_1.requestRuntimeJsonApi)(target, "activeAppInfo");
|
|
158
|
-
return (0, tool_utils_1.createTextToolResult)(`当前激活应用信息:\n${(0, tool_utils_1.formatRuntimeJsonText)((0, tool_utils_1.unwrapRuntimeData)(payload, "activeAppInfo"))}`);
|
|
159
|
-
});
|
|
160
|
-
server.registerTool("take_me_to_front", {
|
|
161
|
-
title: "Take Me To Front",
|
|
162
|
-
description: "将当前应用切到前台。",
|
|
163
|
-
inputSchema: {},
|
|
164
|
-
}, async () => {
|
|
165
|
-
const target = await (0, tool_utils_1.resolveRuntimeHttpTarget)();
|
|
166
|
-
const payload = await (0, tool_utils_1.requestRuntimeJsonApi)(target, "takeMeToFront");
|
|
167
|
-
return (0, tool_utils_1.createTextToolResult)(payload.success === true
|
|
168
|
-
? `切到前台成功: ${target.label}`
|
|
169
|
-
: `切到前台失败: ${target.label}`, payload.success !== true);
|
|
170
|
-
});
|
|
171
|
-
server.registerTool("get_all_config", {
|
|
172
|
-
title: "Get All Config",
|
|
173
|
-
description: "获取当前设备全部配置参数。",
|
|
174
|
-
inputSchema: {},
|
|
175
|
-
}, async () => {
|
|
176
|
-
const target = await (0, tool_utils_1.resolveRuntimeHttpTarget)();
|
|
177
|
-
const payload = await (0, tool_utils_1.requestRuntimeJsonApi)(target, "getAllConfig");
|
|
178
|
-
return (0, tool_utils_1.createTextToolResult)(`当前配置:\n${(0, tool_utils_1.formatRuntimeJsonText)((0, tool_utils_1.unwrapRuntimeData)(payload, "getAllConfig"))}`);
|
|
179
|
-
});
|
|
180
|
-
server.registerTool("set_all_config", {
|
|
181
|
-
title: "Set All Config",
|
|
182
|
-
description: "批量设置当前设备全部配置参数。",
|
|
183
|
-
inputSchema: {
|
|
184
|
-
config: z
|
|
185
|
-
.record(z.string(), z.unknown())
|
|
186
|
-
.describe("完整配置对象,会直接提交到 setAllConfig"),
|
|
187
|
-
},
|
|
188
|
-
}, async ({ config }) => {
|
|
189
|
-
const target = await (0, tool_utils_1.resolveRuntimeHttpTarget)();
|
|
190
|
-
const payload = await (0, tool_utils_1.requestRuntimeJsonApi)(target, "setAllConfig", "POST", config);
|
|
191
|
-
return (0, tool_utils_1.createTextToolResult)(payload.success === true
|
|
192
|
-
? `批量设置配置成功: ${target.label}`
|
|
193
|
-
: `批量设置配置失败: ${target.label}`, payload.success !== true);
|
|
194
|
-
});
|
|
195
|
-
server.registerTool("set_config", {
|
|
196
|
-
title: "Set Config",
|
|
197
|
-
description: "设置单个配置参数。",
|
|
198
|
-
inputSchema: {
|
|
199
|
-
key: z.string().min(1).describe("配置键名"),
|
|
200
|
-
value: z.unknown().describe("配置值,支持任意 JSON 兼容类型"),
|
|
201
|
-
},
|
|
202
|
-
}, async ({ key, value }) => {
|
|
203
|
-
const target = await (0, tool_utils_1.resolveRuntimeHttpTarget)();
|
|
204
|
-
const payload = await (0, tool_utils_1.requestRuntimeJsonApi)(target, "setConfig", "POST", {
|
|
205
|
-
key,
|
|
206
|
-
value,
|
|
207
|
-
});
|
|
208
|
-
return (0, tool_utils_1.createTextToolResult)(payload.success === true
|
|
209
|
-
? `配置设置成功: ${key}`
|
|
210
|
-
: `配置设置失败: ${key}`, payload.success !== true);
|
|
211
|
-
});
|
|
212
|
-
server.registerTool("run_script", {
|
|
213
|
-
title: "Run Script",
|
|
214
|
-
description: "在当前设备上执行一段 JavaScript 并返回结果。",
|
|
215
|
-
inputSchema: {
|
|
216
|
-
script: z.string().min(1).describe("要执行的 JavaScript 代码"),
|
|
217
|
-
},
|
|
218
|
-
}, async ({ script }) => {
|
|
219
|
-
const target = await (0, tool_utils_1.resolveRuntimeHttpTarget)();
|
|
220
|
-
const payload = await (0, tool_utils_1.requestRuntimeJsonApi)(target, "runScript", "POST", {
|
|
221
|
-
script,
|
|
222
|
-
});
|
|
223
|
-
const success = payload.success === true;
|
|
224
|
-
return (0, tool_utils_1.createTextToolResult)(success
|
|
225
|
-
? `脚本执行成功:\n${(0, tool_utils_1.formatRuntimeJsonText)(payload)}`
|
|
226
|
-
: `脚本执行失败:\n${(0, tool_utils_1.formatRuntimeJsonText)(payload)}`, !success);
|
|
227
|
-
});
|
|
228
164
|
server.registerTool("take_screenshot", {
|
|
229
165
|
title: "Take Screenshot",
|
|
230
166
|
description: "获取当前默认设备截图。可返回 base64,或落地到文件后返回文件路径(默认写入系统临时目录)。",
|
|
@@ -248,11 +184,7 @@ function registerRuntimeTools(server) {
|
|
|
248
184
|
return (0, tool_utils_1.createTextToolResult)(`截图成功: ${target.label}\nformat: base64\n${base64}`);
|
|
249
185
|
}
|
|
250
186
|
const image = await (0, project_1.getScreenshotOnDevice)(requestOptions);
|
|
251
|
-
const targetPath = outputPath
|
|
252
|
-
? path.resolve(outputPath.trim())
|
|
253
|
-
: path.join(os.tmpdir(), `ms-mcp-screenshot-${Date.now()}-${Math.random()
|
|
254
|
-
.toString(36)
|
|
255
|
-
.slice(2, 8)}.jpg`);
|
|
187
|
+
const targetPath = resolveOutputPath(outputPath, "ms-mcp-screenshot", "jpg");
|
|
256
188
|
await fsExtra.ensureDir(path.dirname(targetPath));
|
|
257
189
|
await fsExtra.writeFile(targetPath, image);
|
|
258
190
|
return (0, tool_utils_1.createTextToolResult)(`截图成功: ${target.label}\nformat: file\npath: ${targetPath}\nsize: ${image.length} bytes`);
|
|
@@ -287,11 +219,7 @@ function registerRuntimeTools(server) {
|
|
|
287
219
|
const target = await (0, tool_utils_1.resolveRuntimeHttpTarget)();
|
|
288
220
|
const requestOptions = (0, tool_utils_1.createRuntimeHttpRequestOptions)(target);
|
|
289
221
|
const source = await (0, project_1.getSourceOnDevice)(requestOptions, maxDepth, timeout);
|
|
290
|
-
const targetPath = outputPath
|
|
291
|
-
? path.resolve(outputPath.trim())
|
|
292
|
-
: path.join(os.tmpdir(), `ms-mcp-node-source-${Date.now()}-${Math.random()
|
|
293
|
-
.toString(36)
|
|
294
|
-
.slice(2, 8)}.xml`);
|
|
222
|
+
const targetPath = resolveOutputPath(outputPath, "ms-mcp-node-source", "xml");
|
|
295
223
|
await fsExtra.ensureDir(path.dirname(targetPath));
|
|
296
224
|
await fsExtra.writeFile(targetPath, source, "utf8");
|
|
297
225
|
return (0, tool_utils_1.createTextToolResult)(`节点获取成功: ${target.label}\nmaxDepth: ${maxDepth}\ntimeout: ${timeout}\npath: ${targetPath}\nsize: ${Buffer.byteLength(source, "utf8")} bytes`);
|
|
@@ -384,8 +312,4 @@ function registerRuntimeTools(server) {
|
|
|
384
312
|
await (0, project_1.stopOnDevice)((0, tool_utils_1.createRuntimeHttpRequestOptions)(target));
|
|
385
313
|
return (0, tool_utils_1.createTextToolResult)(`停止请求已发送到 ${target.label}`);
|
|
386
314
|
});
|
|
387
|
-
(0, control_tools_1.registerControlTools)(server);
|
|
388
|
-
(0, hid_tools_1.registerHidTools)(server);
|
|
389
|
-
(0, ime_tools_1.registerImeTools)(server);
|
|
390
|
-
(0, mirror_tools_1.registerMirrorTools)(server);
|
|
391
315
|
}
|
package/dist/mcp/tool-utils.d.ts
CHANGED
|
@@ -53,36 +53,6 @@ export declare function createRuntimeHttpRequestOptions(target: RuntimeHttpTarge
|
|
|
53
53
|
* const target = await resolveRuntimeHttpTarget()
|
|
54
54
|
*/
|
|
55
55
|
export declare function resolveRuntimeHttpTarget(): Promise<RuntimeHttpTarget>;
|
|
56
|
-
/**
|
|
57
|
-
* 请求设备通用 JSON API
|
|
58
|
-
* @param target 当前默认设备目标
|
|
59
|
-
* @param endpoint API 路径(不含前导 `/api/`)
|
|
60
|
-
* @param method 请求方法
|
|
61
|
-
* @param body 可选 JSON 请求体
|
|
62
|
-
* @returns 返回解析后的 JSON 数据
|
|
63
|
-
* @example
|
|
64
|
-
* const payload = await requestRuntimeJsonApi(target, "activeAppInfo")
|
|
65
|
-
*/
|
|
66
|
-
export declare function requestRuntimeJsonApi(target: RuntimeHttpTarget, endpoint: string, method?: "GET" | "POST", body?: Record<string, unknown>): Promise<Record<string, unknown>>;
|
|
67
|
-
/**
|
|
68
|
-
* 请求任意相对路径 JSON API,并可附带 query 参数
|
|
69
|
-
* @param target 当前默认设备目标
|
|
70
|
-
* @param routePath 相对路径,例如 `/api/control/click`
|
|
71
|
-
* @param query 可选查询参数
|
|
72
|
-
* @returns 返回解析后的 JSON 数据
|
|
73
|
-
* @example
|
|
74
|
-
* const payload = await requestRuntimePathJson(target, "/api/ime/getText")
|
|
75
|
-
*/
|
|
76
|
-
export declare function requestRuntimePathJson(target: RuntimeHttpTarget, routePath: string, query?: Record<string, RuntimeQueryValue>): Promise<Record<string, unknown>>;
|
|
77
|
-
/**
|
|
78
|
-
* 从通用 JSON 响应中读取 `data` 字段
|
|
79
|
-
* @param payload API 返回 JSON
|
|
80
|
-
* @param endpoint API 路径名,用于错误提示
|
|
81
|
-
* @returns 返回 `data` 字段内容
|
|
82
|
-
* @example
|
|
83
|
-
* const data = unwrapRuntimeData(payload, "getAllConfig")
|
|
84
|
-
*/
|
|
85
|
-
export declare function unwrapRuntimeData(payload: Record<string, unknown>, endpoint: string): unknown;
|
|
86
56
|
/**
|
|
87
57
|
* 将任意 JSON 兼容值格式化为文本
|
|
88
58
|
* @param value 任意待展示值
|
package/dist/mcp/tool-utils.js
CHANGED
|
@@ -3,9 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createTextToolResult = createTextToolResult;
|
|
4
4
|
exports.createRuntimeHttpRequestOptions = createRuntimeHttpRequestOptions;
|
|
5
5
|
exports.resolveRuntimeHttpTarget = resolveRuntimeHttpTarget;
|
|
6
|
-
exports.requestRuntimeJsonApi = requestRuntimeJsonApi;
|
|
7
|
-
exports.requestRuntimePathJson = requestRuntimePathJson;
|
|
8
|
-
exports.unwrapRuntimeData = unwrapRuntimeData;
|
|
9
6
|
exports.formatRuntimeJsonText = formatRuntimeJsonText;
|
|
10
7
|
exports.formatApiDocSummary = formatApiDocSummary;
|
|
11
8
|
const docs_service_1 = require("./docs-service");
|
|
@@ -71,77 +68,6 @@ async function resolveRuntimeHttpTarget() {
|
|
|
71
68
|
label: `${device.ip}:${device.port}`,
|
|
72
69
|
};
|
|
73
70
|
}
|
|
74
|
-
/**
|
|
75
|
-
* 请求设备通用 JSON API
|
|
76
|
-
* @param target 当前默认设备目标
|
|
77
|
-
* @param endpoint API 路径(不含前导 `/api/`)
|
|
78
|
-
* @param method 请求方法
|
|
79
|
-
* @param body 可选 JSON 请求体
|
|
80
|
-
* @returns 返回解析后的 JSON 数据
|
|
81
|
-
* @example
|
|
82
|
-
* const payload = await requestRuntimeJsonApi(target, "activeAppInfo")
|
|
83
|
-
*/
|
|
84
|
-
async function requestRuntimeJsonApi(target, endpoint, method = "GET", body) {
|
|
85
|
-
const url = `http://${target.ip}:${target.port}/api/${endpoint}`;
|
|
86
|
-
const response = await fetch(url, {
|
|
87
|
-
method,
|
|
88
|
-
headers: body ? { "Content-Type": "application/json" } : undefined,
|
|
89
|
-
body: body ? JSON.stringify(body) : undefined,
|
|
90
|
-
});
|
|
91
|
-
if (!response.ok) {
|
|
92
|
-
throw new Error(`${endpoint} 请求失败,状态码: ${response.status}`);
|
|
93
|
-
}
|
|
94
|
-
const payload = (await response.json());
|
|
95
|
-
if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
|
|
96
|
-
throw new Error(`${endpoint} 返回了无效响应`);
|
|
97
|
-
}
|
|
98
|
-
return payload;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* 请求任意相对路径 JSON API,并可附带 query 参数
|
|
102
|
-
* @param target 当前默认设备目标
|
|
103
|
-
* @param routePath 相对路径,例如 `/api/control/click`
|
|
104
|
-
* @param query 可选查询参数
|
|
105
|
-
* @returns 返回解析后的 JSON 数据
|
|
106
|
-
* @example
|
|
107
|
-
* const payload = await requestRuntimePathJson(target, "/api/ime/getText")
|
|
108
|
-
*/
|
|
109
|
-
async function requestRuntimePathJson(target, routePath, query) {
|
|
110
|
-
const url = new URL(`http://${target.ip}:${target.port}${routePath}`);
|
|
111
|
-
if (query) {
|
|
112
|
-
for (const [key, value] of Object.entries(query)) {
|
|
113
|
-
if (value === undefined || value === null) {
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
url.searchParams.set(key, String(value));
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
const response = await fetch(url.toString(), {
|
|
120
|
-
method: "GET",
|
|
121
|
-
});
|
|
122
|
-
if (!response.ok) {
|
|
123
|
-
throw new Error(`${routePath} 请求失败,状态码: ${response.status}`);
|
|
124
|
-
}
|
|
125
|
-
const payload = (await response.json());
|
|
126
|
-
if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
|
|
127
|
-
throw new Error(`${routePath} 返回了无效响应`);
|
|
128
|
-
}
|
|
129
|
-
return payload;
|
|
130
|
-
}
|
|
131
|
-
/**
|
|
132
|
-
* 从通用 JSON 响应中读取 `data` 字段
|
|
133
|
-
* @param payload API 返回 JSON
|
|
134
|
-
* @param endpoint API 路径名,用于错误提示
|
|
135
|
-
* @returns 返回 `data` 字段内容
|
|
136
|
-
* @example
|
|
137
|
-
* const data = unwrapRuntimeData(payload, "getAllConfig")
|
|
138
|
-
*/
|
|
139
|
-
function unwrapRuntimeData(payload, endpoint) {
|
|
140
|
-
if (payload.success !== true) {
|
|
141
|
-
throw new Error(String(payload.message ?? `${endpoint} 返回失败`));
|
|
142
|
-
}
|
|
143
|
-
return payload.data;
|
|
144
|
-
}
|
|
145
71
|
/**
|
|
146
72
|
* 将任意 JSON 兼容值格式化为文本
|
|
147
73
|
* @param value 任意待展示值
|
package/dist/mcp/tools.js
CHANGED
|
@@ -7,6 +7,7 @@ const version_1 = require("../version");
|
|
|
7
7
|
const device_config_1 = require("./device-config");
|
|
8
8
|
Object.defineProperty(exports, "DEFAULT_DEVICE_PORT", { enumerable: true, get: function () { return device_config_1.DEFAULT_DEVICE_PORT; } });
|
|
9
9
|
const doc_tools_1 = require("./doc-tools");
|
|
10
|
+
const httpapi_tools_1 = require("./httpapi-tools");
|
|
10
11
|
const runtime_tools_1 = require("./runtime-tools");
|
|
11
12
|
/**
|
|
12
13
|
* 创建并注册 MCP 工具
|
|
@@ -21,6 +22,7 @@ function createMcpServer() {
|
|
|
21
22
|
});
|
|
22
23
|
(0, doc_tools_1.registerDocResources)(server);
|
|
23
24
|
(0, doc_tools_1.registerDocTools)(server);
|
|
25
|
+
(0, httpapi_tools_1.registerHttpApiTools)(server);
|
|
24
26
|
(0, runtime_tools_1.registerRuntimeTools)(server);
|
|
25
27
|
return server;
|
|
26
28
|
}
|
package/docs/SKILL.md
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: kuaijs-mcp
|
|
3
|
+
description: 快点JS专用 MCP 开发助手。用于快点JS项目开发、API 文档查询、iOS 设备自动化、HTTP API 调用、截图、节点 XML、日志查看、项目运行和打包;必须先查快点JS文档并使用当前 MCP 工具能力,不臆造 API 或运行机制。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 快点JS MCP 技能
|
|
7
|
+
|
|
8
|
+
## 使用场景
|
|
9
|
+
|
|
10
|
+
当任务涉及快点JS项目开发、快点JS API 查询、iOS 设备自动化、HTTP API 调用、截图、节点 XML、日志、项目运行或打包时,使用本技能。
|
|
11
|
+
|
|
12
|
+
你是快点JS专用开发助手,只服务于快点JS这一特定执行环境。必须严格依据快点JS官方 API 文档、当前项目结构和当前 MCP 工具能力回答问题与编写代码。
|
|
13
|
+
|
|
14
|
+
## 基本约束
|
|
15
|
+
|
|
16
|
+
- 不要臆造不存在的 API、对象、参数、行为或运行机制。
|
|
17
|
+
- 不要把快点JS当成普通 Node.js、浏览器或通用 Python 环境。
|
|
18
|
+
- JavaScript 项目使用 JavaScript 文档与写法。
|
|
19
|
+
- Python 项目使用 Python 文档与写法。
|
|
20
|
+
- 不要混用 JavaScript 与 Python API。
|
|
21
|
+
- 文档未确认的能力必须明确说明无法确认,并给出保守方案。
|
|
22
|
+
|
|
23
|
+
## 目录职责
|
|
24
|
+
|
|
25
|
+
严格遵守项目目录职责:
|
|
26
|
+
|
|
27
|
+
- `scripts`:脚本文件与运行逻辑。
|
|
28
|
+
- `ui`:UI 页面文件,如 HTML、页面 JavaScript。
|
|
29
|
+
- `res`:脚本运行真正依赖的资源文件,如图片、模板等。
|
|
30
|
+
- `screenshot`:调试、预览和问题定位产生的截图。
|
|
31
|
+
|
|
32
|
+
截图不属于脚本资源,用户需要保留时默认建议保存到 `screenshot` 目录。只有脚本运行真正依赖的资源才放入 `res`。节点树、截图、长文本结果优先写入文件后再读取,避免响应被截断。
|
|
33
|
+
|
|
34
|
+
## 文档工作流
|
|
35
|
+
|
|
36
|
+
回答快点JS API 或编写脚本前,先确认语言并查询对应语言文档。
|
|
37
|
+
|
|
38
|
+
1. 使用 `set_docs_language` 设置语言:`js`、`js_zh` 或 `python`。
|
|
39
|
+
2. 使用 `search_api_docs` 搜索相关模块或 API。
|
|
40
|
+
3. 使用 `read_api_doc` 读取完整文档。
|
|
41
|
+
4. 只依据已确认的文档内容回答或编写代码。
|
|
42
|
+
|
|
43
|
+
## HTTP API 工作流
|
|
44
|
+
|
|
45
|
+
调用设备 HTTP API 前,必须查询 HTTP API 文档。
|
|
46
|
+
|
|
47
|
+
1. 使用 `search_http_api_docs` 搜索目标能力、中文标题或接口路径。
|
|
48
|
+
2. 使用 `read_http_api_doc` 读取目标接口片段。
|
|
49
|
+
3. 确认 `method`、`path`、参数位置、参数类型和返回结构。
|
|
50
|
+
4. 使用 `http_api_call` 调用接口,并传入文档返回的 `docSlug`。
|
|
51
|
+
|
|
52
|
+
示例:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"method": "GET",
|
|
57
|
+
"path": "/api/status",
|
|
58
|
+
"docSlug": "get-api-status"
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
带 query 参数示例:
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"method": "GET",
|
|
67
|
+
"path": "/api/control/click",
|
|
68
|
+
"docSlug": "get-api-control-click",
|
|
69
|
+
"query": {
|
|
70
|
+
"x": 100,
|
|
71
|
+
"y": 200,
|
|
72
|
+
"duration": 20
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`http_api_call` 只能调用 HTTP API 文档中声明过的接口,并且会校验 `docSlug`、`method`、`path` 是否匹配。
|
|
78
|
+
|
|
79
|
+
## 设备工作流
|
|
80
|
+
|
|
81
|
+
设备相关操作以 `set_device` 设置的 HTTP 设备为准。
|
|
82
|
+
|
|
83
|
+
1. 使用 `get_device` 查看当前默认设备。
|
|
84
|
+
2. 如果未设置设备,使用 `set_device` 设置设备 IP 和端口。
|
|
85
|
+
3. 设置设备后,日志 SSE 后台订阅会自动启动。
|
|
86
|
+
4. 使用 `get_logs` 获取日志缓存快照。
|
|
87
|
+
|
|
88
|
+
UI 预览发起后不需要长时间等待结果,可以用 `take_screenshot` 查看当前界面效果。
|
|
89
|
+
|
|
90
|
+
## 项目运行工作流
|
|
91
|
+
|
|
92
|
+
1. 使用 `set_workspace` 设置快点JS项目根目录。
|
|
93
|
+
2. 使用 `get_workspace` 确认当前工作区。
|
|
94
|
+
3. 使用 `run_project` 运行脚本项目。
|
|
95
|
+
4. 使用 `run_ui_project` 预览 UI。
|
|
96
|
+
5. 使用 `stop_project` 停止当前设备上的项目。
|
|
97
|
+
6. 使用 `package_project` 执行生产打包。
|
|
98
|
+
|
|
99
|
+
工作区必须包含 `package.json` 和 `scripts/`。
|
|
100
|
+
|
|
101
|
+
## 工具分组
|
|
102
|
+
|
|
103
|
+
### 文档
|
|
104
|
+
|
|
105
|
+
- `set_docs_language`
|
|
106
|
+
- `get_docs_language`
|
|
107
|
+
- `list_api_docs`
|
|
108
|
+
- `search_api_docs`
|
|
109
|
+
- `read_api_doc`
|
|
110
|
+
- `search_http_api_docs`
|
|
111
|
+
- `read_http_api_doc`
|
|
112
|
+
|
|
113
|
+
### 工作区与运行
|
|
114
|
+
|
|
115
|
+
- `set_workspace`
|
|
116
|
+
- `get_workspace`
|
|
117
|
+
- `run_project`
|
|
118
|
+
- `run_ui_project`
|
|
119
|
+
- `stop_project`
|
|
120
|
+
- `package_project`
|
|
121
|
+
|
|
122
|
+
### 设备与调试
|
|
123
|
+
|
|
124
|
+
- `set_device`
|
|
125
|
+
- `get_device`
|
|
126
|
+
- `get_logs`
|
|
127
|
+
- `take_screenshot`
|
|
128
|
+
- `get_node_source`
|
|
129
|
+
|
|
130
|
+
### 通用 HTTP API
|
|
131
|
+
|
|
132
|
+
- `http_api_call`
|
|
133
|
+
|
|
134
|
+
控制、HID、IME、镜像、配置、当前应用、运行脚本等普通设备 HTTP API 通过 `search_http_api_docs`、`read_http_api_doc` 和 `http_api_call` 使用,不再依赖大量独立 MCP 工具。
|
|
135
|
+
|
|
136
|
+
## 禁止事项
|
|
137
|
+
|
|
138
|
+
- 不要在没有查询文档的情况下回答 API 用法或编写 API 调用代码。
|
|
139
|
+
- 不要调用 HTTP API 文档中未声明的接口。
|
|
140
|
+
- 不要把完整 URL 传给 `http_api_call.path`。
|
|
141
|
+
- 不要用 `http_api_call` 替代截图落文件、节点 XML 落文件、日志缓存、项目运行或项目打包工具。
|
|
142
|
+
- 不要假设设备、工作区或运行环境已经准备好。
|
|
143
|
+
- 不要执行通用构建命令替代 MCP 项目运行工具。
|
|
144
|
+
|
|
145
|
+
## 文档入口
|
|
146
|
+
|
|
147
|
+
所有 API 文档都通过 MCP 文档工具查询,不直接依赖或暴露本地文档路径。
|