@vrs-soft/wecom-aibot-mcp 1.0.9 → 1.2.1

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 (44) hide show
  1. package/README.md +146 -343
  2. package/dist/approval-manager.d.ts +38 -0
  3. package/dist/approval-manager.js +129 -0
  4. package/dist/bin.d.ts +4 -8
  5. package/dist/bin.js +21 -41
  6. package/dist/cc-registry.d.ts +62 -0
  7. package/dist/cc-registry.js +272 -0
  8. package/dist/client-pool.js +1 -1
  9. package/dist/client.d.ts +36 -5
  10. package/dist/client.js +199 -29
  11. package/dist/config-wizard.d.ts +1 -1
  12. package/dist/config-wizard.js +172 -125
  13. package/dist/connection-log.d.ts +25 -9
  14. package/dist/connection-log.js +130 -37
  15. package/dist/connection-manager.d.ts +29 -31
  16. package/dist/connection-manager.js +102 -156
  17. package/dist/daemon.d.ts +10 -0
  18. package/dist/daemon.js +371 -0
  19. package/dist/headless-state.d.ts +19 -62
  20. package/dist/headless-state.js +66 -260
  21. package/dist/http-server.d.ts +17 -7
  22. package/dist/http-server.js +279 -336
  23. package/dist/index.d.ts +6 -11
  24. package/dist/index.js +10 -11
  25. package/dist/keepalive-monitor.d.ts +3 -1
  26. package/dist/keepalive-monitor.js +11 -22
  27. package/dist/message-bus.d.ts +33 -0
  28. package/dist/message-bus.js +37 -0
  29. package/dist/tools/headless.d.ts +8 -0
  30. package/dist/tools/headless.js +246 -0
  31. package/dist/tools/index.d.ts +5 -14
  32. package/dist/tools/index.js +11 -491
  33. package/dist/tools/messaging.d.ts +7 -0
  34. package/dist/tools/messaging.js +159 -0
  35. package/dist/tools/utils-tools.d.ts +11 -0
  36. package/dist/tools/utils-tools.js +249 -0
  37. package/dist/utils/atomic-write.d.ts +4 -0
  38. package/dist/utils/atomic-write.js +9 -0
  39. package/dist/utils/hash.d.ts +5 -0
  40. package/dist/utils/hash.js +12 -0
  41. package/dist/utils/sanitize.d.ts +59 -0
  42. package/dist/utils/sanitize.js +246 -0
  43. package/package.json +12 -5
  44. package/skills/headless-mode/SKILL.md +124 -94
package/README.md CHANGED
@@ -6,18 +6,19 @@
6
6
 
7
7
  ## 功能特性
8
8
 
9
- - 🔐 **远程审批**:敏感操作通过微信卡片审批,支持"允许一次/永久允许/拒绝"
10
- - 💬 **消息推送**:任务进度、完成通知实时推送到微信
11
- - 📱 **Headless 模式**:离开电脑时切换到微信交互
9
+ - 🔐 **远程审批**:敏感操作通过微信卡片审批,支持"允许一次/拒绝"
10
+ - 💬 **双向通信**:任务进度、完成通知实时推送到微信
11
+ - 📱 **Headless 模式**:离开电脑时切换到微信交互,长轮询实时接收消息
12
12
  - 🔄 **智能代批**:超时自动审批,项目内操作允许,删除操作拒绝
13
- - 🔄 **多机器人支持**:支持配置多个机器人,适用于团队场景
13
+ - 🤖 **多机器人支持**:支持配置多个机器人,团队场景下多人独立使用
14
+ - 🌐 **HTTP Transport**:使用 HTTP 传输,支持多实例共享服务
14
15
 
15
16
  ## 架构
16
17
 
