cicy-desktop 1.0.8

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.
Files changed (66) hide show
  1. package/.github/workflows/build.yml +85 -0
  2. package/.kiro/steering/dev-workflow.md +166 -0
  3. package/AGENTS.md +247 -0
  4. package/CLAUDE.md +162 -0
  5. package/DOCKER.md +85 -0
  6. package/Dockerfile +46 -0
  7. package/README.md +720 -0
  8. package/TODO-anti-detection.md +326 -0
  9. package/bin/cicy +176 -0
  10. package/bin/preinstall.sh +32 -0
  11. package/copy-to-desktop.sh +26 -0
  12. package/docs/AUTOMATION-API.md +342 -0
  13. package/docs/REQUEST_MONITORING.md +435 -0
  14. package/docs/REST-API-FEATURE.md +155 -0
  15. package/docs/REST-API.md +319 -0
  16. package/docs/feature-distributed-multi-agent.md +555 -0
  17. package/docs/yaml.md +255 -0
  18. package/electron-mcp-fixed.command +134 -0
  19. package/electron-mcp-simple.command +135 -0
  20. package/electron-mcp.command +92 -0
  21. package/generate-openapi.js +158 -0
  22. package/jest.config.js +10 -0
  23. package/jest.setup.global.js +13 -0
  24. package/jest.teardown.global.js +7 -0
  25. package/package.json +75 -0
  26. package/service.sh +164 -0
  27. package/src/config.js +8 -0
  28. package/src/extension/inject.js +135 -0
  29. package/src/main-old.js +837 -0
  30. package/src/main.js +403 -0
  31. package/src/preload-rpc.js +4 -0
  32. package/src/server/args-parser.js +37 -0
  33. package/src/server/electron-setup.js +33 -0
  34. package/src/server/express-app.js +166 -0
  35. package/src/server/logging.js +58 -0
  36. package/src/server/mcp-server.js +53 -0
  37. package/src/server/tool-registry.js +77 -0
  38. package/src/server/ui-routes.js +81 -0
  39. package/src/swagger-ui.html +41 -0
  40. package/src/tools/account-tools.js +194 -0
  41. package/src/tools/automation-tools.js +297 -0
  42. package/src/tools/cdp-tools.js +444 -0
  43. package/src/tools/clipboard-tools.js +180 -0
  44. package/src/tools/download-tools.js +57 -0
  45. package/src/tools/exec-js.js +297 -0
  46. package/src/tools/exec-tools.js +139 -0
  47. package/src/tools/file-tools.js +212 -0
  48. package/src/tools/hook-chatgpt.js +489 -0
  49. package/src/tools/hook-gemini.js +454 -0
  50. package/src/tools/index.js +19 -0
  51. package/src/tools/ipc-bridge.js +31 -0
  52. package/src/tools/ping.js +60 -0
  53. package/src/tools/r-reset.js +28 -0
  54. package/src/tools/screenshot-tools.js +28 -0
  55. package/src/tools/system-tools.js +531 -0
  56. package/src/tools/window-tools.js +882 -0
  57. package/src/ui.html +914 -0
  58. package/src/utils/auth.js +81 -0
  59. package/src/utils/cdp-utils.js +8 -0
  60. package/src/utils/download-manager.js +41 -0
  61. package/src/utils/process-utils.js +185 -0
  62. package/src/utils/snapshot-utils.js +56 -0
  63. package/src/utils/window-monitor.js +605 -0
  64. package/src/utils/window-state.js +137 -0
  65. package/src/utils/window-utils.js +336 -0
  66. package/update-desktop.sh +33 -0
