ylib-wecom-openclaw-plugin 2026.4.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.
Files changed (180) hide show
  1. package/README.md +596 -0
  2. package/dist/index.d.ts +10 -0
  3. package/dist/index.js +99 -0
  4. package/dist/src/accounts.d.ts +57 -0
  5. package/dist/src/accounts.js +247 -0
  6. package/dist/src/agent/api-client.d.ts +95 -0
  7. package/dist/src/agent/api-client.js +425 -0
  8. package/dist/src/agent/handler.d.ts +64 -0
  9. package/dist/src/agent/handler.js +731 -0
  10. package/dist/src/agent/index.d.ts +5 -0
  11. package/dist/src/agent/index.js +21 -0
  12. package/dist/src/agent/webhook.d.ts +25 -0
  13. package/dist/src/agent/webhook.js +294 -0
  14. package/dist/src/agent/xml.d.ts +21 -0
  15. package/dist/src/agent/xml.js +43 -0
  16. package/dist/src/channel.d.ts +5 -0
  17. package/dist/src/channel.js +815 -0
  18. package/dist/src/chat-queue.d.ts +31 -0
  19. package/dist/src/chat-queue.js +53 -0
  20. package/dist/src/config-schema.d.ts +587 -0
  21. package/dist/src/config-schema.js +146 -0
  22. package/dist/src/const.d.ts +128 -0
  23. package/dist/src/const.js +168 -0
  24. package/dist/src/dm-policy.d.ts +29 -0
  25. package/dist/src/dm-policy.js +146 -0
  26. package/dist/src/dynamic-agent.d.ts +37 -0
  27. package/dist/src/dynamic-agent.js +67 -0
  28. package/dist/src/dynamic-routing.d.ts +65 -0
  29. package/dist/src/dynamic-routing.js +62 -0
  30. package/dist/src/endpoint-dispatch.d.ts +54 -0
  31. package/dist/src/endpoint-dispatch.js +967 -0
  32. package/dist/src/endpoint-event-adapter.d.ts +15 -0
  33. package/dist/src/endpoint-event-adapter.js +427 -0
  34. package/dist/src/group-policy.d.ts +30 -0
  35. package/dist/src/group-policy.js +126 -0
  36. package/dist/src/http.d.ts +27 -0
  37. package/dist/src/http.js +168 -0
  38. package/dist/src/im-runtime-telemetry.d.ts +25 -0
  39. package/dist/src/im-runtime-telemetry.js +68 -0
  40. package/dist/src/interface.d.ts +192 -0
  41. package/dist/src/interface.js +5 -0
  42. package/dist/src/markdown-chunk.d.ts +1 -0
  43. package/dist/src/markdown-chunk.js +396 -0
  44. package/dist/src/mcp/index.d.ts +6 -0
  45. package/dist/src/mcp/index.js +28 -0
  46. package/dist/src/mcp/interceptors/biz-error.d.ts +11 -0
  47. package/dist/src/mcp/interceptors/biz-error.js +73 -0
  48. package/dist/src/mcp/interceptors/doc-auth-error.d.ts +10 -0
  49. package/dist/src/mcp/interceptors/doc-auth-error.js +235 -0
  50. package/dist/src/mcp/interceptors/index.d.ts +35 -0
  51. package/dist/src/mcp/interceptors/index.js +143 -0
  52. package/dist/src/mcp/interceptors/msg-media.d.ts +11 -0
  53. package/dist/src/mcp/interceptors/msg-media.js +201 -0
  54. package/dist/src/mcp/interceptors/smartpage-create.d.ts +30 -0
  55. package/dist/src/mcp/interceptors/smartpage-create.js +252 -0
  56. package/dist/src/mcp/interceptors/smartpage-export.d.ts +17 -0
  57. package/dist/src/mcp/interceptors/smartpage-export.js +135 -0
  58. package/dist/src/mcp/interceptors/smartsheet-upload.d.ts +22 -0
  59. package/dist/src/mcp/interceptors/smartsheet-upload.js +388 -0
  60. package/dist/src/mcp/interceptors/types.d.ts +64 -0
  61. package/dist/src/mcp/interceptors/types.js +8 -0
  62. package/dist/src/mcp/schema.d.ts +11 -0
  63. package/dist/src/mcp/schema.js +115 -0
  64. package/dist/src/mcp/tool.d.ts +63 -0
  65. package/dist/src/mcp/tool.js +318 -0
  66. package/dist/src/mcp/transport.d.ts +94 -0
  67. package/dist/src/mcp/transport.js +702 -0
  68. package/dist/src/media-handler.d.ts +55 -0
  69. package/dist/src/media-handler.js +306 -0
  70. package/dist/src/media-uploader.d.ts +142 -0
  71. package/dist/src/media-uploader.js +446 -0
  72. package/dist/src/message-parser.d.ts +104 -0
  73. package/dist/src/message-parser.js +232 -0
  74. package/dist/src/message-sender.d.ts +54 -0
  75. package/dist/src/message-sender.js +210 -0
  76. package/dist/src/monitor.d.ts +69 -0
  77. package/dist/src/monitor.js +1846 -0
  78. package/dist/src/onboarding.d.ts +8 -0
  79. package/dist/src/onboarding.js +248 -0
  80. package/dist/src/openclaw-compat.d.ts +148 -0
  81. package/dist/src/openclaw-compat.js +839 -0
  82. package/dist/src/proactive-markdown-send.d.ts +14 -0
  83. package/dist/src/proactive-markdown-send.js +205 -0
  84. package/dist/src/reqid-store.d.ts +23 -0
  85. package/dist/src/reqid-store.js +136 -0
  86. package/dist/src/runtime.d.ts +2 -0
  87. package/dist/src/runtime.js +7 -0
  88. package/dist/src/shared/command-auth.d.ts +23 -0
  89. package/dist/src/shared/command-auth.js +112 -0
  90. package/dist/src/shared/xml-parser.d.ts +46 -0
  91. package/dist/src/shared/xml-parser.js +228 -0
  92. package/dist/src/state-dir-resolve.d.ts +2 -0
  93. package/dist/src/state-dir-resolve.js +33 -0
  94. package/dist/src/state-manager.d.ts +115 -0
  95. package/dist/src/state-manager.js +413 -0
  96. package/dist/src/target.d.ts +35 -0
  97. package/dist/src/target.js +71 -0
  98. package/dist/src/template-card-manager.d.ts +55 -0
  99. package/dist/src/template-card-manager.js +316 -0
  100. package/dist/src/template-card-parser.d.ts +37 -0
  101. package/dist/src/template-card-parser.js +672 -0
  102. package/dist/src/timeout.d.ts +20 -0
  103. package/dist/src/timeout.js +57 -0
  104. package/dist/src/types/account.d.ts +29 -0
  105. package/dist/src/types/account.js +5 -0
  106. package/dist/src/types/config.d.ts +98 -0
  107. package/dist/src/types/config.js +8 -0
  108. package/dist/src/types/constants.d.ts +42 -0
  109. package/dist/src/types/constants.js +45 -0
  110. package/dist/src/types/index.d.ts +7 -0
  111. package/dist/src/types/index.js +17 -0
  112. package/dist/src/types/message.d.ts +238 -0
  113. package/dist/src/types/message.js +6 -0
  114. package/dist/src/utils.d.ts +148 -0
  115. package/dist/src/utils.js +92 -0
  116. package/dist/src/version.d.ts +2 -0
  117. package/dist/src/version.js +28 -0
  118. package/dist/src/webhook/command-auth.d.ts +47 -0
  119. package/dist/src/webhook/command-auth.js +137 -0
  120. package/dist/src/webhook/gateway.d.ts +36 -0
  121. package/dist/src/webhook/gateway.js +297 -0
  122. package/dist/src/webhook/handler.d.ts +19 -0
  123. package/dist/src/webhook/handler.js +481 -0
  124. package/dist/src/webhook/helpers.d.ts +157 -0
  125. package/dist/src/webhook/helpers.js +936 -0
  126. package/dist/src/webhook/http.d.ts +27 -0
  127. package/dist/src/webhook/http.js +168 -0
  128. package/dist/src/webhook/index.d.ts +11 -0
  129. package/dist/src/webhook/index.js +43 -0
  130. package/dist/src/webhook/media.d.ts +30 -0
  131. package/dist/src/webhook/media.js +152 -0
  132. package/dist/src/webhook/monitor.d.ts +59 -0
  133. package/dist/src/webhook/monitor.js +1672 -0
  134. package/dist/src/webhook/state.d.ts +220 -0
  135. package/dist/src/webhook/state.js +568 -0
  136. package/dist/src/webhook/target.d.ts +41 -0
  137. package/dist/src/webhook/target.js +165 -0
  138. package/dist/src/webhook/types.d.ts +348 -0
  139. package/dist/src/webhook/types.js +36 -0
  140. package/dist/src/webhook/video-frame.d.ts +13 -0
  141. package/dist/src/webhook/video-frame.js +108 -0
  142. package/openclaw.plugin.json +19 -0
  143. package/package.json +96 -0
  144. package/schema.json +534 -0
  145. package/scripts/generate-schema.mjs +33 -0
  146. package/skills/wecom-contact/SKILL.md +162 -0
  147. package/skills/wecom-doc/SKILL.md +162 -0
  148. package/skills/wecom-doc/references/create-doc.md +56 -0
  149. package/skills/wecom-doc/references/edit-doc-content.md +68 -0
  150. package/skills/wecom-doc/references/get-doc-content.md +88 -0
  151. package/skills/wecom-doc/references/smartpage-create.md +125 -0
  152. package/skills/wecom-doc/references/smartpage-export.md +160 -0
  153. package/skills/wecom-meeting/SKILL.md +441 -0
  154. package/skills/wecom-meeting/references/example-full.md +30 -0
  155. package/skills/wecom-meeting/references/example-reminder.md +46 -0
  156. package/skills/wecom-meeting/references/example-security.md +22 -0
  157. package/skills/wecom-meeting/references/response-get-meeting-info.md +148 -0
  158. package/skills/wecom-msg/SKILL.md +157 -0
  159. package/skills/wecom-msg/references/api-get-messages.md +93 -0
  160. package/skills/wecom-msg/references/api-get-msg-chat-list.md +58 -0
  161. package/skills/wecom-msg/references/api-get-msg-media.md +44 -0
  162. package/skills/wecom-msg/references/api-send-message.md +39 -0
  163. package/skills/wecom-preflight/SKILL.md +141 -0
  164. package/skills/wecom-schedule/SKILL.md +161 -0
  165. package/skills/wecom-schedule/references/api-check-availability.md +56 -0
  166. package/skills/wecom-schedule/references/api-create-schedule.md +38 -0
  167. package/skills/wecom-schedule/references/api-get-schedule-detail.md +81 -0
  168. package/skills/wecom-schedule/references/api-update-schedule.md +32 -0
  169. package/skills/wecom-schedule/references/ref-reminders.md +24 -0
  170. package/skills/wecom-send-media/SKILL.md +68 -0
  171. package/skills/wecom-send-template-card/SKILL.md +157 -0
  172. package/skills/wecom-send-template-card/references/api-template-card-types.md +358 -0
  173. package/skills/wecom-smartsheet/SKILL.md +164 -0
  174. package/skills/wecom-smartsheet/references/smartsheet-cell-value-formats.md +163 -0
  175. package/skills/wecom-smartsheet/references/smartsheet-field-types.md +44 -0
  176. package/skills/wecom-smartsheet/references/smartsheet-get-records.md +96 -0
  177. package/skills/wecom-smartsheet/references/webhook-examples.md +185 -0
  178. package/skills/wecom-smartsheet/references/webhook-fallback.md +184 -0
  179. package/skills/wecom-todo/SKILL.md +392 -0
  180. package/skills/wecom-todo/examples/workflows.md +163 -0