17
18
  ```
18
19
  ┌─────────────────┐ MCP (HTTP) ┌──────────────────┐
19
20
  │ Claude Code │ ──────────────────▶ │ wecom-aibot-mcp │
20
- │ (MCP Client) │ │ MCP Server │
21
+ │ (MCP Client) │ ◀────────────────── │ MCP Server │
21
22
  └─────────────────┘ └──────────────────┘
22
23
 
23
24
  WebSocket 长连接
@@ -43,6 +44,7 @@ PermissionRequest Hook 拦截
43
44
 
44
45
  ┌────────────────────────┐
45
46
  │ 检查 headless 模式状态 │
47
+ │ (检查 .claude/wecom-aibot.json)
46
48
  └────────────────────────┘
47
49
 
48
50
  ┌───────┴───────┐
@@ -50,76 +52,52 @@ PermissionRequest Hook 拦截
50
52
  非 headless headless
51
53
  ↓ ↓
52
54
  终端确认框 发送微信审批卡片
53
-
54
- 用户点击按钮
55
-
56
- └───────┬───────┘
57
-
58
- 执行或拒绝操作
55
+
56
+ 用户点击按钮
57
+
58
+ 通过 HTTP /approval_status
59
+
60
+ 执行或拒绝操作
61
+ ```
62
+
63
+ ### Headless 模式
64
+
65
+ ```
66
+ 用户:现在开始通过微信联系
67
+
68
+ Claude → enter_headless_mode()
69
+
70
+ ├─ 连接 WebSocket
71
+ ├─ 写入 .claude/settings.json (PermissionRequest hook)
72
+ ├─ 发送微信确认消息
73
+ └─ 返回 { status: 'entered', headless: true }
74
+
75
+ Claude 开始长轮询 get_pending_messages(timeout_ms=30000)
76
+
77
+ ┌─────────────────────────────────────────┐
78
+ │ loop: │
79
+ │ 1. 等待用户消息(30秒超时) │
80
+ │ 2. 收到消息 → 理解意图 → 执行操作 │
81
+ │ 3. Hook 自动拦截审批 → 发送微信卡片 │
82
+ │ 4. 用户审批 → 操作完成 → 汇报结果 │
83
+ │ 5. 继续轮询 │
84
+ └─────────────────────────────────────────┘
85
+
86
+ 用户:我回来了
87
+
88
+ Claude → exit_headless_mode()
89
+ ├─ 断开 WebSocket
90
+ ├─ 删除 .claude/settings.json hook
91
+ └─ 发送微信确认消息
59
92
  ```
60
93
 
61
- ### 智能代批
62
-
63
- 开启「自动审批」后,审批请求超时(10分钟)会自动决策:
64
-
65
- | 操作类型 | 条件 | 自动决策 |
66
- |---------|------|---------|
67
- | Bash | 包含 rm/rmdir/unlink | ❌ 拒绝 |
68
- | Bash | 项目内操作或常见命令 | ✅ 允许 |
69
- | Bash | 无法判断范围 | ❌ 拒绝 |
70
- | Write/Edit | 项目内文件 | ✅ 允许 |
71
- | Write/Edit | 项目外文件 | ❌ 拒绝 |
72
-
73
94
  ## 安装
74
95
 
75
96
  ### 前置要求
76
97
 
77
- - **Node.js >= 18**(必需)
98
+ - **Node.js >= 18**
78
99
  - 企业微信账号(有创建机器人权限)
79
- - Claude Code 已安装
80
-
81
- ### 安装 Node.js
82
-
83
- **检查版本**:
84
- ```bash
85
- node --version
86
- # 输出应 >= v18.0.0
87
- ```
88
-
89
- **安装方式**:
90
-
91
- **macOS**:
92
- ```bash
93
- # 使用 Homebrew
94
- brew install node
95
-
96
- # 或使用 nvm(推荐,可管理多版本)
97
- curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
98
- nvm install 18
99
- nvm use 18
100
- ```
101
-
102
- **Windows**:
103
- ```bash
104
- # 使用 winget
105
- winget install OpenJS.NodeJS.LTS
106
-
107
- # 或下载安装包:https://nodejs.org/
108
- ```
109
-
110
- **Linux**:
111
- ```bash
112
- # Ubuntu/Debian
113
- curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
114
- sudo apt-get install -y nodejs
115
-
116
- # 或使用 nvm
117
- curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
118
- nvm install 18
119
- nvm use 18
120
- ```
121
-
122
- ## 快速开始
100
+ - Claude Code
123
101
 