package/README.md ADDED
@@ -0,0 +1,720 @@
1
+ # Electron MCP Server
2
+
3
+ 基于 Electron 的 MCP 服务器,提供**浏览器自动化 + 系统级控制**的完整解决方案。支持多账户隔离、会话管理、丰富的 CDP 操作,以及 **YAML/JSON 双格式支持**。
4
+
5
+ ## 🌟 产品亮点
6
+
7
+ ### 🎯 双层自动化能力
8
+ - **浏览器层**:完整的 CDP 控制,网页自动化专家
9
+ - **系统层**:跨应用窗口管理,不限于浏览器
10
+
11
+ ### 🚀 开发体验极致优化
12
+ - **简化语法**:`cicy-rpc tool_name key=value`,告别冗长 JSON
13
+ - **热重载**:修改代码无需重启,秒级生效
14
+ - **YAML 优先**:比 JSON 节省 30% token,AI 友好
15
+
16
+ ### 🔒 企业级特性
17
+ - **多账户隔离**:Cookie/Storage 完全隔离,支持多账号场景
18
+ - **认证保护**:Bearer Token + Basic Auth 双重支持
19
+ - **文件托管**:截图自动托管,支持认证访问
20
+
21
+ ### 🧩 高度可扩展
22
+ - **模块化架构**:清晰的工具分组,易于扩展
23
+ - **MCP 协议**:标准化接口,AI Agent 无缝集成
24
+ - **跨平台就绪**:核心架构支持 Windows/macOS 扩展
25
+
26
+ ## ✨ 核心特性
27
+
28
+ - 🚀 **简化语法** - `cicy-rpc tool_name key=value`,最简洁
29
+ - 📝 **YAML 优先** - 默认 YAML 格式,节省 30% token
30
+ - 🔥 **手动热重载** - `cicy-rpc r-reset` 清除缓存,无需重启
31
+ - 🪟 **双层窗口管理** - 浏览器窗口 + 系统窗口全覆盖
32
+ - 👤 **多账户隔离** - Cookie/Storage 完全隔离
33
+ - 🎯 **CDP 完整控制** - 鼠标、键盘、页面、网络
34
+ - 📸 **智能截图** - 全屏/窗口截图,自动清理
35
+ - 🖥️ **系统监控** - CPU、内存、磁盘、网络、IP
36
+ - 🔧 **轻量工具** - cicy-rpc 命令行工具
37
+ - 🧩 **模块化架构** - 清晰的代码组织,易于维护
38
+ - ⚡ **执行工具** - Shell/Python/Node.js 命令执行
39
+ - 📋 **剪贴板操作** - 文本和图片的读写
40
+
41
+ ## 功能特性
42
+
43
+ ### 核心工具
44
+
45
+ - `ping` - 测试 MCP 服务器连接
46
+
47
+ ### 系统工具
48
+
49
+ - `get_system_windows` - 获取所有系统窗口信息(支持简洁/详细模式)
50
+ - `focus_system_window` - 聚焦指定系统窗口
51
+ - `get_system_info` - 获取系统信息(CPU、内存、磁盘、负载、IP)
52
+ - `system_screenshot` - 截取全屏并保存为 JPEG
53
+ - `sys_win_screenshot` - 截取指定窗口并保存为 JPEG
54
+ - `system_window_setbound` - 设置系统窗口的位置和大小
55
+
56
+ ### 窗口管理
57
+
58
+ - `get_windows` - 获取所有窗口列表和详细信息
59
+ - `get_window_info` - 获取指定窗口详细信息
60
+ - `open_window` - 打开新窗口(支持多账户隔离,默认复用窗口)
61
+ - `close_window` - 关闭窗口
62
+ - `load_url` - 加载 URL
63
+ - `get_title` - 获取窗口标题
64
+ - `set_window_bounds` - 设置窗口位置和大小
65
+ - `control_electron_BrowserWindow` - 直接控制 BrowserWindow
66
+ - `control_electron_WebContents` - 直接控制 WebContents
67
+
68
+ ### CDP 鼠标操作
69
+
70
+ - `cdp_click` - 点击指定坐标
71
+ - `cdp_dblclick` - 双击指定坐标
72
+
73
+ ### CDP 键盘操作
74
+
75
+ - `cdp_press_key` - 按下任意按键
76
+ - `cdp_press_enter` - 按下回车键
77
+ - `cdp_press_backspace` - 按下退格键
78
+ - `cdp_press_copy` - 复制 (Ctrl+C)
79
+ - `cdp_press_paste` - 粘贴 (支持 sendInputEvent/CDP/JS 三种方法)
80
+ - `cdp_press_selectall` - 全选 (Ctrl+A)
81
+ - `cdp_press_cut` - 剪切 (Ctrl+X)
82
+ - `cdp_type_text` - 输入文本
83
+
84
+ ### 剪贴板操作
85
+
86
+ - `clipboard_write_text` - 写入文本到剪贴板
87
+ - `clipboard_read_text` - 读取剪贴板文本
88
+ - `clipboard_write_image` - 写入图片到剪贴板
89
+ - `test_paste_methods` - 测试三种粘贴方法
90
+
91
+ ### 执行工具
92
+
93
+ - `exec_shell` - 执行 Shell 命令
94
+ - `exec_python` - 执行 Python 代码
95
+ - `exec_npm` - 执行 npm 命令
96
+
97
+ ### CDP 页面操作
98
+
99
+ - `cdp_scroll` - 滚动页面
100
+ - `cdp_sendcmd` - 发送任意 CDP 命令
101
+
102
+ ### JS 执行与注入
103
+
104
+ - `exec_js` - 执行 JavaScript 代码
105
+ - `get_element_client_bound` - 获取元素位置和尺寸
106
+ - `show_float_div` - 显示可拖拽调试浮动框
107
+
108
+ ### 网络监控
109
+
110
+ - `get_console_logs` - 获取控制台日志
111
+ - `get_requests` - 获取网络请求记录
112
+ - `filter_requests` - 过滤网络请求
113
+ - `get_request_detail` - 获取请求详细信息
114
+
115
+ ### 截图与下载
116
+
117
+ - `webpage_screenshot_to_clipboard` - 截图并复制到剪贴板
118
+ - `webpage_snapshot` - 网页快照(截图+HTML)
119
+ - `session_download_url` - 下载文件到指定路径(支持超时设置)
120
+ - **自动下载** - 所有浏览器下载自动保存到 `~/Downloads/electron/`,无弹窗
121
+
122
+ ### 下载管理
123
+
124
+ - `get_downloads` - 获取所有下载记录
125
+ - `get_download` - 获取指定下载的详细信息
126
+ - `clear_downloads` - 清空下载记录
127
+
128
+ **下载特性:**
129
+ - ✅ 无弹窗下载 - 自动保存,不打断工作流
130
+ - ✅ 双模式支持 - 工具指定路径 或 自动保存到默认目录
131
+ - ✅ 实时进度跟踪 - 下载状态、进度、速度全记录
132
+ - ✅ 全局记录管理 - 查询历史下载,支持批量清理
133
+
134
+ ### 进程与端口工具
135
+
136
+ - `process-utils` - 跨平台进程和端口管理工具
137
+ - `isPortOpen(port, host, timeout)` - 检查端口是否开放
138
+ - `killPort(port)` - 杀死占用端口的进程
139
+ - 支持 Windows、macOS、Linux 三大平台
140
+
141
+ ## 快速开始
142
+
143
+ ### 安装依赖
144
+
145
+ ```bash
146
+ git clone git@github.com:cicy-dev/electron-mcp.git
147
+ cd electron-mcp
148
+ npm install
149
+ ```
150
+
151
+ ### 启动服务
152
+
153
+ ```bash
154
+ # 启动服务
155
+ bash skills/electron-mcp-service/service.sh start
156
+
157
+ # 验证服务
158
+ cicy-rpc "name: ping"
159
+ ```
160
+
161
+ ### 使用技能
162
+
163
+ ```bash
164
+ # 下载抖音视频
165
+ bash skills/download-douyin-video/download-douyin-video.sh <url>
166
+ ```
167
+
168
+ ## Skills
169
+
170
+ ### 可用技能
171
+
172
+ | 技能 | 说明 | 文档 |
173
+ |------|------|------|
174
+ | **electron-mcp-service** | 浏览器自动化服务 | [README](./skills/electron-mcp-service/README.md) |
175
+ | **download-douyin-video** | 下载抖音视频 | [README](./skills/download-douyin-video/README.md) |
176
+ | **aistudio** | AI Studio 自动化 | [README](./skills/aistudio/README.md) |
177
+ | **cicy-rpc** | RPC 命令行工具 | [README](./skills/cicy-rpc/README.md) |
178
+
179
+ ### 创建新技能
180
+
181
+ ```bash
182
+ bash skills/create-skill.sh my-skill
183
+ ```
184
+
185
+ 查看 [技能列表](./skills/SKILLS-LIST.md) 了解更多。
186
+
187
+ ## 服务管理
188
+
189
+ ```bash
190
+ bash skills/electron-mcp-service/service.sh start # 启动
191
+ bash skills/electron-mcp-service/service.sh stop # 停止
192
+ bash skills/electron-mcp-service/service.sh status # 状态
193
+ bash skills/electron-mcp-service/service.sh logs # 日志
194
+ bash skills/electron-mcp-service/service.sh restart # 重启
195
+ ```
196
+
197
+ ## 启动参数
198
+
199
+ ```bash
200
+ # 指定端口启动
201
+ npm start -- --port=8102
202
+
203
+ # 启动并打开浏览器窗口
204
+ npm start -- --url=http://www.google.com
205
+
206
+ # 单窗口模式(复用同一个窗口)
207
+ npm start -- --one-window
208
+
209
+ # 多账户模式启动(账户 0)
210
+ npm start -- --url=http://example.com --account=0
211
+
212
+ # 多账户模式启动(账户 1,隔离cookie)
213
+ npm start -- --url=http://example.com --account=1
214
+
215
+ # 组合使用
216
+ npm start -- --port=8080 --url=http://example.com --account=2 --one-window
217
+ ```
218
+
219
+ ## 运行测试
220
+
221
+ ```bash
222
+ # 运行完整测试套件
223
+ npm test
224
+
225
+ # 运行指定测试
226
+ npm test -- api.cdp-tools.test.js
227
+ ```
228
+
229
+ ## 多账户系统
230
+
231
+ ### 账户隔离机制
232
+
233
+ 每个窗口可以指定 `accountIdx` 参数,相同账户的窗口共享:
234
+
235
+ - Cookie(登录状态共享)
236
+ - LocalStorage
237
+ - SessionStorage
238
+ - 缓存数据
239
+
240
+ ```javascript
241
+ // 打开账户 0 的窗口(默认)
242
+ { "name": "open_window", "arguments": { "url": "https://google.com", "accountIdx": 0 } }
243
+
244
+ // 打开账户 1 的窗口(独立 cookie)
245
+ { "name": "open_window", "arguments": { "url": "https://google.com", "accountIdx": 1 } }
246
+
247
+ // 打开账户 2 的窗口
248
+ { "name": "open_window", "arguments": { "url": "https://google.com", "accountIdx": 2 } }
249
+ ```
250
+
251
+ ### 窗口标题格式
252
+
253
+ 窗口标题会自动添加前缀:`{accountIdx}-{win_id} | `,便于识别:
254
+
255
+ ```
256
+ 0-1 | Loading...
257
+ 0-1 | Google 首页
258
+ 1-2 | Gmail - 账户 1
259
+ ```
260
+
261
+ ### 账户使用场景
262
+
263
+ - **账户 0**: 默认账户,用于通用浏览
264
+ - **账户 1-3**: 多账号登录场景(如多个邮箱、社交账号)
265
+ - **隔离测试**: 不同账户的独立测试环境
266
+
267
+ ## 在 Kiro CLI 中使用
268
+
269
+ ```bash
270
+ # 添加 MCP 服务器
271
+ kiro-cli mcp add --name electron-mcp --url http://localhost:8101/mcp --force
272
+ ```
273
+
274
+ 或手动配置 `~/.kiro/settings/mcp.json`:
275
+
276
+ ```json
277
+ {
278
+ "mcpServers": {
279
+ "electron-mcp": {
280
+ "url": "http://localhost:8101/mcp"
281
+ }
282
+ }
283
+ }
284
+ ```
285
+
286
+ ## 使用示例
287
+
288
+ ### 命令行工具 (cicy-rpc)
289
+
290
+ 快速调用 MCP 工具的轻量级命令行工具,**支持简化语法和 YAML/JSON 双格式**:
291
+
292
+ ```bash
293
+ # 安装到 ~/.local/bin
294
+ curl -o ~/.local/bin/cicy-rpc https://raw.githubusercontent.com/cicy-dev/electron-mcp/main/bin/cicy-rpc
295
+ chmod +x ~/.local/bin/cicy-rpc
296
+
297
+ # 安装依赖(YAML 支持)
298
+ pip install yq --break-system-packages
299
+
300
+ # 设置 token(首次使用)
301
+ echo "your-token-here" > ~/data/electron/token.txt
302
+
303
+ # 简化语法(推荐)
304
+ cicy-rpc ping
305
+ cicy-rpc open_window url=https://google.com
306
+ cicy-rpc get_window_info win_id=1
307
+ cicy-rpc set_window_bounds win_id=1 x=100 y=100 width=1280 height=720
308
+ cicy-rpc cdp_click win_id=1 x=500 y=300
309
+ cicy-rpc cdp_type_text win_id=1 text="Hello World"
310
+ cicy-rpc close_window win_id=1
311
+
312
+ # YAML 格式(完整语法)
313
+ cicy-rpc "
314
+ name: open_window
315
+ arguments:
316
+ url: https://google.com
317
+ reuseWindow: false
318
+ "
319
+
320
+ # JSON 格式
321
+ cicy-rpc --json '{"name":"get_window_info","arguments":{"win_id":1}}'
322
+ ```
323
+
324
+ **三种格式对比:**
325
+
326
+ 简化语法(最简洁):
327
+ ```bash
328
+ cicy-rpc open_window url=https://google.com
329
+ ```
330
+
331
+ YAML 格式(推荐,复杂参数):
332
+ ```bash
333
+ cicy-rpc "
334
+ name: open_window
335
+ arguments:
336
+ url: https://google.com
337
+ reuseWindow: false
338
+ "
339
+ ```
340
+
341
+ JSON 格式(标准):
342
+ ```json
343
+ {"name":"open_window","arguments":{"url":"https://google.com","reuseWindow":false}}
344
+ ```
345
+
346
+ **最佳实践:**
347
+ - 简单参数 → 简化语法
348
+ - 复杂参数/JS 代码 → YAML 格式
349
+ - YAML 比 JSON 省约 30% token
350
+
351
+ ### 窗口管理
352
+
353
+ ```javascript
354
+ // 获取所有窗口
355
+ { "name": "get_windows", "arguments": {} }
356
+
357
+ // 打开新窗口(默认复用现有窗口)
358
+ { "name": "open_window", "arguments": { "url": "https://www.google.com" } }
359
+
360
+ // 打开新窗口(强制创建新窗口)
361
+ { "name": "open_window", "arguments": { "url": "https://www.google.com", "reuseWindow": false } }
362
+
363
+ // 打开新窗口(账户1)
364
+ { "name": "open_window", "arguments": { "url": "https://mail.google.com", "accountIdx": 1 } }
365
+
366
+ // 获取窗口信息(包含账户ID)
367
+ { "name": "get_window_info", "arguments": { "win_id": 1 } }
368
+
369
+ // 设置窗口位置和大小
370
+ { "name": "set_window_bounds", "arguments": { "win_id": 1, "x": 100, "y": 100, "width": 1280, "height": 720 } }
371
+
372
+ // 只设置位置
373
+ { "name": "set_window_bounds", "arguments": { "win_id": 1, "x": 0, "y": 0 } }
374
+
375
+ // 只设置大小
376
+ { "name": "set_window_bounds", "arguments": { "win_id": 1, "width": 1920, "height": 1080 } }
377
+ ```
378
+
379
+ ### CDP 操作
380
+
381
+ ```javascript
382
+ // 点击页面
383
+ { "name": "cdp_click", "arguments": { "win_id": 1, "x": 100, "y": 100 } }
384
+
385
+ // 输入文本
386
+ { "name": "cdp_type_text", "arguments": { "win_id": 1, "text": "Hello" } }
387
+
388
+ // 滚动页面
389
+ { "name": "cdp_scroll", "arguments": { "win_id": 1, "y": 100 } }
390
+ ```
391
+
392
+ ### JS 执行
393
+
394
+ ```javascript
395
+ // 执行 JS 代码
396
+ { "name": "exec_js", "arguments": { "win_id": 1, "code": "document.title" } }
397
+
398
+ // 获取元素位置
399
+ { "name": "get_element_client_bound", "arguments": { "win_id": 1, "selector": "button" } }
400
+ ```
401
+
402
+ ### 进程与端口管理
403
+
404
+ ```javascript
405
+ const { isPortOpen, killPort } = require('./src/utils/process-utils');
406
+
407
+ // 检查端口是否开放
408
+ const isOpen = await isPortOpen(8080);
409
+ console.log(`Port 8080 is ${isOpen ? 'open' : 'closed'}`);
410
+
411
+ // 检查端口(自定义超时)
412
+ const isOpen2 = await isPortOpen(8080, 'localhost', 2000);
413
+
414
+ // 杀死占用端口的进程
415
+ const result = await killPort(8080);
416
+ if (result.success) {
417
+ console.log(`Killed process ${result.pid} on port 8080`);
418
+ } else {
419
+ console.error(result.message);
420
+ }
421
+ ```
422
+
423
+ ## 配置选项
424
+
425
+ ### 环境变量
426
+
427
+ - `PORT`: 服务器端口 (默认: 8101)
428
+ - `NODE_ENV`: 环境模式 (test/development/production)
429
+ - `HOME` / `USERPROFILE`: 日志目录 (默认: ~/logs)
430
+
431
+ ### 启动参数
432
+
433
+ ```bash
434
+ # 指定端口
435
+ npm start -- --port=8102
436
+
437
+ # 启动并打开浏览器窗口
438
+ npm start -- --url=http://example.com
439
+
440
+ # 单窗口模式(所有操作复用同一窗口)
441
+ npm start -- --one-window
442
+
443
+ # 指定账户(0-3)
444
+ npm start -- --account=1
445
+
446
+ # 组合使用
447
+ npm start -- --port=8080 --url=http://example.com --account=2 --one-window
448
+
449
+ # 也可以使用环境变量
450
+ PORT=8080 npm start
451
+ ```
452
+
453
+ ### 单窗口模式 (--one-window)
454
+
455
+ 启用后,所有 `open_window` 调用都会复用现有窗口:
456
+ - 如果窗口已存在,会将其赊到前台并加载新 URL
457
+ - 如果当前 URL 与请求的 URL 相同,则刷新页面
458
+ - 返回的消息会提示使用 `get_window_info` 检查 `dom-ready` 状态
459
+
460
+ ### 日志文件
461
+
462
+ 日志写入 `~/logs/electron-mcp-{port}.log`,格式:
463
+
464
+ ```
465
+ [2026-02-06 15:30:33.994] [info] Server listening on http://localhost:1234
466
+ [2026-02-06 15:30:33.994] [debug] [MCP] SSE connection established: xxx
467
+ [2026-02-06 15:30:34.123] [info] [MCP] Opening window with URL: http://example.com
468
+ ```
469
+
470
+ 日志级别:debug / info / warn / error
471
+
472
+ ## 常见问题
473
+
474
+ ### Q: 如何在无头环境中使用?
475
+
476
+ A: 需要虚拟显示环境,如 Xvfb:
477
+
478
+ ```bash
479
+ xvfb-run -a npm start
480
+ ```
481
+
482
+ ### Q: 如何配置多个实例?
483
+
484
+ A: 使用不同端口启动多个实例:
485
+
486
+ ```bash
487
+ npm start -- --port=8101 &
488
+ npm start -- --port=8102 &
489
+ ```
490
+
491
+ ### Q: 如何调试工具问题?
492
+
493
+ A: 查看日志文件:
494
+
495
+ ```bash
496
+ tail -f ~/logs/electron-mcp-8101.log
497
+ ```
498
+
499
+ ### Q: 多账户窗口之间如何隔离?
500
+
501
+ A: 每个账户使用独立的 `partition`:
502
+
503
+ - 账户 0: `persist:sandbox-0`
504
+ - 账户 1: `persist:sandbox-1`
505
+ - 以此类推...
506
+
507
+ 相同账户的窗口共享 cookie,不同账户完全隔离。
508
+
509
+ ### Q: 窗口标题的含义?
510
+
511
+ A: 格式为 `{accountIdx}-{win_id} | {页面标题}`:
512
+
513
+ - `0-1 | Google` - 账户0,窗口ID 1
514
+ - `1-2 | Gmail` - 账户1,窗口ID 2
515
+
516
+ ## API 文档
517
+
518
+ ### HTTP 端点
519
+
520
+ - `GET /mcp` - 建立 SSE 连接
521
+ - `POST /messages` - 发送 MCP 消息
522
+
523
+ ### 工具调用格式
524
+
525
+ ```json
526
+ {
527
+ "name": "tool_name",
528
+ "arguments": {
529
+ "param1": "value1",
530
+ "param2": "value2"
531
+ }
532
+ }
533
+ ```
534
+
535
+ ### OpenAPI 文档
536
+
537
+ 访问 `/openapi.json` 获取完整的 OpenAPI 规范,工具按功能分组:
538
+
539
+ | Tag | 工具类型 |
540
+ |-----|------|
541
+ | System | `ping` |
542
+ | Window | 窗口管理工具 |
543
+ | Input | CDP 输入操作 |
544
+ | CDP | CDP 任意命令 |
545
+ | Network | 网络监控工具 |
546
+ | Console | 控制台日志 |
547
+ | Screenshot | 截图工具 |
548
+ | JavaScript | JS 执行工具 |
549
+
550
+ ## 测试
551
+
552
+ 项目包含完整的测试套件,覆盖所有 MCP 工具:
553
+
554
+ 运行测试:
555
+
556
+ ```bash
557
+ # 运行完整测试套件
558
+ npm test
559
+
560
+ # 运行指定测试文件
561
+ npm test -- api.cdp-tools.test.js
562
+ npm test -- api.exec-js.test.js
563
+ ```
564
+
565
+ ## 开发
566
+
567
+ ### 项目结构
568
+
569
+ ```
570
+ electron-mcp/
571
+ ├── src/
572
+ │ ├── main.js # 主入口(模块化)
573
+ │ ├── config.js # 配置文件
574
+ │ ├── server/ # 服务器模块
575
+ │ │ ├── electron-setup.js # Electron 配置
576
+ │ │ ├── args-parser.js # 参数解析
577
+ │ │ ├── logging.js # 日志系统
578
+ │ │ ├── express-app.js # Express 应用
579
+ │ │ ├── mcp-server.js # MCP 服务器
580
+ │ │ └── tool-registry.js # 工具注册
581
+ │ ├── tools/ # MCP 工具实现
582
+ │ │ ├── window-tools.js # 窗口管理工具
583
+ │ │ ├── cdp-tools.js # CDP 操作工具
584
+ │ │ ├── exec-js.js # JS 执行工具
585
+ │ │ └── ping.js # 连接测试工具
586
+ │ └── utils/ # 工具函数
587
+ │ ├── window-utils.js # 窗口创建与管理
588
+ │ ├── window-monitor.js # 窗口监控
589
+ │ ├── cdp-utils.js # CDP 封装
590
+ │ └── snapshot-utils.js # 截图工具
591
+ ├── tests/ # 核心测试
592
+ │ ├── rpc/ # RPC 基础测试
593
+ │ └── mcp/ # MCP 协议测试
594
+ ├── skills/ # 功能技能模块
595
+ │ ├── window-management/ # 窗口管理技能
596
+ │ ├── cdp-automation/ # CDP 自动化技能
597
+ │ ├── javascript/ # JavaScript 执行技能
598
+ │ ├── network/ # 网络监控技能
599
+ │ └── template-rpc/ # 技能模板
600
+ ├── changelog/ # 变更日志
601
+ ├── task/ # 任务文档
602
+ ├── bin/ # 命令行工具
603
+ │ └── cicy-rpc # YAML/JSON RPC 客户端
604
+ └── package.json
605
+ ```
606
+
607
+ ### 热重载开发
608
+
609
+ 修改 `src/tools/` 或 `src/utils/` 中的代码后,**无需重启 Electron**,使用 `r-reset` 工具清除缓存即可。
610
+
611
+ ```bash
612
+ # 启动服务
613
+ bash skills/electron-mcp-service/service.sh start
614
+
615
+ # 修改工具代码
616
+ vim src/tools/ping.js
617
+
618
+ # 清除缓存
619
+ cicy-rpc r-reset
620
+
621
+ # 测试新代码
622
+ cicy-rpc ping
623
+ ```
624
+
625
+ **工作原理:**
626
+ - `r-reset` 清除 `require.cache` 中的 `/tools/` 和 `/utils/` 模块
627
+ - 下次调用工具时自动重新加载最新代码
628
+ - 无需重启 Electron 进程
629
+
630
+ **适用范围:**
631
+ - ✅ `src/tools/` - 工具实现
632
+ - ✅ `src/utils/` - 工具函数
633
+ - ❌ `src/main.js` - 需要重启
634
+ - ❌ `src/server/` - 需要重启
635
+
636
+ ### 添加新工具
637
+
638
+ 1. 在 `src/tools/` 目录创建新工具文件
639
+ 2. 使用 `registerTool()` 注册工具,支持指定 tag
640
+ 3. 在 `tests/` 目录添加测试用例
641
+ 4. 更新 README.md
642
+
643
+ ```javascript
644
+ // 工具注册示例
645
+ registerTool(
646
+ "my_tool",
647
+ "工具描述",
648
+ z.object({
649
+ win_id: z.number().optional().default(1).describe("窗口 ID"),
650
+ param: z.string().describe("参数描述")
651
+ }),
652
+ async ({ win_id, param }) => {
653
+ // 工具实现
654
+ return { content: [{ type: "text", text: "result" }] };
655
+ },
656
+ { tag: "MyCategory" } // 可选: 指定 OpenAPI 分组
657
+ );
658
+ ```
659
+
660
+ ### 窗口创建示例
661
+
662
+ ```javascript
663
+ const { createWindow, getWindowInfo } = require("./utils/window-utils");
664
+
665
+ // 创建窗口(账户0,默认)
666
+ const win1 = createWindow({ url: "https://google.com" }, 0);
667
+
668
+ // 创建窗口(账户1,隔离)
669
+ const win2 = createWindow({ url: "https://gmail.com" }, 1);
670
+
671
+ // 获取窗口信息
672
+ const info = getWindowInfo(win1);
673
+ // {
674
+ // id: 1,
675
+ // title: "0-1 | Google",
676
+ // accountIdx: 0,
677
+ // partition: "persist:sandbox-0",
678
+ // ...
679
+ // }
680
+ ```
681
+
682
+ ## 文档
683
+
684
+ - [YAML 支持](docs/yaml.md) - YAML/JSON 双格式说明
685
+ - [API 文档](http://localhost:8101/docs) - REST API 文档
686
+ - [OpenAPI 规范](openapi.yml) - OpenAPI 3.0 规范
687
+
688
+ ## 🗺️ Roadmap
689
+
690
+ ### 🎯 近期计划
691
+ - [ ] **图像识别集成**
692
+ - OCR 文字识别(Tesseract)
693
+ - 图像相似度对比(OpenCV)
694
+ - UI 元素定位(基于截图)
695
+ - 验证码识别
696
+
697
+ - [ ] **多平台支持**
698
+ - Windows 系统工具适配
699
+ - macOS 系统工具适配
700
+ - 跨平台 API 统一抽象
701
+
702
+ ### 🚀 未来规划
703
+ - [ ] **AI 增强**
704
+ - 自然语言转操作指令
705
+ - 智能元素定位
706
+ - 自动化测试生成
707
+
708
+ - [ ] **性能优化**
709
+ - 并发窗口管理
710
+ - 资源池化
711
+ - 缓存优化
712
+
713
+ - [ ] **企业功能**
714
+ - 分布式部署
715
+ - 任务队列
716
+ - 监控告警
717
+
718
+ ## 许可证
719
+
720
+ MIT License