@@ -0,0 +1,22 @@
1
+ # 创建会议 - 安全设置场景示例
2
+
3
+ ## 场景 4: 会议密码 + 等候室 + 主持人设置
4
+
5
+ **用户意图**: "帮我创建一个重要的客户汇报会议, 需要设置密码1234, 开启等候室, 不允许外部人员入会"
6
+
7
+ ```json
8
+ {
9
+ "title": "客户汇报会议",
10
+ "meeting_start_datetime": "2026-03-19 14:00",
11
+ "meeting_duration": 5400,
12
+ "invitees": {
13
+ "userid": ["zhangsan", "lisi", "wangwu"]
14
+ },
15
+ "settings": {
16
+ "password": "1234",
17
+ "enable_waiting_room": true,
18
+ "allow_enter_before_host": false,
19
+ "allow_external_user": false
20
+ }
21
+ }
22
+ ```
@@ -0,0 +1,148 @@
1
+ # 获取会议详情 (get_meeting_info) - 返回参数
2
+
3
+ ## 返回参数
4
+
5
+ ```json
6
+ {
7
+ "errcode": 0,
8
+ "errmsg": "ok",
9
+ "creator_userid": "创建者userid",
10
+ "admin_userid": "会议管理userid (与 creator_userid 有且仅返回一个)",
11
+ "title": "会议标题",
12
+ "meeting_start_datetime": "YYYY-MM-DD HH:mm",
13
+ "meeting_duration": "会议时长秒数",
14
+ "description": "会议描述文本",
15
+ "location": "会议地点文本",
16
+ "main_department": "创建者主部门ID",
17
+ "status": "会议状态枚举值",
18
+ "meeting_type": "会议类型枚举值",
19
+ "attendees": {
20
+ "member": [
21
+ {
22
+ "userid": "内部成员userid",
23
+ "status": "与会状态枚举值",
24
+ "first_join_datetime": "YYYY-MM-DD HH:mm",
25
+ "last_quit_datetime": "YYYY-MM-DD HH:mm",
26
+ "total_join_count": "加入次数",
27
+ "cumulative_time": "累计在会时长秒数"
28
+ }
29
+ ],
30
+ "tmp_external_user": [
31
+ {
32
+ "tmp_external_userid": "外部临时用户ID",
33
+ "status": "与会状态枚举值",
34
+ "first_join_datetime": "YYYY-MM-DD HH:mm",
35
+ "last_quit_datetime": "YYYY-MM-DD HH:mm",
36
+ "total_join_count": "加入次数",
37
+ "cumulative_time": "累计在会时长秒数"
38
+ }
39
+ ]
40
+ },
41
+ "settings": {
42
+ "remind_scope": "提醒范围枚举值",
43
+ "need_password": "是否需要密码布尔值",
44
+ "password": "会议密码",
45
+ "enable_waiting_room": "是否启用等候室布尔值",
46
+ "allow_enter_before_host": "是否允许提前入会布尔值",
47
+ "enable_enter_mute": "入会静音枚举值",
48
+ "allow_unmute_self": "是否允许自我解除静音布尔值",
49
+ "allow_external_user": "是否允许外部用户布尔值",
50
+ "enable_screen_watermark": "是否开启水印布尔值",
51
+ "watermark_type": "水印类型枚举值",
52
+ "auto_record_type": "录制类型枚举字符串",
53
+ "attendee_join_auto_record": "参会者加入自动录制布尔值",
54
+ "enable_host_pause_auto_record": "主持人可暂停录制布尔值",
55
+ "enable_doc_upload_permission": "允许上传文档布尔值",
56
+ "enable_enroll": "是否开启报名布尔值",
57
+ "enable_host_key": "是否启用主持人密钥布尔值",
58
+ "host_key": "主持人密钥字符串",
59
+ "hosts": {"userid": ["主持人userid列表"]},
60
+ "current_hosts": {"userid": ["当前主持人userid列表"]},
61
+ "co_hosts": {"userid": ["联席主持人userid列表"]},
62
+ "ring_users": {"userid": ["响铃用户userid列表"]}
63
+ },
64
+ "meeting_code": "会议号码字符串",
65
+ "meeting_link": "会议链接URL",
66
+ "has_vote": "是否有投票布尔值",
67
+ "has_more_sub_meeting": "是否还有更多子会议枚举值",
68
+ "remain_sub_meetings": "剩余子会议场数",
69
+ "current_sub_meetingid": "当前子会议ID",
70
+ "guests": [
71
+ {
72
+ "area": "国际区号",
73
+ "phone_number": "手机号字符串",
74
+ "guest_name": "嘉宾姓名"
75
+ }
76
+ ],
77
+ "reminders": {
78
+ "is_repeat": "是否周期性枚举值",
79
+ "repeat_type": "重复类型枚举值",
80
+ "repeat_until_type": "结束类型枚举值",
81
+ "repeat_until_count": "限定次数",
82
+ "repeat_until_datetime": "YYYY-MM-DD HH:mm",
83
+ "repeat_interval": "重复间隔数值",
84
+ "is_custom_repeat": "是否自定义重复枚举值",
85
+ "repeat_day_of_week": ["星期几数组"],
86
+ "repeat_day_of_month": ["日期数组"],
87
+ "remind_before": ["提醒秒数数组"]
88
+ },
89
+ "sub_meetings": [
90
+ {
91
+ "sub_meetingid": "子会议ID",
92
+ "status": "子会议状态枚举值",
93
+ "start_datetime": "YYYY-MM-DD HH:mm",
94
+ "end_datetime": "YYYY-MM-DD HH:mm",
95
+ "title": "子会议标题",
96
+ "repeat_id": "周期性会议分段ID"
97
+ }
98
+ ],
99
+ "sub_repeat_list": [
100
+ {
101
+ "repeat_id": "周期性会议分段ID",
102
+ "repeat_type": "重复类型枚举值",
103
+ "repeat_until_type": "结束类型枚举值",
104
+ "repeat_until_count": "限定次数",
105
+ "repeat_until_datetime": "YYYY-MM-DD HH:mm",
106
+ "repeat_interval": "重复间隔数值",
107
+ "is_custom_repeat": "是否自定义重复枚举值",
108
+ "repeat_day_of_week": ["星期几数组"],
109
+ "repeat_day_of_month": ["日期数组"]
110
+ }
111
+ ]
112
+ }
113
+ ```
114
+
115
+ ## 关键返回字段
116
+
117
+ | 字段 | 类型 | 说明 |
118
+ | --------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------- |
119
+ | `creator_userid` | string | 创建者 userid,与 `admin_userid` 有且仅返回一个 |
120
+ | `admin_userid` | string | 会议管理 userid,与 `creator_userid` 有且仅返回一个 |
121
+ | `title` | string | 会议标题 |
122
+ | `meeting_start_datetime` | string | 会议开始时间 |
123
+ | `meeting_duration` | integer | 会议时长 (秒) |
124
+ | `main_department` | integer | 创建者所属主部门 |
125
+ | `status` | integer | 会议状态 (1: 待开始,2: 会议中,3: 已结束,4: 已取消,5: 已过期) |
126
+ | `meeting_type` | integer | 会议类型 (0: 一次性会议,1: 周期性会议,2: 微信专属会议,3: Rooms 投屏会议,5: 个人会议号会议,6: 网络研讨会) |
127
+ | `meeting_code` | string | 会议号码 |
128
+ | `meeting_link` | string | 会议链接 |
129
+ | `attendees.member` | array | 内部参与者列表 |
130
+ | `attendees.member[].status` | integer | 与会状态 (1: 已参与,2: 未参与) |
131
+ | `attendees.tmp_external_user` | array | 外部参与者 (临时 ID) |
132
+ | `attendees.tmp_external_user[].status` | integer | 与会状态 (1: 已参与,2: 未参与) |
133
+ | `guests` | array | 外部嘉宾列表,每项含 `area`,`phone_number`,`guest_name` |
134
+ | `current_sub_meetingid` | string | 当前子会议 ID |
135
+ | `settings.ring_users` | object | 响铃用户列表 |
136
+ | `settings.need_password` | boolean | 是否需要密码 (只读字段) |
137
+ | `settings.enable_doc_upload_permission` | boolean | 是否允许成员上传文档 |
138
+ | `settings.hosts` | object | 主持人列表 |
139
+ | `settings.current_hosts` | object | 当前主持人列表 |
140
+ | `settings.co_hosts` | object | 联席主持人列表 |
141
+ | `reminders` | object | 周期性配置 |
142
+ | `has_vote` | boolean | 是否有投票 (仅会议创建人和主持人有权限查询) |
143
+ | `has_more_sub_meeting` | integer | 是否还有更多子会议特例 (0: 无更多,1: 有更多) |
144
+ | `remain_sub_meetings` | integer | 剩余子会议场数 |
145
+ | `sub_meetings` | array | 子会议列表 |
146
+ | `sub_meetings[].status` | integer | 子会议状态 (0: 默认/存在,1: 已删除) |
147
+ | `sub_meetings[].repeat_id` | string | 周期性会议分段 ID,用于关联子会议所属分段 |
148
+ | `sub_repeat_list` | array | 周期性会议分段信息,修改周期性会议某一场后可能产生不同分段,各分段有不同重复规则 |
@@ -0,0 +1,157 @@
1
+ ---
2
+ name: wecom-msg
3
+ description: 企业微信消息技能。提供会话列表查询、消息记录拉取(支持文本/图片/文件/语音/视频)、多媒体文件获取和文本消息发送能力。当用户需要"查看消息"、"看聊天记录"、"发消息给某人"、"最近有什么消息"、"给群里发消息"、"看看发了什么图片/文件"时触发。
4
+ metadata:
5
+ {
6
+ "openclaw": { "emoji": "💬" },
7
+ }
8
+ ---
9
+
10
+ # 企业微信消息技能
11
+
12
+ > `wecom_mcp` 是一个 MCP tool,所有操作通过调用该 tool 完成。
13
+
14
+ > ⚠️ **前置条件**:首次调用 `wecom_mcp` 前,必须按 `wecom-preflight` 技能执行前置条件检查,确保工具已加入白名单。
15
+
16
+ 通过 `wecom_mcp call msg <接口名> '<json入参>'` 与企业微信消息系统交互。
17
+
18
+ ---
19
+
20
+ ## 接口列表
21
+
22
+ ### get_msg_chat_list — 获取会话列表
23
+
24
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call msg get_msg_chat_list '{"begin_time": "2026-03-11 00:00:00", "end_time": "2026-03-17 23:59:59"}'`
25
+
26
+ 按时间范围查询有消息的会话列表,支持分页。参见 [API 详情](references/api-get-msg-chat-list.md)。
27
+
28
+ ### get_message — 拉取会话消息
29
+
30
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call msg get_message '{"chat_type": 1, "chatid": "zhangsan", "begin_time": "2026-03-17 09:00:00", "end_time": "2026-03-17 18:00:00"}'`
31
+
32
+ 根据会话类型和 ID 拉取指定时间范围内的消息记录,支持分页。支持 text/image/file/voice/video 消息类型,仅支持 7 天内。参见 [API 详情](references/api-get-messages.md)。
33
+
34
+ ### get_msg_media — 获取消息文件内容
35
+
36
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call msg get_msg_media '{"media_id": "MEDIAID_xxxxxx"}'`
37
+
38
+ 根据文件 ID 自动下载文件到本地,返回文件的本地路径(`local_path`)、名称、类型、大小及 MIME 类型。用于获取图片、文件、语音、视频等非文本消息的实际内容。参见 [API 详情](references/api-get-msg-media.md)。
39
+
40
+ ### send_message — 发送文本消息
41
+
42
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call msg send_message '{"chat_type": 1, "chatid": "zhangsan", "msgtype": "text", "text": {"content": "hello world"}}'`
43
+
44
+ 向单聊或群聊发送文本消息。参见 [API 详情](references/api-send-message.md)。
45
+
46
+ ---
47
+
48
+ ## 核心规则
49
+
50
+ ### 时间范围规则
51
+ - **格式**:所有时间参数使用 `YYYY-MM-DD HH:mm:ss` 格式
52
+ - **默认范围**:用户未指定时,默认使用最近7天(当前时间往前推7天)
53
+ - **限制**:开始时间不能早于当前时间的7天前,不能晚于当前时间
54
+ - **相对时间支持**:支持"昨天"、"最近三天"等自动推算
55
+
56
+ ### chatid查找规则
57
+ - 当用户提供人名或群名而非ID时:
58
+ 1. 调用 `get_msg_chat_list` 获取会话列表(时间范围与目标查询一致)
59
+ 2. 在 `chats` 中按 `chat_name` 匹配
60
+ 3. **匹配策略**:
61
+ - 精确匹配唯一结果:直接使用
62
+ - 模糊匹配多个结果:展示候选列表让用户选择
63
+ - 无匹配结果:告知用户未找到
64
+ - **chat_type 判断**:`get_msg_chat_list` 返回中不含会话类型字段,需根据上下文推断:用户明确提到「群」时使用 `chat_type=2`,否则默认 `chat_type=1`(单聊)
65
+
66
+ ### userid转username
67
+ **流程**:
68
+ 1. 调用 `wecom-contact get_userlist` 获取用户列表
69
+ 2. 建立userid到username的映射关系
70
+ 3. **展示策略**:
71
+ - 精确匹配:显示username
72
+ - 无匹配:保持显示userid
73
+
74
+ ### 强制交互步骤(不可跳过)
75
+ 以下步骤在涉及非文本消息下载时**必须逐一执行**,不得合并、省略或跳过,即使用户未主动询问也必须执行:
76
+ 1. **必须主动告知文件位置**:下载完成后必须立即向用户展示所有文件的完整路径和存放目录
77
+ 2. **必须询问是否删除**:告知位置后必须立即询问用户是否需要清理临时文件
78
+
79
+ ---
80
+
81
+ ## 典型工作流
82
+
83
+ ### 查看会话列表
84
+ **用户query示例**:
85
+ - "看看我最近一周有哪些聊天"
86
+ - "这几天谁给我发过消息"
87
+
88
+ **执行流程**:
89
+ 1. 确定时间范围(用户指定或默认最近7天)
90
+ 2. 调用 `get_msg_chat_list` 获取会话列表
91
+ 3. 展示会话名称、最后消息时间、消息数量
92
+ 4. 若 `has_more` 为 `true`,告知用户还有更多会话可继续查看
93
+
94
+ ### 查看聊天记录
95
+ **用户query示例**:
96
+ - "帮我看看和张三最近的聊天记录"
97
+ - "看看项目群里最近的消息"
98
+
99
+ **执行流程**:
100
+ 1. 确定时间范围(用户指定或默认最近7天)
101
+ 2. 通过 **chatid查找规则** 确定目标会话的 `chatid` 和 `chat_type`
102
+ 3. 调用 `get_message` 拉取消息列表
103
+ 4. 调用 `wecom-contact` 的 `get_userlist` 获取通讯录,建立 userid→姓名 映射
104
+ 5. **统计非文本消息**:遍历消息列表,统计 `msgtype` 非 `text` 的消息(image/file/voice/video)数量和类型
105
+ 6. 展示消息时将 `userid` 替换为可读姓名,格式:
106
+ - 文本消息:`姓名 [时间]: 内容`
107
+ - 图片消息:`姓名 [时间]:[图片]`
108
+ - 文件消息:`姓名 [时间]:[文件] 文件名称`
109
+ - 语音消息:`姓名 [时间]:[语音] 语音内容`
110
+ - 视频消息:`姓名 [时间]:[视频]`
111
+ 7. **非文本消息处理**:展示完消息后,如果存在非文本消息:
112
+ - **主动询问是否下载**:告知用户非文本消息数量和类型(如:"以上聊天中包含 2 张图片、1 个文件,是否需要下载到本地?")
113
+ - 用户确认后,逐个调用 `get_msg_media` 接口,接口会自动下载文件并返回 `local_path`
114
+ - **检查文件后缀**:每个文件下载完成后,检查 `local_path` 对应的文件是否具有正确的后缀名:
115
+ - 根据 `get_msg_media` 返回的 `content_type`(MIME 类型)和 `name` 字段判断:
116
+ - 如果文件名缺少后缀(如 `screenshot` 而非 `screenshot.png`),根据 `content_type` 自动补上正确后缀(如 `image/png` → `.png`,`application/pdf` → `.pdf`,`audio/amr` → `.amr`,`video/mp4` → `.mp4`)
117
+ - 如果文件名后缀与 `content_type` 不一致,以 `content_type` 为准进行修正
118
+ - 补全或修正后缀后,将文件重命名为正确的文件名
119
+ - 确认文件可正常读取(文件大小 > 0),若文件为空或损坏则告知用户该文件下载异常
120
+ - ⚠️ **不要对下载的文件使用 `MEDIA:` 指令**:这些文件是从聊天记录中下载的历史附件,仅需告知用户本地存放路径即可,**严禁**通过 `MEDIA:` 指令重新发送给用户
121
+ 8. ⚠️ **必须主动告知文件位置**(此步骤不可跳过):所有文件下载并检查完成后,**必须立即、主动**以汇总形式向用户展示文件存放目录和每个文件的完整路径,不要等用户询问。示例:
122
+ > 📁 文件已下载到以下位置:
123
+ > - 图片:`xxx/yyy.png`
124
+ > - 文件:`xxx/yyy.pdf`
125
+ >
126
+ > 你可以在 `xxx/yyy/` 目录下找到所有下载的文件。
127
+ 9. ⚠️ **必须询问是否删除**(此步骤不可跳过):告知文件位置后,**必须立即、主动**询问用户是否需要删除已下载的临时文件(如:"如果不再需要这些文件,是否需要我帮你清理?")
128
+ - 用户确认删除后,删除 `local_path` 对应的文件
129
+ - 用户不需要删除则保留文件
130
+ 10. 若 `next_cursor` 不为空,告知用户还有更多消息可继续查看
131
+
132
+ ### 发送消息
133
+ **用户query示例**:
134
+ - "帮我给张三发一条消息:明天会议改到下午3点"
135
+ - "在项目群里发一条消息:今天下午3点开会"
136
+
137
+ **执行流程**:
138
+ 1. 通过 **chatid查找规则** 确定目标会话的 `chatid` 和 `chat_type`
139
+ 2. **发送前确认**:向用户确认发送对象和内容(如:"即将向 张三 发送:'明天会议改到下午3点',确认发送吗?"),用户确认后再执行
140
+ 3. 调用 `send_message` 发送(`msgtype` 固定为 `text`)
141
+ 4. 展示发送结果
142
+
143
+ ### 查看消息并回复
144
+ **用户query示例**:
145
+ - "看看张三给我发了什么,然后帮我回复收到"
146
+
147
+ **执行流程**:
148
+ 1. 先执行"查看聊天记录"流程(复用已获取的 `chatid` 和 `chat_type`)
149
+ 2. 展示消息后,执行"发送消息"流程(需确认后再发送)
150
+
151
+ ---
152
+
153
+ ## 错误处理
154
+ - **时间范围超限**:告知用户7天限制并调整为有效范围
155
+ - **会话未找到**:明确告知用户未找到对应会话
156
+ - **API错误**:展示具体错误信息,必要时重试
157
+ - **网络问题**:HTTP错误时主动重试最多3次`
@@ -0,0 +1,93 @@
1
+ # get_message API
2
+
3
+ 根据会话类型和会话 ID,拉取指定时间范围内的消息记录。支持文本、图片、文件、语音、视频类型消息。
4
+
5
+ ## 参数说明
6
+
7
+ | 参数 | 类型 | 必填 | 说明 |
8
+ |------|------|------|------|
9
+ | `chat_type` | integer | ✅ | 会话类型,`1`-单聊,`2`-群聊 |
10
+ | `chatid` | string | ✅ | 会话 ID,单聊时为 userid,群聊时为群 ID,最大 256 字节 |
11
+ | `begin_time` | string | ✅ | 拉取开始时间,格式:`YYYY-MM-DD HH:mm:ss`,仅支持请求时刻往前 **7 天**内 |
12
+ | `end_time` | string | ✅ | 拉取结束时间,格式:`YYYY-MM-DD HH:mm:ss`,必须 ≥ `begin_time` |
13
+ | `cursor` | string | ❌ | 分页游标,首次请求不传,后续传入上次响应的 `next_cursor`,最大 256 字节 |
14
+
15
+ ## 请求示例
16
+
17
+ 单聊:
18
+
19
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call msg get_message '{"chat_type": 1, "chatid": "zhangsan", "begin_time": "2026-03-17 09:00:00", "end_time": "2026-03-17 18:00:00"}'`
20
+
21
+ 群聊:
22
+
23
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call msg get_message '{"chat_type": 2, "chatid": "wrxxxxxxxx", "begin_time": "2026-03-17 09:00:00", "end_time": "2026-03-17 18:00:00"}'`
24
+
25
+ 分页请求:
26
+
27
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call msg get_message '{"chat_type": 1, "chatid": "zhangsan", "begin_time": "2026-03-17 09:00:00", "end_time": "2026-03-17 18:00:00", "cursor": "CURSOR_xxxxxx"}'`
28
+
29
+ ## 返回字段
30
+
31
+ | 字段 | 类型 | 说明 |
32
+ |------|------|------|
33
+ | `errcode` | Integer | 返回码,`0` 表示成功 |
34
+ | `errmsg` | String | 错误信息 |
35
+ | `messages` | Array | 消息列表 |
36
+ | `messages[].userid` | String | 消息发送者的 userid |
37
+ | `messages[].send_time` | String | 消息发送时间(北京时间),格式:`YYYY-MM-DD HH:mm:ss` |
38
+ | `messages[].msgtype` | String | 消息类型,`text`-文本消息,`image`-图片消息,`file`-文件消息,`voice`-语音消息,`video`-视频消息 |
39
+ | `messages[].text` | Object | 文本消息内容,`msgtype` 为 `text` 时返回 |
40
+ | `messages[].text.content` | String | 消息内容 |
41
+ | `messages[].image` | Object | 图片消息内容,`msgtype` 为 `image` 时返回 |
42
+ | `messages[].image.media_id` | String | 图片的 media_id,可通过 `get_msg_media` 接口下载 |
43
+ | `messages[].image.name` | String | 图片文件名称 |
44
+ | `messages[].file` | Object | 文件消息内容,`msgtype` 为 `file` 时返回 |
45
+ | `messages[].file.media_id` | String | 文件的 media_id,可通过 `get_msg_media` 接口下载 |
46
+ | `messages[].file.name` | String | 文件名称 |
47
+ | `messages[].voice` | Object | 语音消息内容,`msgtype` 为 `voice` 时返回 |
48
+ | `messages[].voice.media_id` | String | 语音的 media_id,可通过 `get_msg_media` 接口下载 |
49
+ | `messages[].video` | Object | 视频消息内容,`msgtype` 为 `video` 时返回 |
50
+ | `messages[].video.media_id` | String | 视频的 media_id,可通过 `get_msg_media` 接口下载 |
51
+ | `next_cursor` | String | 分页游标,为空表示已拉取完毕 |
52
+
53
+ ## 响应示例
54
+
55
+ ```json
56
+ {
57
+ "errcode": 0,
58
+ "errmsg": "ok",
59
+ "messages": [
60
+ {
61
+ "userid": "zhangsan",
62
+ "send_time": "2026-03-17 09:30:00",
63
+ "msgtype": "text",
64
+ "text": {
65
+ "content": "你好"
66
+ }
67
+ },
68
+ {
69
+ "userid": "lisi",
70
+ "send_time": "2026-03-17 09:35:00",
71
+ "msgtype": "image",
72
+ "image": {
73
+ "media_id": "MEDIAID_xxxxxx",
74
+ "name": "screenshot.png"
75
+ }
76
+ },
77
+ {
78
+ "userid": "zhangsan",
79
+ "send_time": "2026-03-17 09:40:00",
80
+ "msgtype": "file",
81
+ "file": {
82
+ "media_id": "MEDIAID_yyyyyy",
83
+ "name": "report.pdf"
84
+ }
85
+ }
86
+ ],
87
+ "next_cursor": "CURSOR_xxxxxx"
88
+ }
89
+ ```
90
+
91
+ ## 非文本消息处理
92
+
93
+ 当 `msgtype` 为 `image`、`file`、`voice`、`video` 时,消息体中包含 `media_id`。需要调用 [get_msg_media](api-get-msg-media.md) 接口获取文件的本地路径(`local_path`),再进行展示。
@@ -0,0 +1,58 @@
1
+ # get_msg_chat_list API
2
+
3
+ 获取指定时间范围内有消息的会话列表,支持分页查询。
4
+
5
+ ## 参数说明
6
+
7
+ | 参数 | 类型 | 必填 | 说明 |
8
+ |------|------|------|------|
9
+ | `begin_time` | string | ✅ | 拉取开始时间,格式:`YYYY-MM-DD HH:mm:ss` |
10
+ | `end_time` | string | ✅ | 拉取结束时间,格式:`YYYY-MM-DD HH:mm:ss` |
11
+ | `cursor` | string | ❌ | 分页游标,首次请求不传,后续传入上次响应的 `next_cursor`,最大长度 256 |
12
+
13
+ ## 请求示例
14
+
15
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call msg get_msg_chat_list '{"begin_time": "2026-03-11 00:00:00", "end_time": "2026-03-17 23:59:59"}'`
16
+
17
+ 分页请求:
18
+
19
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call msg get_msg_chat_list '{"begin_time": "2026-03-11 00:00:00", "end_time": "2026-03-17 23:59:59", "cursor": "NEXT_CURSOR"}'`
20
+
21
+ ## 返回字段
22
+
23
+ | 字段 | 类型 | 说明 |
24
+ |------|------|------|
25
+ | `errcode` | integer | 返回码,`0` 表示成功 |
26
+ | `errmsg` | string | 错误信息 |
27
+ | `chats` | array | 会话列表 |
28
+ | `chats[].chat_id` | string | 会话 ID |
29
+ | `chats[].chat_name` | string | 会话名称 |
30
+ | `chats[].last_msg_time` | string | 最后一条消息时间,格式:`YYYY-MM-DD HH:mm:ss` |
31
+ | `chats[].msg_count` | integer | 消息数量 |
32
+ | `has_more` | boolean | 是否还有更多数据 |
33
+ | `next_cursor` | string | 分页游标,用于下一次请求 |
34
+
35
+ ## 响应示例
36
+
37
+ ```json
38
+ {
39
+ "errcode": 0,
40
+ "errmsg": "ok",
41
+ "chats": [
42
+ {
43
+ "chat_id": "CHAT_ID",
44
+ "chat_name": "张三",
45
+ "last_msg_time": "2026-03-17 15:30:45",
46
+ "msg_count": 128
47
+ },
48
+ {
49
+ "chat_id": "CHAT_ID_2",
50
+ "chat_name": "项目讨论群",
51
+ "last_msg_time": "2026-03-16 09:12:33",
52
+ "msg_count": 56
53
+ }
54
+ ],
55
+ "has_more": true,
56
+ "next_cursor": "NEXT_CURSOR"
57
+ }
58
+ ```
@@ -0,0 +1,44 @@
1
+ # get_msg_media API
2
+
3
+ 获取消息文件内容。根据文件 ID 自动下载文件到本地,返回本地文件路径、文件名称、类型、大小及内容类型。
4
+
5
+ ## 参数说明
6
+
7
+ | 参数 | 类型 | 必填 | 说明 |
8
+ |------|------|------|------|
9
+ | `media_id` | string | ✅ | 文件 ID,长度 1~256 |
10
+
11
+ ## 请求示例
12
+
13
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call msg get_msg_media '{"media_id": "MEDIAID_xxxxxx"}'`
14
+
15
+ ## 返回字段
16
+
17
+ | 字段 | 类型 | 说明 |
18
+ |------|------|------|
19
+ | `errcode` | Integer | 返回码,`0` 表示成功 |
20
+ | `errmsg` | String | 错误信息 |
21
+ | `media_item` | Object | 文件内容 |
22
+ | `media_item.media_id` | String | 文件 ID |
23
+ | `media_item.name` | String | 文件名称 |
24
+ | `media_item.type` | String | 文件类型,`image`-图片,`voice`-语音,`video`-视频,`file`-普通文件 |
25
+ | `media_item.local_path` | String | 文件下载后的本地路径 |
26
+ | `media_item.size` | Integer | 文件大小(字节) |
27
+ | `media_item.content_type` | String | 文件 MIME 类型,如 `image/png`、`application/pdf` 等 |
28
+
29
+ ## 响应示例
30
+
31
+ ```json
32
+ {
33
+ "errcode": 0,
34
+ "errmsg": "ok",
35
+ "media_item": {
36
+ "media_id": "MEDIAID_xxxxxx",
37
+ "name": "screenshot.png",
38
+ "type": "image",
39
+ "local_path": "xxx/yyy/screenshot.png",
40
+ "size": 102400,
41
+ "content_type": "image/png"
42
+ }
43
+ }
44
+ ```
@@ -0,0 +1,39 @@
1
+ # send_message API
2
+
3
+ 向单聊或群聊发送文本消息。
4
+
5
+ ## 参数说明
6
+
7
+ | 参数 | 类型 | 必填 | 说明 |
8
+ |------|------|------|------|
9
+ | `chat_type` | integer | ✅ | 会话类型,`1`-单聊,`2`-群聊 |
10
+ | `chatid` | string | ✅ | 会话 ID,单聊时为 userid,群聊时为群 ID,最大 256 字节 |
11
+ | `msgtype` | string | ✅ | 消息类型,目前仅支持 `text` |
12
+ | `text` | object | ✅ | 文本消息内容 |
13
+ | `text.content` | string | ✅ | 消息内容,最大 2048 字节 |
14
+
15
+ ## 请求示例
16
+
17
+ 单聊:
18
+
19
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call msg send_message '{"chat_type": 1, "chatid": "zhangsan", "msgtype": "text", "text": {"content": "hello world"}}'`
20
+
21
+ 群聊:
22
+
23
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call msg send_message '{"chat_type": 2, "chatid": "wrxxxxxxxx", "msgtype": "text", "text": {"content": "大家好"}}'`
24
+
25
+ ## 返回字段
26
+
27
+ | 字段 | 类型 | 说明 |
28
+ |------|------|------|
29
+ | `errcode` | integer | 返回码,`0` 表示成功 |
30
+ | `errmsg` | string | 错误信息 |
31
+
32
+ ## 响应示例
33
+
34
+ ```json
35
+ {
36
+ "errcode": 0,
37
+ "errmsg": "ok"
38
+ }
39
+ ```