124
102
  ### 第一步:创建企业微信机器人
125
103
 
@@ -130,9 +108,7 @@ nvm use 18
130
108
  5. 在「API 配置」区域:
131
109
  - 连接方式选择「**使用长连接**」
132
110
  - 点击「获取 Secret」
133
- 6. 记录以下信息:
134
- - **Bot ID**:机器人唯一标识
135
- - **Secret**:长连接密钥
111
+ 6. 记录 **Bot ID** 和 **Secret**
136
112
 
137
113
  > ⚠️ 每个机器人同时只能保持一个 WebSocket 长连接
138
114
 
@@ -142,79 +118,48 @@ nvm use 18
142
118
  npx @vrs-soft/wecom-aibot-mcp
143
119
  ```
144
120
 
145
- 配置向导会引导您完成以下步骤:
146
-
147
- 1. **输入 Bot ID** - 从企业微信管理后台复制
148
- 2. **输入 Secret** - 从企业微信管理后台复制
149
- 3. **发送消息识别用户** - 让需要接收审批消息的人,在企业微信中给机器人发送一条消息,系统会自动识别其用户 ID
121
+ 配置向导会引导您:
122
+ 1. 输入**机器人名称**(用于识别,如"工作机器人")
123
+ 2. 输入 **Bot ID**
124
+ 3. 输入 **Secret**
125
+ 4. 在企业微信中给机器人发送消息,自动识别用户 ID
150
126
 
151
- > ✅ 无需手动查找用户 ID,系统会自动识别并回复确认消息
127
+ 配置完成后会自动:
128
+ - 写入机器人配置到 `~/.wecom-aibot-mcp/config.json`
129
+ - 写入 MCP 配置到 `~/.claude.json`
130
+ - 注册 PermissionRequest hook 到 `~/.claude/settings.local.json`
131
+ - 安装 headless-mode skill 到 `~/.claude/skills/`
132
+ - 后台启动 MCP 服务
152
133
 
153
- ### 常用命令
134
+ ## 常用命令
154
135
 
155
136
  | 命令 | 说明 |
156
137
  |------|------|
157
138
  | `npx @vrs-soft/wecom-aibot-mcp` | 首次配置向导 |
158
- | `npx @vrs-soft/wecom-aibot-mcp --config` | 修改现有配置 |
139
+ | `npx @vrs-soft/wecom-aibot-mcp --start` | 后台启动 MCP 服务 |
140
+ | `npx @vrs-soft/wecom-aibot-mcp --stop` | 停止 MCP 服务 |
141
+ | `npx @vrs-soft/wecom-aibot-mcp --status` | 查看状态 |
142
+ | `npx @vrs-soft/wecom-aibot-mcp --config` | 修改配置 |
159
143
  | `npx @vrs-soft/wecom-aibot-mcp --add` | 添加新机器人 |
160
144
  | `npx @vrs-soft/wecom-aibot-mcp --delete` | 删除机器人配置 |
161
145
  | `npx @vrs-soft/wecom-aibot-mcp --uninstall` | 完全卸载 |
162
- | `npx @vrs-soft/wecom-aibot-mcp --server` | 启动 HTTP 服务模式 |
163
- | `npx @vrs-soft/wecom-aibot-mcp --status` | 查看当前状态 |
164
146
 
165
- ### 添加新机器人(--add)
147
+ ### 添加新机器人
166
148
 
167
- 适用于多用户场景,每个用户使用独立机器人:
149
+ 适用于团队多人场景:
168
150
 
169
151
  ```bash
170
152
  npx @vrs-soft/wecom-aibot-mcp --add
