@sunnoy/wecom 2.1.0 → 2.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.
- package/README.md +6 -2
- package/index.js +2 -0
- package/openclaw.plugin.json +3 -0
- package/package.json +5 -3
- package/skills/wecom-contact-lookup/SKILL.md +167 -0
- package/skills/wecom-doc-manager/SKILL.md +106 -0
- package/skills/wecom-doc-manager/references/api-create-doc.md +56 -0
- package/skills/wecom-doc-manager/references/api-edit-doc-content.md +68 -0
- package/skills/wecom-doc-manager/references/api-export-document.md +88 -0
- package/skills/wecom-edit-todo/SKILL.md +254 -0
- package/skills/wecom-get-todo-detail/SKILL.md +148 -0
- package/skills/wecom-get-todo-list/SKILL.md +132 -0
- package/skills/wecom-meeting-create/SKILL.md +163 -0
- package/skills/wecom-meeting-create/references/example-full.md +30 -0
- package/skills/wecom-meeting-create/references/example-reminder.md +46 -0
- package/skills/wecom-meeting-create/references/example-security.md +22 -0
- package/skills/wecom-meeting-manage/SKILL.md +141 -0
- package/skills/wecom-meeting-query/SKILL.md +335 -0
- package/skills/wecom-preflight/SKILL.md +103 -0
- package/skills/wecom-schedule/SKILL.md +164 -0
- package/skills/wecom-schedule/references/api-check-availability.md +56 -0
- package/skills/wecom-schedule/references/api-create-schedule.md +38 -0
- package/skills/wecom-schedule/references/api-get-schedule-detail.md +81 -0
- package/skills/wecom-schedule/references/api-update-schedule.md +30 -0
- package/skills/wecom-schedule/references/ref-reminders.md +24 -0
- package/skills/wecom-smartsheet-data/SKILL.md +76 -0
- package/skills/wecom-smartsheet-data/references/api-get-records.md +61 -0
- package/skills/wecom-smartsheet-data/references/cell-value-formats.md +120 -0
- package/skills/wecom-smartsheet-schema/SKILL.md +96 -0
- package/skills/wecom-smartsheet-schema/references/field-types.md +43 -0
- package/wecom/accounts.js +1 -0
- package/wecom/callback-inbound.js +133 -33
- package/wecom/channel-plugin.js +107 -125
- package/wecom/constants.js +83 -3
- package/wecom/mcp-config.js +146 -0
- package/wecom/mcp-tool.js +660 -0
- package/wecom/media-uploader.js +208 -0
- package/wecom/openclaw-compat.js +302 -0
- package/wecom/reqid-store.js +146 -0
- package/wecom/target.js +3 -2
- package/wecom/workspace-template.js +107 -21
- package/wecom/ws-monitor.js +778 -328
- package/image-processor.js +0 -175
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wecom-meeting-query
|
|
3
|
+
description: 企业微信会议查询技能, 支持查询会议列表, 获取会议详情, 按关键词查找会议. 当用户需要"查看会议", "查询会议列表", "会议详情", "什么时候开会", "有哪些会议", "查找会议"时触发.
|
|
4
|
+
---
|
|
5
|
+
# 企业微信会议查询技能
|
|
6
|
+
|
|
7
|
+
> `wecom_mcp` 是一个 MCP tool,所有操作通过调用该 tool 完成。
|
|
8
|
+
|
|
9
|
+
> ⚠️ **前置条件**:首次调用 `wecom_mcp` 前,必须按 `wecom-preflight` 技能执行前置条件检查,确保工具已加入白名单。
|
|
10
|
+
|
|
11
|
+
> ⚠️ **路径与停止规则**:
|
|
12
|
+
> - 如果要读取本 skill,必须直接使用 `<available_skills>` 或 `skillsSnapshot` 中给出的精确绝对路径。
|
|
13
|
+
> - 不要猜测或改写为 `/data/openclaw/skills/wecom-*`、`/workspace/.openclaw/skills/...`、`/root/.openclaw/workspace-*/.openclaw/skills/...`,也不要用 `exec` + `ls/find` 探路。
|
|
14
|
+
> - 若 `wecom_mcp` 返回 `errcode: 846609` 或 `unsupported mcp biz type`,表示当前 bot 未开通该 category,不是路径、白名单或 sandbox 问题;立即停止继续 `read`、`list`、`find`、memory fallback 探索,直接告知用户对应 category 未开通。
|
|
15
|
+
|
|
16
|
+
## 概述
|
|
17
|
+
|
|
18
|
+
wecom-meeting-query 提供企业微信会议查询能力, 包含以下功能:
|
|
19
|
+
|
|
20
|
+
1. **查询会议列表** - 按用户和时间范围查询会议 ID 列表 (限制: 当日及前后 30 天, 上限 100 个)
|
|
21
|
+
2. **获取会议详情** - 通过会议 ID 查询完整会议信息
|
|
22
|
+
|
|
23
|
+
## 命令调用方式
|
|
24
|
+
|
|
25
|
+
查看可用命令列表:使用 `wecom_mcp` tool 调用 `wecom_mcp list meeting`
|
|
26
|
+
|
|
27
|
+
执行指定命令:使用 `wecom_mcp` tool 调用 `wecom_mcp call meeting <tool_name> '<json_params>'`
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## 命令详细说明
|
|
31
|
+
|
|
32
|
+
### 1. 查询会议列表 (list_user_meetings)
|
|
33
|
+
|
|
34
|
+
查询指定用户在时间范围内的会议 ID 列表.
|
|
35
|
+
|
|
36
|
+
#### 执行命令
|
|
37
|
+
|
|
38
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call meeting list_user_meetings '{"begin_datetime": "2026-03-01 00:00", "end_datetime": "2026-03-31 23:59", "limit": 100}'`
|
|
39
|
+
|
|
40
|
+
#### 入参说明
|
|
41
|
+
|
|
42
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
43
|
+
| ------------------ | ------- | ---- | --------------------------------------- |
|
|
44
|
+
| `begin_datetime` | string | 否 | 查询起始时间, 格式:`YYYY-MM-DD HH:mm` |
|
|
45
|
+
| `end_datetime` | string | 否 | 查询结束时间, 格式:`YYYY-MM-DD HH:mm` |
|
|
46
|
+
| `cursor` | string | 否 | 分页游标, 用于获取下一页数据 |
|
|
47
|
+
| `limit` | integer | 否 | 每页返回条数, 最大 100 |
|
|
48
|
+
|
|
49
|
+
> **限制**: 时间范围仅支持当日及前后 30 天.
|
|
50
|
+
|
|
51
|
+
#### 返回参数
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{
|
|
55
|
+
"errcode": 0,
|
|
56
|
+
"errmsg": "ok",
|
|
57
|
+
"next_cursor": "分页游标字符串, 为空表示无更多",
|
|
58
|
+
"meetingid_list": ["会议ID_1", "会议ID_2"]
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
| 字段 | 类型 | 说明 |
|
|
63
|
+
| ------------------ | ------ | ------------------------------ |
|
|
64
|
+
| `meetingid_list` | array | 会议 ID 列表 |
|
|
65
|
+
| `next_cursor` | string | 下一页游标, 为空表示无更多数据 |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
### 2. 获取会议详情 (get_meeting_info)
|
|
70
|
+
|
|
71
|
+
通过会议 ID 查询会议的完整详情.
|
|
72
|
+
|
|
73
|
+
#### 执行命令
|
|
74
|
+
|
|
75
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call meeting get_meeting_info '{"meetingid": "<会议id>"}'`
|
|
76
|
+
|
|
77
|
+
#### 入参说明
|
|
78
|
+
|
|
79
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
80
|
+
| ----------------- | ------ | ---- | --------------- |
|
|
81
|
+
| `meetingid` | string | 是 | 会议 ID, 通过 `list_user_meetings` 获取 |
|
|
82
|
+
| `meeting_code` | string | 否 | 会议号码 |
|
|
83
|
+
| `sub_meetingid` | string | 否 | 子会议 ID |
|
|
84
|
+
|
|
85
|
+
#### 返回参数
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"errcode": 0,
|
|
90
|
+
"errmsg": "ok",
|
|
91
|
+
"creator_userid": "创建者userid",
|
|
92
|
+
"admin_userid": "会议管理userid (与 creator_userid 有且仅返回一个)",
|
|
93
|
+
"title": "会议标题",
|
|
94
|
+
"meeting_start_datetime": "YYYY-MM-DD HH:mm",
|
|
95
|
+
"meeting_duration": 会议时长秒数,
|
|
96
|
+
"description": "会议描述文本",
|
|
97
|
+
"location": "会议地点文本",
|
|
98
|
+
"main_department": 创建者主部门ID,
|
|
99
|
+
"status": 会议状态枚举值,
|
|
100
|
+
"meeting_type": 会议类型枚举值,
|
|
101
|
+
"attendees": {
|
|
102
|
+
"member": [
|
|
103
|
+
{
|
|
104
|
+
"userid": "内部成员userid",
|
|
105
|
+
"status": 与会状态枚举值,
|
|
106
|
+
"first_join_datetime": "YYYY-MM-DD HH:mm",
|
|
107
|
+
"last_quit_datetime": "YYYY-MM-DD HH:mm",
|
|
108
|
+
"total_join_count": 加入次数,
|
|
109
|
+
"cumulative_time": 累计在会时长秒数
|
|
110
|
+
}
|
|
111
|
+
],
|
|
112
|
+
"tmp_external_user": [
|
|
113
|
+
{
|
|
114
|
+
"tmp_external_userid": "外部临时用户ID",
|
|
115
|
+
"status": 与会状态枚举值,
|
|
116
|
+
"first_join_datetime": "YYYY-MM-DD HH:mm",
|
|
117
|
+
"last_quit_datetime": "YYYY-MM-DD HH:mm",
|
|
118
|
+
"total_join_count": 加入次数,
|
|
119
|
+
"cumulative_time": 累计在会时长秒数
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
},
|
|
123
|
+
"settings": {
|
|
124
|
+
"remind_scope": 提醒范围枚举值,
|
|
125
|
+
"need_password": 是否需要密码布尔值,
|
|
126
|
+
"password": "会议密码",
|
|
127
|
+
"enable_waiting_room": 是否启用等候室布尔值,
|
|
128
|
+
"allow_enter_before_host": 是否允许提前入会布尔值,
|
|
129
|
+
"enable_enter_mute": 入会静音枚举值,
|
|
130
|
+
"allow_unmute_self": 是否允许自我解除静音布尔值,
|
|
131
|
+
"allow_external_user": 是否允许外部用户布尔值,
|
|
132
|
+
"enable_screen_watermark": 是否开启水印布尔值,
|
|
133
|
+
"watermark_type": 水印类型枚举值,
|
|
134
|
+
"auto_record_type": "录制类型枚举字符串",
|
|
135
|
+
"attendee_join_auto_record": 参会者加入自动录制布尔值,
|
|
136
|
+
"enable_host_pause_auto_record": 主持人可暂停录制布尔值,
|
|
137
|
+
"enable_doc_upload_permission": 允许上传文档布尔值,
|
|
138
|
+
"enable_enroll": 是否开启报名布尔值,
|
|
139
|
+
"enable_host_key": 是否启用主持人密钥布尔值,
|
|
140
|
+
"host_key": "主持人密钥字符串",
|
|
141
|
+
"hosts": {"userid": ["主持人userid列表"]},
|
|
142
|
+
"current_hosts": {"userid": ["当前主持人userid列表"]},
|
|
143
|
+
"co_hosts": {"userid": ["联席主持人userid列表"]},
|
|
144
|
+
"ring_users": {"userid": ["响铃用户userid列表"]}
|
|
145
|
+
},
|
|
146
|
+
"meeting_code": "会议号码字符串",
|
|
147
|
+
"meeting_link": "会议链接URL",
|
|
148
|
+
"has_vote": 是否有投票布尔值,
|
|
149
|
+
"has_more_sub_meeting": 是否有更多子会议枚举值,
|
|
150
|
+
"remain_sub_meetings": 剩余子会议场数,
|
|
151
|
+
"current_sub_meetingid": "当前子会议ID",
|
|
152
|
+
"guests": [
|
|
153
|
+
{
|
|
154
|
+
"area": "国际区号",
|
|
155
|
+
"phone_number": "手机号字符串",
|
|
156
|
+
"guest_name": "嘉宾姓名"
|
|
157
|
+
}
|
|
158
|
+
],
|
|
159
|
+
"reminders": {
|
|
160
|
+
"is_repeat": 是否周期性枚举值,
|
|
161
|
+
"repeat_type": 重复类型枚举值,
|
|
162
|
+
"repeat_until_type": 结束类型枚举值,
|
|
163
|
+
"repeat_until_count": 限定次数,
|
|
164
|
+
"repeat_until_datetime": "YYYY-MM-DD HH:mm",
|
|
165
|
+
"repeat_interval": 重复间隔数值,
|
|
166
|
+
"is_custom_repeat": 是否自定义重复枚举值,
|
|
167
|
+
"repeat_day_of_week": [星期几数组],
|
|
168
|
+
"repeat_day_of_month": [日期数组],
|
|
169
|
+
"remind_before": [提醒秒数数组]
|
|
170
|
+
},
|
|
171
|
+
"sub_meetings": [
|
|
172
|
+
{
|
|
173
|
+
"sub_meetingid": "子会议ID",
|
|
174
|
+
"status": 子会议状态枚举值,
|
|
175
|
+
"start_datetime": "YYYY-MM-DD HH:mm",
|
|
176
|
+
"end_datetime": "YYYY-MM-DD HH:mm",
|
|
177
|
+
"title": "子会议标题",
|
|
178
|
+
"repeat_id": "周期性会议分段ID"
|
|
179
|
+
}
|
|
180
|
+
],
|
|
181
|
+
"sub_repeat_list": [
|
|
182
|
+
{
|
|
183
|
+
"repeat_id": "周期性会议分段ID",
|
|
184
|
+
"repeat_type": 重复类型枚举值,
|
|
185
|
+
"repeat_until_type": 结束类型枚举值,
|
|
186
|
+
"repeat_until_count": 限定次数,
|
|
187
|
+
"repeat_until_datetime": "YYYY-MM-DD HH:mm",
|
|
188
|
+
"repeat_interval": 重复间隔数值,
|
|
189
|
+
"is_custom_repeat": 是否自定义重复枚举值,
|
|
190
|
+
"repeat_day_of_week": [星期几数组],
|
|
191
|
+
"repeat_day_of_month": [日期数组]
|
|
192
|
+
}
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**关键返回字段:**
|
|
198
|
+
|
|
199
|
+
| 字段 | 类型 | 说明 |
|
|
200
|
+
| ----------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------- |
|
|
201
|
+
| `creator_userid` | string | 创建者 userid, 与 `admin_userid` 有且仅返回一个 |
|
|
202
|
+
| `admin_userid` | string | 会议管理 userid, 与 `creator_userid` 有且仅返回一个 |
|
|
203
|
+
| `title` | string | 会议标题 |
|
|
204
|
+
| `meeting_start_datetime` | string | 会议开始时间 |
|
|
205
|
+
| `meeting_duration` | integer | 会议时长 (秒) |
|
|
206
|
+
| `main_department` | integer | 创建者所属主部门 |
|
|
207
|
+
| `status` | integer | 会议状态 (1: 待开始, 2: 会议中, 3: 已结束, 4: 已取消, 5: 已过期) |
|
|
208
|
+
| `meeting_type` | integer | 会议类型 (0: 一次性会议, 1: 周期性会议, 2: 微信专属会议, 3: Rooms 投屏会议, 5: 个人会议号会议, 6: 网络研讨会) |
|
|
209
|
+
| `meeting_code` | string | 会议号码 |
|
|
210
|
+
| `meeting_link` | string | 会议链接 |
|
|
211
|
+
| `attendees.member` | array | 内部参与者列表 |
|
|
212
|
+
| `attendees.member[].status` | integer | 与会状态 (1: 已参与, 2: 未参与) |
|
|
213
|
+
| `attendees.tmp_external_user` | array | 外部参与者 (临时 ID) |
|
|
214
|
+
| `attendees.tmp_external_user[].status` | integer | 与会状态 (1: 已参与, 2: 未参与) |
|
|
215
|
+
| `guests` | array | 外部嘉宾列表, 每项含 `area`, `phone_number`, `guest_name` |
|
|
216
|
+
| `current_sub_meetingid` | string | 当前子会议 ID |
|
|
217
|
+
| `settings.ring_users` | object | 响铃用户列表 |
|
|
218
|
+
| `settings.need_password` | boolean | 是否需要密码 (只读字段) |
|
|
219
|
+
| `settings.enable_doc_upload_permission` | boolean | 是否允许成员上传文档 |
|
|
220
|
+
| `settings.hosts` | object | 主持人列表 |
|
|
221
|
+
| `settings.current_hosts` | object | 当前主持人列表 |
|
|
222
|
+
| `settings.co_hosts` | object | 联席主持人列表 |
|
|
223
|
+
| `reminders` | object | 周期性配置 |
|
|
224
|
+
| `has_vote` | boolean | 是否有投票 (仅会议创建人和主持人有权限查询) |
|
|
225
|
+
| `has_more_sub_meeting` | integer | 是否还有更多子会议特例 (0: 无更多, 1: 有更多) |
|
|
226
|
+
| `remain_sub_meetings` | integer | 剩余子会议场数 |
|
|
227
|
+
| `sub_meetings` | array | 子会议列表 |
|
|
228
|
+
| `sub_meetings[].status` | integer | 子会议状态 (0: 默认/存在, 1: 已删除) |
|
|
229
|
+
| `sub_meetings[].repeat_id` | string | 周期性会议分段 ID, 用于关联子会议所属分段 |
|
|
230
|
+
| `sub_repeat_list` | array | 周期性会议分段信息, 修改周期性会议某一场后可能产生不同分段, 各分段有不同重复规则 |
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## 典型工作流
|
|
235
|
+
|
|
236
|
+
### 工作流 1: 查询会议列表
|
|
237
|
+
|
|
238
|
+
**示例**: 用户说 "帮我查一下本周有哪些会议"
|
|
239
|
+
|
|
240
|
+
**步骤:**
|
|
241
|
+
|
|
242
|
+
1. **确定时间范围**: 根据当前日期计算本周的起止时间.
|
|
243
|
+
2. **查询会议 ID 列表**:
|
|
244
|
+
|
|
245
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call meeting list_user_meetings '{"begin_datetime": "2026-03-16 00:00", "end_datetime": "2026-03-22 23:59", "limit": 100}'`
|
|
246
|
+
|
|
247
|
+
3. **逐个查询会议详情** (对返回的每个 meetingid):
|
|
248
|
+
|
|
249
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call meeting get_meeting_info '{"meetingid": "<会议id1>"}'`
|
|
250
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call meeting get_meeting_info '{"meetingid": "<会议id2>"}'`
|
|
251
|
+
|
|
252
|
+
4. **汇总展示**:
|
|
253
|
+
|
|
254
|
+
```
|
|
255
|
+
📋 本周会议列表 (共 3 场):
|
|
256
|
+
|
|
257
|
+
1. 📅 技术方案评审
|
|
258
|
+
🕐 2026-03-17 10:00 - 11:00
|
|
259
|
+
👥 张三, 李四, 王五
|
|
260
|
+
|
|
261
|
+
2. 📅 产品需求沟通
|
|
262
|
+
🕐 2026-03-18 14:00 - 15:00
|
|
263
|
+
👥 赵六, 钱七
|
|
264
|
+
|
|
265
|
+
3. 📅 周五周会
|
|
266
|
+
🕐 2026-03-21 09:00 - 10:00
|
|
267
|
+
👥 全组成员
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
> **分页处理**: 如果 `next_cursor` 不为空, 使用 `cursor` 参数继续拉取下一页.
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
### 工作流 2: 获取会议详情
|
|
275
|
+
|
|
276
|
+
**示例**: 用户说 "帮我看下技术方案评审会议的详情"
|
|
277
|
+
|
|
278
|
+
**步骤:**
|
|
279
|
+
|
|
280
|
+
1. **定位会议**: 先通过会议列表查询找到目标会议的 meetingid (按关键词匹配).
|
|
281
|
+
2. **查询详情**:
|
|
282
|
+
|
|
283
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call meeting get_meeting_info '{"meetingid": "<target_meetingid>"}'`
|
|
284
|
+
|
|
285
|
+
3. **展示结果**:
|
|
286
|
+
|
|
287
|
+
#会议号: <会议号>
|
|
288
|
+
|
|
289
|
+
```
|
|
290
|
+
📅 <会议标题>
|
|
291
|
+
|
|
292
|
+
🕐 时间: <开始时间>, 时长 <时长>
|
|
293
|
+
📍 地点: <会议地点>
|
|
294
|
+
📝 描述: <会议描述>
|
|
295
|
+
👤 创建者: <创建者姓名>
|
|
296
|
+
👥 参与者: <参与者姓名列表>
|
|
297
|
+
🔗 会议链接: <会议链接>
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
### 工作流 3: 根据关键词查找会议
|
|
303
|
+
|
|
304
|
+
**示例**: 用户说 "技术评审会议是什么时候?"
|
|
305
|
+
|
|
306
|
+
**查询策略:**
|
|
307
|
+
|
|
308
|
+
1. **确定查询范围**: 默认查当日前后 30 天 (接口限制范围).
|
|
309
|
+
2. **拉取会议列表**:
|
|
310
|
+
|
|
311
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call meeting list_user_meetings '{"begin_datetime": "2026-02-15 00:00", "end_datetime": "2026-04-16 23:59", "limit": 100}'`
|
|
312
|
+
|
|
313
|
+
3. **逐个查询详情并匹配标题关键词**.
|
|
314
|
+
4. **找到匹配后停止查询, 展示结果**:
|
|
315
|
+
|
|
316
|
+
#会议号: <会议号>
|
|
317
|
+
|
|
318
|
+
```
|
|
319
|
+
✅ 找到会议: "<会议标题>"
|
|
320
|
+
|
|
321
|
+
📅 时间: <开始时间>, 时长 <时长>
|
|
322
|
+
📍 地点: <会议地点>
|
|
323
|
+
👥 参与者: <参与者姓名列表>
|
|
324
|
+
🔗 会议链接: <会议链接>
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
5. **未找到处理**: 告知用户在前后 30 天范围内未找到匹配会议, 请确认会议名称.
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## 注意事项
|
|
332
|
+
|
|
333
|
+
- **时间格式**: 统一使用 `YYYY-MM-DD HH:mm` 格式
|
|
334
|
+
- **会议列表时间范围限制**: 仅支持查询当日及前后 30 天内的会议
|
|
335
|
+
- **查询详情需两步**: 先通过 `list_user_meetings` 获取会议 ID 列表, 再通过 `get_meeting_info` 逐个获取详情
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wecom-preflight
|
|
3
|
+
description: 企业微信 MCP 调用前置检查。用于 sandbox 场景下确认是否可以直接继续调用 `wecom_mcp`,并在工具未放行或宿主未完成配置时给出正确的人工处理指引。不要在 agent sandbox 内执行 `openclaw config` 或 `openclaw gateway restart`。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 企业微信前置检查
|
|
7
|
+
|
|
8
|
+
> 本技能只用于判断当前会话能否继续使用 `wecom_mcp`。
|
|
9
|
+
> 在 agent sandbox 内,**不要**执行宿主机级别的 `openclaw config ...` 或 `openclaw gateway restart`。
|
|
10
|
+
|
|
11
|
+
> ⚠️ **路径与停止规则**:
|
|
12
|
+
> - 如果要读取 WeCom skill,必须直接使用 `<available_skills>` 或 `skillsSnapshot` 中给出的精确绝对路径。
|
|
13
|
+
> - 不要猜测或改写为 `/data/openclaw/skills/wecom-*`、`/workspace/.openclaw/skills/...`、`/root/.openclaw/workspace-*/.openclaw/skills/...`,也不要用 `exec` + `ls/find` 探路。
|
|
14
|
+
> - 若 `wecom_mcp` 返回 `errcode: 846609` 或 `unsupported mcp biz type`,表示当前 bot 未开通该 category,不是路径、白名单或 sandbox 问题;立即停止继续 `read`、`list`、`find`、memory fallback 探索,直接告知用户对应 category 未开通。
|
|
15
|
+
|
|
16
|
+
## 何时使用
|
|
17
|
+
|
|
18
|
+
在以下场景使用本技能:
|
|
19
|
+
|
|
20
|
+
1. 当前会话第一次准备调用 `wecom_mcp`
|
|
21
|
+
2. 调用 `wecom_mcp` 后返回 `tool not allowed`、`not permitted`、`permission denied`
|
|
22
|
+
3. 你怀疑当前环境没有把 WeCom MCP 正确暴露给 agent
|
|
23
|
+
|
|
24
|
+
如果当前会话里 `wecom_mcp` 已经成功调用过一次,就不要重复执行本技能。
|
|
25
|
+
|
|
26
|
+
## 当前部署的正确做法
|
|
27
|
+
|
|
28
|
+
本项目的 `wecom_mcp` 是否可用,取决于 **宿主机 OpenClaw 配置** 和 **sandbox 挂载**,不是由 agent 自己在容器里动态修复。
|
|
29
|
+
|
|
30
|
+
因此:
|
|
31
|
+
|
|
32
|
+
- 可以继续直接调用 `wecom_mcp` 的前提:工具已经出现在当前会话可用工具中,或你刚刚已经成功调用过
|
|
33
|
+
- 不可以做的事:在 sandbox 里执行 `openclaw config get ...`、`openclaw config set ...`、`openclaw gateway restart`
|
|
34
|
+
- 如果工具不可用,应该停止继续试探,并明确告知用户或管理员去宿主机修复
|
|
35
|
+
|
|
36
|
+
## 检查流程
|
|
37
|
+
|
|
38
|
+
### 情况 A:`wecom_mcp` 已可用
|
|
39
|
+
|
|
40
|
+
满足任一条件即可视为通过:
|
|
41
|
+
|
|
42
|
+
- 当前回合工具列表里已经有 `wecom_mcp`
|
|
43
|
+
- 当前会话里之前已经成功调用过 `wecom_mcp`
|
|
44
|
+
|
|
45
|
+
处理方式:
|
|
46
|
+
|
|
47
|
+
- 直接继续执行原始 WeCom 技能
|
|
48
|
+
- 不要再做额外的 shell 探测
|
|
49
|
+
|
|
50
|
+
### 情况 B:返回工具权限错误
|
|
51
|
+
|
|
52
|
+
如果错误类似:
|
|
53
|
+
|
|
54
|
+
- `tool not allowed`
|
|
55
|
+
- `not permitted`
|
|
56
|
+
- `permission denied`
|
|
57
|
+
- `unknown tool: wecom_mcp`
|
|
58
|
+
|
|
59
|
+
这说明问题在 **宿主机工具放行配置**,不是当前业务参数错误。
|
|
60
|
+
|
|
61
|
+
处理方式:
|
|
62
|
+
|
|
63
|
+
- 立即停止继续试探
|
|
64
|
+
- 明确告知用户:需要在宿主机上把 `wecom_mcp` 加入允许列表,并在必要时重启 gateway
|
|
65
|
+
- 不要在 sandbox 内尝试修复
|
|
66
|
+
|
|
67
|
+
可对用户说明:
|
|
68
|
+
|
|
69
|
+
```text
|
|
70
|
+
当前会话所在的 agent sandbox 里还不能使用 wecom_mcp。这个问题需要在宿主机 OpenClaw 配置里放行 wecom_mcp,并在必要时重启 gateway 后才会生效;我无法在当前 sandbox 内直接执行这类宿主机配置。
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 情况 C:返回 MCP 业务错误
|
|
74
|
+
|
|
75
|
+
如果 `wecom_mcp` 工具本身可调用,但返回类似下面的业务错误:
|
|
76
|
+
|
|
77
|
+
- `unsupported mcp biz type`
|
|
78
|
+
- `errcode: 846609`
|
|
79
|
+
|
|
80
|
+
这说明:
|
|
81
|
+
|
|
82
|
+
- 工具权限通常已经没问题
|
|
83
|
+
- 但当前机器人或当前企业微信侧 **没有开通对应 category**,例如只开了 `doc`,没有开 `schedule`
|
|
84
|
+
|
|
85
|
+
处理方式:
|
|
86
|
+
|
|
87
|
+
- 不要再把它误判成“tool 未放行”
|
|
88
|
+
- 直接告诉用户:当前业务类型未开通,需要企业微信侧补充对应 MCP 配置
|
|
89
|
+
|
|
90
|
+
## 决策规则
|
|
91
|
+
|
|
92
|
+
| 现象 | 结论 | 动作 |
|
|
93
|
+
| --- | --- | --- |
|
|
94
|
+
| `wecom_mcp` 已成功调用 | 前置检查通过 | 继续原始任务 |
|
|
95
|
+
| `tool not allowed` / `unknown tool` | 宿主机未放行工具 | 停止试探,提示宿主机修复 |
|
|
96
|
+
| `unsupported mcp biz type` / `846609` | 对应业务类型未开通 | 停止试探,提示开通对应 category |
|
|
97
|
+
| 其他业务报错 | 接口调用失败 | 按具体错误处理,不要误改环境 |
|
|
98
|
+
|
|
99
|
+
## 关键约束
|
|
100
|
+
|
|
101
|
+
1. 本技能是 **判断与分流**,不是在 sandbox 内自动修配置。
|
|
102
|
+
2. 绝不要在当前容器里执行宿主机级别的 OpenClaw 配置命令。
|
|
103
|
+
3. 一旦确认是宿主机配置问题或企业微信侧未开通问题,就停止重复探索,直接给出明确结论。
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wecom-schedule
|
|
3
|
+
description: 企业微信日程管理技能。适用于用户对企业微信日程的各类管理需求。当用户需要:(1) 查询指定时间范围内的日程列表或获取日程详细信息(标题、时间、地点、参与者等),(2) 创建新日程并设置提醒、参与人等,(3) 修改已有日程的标题、时间、地点等信息或取消日程,(4) 添加或移除日程参与人,(5) 查询多个成员的闲忙状态并分析共同空闲时段以安排会议时使用此技能。
|
|
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
|
+
> ⚠️ **路径与停止规则**:
|
|
17
|
+
> - 如果要读取本 skill,必须直接使用 `<available_skills>` 或 `skillsSnapshot` 中给出的精确绝对路径。
|
|
18
|
+
> - 不要猜测或改写为 `/data/openclaw/skills/wecom-*`、`/workspace/.openclaw/skills/...`、`/root/.openclaw/workspace-*/.openclaw/skills/...`,也不要用 `exec` + `ls/find` 探路。
|
|
19
|
+
> - 若 `wecom_mcp` 返回 `errcode: 846609` 或 `unsupported mcp biz type`,表示当前 bot 未开通该 category,不是路径、白名单或 sandbox 问题;立即停止继续 `read`、`list`、`find`、memory fallback 探索,直接告知用户对应 category 未开通。
|
|
20
|
+
|
|
21
|
+
通过 `wecom_mcp call schedule <接口名> '<json入参>'` 与企业微信日程系统交互。
|
|
22
|
+
|
|
23
|
+
## 注意事项
|
|
24
|
+
|
|
25
|
+
- 日程列表查询仅支持**当日前后 30 天**,时间格式 `YYYY-MM-DD` 或 `YYYY-MM-DD HH:MM:SS`
|
|
26
|
+
- 涉及参与者 userid 时,需先使用 **wecom-contact-lookup** 技能获取;存在同名时展示候选让用户选择(禁止暴露 userid)
|
|
27
|
+
- 创建/修改/取消前,先确认目标日程和参与者信息
|
|
28
|
+
- `errcode != 0` 时展示错误信息;返回的 `start_time`/`end_time` 为 Unix 时间戳(秒),需转为可读格式
|
|
29
|
+
- **注意时间格式转换**:接口入参使用字符串格式(如 `YYYY-MM-DD HH:MM:SS`),但返回值多为 Unix 时间戳,使用时需进行格式转换
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 接口列表
|
|
34
|
+
|
|
35
|
+
### get_schedule_list_by_range — 查询日程 ID 列表
|
|
36
|
+
|
|
37
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call schedule get_schedule_list_by_range '{"start_time": "YYYY-MM-DD HH:MM:SS", "end_time": "YYYY-MM-DD HH:MM:SS"}'`
|
|
38
|
+
|
|
39
|
+
返回 `schedule_id_list` 数组。仅支持当日前后 30 天。
|
|
40
|
+
|
|
41
|
+
### get_schedule_detail — 获取日程详情
|
|
42
|
+
|
|
43
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call schedule get_schedule_detail '{"schedule_id_list": ["SCHEDULE_ID_1", "SCHEDULE_ID_2"]}'`
|
|
44
|
+
|
|
45
|
+
支持 1~50 个 ID,返回日程标题、时间、地点、参与者等。参见 [API 详情](references/api-get-schedule-detail.md)。
|
|
46
|
+
|
|
47
|
+
### create_schedule — 创建日程
|
|
48
|
+
|
|
49
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call schedule create_schedule '{"schedule": {"start_time": "YYYY-MM-DD HH:MM:SS", "end_time": "YYYY-MM-DD HH:MM:SS", "summary": "日程标题", "attendees": [{"userid": "USER_ID"}], "reminders": {"is_remind": 1, "remind_before_event_secs": 3600, "timezone": 8}}}'`
|
|
50
|
+
|
|
51
|
+
参见 [API 详情](references/api-create-schedule.md) | [reminders 字段](references/ref-reminders.md)。
|
|
52
|
+
|
|
53
|
+
### update_schedule — 修改日程
|
|
54
|
+
|
|
55
|
+
只需传入需修改的字段,未传字段保持不变。
|
|
56
|
+
|
|
57
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call schedule update_schedule '{"schedule": {"schedule_id": "SCHEDULE_ID", "summary": "更新后的标题"}}'`
|
|
58
|
+
|
|
59
|
+
参见 [API 详情](references/api-update-schedule.md)。
|
|
60
|
+
|
|
61
|
+
### cancel_schedule — 取消日程
|
|
62
|
+
|
|
63
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call schedule cancel_schedule '{"schedule_id": "SCHEDULE_ID"}'`
|
|
64
|
+
|
|
65
|
+
### add_schedule_attendees / del_schedule_attendees — 管理参与人
|
|
66
|
+
|
|
67
|
+
- 添加参与人:使用 `wecom_mcp` tool 调用 `wecom_mcp call schedule add_schedule_attendees '{"schedule_id": "SCHEDULE_ID", "attendees": [{"userid": "USER_ID"}]}'`
|
|
68
|
+
- 移除参与人:使用 `wecom_mcp` tool 调用 `wecom_mcp call schedule del_schedule_attendees '{"schedule_id": "SCHEDULE_ID", "attendees": [{"userid": "USER_ID"}]}'`
|
|
69
|
+
|
|
70
|
+
### check_availablity — 查询闲忙
|
|
71
|
+
|
|
72
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call schedule check_availablity '{"check_user_list": ["USER_ID_1", "USER_ID_2"], "start_time": "YYYY-MM-DD HH:MM:SS", "end_time": "YYYY-MM-DD HH:MM:SS"}'`
|
|
73
|
+
|
|
74
|
+
支持 1~10 个用户,返回各用户的忙碌时段列表。参见 [API 详情](references/api-check-availability.md)。
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## 典型工作流
|
|
79
|
+
|
|
80
|
+
### 查询日程
|
|
81
|
+
|
|
82
|
+
**经典 query 示例:**
|
|
83
|
+
- "我今天有哪些日程?"
|
|
84
|
+
- "帮我看看这周三下午有没有会议"
|
|
85
|
+
- "明天的日程安排是什么?"
|
|
86
|
+
- "查一下最近有没有关于项目评审的日程"
|
|
87
|
+
- "我下周一到周五的日程都有哪些?"
|
|
88
|
+
|
|
89
|
+
**流程:**
|
|
90
|
+
1. 根据用户意图计算时间范围(如"今天"→当日 00:00:00 至 23:59:59,"这周"→本周一至周日)
|
|
91
|
+
2. 调用 `get_schedule_list_by_range` 获取日程 ID 列表
|
|
92
|
+
3. 调用 `get_schedule_detail` 批量获取详情,将 Unix 时间戳转为可读时间
|
|
93
|
+
4. 若用户提到关键词(如"项目评审"),在 `summary` 中匹配筛选;未找到则逐步扩大范围至前后 30 天上限
|
|
94
|
+
5. 展示日程列表时包含标题、时间、地点、参与者等关键信息,方便用户快速了解
|
|
95
|
+
|
|
96
|
+
### 创建日程
|
|
97
|
+
|
|
98
|
+
**经典 query 示例:**
|
|
99
|
+
- "帮我创建一个明天下午 2 点到 3 点的会议,标题叫需求评审"
|
|
100
|
+
- "安排一个周五全天的团建活动"
|
|
101
|
+
- "创建日程:后天上午 10 点和张三、李四开产品方案讨论会,地点在 3 楼会议室"
|
|
102
|
+
- "帮我建个日程,下周一 14:00-15:00,提前 15 分钟提醒"
|
|
103
|
+
- "约一个明天上午的日程,邀请王伟参加"
|
|
104
|
+
|
|
105
|
+
**流程:**
|
|
106
|
+
1. 解析用户意图,提取时间、标题、地点、参与人、提醒设置等信息
|
|
107
|
+
2. 若涉及参与人,先通过 **wecom-contact-lookup** 查询 userid;存在同名时展示候选让用户选择
|
|
108
|
+
3. 若用户未指定提醒,默认设置提前 15 分钟提醒(`remind_before_event_secs: 900`)
|
|
109
|
+
4. 若用户说"全天",设置 `is_whole_day: 1`,时间设为当天 00:00:00 至 23:59:59
|
|
110
|
+
5. 向用户确认日程信息(标题、时间、地点、参与人等)后调用 `create_schedule`
|
|
111
|
+
|
|
112
|
+
### 修改日程
|
|
113
|
+
|
|
114
|
+
**经典 query 示例:**
|
|
115
|
+
- "把明天的需求评审改到后天下午 3 点"
|
|
116
|
+
- "帮我修改下今天下午的会议标题,改成技术方案评审"
|
|
117
|
+
- "我今天 14 点的日程地点改成线上腾讯会议"
|
|
118
|
+
- "把周五的团建活动推迟一个小时"
|
|
119
|
+
- "帮我给明天的周会加个描述:讨论 Q2 规划"
|
|
120
|
+
|
|
121
|
+
**流程:**
|
|
122
|
+
1. 先通过查询工作流定位目标日程(根据用户提到的时间、标题等关键词匹配)
|
|
123
|
+
2. 若匹配到多个日程,展示候选列表让用户确认
|
|
124
|
+
3. 向用户确认要修改的字段和目标值
|
|
125
|
+
4. 调用 `update_schedule`,只传入需修改的字段
|
|
126
|
+
|
|
127
|
+
### 取消日程
|
|
128
|
+
|
|
129
|
+
**经典 query 示例:**
|
|
130
|
+
- "取消明天下午的需求评审"
|
|
131
|
+
- "帮我把周五的团建日程删掉"
|
|
132
|
+
- "我不想开今天 15 点的会了,帮我取消"
|
|
133
|
+
|
|
134
|
+
**流程:**
|
|
135
|
+
1. 先通过查询工作流定位目标日程
|
|
136
|
+
2. 向用户确认取消的日程信息(标题、时间等),避免误操作
|
|
137
|
+
3. 确认后调用 `cancel_schedule`
|
|
138
|
+
|
|
139
|
+
### 管理参与人
|
|
140
|
+
|
|
141
|
+
**经典 query 示例:**
|
|
142
|
+
- "把张三加到明天的需求评审会议里"
|
|
143
|
+
- "帮我把李四从周五的日程里移除"
|
|
144
|
+
- "明天下午的会议再邀请一下王伟和赵敏"
|
|
145
|
+
- "把我后天那个技术分享的参与人里去掉刘强"
|
|
146
|
+
|
|
147
|
+
**流程:**
|
|
148
|
+
1. 通过 **wecom-contact-lookup** 获取目标人员 userid;存在同名时展示候选让用户选择
|
|
149
|
+
2. 通过查询工作流定位目标日程
|
|
150
|
+
3. 调用 `add_schedule_attendees` 或 `del_schedule_attendees` 完成添加/移除
|
|
151
|
+
|
|
152
|
+
### 查询闲忙并安排会议
|
|
153
|
+
|
|
154
|
+
**经典 query 示例:**
|
|
155
|
+
- "帮我看看张三和李四明天下午有没有空"
|
|
156
|
+
- "查一下我和王伟这周的空闲时间,想约个会"
|
|
157
|
+
- "我想跟产品组的小明、小红开个会,看看大家什么时候有空"
|
|
158
|
+
- "找一个明天下午大家都有空的时段,安排一个 1 小时的会议"
|
|
159
|
+
|
|
160
|
+
**流程:**
|
|
161
|
+
1. 通过 **wecom-contact-lookup** 获取相关人员 userid
|
|
162
|
+
2. 调用 `check_availablity` 查询指定时间范围内各用户的忙碌时段
|
|
163
|
+
3. 分析所有用户的忙碌时段,计算出共同空闲时段并推荐给用户
|
|
164
|
+
4. 用户确认时段后,调用 `create_schedule` 创建会议并自动添加参与人
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# check_availablity API
|
|
2
|
+
|
|
3
|
+
查询指定用户在某时间范围内的忙碌时段。
|
|
4
|
+
|
|
5
|
+
## 参数说明
|
|
6
|
+
|
|
7
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
8
|
+
|------|------|------|------|
|
|
9
|
+
| `check_user_list` | array | ✅ | 用户 ID 列表,1~10 个 |
|
|
10
|
+
| `start_time` | string | ✅ | 查询开始时间 |
|
|
11
|
+
| `end_time` | string | ✅ | 查询结束时间 |
|
|
12
|
+
|
|
13
|
+
## 请求示例
|
|
14
|
+
|
|
15
|
+
使用 `wecom_mcp` tool 调用 `wecom_mcp call schedule check_availablity '{"check_user_list": ["USER_ID_1", "USER_ID_2"], "start_time": "YYYY-MM-DD HH:MM:SS", "end_time": "YYYY-MM-DD HH:MM:SS"}'`
|
|
16
|
+
|
|
17
|
+
## 返回字段
|
|
18
|
+
|
|
19
|
+
| 字段 | 类型 | 说明 |
|
|
20
|
+
|------|------|------|
|
|
21
|
+
| `errcode` | integer | 返回码,`0` 表示成功 |
|
|
22
|
+
| `errmsg` | string | 错误信息 |
|
|
23
|
+
| `user_busy_list` | array | 用户忙碌时段列表 |
|
|
24
|
+
|
|
25
|
+
### user_busy_list[] 数组中每项字段
|
|
26
|
+
|
|
27
|
+
| 字段 | 类型 | 说明 |
|
|
28
|
+
|------|------|------|
|
|
29
|
+
| `userid` | string | 用户 ID |
|
|
30
|
+
| `busy_slots` | array | 忙碌时段列表 |
|
|
31
|
+
| `busy_slots[].start_time` | string | 忙碌时段开始时间 |
|
|
32
|
+
| `busy_slots[].end_time` | string | 忙碌时段结束时间 |
|
|
33
|
+
| `busy_slots[].schedule_id` | string | 关联的日程 ID |
|
|
34
|
+
| `busy_slots[].subject` | string | 日程标题 |
|
|
35
|
+
|
|
36
|
+
## 响应示例
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"errcode": 0,
|
|
41
|
+
"errmsg": "ok",
|
|
42
|
+
"user_busy_list": [
|
|
43
|
+
{
|
|
44
|
+
"userid": "USER_ID",
|
|
45
|
+
"busy_slots": [
|
|
46
|
+
{
|
|
47
|
+
"start_time": "YYYY-MM-DD HH:MM:SS",
|
|
48
|
+
"end_time": "YYYY-MM-DD HH:MM:SS",
|
|
49
|
+
"schedule_id": "SCHEDULE_ID",
|
|
50
|
+
"subject": "日程标题"
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
```
|