153
+ # 输入机器人名称(如"张三的机器人")
154
+ # 输入 Bot ID 和 Secret
155
+ # 发送消息识别用户
171
156
  ```
172
157
 
173
- 交互流程:
174
- 1. 输入机器人名称(如"张三的审批助手")
175
- 2. 输入 Bot ID
176
- 3. 输入 Secret
177
- 4. 发送消息识别用户 ID
178
- 5. 选择添加到 MCP 配置的位置
179
-
180
- ### 删除机器人配置(--delete)
181
-
182
- ```bash
183
- npx @vrs-soft/wecom-aibot-mcp --delete
184
- ```
185
-
186
- 交互流程:
187
- 1. 显示已配置的机器人列表
188
- 2. 选择要删除的机器人
189
- 3. 确认删除
190
-
191
- 也可以直接指定机器人名称:
192
- ```bash
193
- npx @vrs-soft/wecom-aibot-mcp --delete "张三的审批助手"
194
- ```
195
-
196
- ### 完全卸载(--uninstall)
197
-
198
- 删除所有配置和文件:
199
-
200
- ```bash
201
- npx @vrs-soft/wecom-aibot-mcp --uninstall
202
- ```
203
-
204
- 这会删除:
205
- - 配置目录:`~/.wecom-aibot-mcp/`
206
- - MCP 配置:`~/.claude.json` 中的所有 `wecom-aibot-*` 条目
207
- - 全局 Hook 配置:`~/.claude/settings.local.json` 中的 PermissionRequest hook
208
- - Skill 文件:`~/.claude/skills/headless-mode/`
209
-
210
- 卸载后如需重新安装:
211
- ```bash
212
- npx @vrs-soft/wecom-aibot-mcp --config
213
- ```
158
+ ## 快速开始
214
159
 
215
- ### 第三步:配置 Claude Code
160
+ ### 配置 Claude Code
216
161
 
217
- 编辑 `~/.claude.json`(不存在则创建):
162
+ 配置向导会自动写入 `~/.claude.json`:
218
163
 
219
164
  ```json
220
165
  {
@@ -227,215 +172,121 @@ npx @vrs-soft/wecom-aibot-mcp --config
227
172
  }
228
173
  ```
229
174
 
230
- > 使用 HTTP Transport,无需在配置中传递环境变量,配置向导会自动管理。
231
-
232
- ### 第四步:启动 MCP 服务
175
+ ### 启动服务
233
176
 
234
177
  ```bash
235
- npx @vrs-soft/wecom-aibot-mcp --server
178
+ npx @vrs-soft/wecom-aibot-mcp --start
236
179
  ```
237
180
 
238
- 服务启动后会显示:
181
+ 输出:
239
182
  ```
240
- ╔════════════════════════════════════════════════════════╗
241
- ║ 企业微信智能机器人 MCP 服务 v1.0.6 ║
242
- ║ Claude Code 审批通道 ║
243
- ╚════════════════════════════════════════════════════════╝
244
-
245
- [mcp] MCP Server 已启动: http://127.0.0.1:18963
246
- [mcp] MCP endpoint: http://127.0.0.1:18963/mcp
247
- [mcp] 健康检查: http://127.0.0.1:18963/health
183
+ [mcp] MCP Server 已在后台启动
184
+ [mcp] HTTP endpoint: http://127.0.0.1:18963/mcp
185
+ [mcp] 健康检查: curl http://127.0.0.1:18963/health
186
+ [mcp] 停止服务: npx @vrs-soft/wecom-aibot-mcp --stop
248
187
  ```
249
188
 
250
- ### 第五步:重启 Claude Code
251
-
252
- 1. 运行 `/mcp` 命令
253
- 2. 选择「Reconnect」重新连接 MCP 服务
189
+ ### 重启 Claude Code
254
190
 
255
- ### 第六步:验证连接
256
-
257
- ```
258
- 你:检查微信连接状态
259
- Claude:(调用 check_connection)
260
- 返回:{"connected":true,"defaultTargetUser":"zhangsan"}
261
- ```
191
+ 运行 `/mcp` 命令,选择「Reconnect」重新连接 MCP 服务。
262
192
 
263
193
  ## 使用示例
264
194
 
265
- ### 场景 1:发送任务完成通知
195
+ ### Headless 模式(远程审批)
266
196
 
267
197
  ```
268
- 你:帮我重构这个函数,完成后微信通知我
198
+ 你:现在开始通过微信联系
269
199
 
270
- Claude:[执行重构操作...]
271
-
272
- Claude:(调用 send_message)
273
- 微信收到:
274
- ┌─────────────────────────┐
275
- │ 【完成】函数重构完成 │
276
- │ │
277
- │ 已将 parseData 函数拆分 │
278
- │ 为 3 个独立函数,提高可读性│
279
- └─────────────────────────┘
280
- ```
281
-
282
- ### 场景 2:远程审批(Headless 模式)
283
-
284
- ```
285
- 你:我要离开电脑前了,现在开始通过微信联系
286
-
287
- Claude:(调用 enter_headless_mode)
288
- 微信收到:【进度】已进入微信模式,所有交互将通过企业微信进行。
200
+ Claude:已进入微信模式,所有交互将通过企业微信进行。
201
+ 微信收到:【cc-1】已进入微信模式,使用机器人「工作机器人」。
289
202
 
290
203
  [你离开电脑,Claude 需要执行删除文件操作]
291
204
 
292
205
  微信收到审批卡片:
293
206
  ┌─────────────────────────┐
294
207
  │ 【待审批】Bash │
295
- │ │
296
208
  │ 执行命令: rm -rf dist │
297
-
298
- │ [允许一次] [永久允许] [拒绝]│
209
+ [允许一次] [拒绝]
299
210
  └─────────────────────────┘
300
211
 
301
212
  [你在手机点击"允许一次"]
302
213
 
303
- Claude 继续执行...
214
+ Claude 继续执行,发送结果到微信。
304
215
 
305
216
  你:我回来了
306
217
 
307
- Claude:(调用 exit_headless_mode)
308
- 微信收到:【进度】已退出微信模式,恢复终端交互。
218
+ Claude:已退出微信模式,恢复终端交互。
309
219
  ```
310
220
 
311
- ### 场景 3:开启智能代批
221
+ ### 发送任务通知
312
222
 
313
223
  ```
314
- 你:开启自动审批
315
-
316
- Claude:(调用 set_auto_approve)
317
- 微信收到:【系统】自动审批已开启,超时 10 分钟后将自动处理审批请求。
318
-
319
- [你离开电脑去开会,超过 10 分钟未响应]
224
+ 你:帮我重构这个函数,完成后微信通知我
320
225
 
321
- Claude:(自动审批,项目内操作允许)
322
- 微信收到:
323
- ┌─────────────────────────┐
324
- │ 【自动审批简报】 │
325
- │ │
326
- │ 由于您长时间未响应,系统 │
327
- │ 已代为处理: │
328
- │ │
329
- │ ✅ npm run build │
330
- │ ✅ 修改 src/index.ts │
331
- │ ❌ rm -rf dist (删除操作)│
332
- └─────────────────────────┘
226
+ Claude:[执行重构...]
227
+ 微信收到:【完成】函数重构完成!
333
228
  ```
334
229
 
335
- ### 场景 4:群聊机器人
230
+ ### 群聊机器人
336
231
 
337
- 将机器人拉入群聊,@机器人 即可触发:
232
+ 将机器人拉入群聊:
338
233
 
339
234
  ```
340
235
  群聊中:
341
- 张三:@Claude助手 帮我查看服务器日志
236
+ 张三:@Claude助手 查看服务器日志
342
237
 
343
- Claude:(执行命令,通过 send_message 发送结果到群聊)
344
- 微信收到:
345
- ┌─────────────────────────┐
346
- │ 📋 服务器日志摘要 │
347
- │ │
348
- │ 最近 10 条错误日志... │
349
- └─────────────────────────┘
238
+ Claude:执行命令,发送结果到群聊
350
239
  ```
351
240
 
352
241
  ## MCP 工具
353
242
 
354
- ### 消息类
355
-
356
243
  | 工具 | 说明 | 参数 |
357
244
  |------|------|------|
358
- | `send_message` | 发送消息到微信 | `content`(内容), `target_user`(可选) |
359
- | `get_pending_messages` | 获取用户消息 | `clear`(是否清空队列) |
360
-
361
- ### 审批类
362
-
363
- | 工具 | 说明 | 参数 |
364
- |------|------|------|
365
- | `send_approval_request` | 发送审批卡片 | `title`, `description`, `request_id` |
366
- | `get_approval_result` | 获取审批结果 | `task_id` |
367
- | `set_auto_approve` | 设置自动审批开关 | `enabled`(布尔值) |
368
-
369
- ### 模式控制
370
-
371
- | 工具 | 说明 |
372
- |------|------|
373
- | `enter_headless_mode` | 进入微信审批模式 |
374
- | `exit_headless_mode` | 退出微信审批模式 |
375
- | `check_connection` | 检查连接状态 |
376
-
377
- ### 辅助类
245
+ | `send_message` | 发送消息到微信 | `content`, `target_user` |
246
+ | `get_pending_messages` | 获取待处理消息(长轮询) | `clear`, `timeout_ms` |
247
+ | `enter_headless_mode` | 进入微信模式 | `agent_name`, `robot_id` |
248
+ | `exit_headless_mode` | 退出微信模式 | `agent_name` |
249
+ | `check_connection` | 检查连接状态 | - |
250
+ | `list_robots` | 列出所有机器人 | - |
251
+ | `get_connection_stats` | 获取连接统计 | `recent_logs` |
252
+ | `detect_user_from_message` | 从消息识别用户 | `timeout` |
253
+ | `get_setup_guide` | 获取安装指南 | - |
378
254
 
379
- | 工具 | 说明 |
380
- |------|------|
381
- | `get_setup_guide` | 获取安装指南 |
382
- | `list_robots` | 列出所有机器人及状态 |
383
- | `get_robot_status` | 查看机器人详细状态 |
384
-
385
- ## 多机器人配置
255
+ ## 配置说明
386
256
 
387
- ### 场景:团队共享
257
+ ### 多机器人配置
388
258
 
389
- 使用 `--add` 命令添加多个机器人:
390
-
391
- ```bash
392
- # 添加张三的机器人
393
- npx @vrs-soft/wecom-aibot-mcp --add
394
- # 输入名称:张三的审批助手
395
- # 输入 Bot ID 和 Secret
396
- # 发送消息识别用户
397
-
398
- # 添加李四的机器人
399
- npx @vrs-soft/wecom-aibot-mcp --add
400
- # 输入名称:李四的审批助手
401
- # ...
402
- ```
403
-
404
- 配置完成后,`~/.claude.json` 会包含多个实例:
259
+ 支持多个机器人独立使用:
405
260
 
406
261
  ```json
262
+ // ~/.wecom-aibot-mcp/config.json
407
263
  {
408
- "mcpServers": {
409
- "wecom-aibot-zhangsan": {
410
- "type": "http",
411
- "url": "http://127.0.0.1:18963/mcp"
412
- },
413
- "wecom-aibot-lisi": {
414
- "type": "http",
415
- "url": "http://127.0.0.1:18963/mcp"
416
- }
417
- }
264
+ "botId": "bot-xxx",
265
+ "secret": "sec-yyy",
266
+ "targetUserId": "user1",
267
+ "nameTag": "机器人1"
418
268
  }
419
- ```
420
269
 
421
- ### 查看机器人列表
422
-
423
- ```bash
424
- npx @vrs-soft/wecom-aibot-mcp --status
270
+ // ~/.wecom-aibot-mcp/robot-1234567890.json
271
+ {
272
+ "botId": "bot-zzz",
273
+ "secret": "sec-www",
274
+ "targetUserId": "user2",
275
+ "nameTag": "机器人2"
276
+ }
425
277
  ```
426
278
 
427
- 或在 Claude Code 中:
428
- ```
429
- 你:列出所有机器人
430
- Claude:(调用 list_robots)
431
- 返回:
279
+ 使用 `list_robots` 查看所有机器人状态:
280
+
281
+ ```json
432
282
  {
433
283
  "robots": [
434
- {"projectDir": "...", "status": "connected", "defaultUser": "zhangsan"},
435
- {"projectDir": "...", "status": "connected", "defaultUser": "lisi"}
284
+ {"name": "机器人1", "status": "connected"},
285
+ {"name": "机器人2", "status": "available"}
436
286
  ],
437
287
  "total": 2,
438
- "available": 2
288
+ "connected": 1,
289
+ "occupied": 0
439
290
  }
440
291
  ```
441
292
 
@@ -443,83 +294,35 @@ Claude:(调用 list_robots)
443
294
 
444
295
  ### 认证失败(错误码 40058)
445
296
 
446
- **可能原因**:
447
- - 机器人未授权
448
- - Bot ID Secret 配置错误
449
- - 新建机器人需要等待同步时间
450
-
451
- **解决方法**:
452
- ```
453
- 1. 新建机器人需要等待约 2 分钟同步时间,请稍后再试
454
-
455
- 2. 完成机器人授权(任选其一):
456
- • 在电脑端企业微信APP中打开:机器人详情 → 可使用权限 → 授权
457
- • 打开浏览器访问授权页面,使用手机企业微信扫码:
458
- https://work.weixin.qq.com/ai/aiHelper/authorizationPage?str_aibotid={BotID}&type=6&from=chat&forceInnerBrowser=1
459
-
460
- 3. 确认 Bot ID 和 Secret 是否正确:
461
- npx @vrs-soft/wecom-aibot-mcp --status
297
+ 1. 新建机器人需等待约 2 分钟同步
298
+ 2. 完成授权:机器人详情 → 可使用权限 → 授权
299
+ 3. 检查 Bot ID Secret 是否正确
462
300
 
463
- 4. 如需重新配置:
464
- npx @vrs-soft/wecom-aibot-mcp --config
465
- ```
466
-
467
- ### 无法收到消息
468
-
469
- **可能原因**:
470
- - 机器人未添加到通讯录
471
- - 群聊中未 @机器人
472
- - WebSocket 连接断开
473
-
474
- **解决方法**:
475
- ```
476
- 1. 在企业微信中搜索机器人名称,添加到通讯录
477
- 2. 群聊中必须 @机器人 才能触发消息
478
- 3. 运行 check_connection 检查连接状态
479
- ```
301
+ ### 连接问题
480
302
 
481
- ### 连接失败
482
-
483
- **检查项**:
484
303
  ```bash
485
- # 1. 检查网络连通性
486
- curl -v wss://openws.work.weixin.qq.com
487
-
488
- # 2. 检查 HTTP 服务状态
304
+ # 检查服务状态
489
305
  curl http://127.0.0.1:18963/health
490
306
 
491
- # 3. 查看进程日志
492
- # 重启 MCP 服务,观察启动日志
493
- ```
494
-
495
- ### 审批没发到微信
496
-
497
- **检查 headless 状态**:
498
- ```bash
499
- # 查看状态文件
500
- ls ~/.wecom-aibot-mcp/headless-*
307
+ # 查看日志
308
+ tail -f ~/.wecom-aibot-mcp/connection.log
501
309
 
502
- # 如果没有文件,说明不在 headless 模式
503
- # 需要告诉 Claude:「现在开始通过微信联系」
310
+ # 重启服务
311
+ npx @vrs-soft/wecom-aibot-mcp --stop
312
+ npx @vrs-soft/wecom-aibot-mcp --start
504
313
  ```
505
314
 
506
- ### 残留文件清理
315
+ ### 完全卸载
507
316
 
508
317
  ```bash
509
- # 查看残留文件
510
- ls ~/.wecom-aibot-mcp/
511
-
512
- # MCP 服务重启会自动清理孤儿文件
513
- # 或使用卸载命令彻底清理
514
318
  npx @vrs-soft/wecom-aibot-mcp --uninstall
515
319
  ```
516
320
 
517
- ## 安全建议
518
-
519
- 1. **保护凭证**:Bot ID 和 Secret 不要提交到代码仓库
520
- 2. **定期轮换**:建议每 3 个月更换一次 Secret
521
- 3. **权限最小化**:机器人的可见范围设置为需要的用户/部门即可
522
- 4. **谨慎使用自动审批**:仅在信任的环境下开启
321
+ 这会删除:
322
+ - `~/.wecom-aibot-mcp/`
323
+ - `~/.claude.json` 中的 wecom-aibot 配置
324
+ - `~/.claude/settings.local.json` 中的 hook
325
+ - `~/.claude/skills/headless-mode/`
523
326
 
524
327
  ## 开发
525
328
 
@@ -531,14 +334,14 @@ cd wecom-aibot-mcp
531
334
  # 安装依赖
532
335
  npm install
533
336
 
534
- # 开发模式(自动重新编译)
337
+ # 开发模式
535
338
  npm run dev
536
339
 
537
340
  # 构建
538
341
  npm run build
539
342
 
540
- # 运行服务
541
- node dist/bin.js --server
343
+ # 测试
344
+ npm test
542
345
  ```
543
346
 
544
347
  ## License
@@ -549,4 +352,4 @@ MIT
549
352
 
550
353
  - [企业微信智能机器人文档](https://developer.work.weixin.qq.com/document/path/101039)
551
354
  - [Claude Code 文档](https://docs.anthropic.com/claude-code)
552
- - [MCP 协议规范](https://modelcontextprotocol.io)
355
+ - [MCP 协议规范](https://modelcontextprotocol.io)
@@ -0,0 +1,38 @@
1
+ /**
2
+ * 审批管理器
3
+ *
4
+ * 负责:
5
+ * 1. 存储 pendingApprovals Map(http-server 审批记录)
6
+ * 2. 持久化到 approval-state.json,MCP 重启后恢复
7
+ * 3. 恢复时将 approvalRecord 注入对应的 WecomClient
8
+ *
9
+ * 与 WecomClient.approvals 的关系:
10
+ * - WecomClient.approvals 记录企业微信卡片状态(用户点击后更新)
11
+ * - approval-manager 记录 http-server 层的审批条目
12
+ * - MCP 重启后,WecomClient 实例是全新的,需要 injectApprovalRecord 恢复
13
+ */
14
+ export interface ApprovalEntry {
15
+ taskId: string;
16
+ status: 'pending' | 'allow-once' | 'allow-always' | 'deny';
17
+ timestamp: number;
18
+ tool_name: string;
19
+ tool_input: Record<string, unknown>;
20
+ description: string;
21
+ robotName: string;
22
+ }
23
+ /**
24
+ * 设置配置目录(仅用于测试)
25
+ */
26
+ export declare function setConfigDir(dir: string): void;
27
+ export declare function addApproval(entry: ApprovalEntry): void;
28
+ export declare function getApproval(taskId: string): ApprovalEntry | undefined;
29
+ export declare function updateApprovalStatus(taskId: string, status: 'allow-once' | 'allow-always' | 'deny'): void;
30
+ export declare function getPendingApprovals(): Map<string, ApprovalEntry>;
31
+ export declare function saveApprovalState(): void;
32
+ /**
33
+ * 从文件恢复审批状态,并将审批记录注入对应的 WecomClient
34
+ * 需在 connectAllRobots() 完成后调用,确保 client 已存在
35
+ */
36
+ export declare function loadApprovalState(getClientFn: (robotName: string) => Promise<import('./client.js').WecomClient | null>): Promise<void>;
37
+ export declare function startAutoSave(): void;
38
+ export declare function stopAutoSave(): void;