@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.
Files changed (43) hide show
  1. package/README.md +6 -2
  2. package/index.js +2 -0
  3. package/openclaw.plugin.json +3 -0
  4. package/package.json +5 -3
  5. package/skills/wecom-contact-lookup/SKILL.md +167 -0
  6. package/skills/wecom-doc-manager/SKILL.md +106 -0
  7. package/skills/wecom-doc-manager/references/api-create-doc.md +56 -0
  8. package/skills/wecom-doc-manager/references/api-edit-doc-content.md +68 -0
  9. package/skills/wecom-doc-manager/references/api-export-document.md +88 -0
  10. package/skills/wecom-edit-todo/SKILL.md +254 -0
  11. package/skills/wecom-get-todo-detail/SKILL.md +148 -0
  12. package/skills/wecom-get-todo-list/SKILL.md +132 -0
  13. package/skills/wecom-meeting-create/SKILL.md +163 -0
  14. package/skills/wecom-meeting-create/references/example-full.md +30 -0
  15. package/skills/wecom-meeting-create/references/example-reminder.md +46 -0
  16. package/skills/wecom-meeting-create/references/example-security.md +22 -0
  17. package/skills/wecom-meeting-manage/SKILL.md +141 -0
  18. package/skills/wecom-meeting-query/SKILL.md +335 -0
  19. package/skills/wecom-preflight/SKILL.md +103 -0
  20. package/skills/wecom-schedule/SKILL.md +164 -0
  21. package/skills/wecom-schedule/references/api-check-availability.md +56 -0
  22. package/skills/wecom-schedule/references/api-create-schedule.md +38 -0
  23. package/skills/wecom-schedule/references/api-get-schedule-detail.md +81 -0
  24. package/skills/wecom-schedule/references/api-update-schedule.md +30 -0
  25. package/skills/wecom-schedule/references/ref-reminders.md +24 -0
  26. package/skills/wecom-smartsheet-data/SKILL.md +76 -0
  27. package/skills/wecom-smartsheet-data/references/api-get-records.md +61 -0
  28. package/skills/wecom-smartsheet-data/references/cell-value-formats.md +120 -0
  29. package/skills/wecom-smartsheet-schema/SKILL.md +96 -0
  30. package/skills/wecom-smartsheet-schema/references/field-types.md +43 -0
  31. package/wecom/accounts.js +1 -0
  32. package/wecom/callback-inbound.js +133 -33
  33. package/wecom/channel-plugin.js +107 -125
  34. package/wecom/constants.js +83 -3
  35. package/wecom/mcp-config.js +146 -0
  36. package/wecom/mcp-tool.js +660 -0
  37. package/wecom/media-uploader.js +208 -0
  38. package/wecom/openclaw-compat.js +302 -0
  39. package/wecom/reqid-store.js +146 -0
  40. package/wecom/target.js +3 -2
  41. package/wecom/workspace-template.js +107 -21
  42. package/wecom/ws-monitor.js +778 -328
  43. package/image-processor.js +0 -175
package/README.md CHANGED
@@ -435,11 +435,15 @@ Webhook 只负责群通知。
435
435
 
436
436
  ### Workspace 模板
437
437
 
438
- `workspaceTemplate` 目录中的 bootstrap 文件会在动态 Agent 首次创建时复制到工作区:
438
+ `workspaceTemplate` 目录中的模板文件会在动态 Agent 首次创建时复制到工作区:
439
439
 
440
440
  - `AGENTS.md`、`BOOTSTRAP.md`、`CLAUDE.md`、`SOUL.md`、`TOOLS.md`、`IDENTITY.md`、`USER.md`、`HEARTBEAT.md`、`system-prompt.md`
441
441
 
442
- 模板支持 mtime 变更检测 当模板文件更新后,下次 Agent 启动会增量同步。
442
+ 插件会在工作区里写入 `.openclaw/wecom-template-state.json` 记录首次模板同步状态。已有 state 的工作区后续只补缺,不覆盖已有文件。
443
+
444
+ `BOOTSTRAP.md` 只会在工作区还没有 `memory/` 或 `MEMORY.md` 时参与同步;一旦工作区已经出现记忆痕迹,插件就不再回种 bootstrap,避免打断已完成 onboarding 的会话。
445
+
446
+ 历史工作区如果还没有 state,插件会先补写 state,再按“只补缺、不覆盖”处理,避免存量工作区被重新整批同步。
443
447
 
444
448
  ### Bindings
445
449
 
package/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { emptyPluginConfigSchema } from "openclaw/plugin-sdk";
2
2
  import { logger } from "./logger.js";
3
3
  import { wecomChannelPlugin } from "./wecom/channel-plugin.js";
4
+ import { createWeComMcpTool } from "./wecom/mcp-tool.js";
4
5
  import { setOpenclawConfig, setRuntime } from "./wecom/state.js";
5
6
  import { buildReplyMediaGuidance } from "./wecom/ws-monitor.js";
6
7
  import { listAccountIds, resolveAccount } from "./wecom/accounts.js";
@@ -16,6 +17,7 @@ const plugin = {
16
17
  setRuntime(api.runtime);
17
18
  setOpenclawConfig(api.config);
18
19
  api.registerChannel({ plugin: wecomChannelPlugin });
20
+ api.registerTool(createWeComMcpTool(), { name: "wecom_mcp" });
19
21
 
20
22
  // Register HTTP callback endpoints for all accounts that have callback config
21
23
  for (const accountId of listAccountIds(api.config)) {
@@ -2,6 +2,9 @@
2
2
  "id": "wecom",
3
3
  "name": "OpenClaw WeCom",
4
4
  "description": "Enterprise WeChat (WeCom) messaging channel plugin for OpenClaw",
5
+ "skills": [
6
+ "./skills"
7
+ ],
5
8
  "configSchema": {
6
9
  "type": "object",
7
10
  "additionalProperties": true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sunnoy/wecom",
3
- "version": "2.1.0",
3
+ "version": "2.2.1",
4
4
  "description": "Enterprise WeChat AI Bot channel plugin for OpenClaw",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -8,11 +8,12 @@
8
8
  "index.js",
9
9
  "wecom",
10
10
  "dynamic-agent.js",
11
- "image-processor.js",
11
+
12
12
  "logger.js",
13
13
  "README.md",
14
14
  "LICENSE",
15
15
  "CONTRIBUTING.md",
16
+ "skills",
16
17
  "think-parser.js",
17
18
  "utils.js",
18
19
  "openclaw.plugin.json"
@@ -59,6 +60,7 @@
59
60
  "author": "",
60
61
  "license": "ISC",
61
62
  "dependencies": {
62
- "@wecom/aibot-node-sdk": "^1.0.1"
63
+ "@wecom/aibot-node-sdk": "^1.0.2",
64
+ "file-type": "^21.3.0"
63
65
  }
64
66
  }
@@ -0,0 +1,167 @@
1
+ ---
2
+ name: wecom-contact-lookup
3
+ description: 通讯录成员查询技能,基于 MCP tool 协议封装的 `get_userlist` 接口,获取当前用户可见范围内的通讯录成员,支持按姓名/别名本地筛选匹配。返回 userid、姓名和别名。⚠️ 仅返回当前用户有权限查看的成员,非全量成员。
4
+ ---
5
+
6
+ # 通讯录成员查询技能
7
+
8
+ > `wecom_mcp` 是一个 MCP tool,所有操作通过调用该 tool 完成。
9
+
10
+ > ⚠️ **前置条件**:首次调用 `wecom_mcp` 前,必须按 `wecom-preflight` 技能执行前置条件检查,确保工具已加入白名单。
11
+
12
+ > ⚠️ **路径与停止规则**:
13
+ > - 如果要读取本 skill,必须直接使用 `<available_skills>` 或 `skillsSnapshot` 中给出的精确绝对路径。
14
+ > - 不要猜测或改写为 `/data/openclaw/skills/wecom-*`、`/workspace/.openclaw/skills/...`、`/root/.openclaw/workspace-*/.openclaw/skills/...`,也不要用 `exec` + `ls/find` 探路。
15
+ > - 若 `wecom_mcp` 返回 `errcode: 846609` 或 `unsupported mcp biz type`,表示当前 bot 未开通该 category,不是路径、白名单或 sandbox 问题;立即停止继续 `read`、`list`、`find`、memory fallback 探索,直接告知用户对应 category 未开通。
16
+
17
+ 通过 MCP tool 协议封装的 `get_userlist` 接口,获取当前用户可见范围内的通讯录成员,并在本地按姓名/别名进行筛选匹配。
18
+
19
+ ## 操作
20
+
21
+ ### 1. 获取全量通讯录成员
22
+
23
+ 获取当前用户可见范围内的所有企业成员信息:
24
+
25
+ **调用示例:**
26
+
27
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call contact get_userlist '{}'`
28
+
29
+ **返回格式:**
30
+
31
+ ```json
32
+ {
33
+ "errcode": 0,
34
+ "errmsg": "ok",
35
+ "userlist": [
36
+ {
37
+ "userid": "zhangsan",
38
+ "name": "张三",
39
+ "alias": "Sam"
40
+ },
41
+ {
42
+ "userid": "lisi",
43
+ "name": "李四",
44
+ "alias": ""
45
+ }
46
+ ]
47
+ }
48
+ ```
49
+
50
+ **返回字段说明:**
51
+
52
+ | 字段 | 类型 | 说明 |
53
+ |------|------|------|
54
+ | `errcode` | integer | 返回码,`0` 表示成功 |
55
+ | `errmsg` | string | 错误信息 |
56
+ | `userlist` | array | 用户列表 |
57
+ | `userlist[].userid` | string | 用户唯一 ID |
58
+ | `userlist[].name` | string | 用户姓名 |
59
+ | `userlist[].alias` | string | 用户别名,可能为空 |
60
+
61
+ ---
62
+
63
+ ### 2. 按姓名/别名搜索人员
64
+
65
+ `get_userlist` 返回全量成员后,在本地对结果进行筛选匹配:
66
+
67
+ - **精确匹配**:`name` 或 `alias` 与关键词完全一致,直接使用
68
+ - **模糊匹配**:`name` 或 `alias` 包含关键词,返回所有匹配结果
69
+ - **无结果**:告知用户未找到对应人员
70
+
71
+ **搜索示例:**
72
+
73
+ 用户问:"帮我找一下张三是谁?"
74
+
75
+ 1. 调用 `get_userlist` 获取全量成员
76
+ 2. 在 `userlist` 中筛选 `name` 或 `alias` 包含"张三"的成员
77
+ 3. 返回匹配结果
78
+
79
+ ---
80
+
81
+ ## 注意事项
82
+
83
+ - `get_userlist` 返回的是当前用户**可见范围内**的成员,需经过可见性规则过滤,不一定是全公司所有人员;返回字段仅包含 `userid`、`name`(姓名)和 `alias`(别名)
84
+ - ⚠️ **超过 10 人时接口将报错**:若 `userlist` 返回成员数量超过 10 人,视为异常,应立即停止处理并向用户说明:
85
+
86
+ > 当前通讯录可见成员数量超过了本技能支持的上限(10 人)。
87
+ > 本技能仅适用于可见范围较小的场景,无法在大范围通讯录中使用。
88
+ > 建议缩小可见范围后重试,或通过其他方式查询目标人员。
89
+
90
+ - `userid` 是用户的唯一标识,在需要传递用户 ID 给其他接口时使用此字段
91
+ - `alias` 字段可能为空字符串,搜索时需做空值判断
92
+ - 若搜索结果有多个同名人员,需将所有候选人展示给用户选择,不得自行决定
93
+ - 若 `errcode` 不为 `0`,说明接口调用失败,需告知用户错误信息(`errmsg`)
94
+
95
+ ---
96
+
97
+ ## 典型工作流
98
+
99
+ ### 工作流 1:查询人员信息
100
+
101
+ 用户问:"帮我查一下 Sam 是谁?"
102
+
103
+ 1. 使用 `wecom_mcp` tool 调用 `wecom_mcp call contact get_userlist '{}'` 获取全量成员列表
104
+
105
+ 2. 在结果中筛选 `alias` 为 `Sam` 或 `name` 包含 `Sam` 的成员
106
+ 3. 若找到唯一匹配,直接展示结果:
107
+
108
+ ```
109
+ 📇 找到成员:
110
+ - 姓名:张三
111
+ - 别名:Sam
112
+ - 用户ID:zhangsan
113
+ ```
114
+
115
+ 4. 若找到多个匹配,展示候选列表请用户确认:
116
+
117
+ ```
118
+ 🔍 找到多个匹配成员,请确认您要查询的是哪位:
119
+
120
+ 1. 张三(别名:Sam,ID:zhangsan)
121
+ 2. 张三丰(别名:Sam2,ID:zhangsan2)
122
+
123
+ 请问您要查询的是哪一位?
124
+ ```
125
+
126
+ ---
127
+
128
+ ### 工作流 2:为其他功能提供 userid 转换
129
+
130
+ 用户问:"帮我发消息给张三"
131
+
132
+ 1. 使用 `wecom_mcp` tool 调用 `wecom_mcp call contact get_userlist '{}'` 获取全量成员
133
+
134
+ 2. 筛选 `name` 为"张三"的成员,确认 `userid`
135
+ 3. 将 `userid` 传递给消息发送接口
136
+
137
+ ---
138
+
139
+ ### 工作流 3:批量查询多个人员
140
+
141
+ 用户问:"帮我查一下张三和李四分别是谁?"
142
+
143
+ 1. 使用 `wecom_mcp` tool 调用 `wecom_mcp call contact get_userlist '{}'` 获取全量成员列表
144
+
145
+ 2. 分别筛选"张三"和"李四"的匹配结果
146
+ 3. 汇总后一并展示
147
+
148
+ > 注意:只需调用一次 `get_userlist`,在本地对结果进行多次筛选,避免重复调用接口。
149
+
150
+ ---
151
+
152
+ ## 快速参考
153
+
154
+ ### 接口说明
155
+
156
+ | 接口 | 用途 | 输入 | 返回 |
157
+ |------|------|------|------|
158
+ | `get_userlist` | 获取可见范围内全量通讯录成员 | 无 | 用户列表(userid、name、alias) |
159
+
160
+ ### 本地筛选策略
161
+
162
+ | 场景 | 策略 |
163
+ |------|------|
164
+ | 精确匹配(name 或 alias 完全一致) | 直接使用,无需用户确认 |
165
+ | 模糊匹配(name 或 alias 包含关键词),唯一结果 | 直接使用,向用户展示结果 |
166
+ | 模糊匹配,多个结果 | 展示候选列表,请用户选择 |
167
+ | 无匹配结果 | 告知用户未找到对应人员 |
@@ -0,0 +1,106 @@
1
+ ---
2
+ name: wecom-doc-manager
3
+ description: 企业微信文档管理技能。提供文档的创建、读取和编辑能力,支持通过 docid 或文档 URL 操作企业微信文档(doc_type=3)和智能表格(doc_type=10)。适用场景:(1) 以 Markdown 格式导出获取文档完整内容(异步轮询) (2) 新建文档或智能表格 (3) 用 Markdown 格式覆写文档内容。当用户需要查看文档内容、创建新文档、编辑文档正文时触发此 Skill。
4
+ ---
5
+
6
+ # 企业微信文档管理
7
+
8
+ > `wecom_mcp` 是一个 MCP tool,所有操作通过调用该 tool 完成。
9
+
10
+ > ⚠️ **前置条件**:仅在当前会话**第一次**准备调用 `wecom_mcp`、且尚未确认工具可用时,按 `wecom-preflight` 技能执行前置条件检查。若当前回合工具列表里已经有 `wecom_mcp`,或当前会话里刚刚成功调用过 `wecom_mcp`,则**不要重复读取 `wecom-preflight`**。
11
+
12
+ > ⚠️ **路径与停止规则**:
13
+ > - 如果要读取本 skill,必须直接使用 `<available_skills>` 或 `skillsSnapshot` 中给出的精确绝对路径。
14
+ > - 不要猜测或改写为 `/data/openclaw/skills/wecom-*`、`/workspace/.openclaw/skills/...`、`/root/.openclaw/workspace-*/.openclaw/skills/...`,也不要用 `exec` + `ls/find` 探路。
15
+ > - 若 `wecom_mcp` 返回 `errcode: 846609` 或 `unsupported mcp biz type`,表示当前 bot 未开通该 category,不是路径、白名单或 sandbox 问题;立即停止继续 `read`、`list`、`find`、memory fallback 探索,直接告知用户对应 category 未开通。
16
+ > - 在读取文档前,先调用 `wecom_mcp` 执行 `list` + `category=doc` 探测当前 bot 实际暴露的 doc 工具列表。只有当列表里确实存在 `get_doc_content` 时,才允许继续调用它。
17
+ > - 如果 `list doc` 的结果中不存在 `get_doc_content`,说明当前 bot 的 doc 类 MCP 仅开放了创建/编辑能力,没有开放读取能力。此时必须立即停止,直接告诉用户“当前文档读取能力未开通”;不要再继续尝试 `get_doc_content`、浏览器抓页面、read/find/exec 探路或 HTML fallback。
18
+
19
+ 管理企业微信文档的创建、读取和编辑。所有接口支持通过 `docid` 或 `url` 二选一定位文档。
20
+
21
+ ## 调用方式
22
+
23
+ 通过 `wecom_mcp` tool 调用,品类为 `doc`:
24
+
25
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call doc <tool_name> '<json_params>'` 调用指定技能
26
+
27
+ ## 返回格式说明
28
+
29
+ 所有接口返回 JSON 对象,包含以下公共字段:
30
+
31
+ | 字段 | 类型 | 说明 |
32
+ |------|------|------|
33
+ | `errcode` | integer | 返回码,`0` 表示成功,非 `0` 表示失败 |
34
+ | `errmsg` | string | 错误信息,成功时为 `"ok"` |
35
+
36
+ 当 `errcode` 不为 `0` 时,说明接口调用失败,可重试 1 次;若仍失败,将 `errcode` 和 `errmsg` 展示给用户。
37
+
38
+ ### get_doc_content
39
+
40
+ 仅当 `wecom_mcp list doc` 的结果中明确包含 `get_doc_content` 时,才可以使用本接口。
41
+
42
+ 获取文档完整内容数据,只能以 Markdown 格式返回。采用**异步轮询机制**:首次调用无需传 `task_id`,接口返回 `task_id`;若 `task_done` 为 false,需携带该 `task_id` 再次调用,直到 `task_done` 为 true 时返回完整内容。
43
+
44
+ - 首次调用(不传 task_id):使用 `wecom_mcp` tool 调用 `wecom_mcp call doc get_doc_content '{"docid": "DOCID", "type": 2}'`
45
+ - 轮询(携带上次返回的 task_id):使用 `wecom_mcp` tool 调用 `wecom_mcp call doc get_doc_content '{"docid": "DOCID", "type": 2, "task_id": "xxx"}'`
46
+ - 或通过 URL:使用 `wecom_mcp` tool 调用 `wecom_mcp call doc get_doc_content '{"url": "https://doc.weixin.qq.com/doc/xxx", "type": 2}'`
47
+
48
+ 参见 [API 详情](references/api-export-document.md)。
49
+
50
+ ### create_doc
51
+
52
+ 新建文档(doc_type=3)或智能表格(doc_type=10)。创建成功返回 url 和 docid。
53
+
54
+ - 使用 `wecom_mcp` tool 调用 `wecom_mcp call doc create_doc '{"doc_type": 3, "doc_name": "项目周报"}'`
55
+ - 使用 `wecom_mcp` tool 调用 `wecom_mcp call doc create_doc '{"doc_type": 10, "doc_name": "任务跟踪表"}'`
56
+
57
+ **注意**:
58
+
59
+ - `docid` 仅在创建时返回,需妥善保存。
60
+ - 创建智能表格时默认包含一个子表,可通过 `smartsheet_get_sheet` 查询其 `sheet_id`。
61
+ - **当需要把文档发给用户时,必须原样使用 `create_doc` 返回的完整 `url` 字段。**
62
+ - **不要自行根据 `docid`、短链路径或 `/doc/...` 重新拼接链接。**
63
+ - **不要删除 `url` 里的查询参数,例如 `?scode=...`。**
64
+ - 若最终回复里需要展示链接,优先直接粘贴 `create_doc` 返回的完整 `url`,不要做截短、美化或重写。
65
+
66
+ 参见 [API 详情](references/api-create-doc.md)。
67
+
68
+ ### edit_doc_content
69
+
70
+ 用 Markdown 内容覆写文档正文。`content_type` 固定为 `1`(Markdown)。
71
+
72
+ 使用 `wecom_mcp` tool 调用 `wecom_mcp call doc edit_doc_content '{"docid": "DOCID", "content": "# 标题\n\n正文内容", "content_type": 1}'`
73
+
74
+ 参见 [API 详情](references/api-edit-doc-content.md)。
75
+
76
+ ## 典型工作流
77
+
78
+ 1. **探测当前 doc 能力** → 先调用 `wecom_mcp` 执行 `list` + `category=doc`
79
+ 2. **读取文档** → 只有当第 1 步结果中存在 `get_doc_content` 时,才调用 `wecom_mcp call doc get_doc_content '{"docid": "DOCID", "type": 2}'`;若 `task_done` 为 false 则携带 `task_id` 继续轮询
80
+ 3. **读取能力未开通时立即停止** → 如果第 1 步结果里没有 `get_doc_content`,直接回复用户当前 bot 未开通文档读取能力;不要改用浏览器、HTML 抓取或其他探路方式伪造结果
81
+ 4. **创建新文档** → 使用 `wecom_mcp` tool 调用 `wecom_mcp call doc create_doc '{"doc_type": 3, "doc_name": "文档名"}'`,保存返回的 `docid` 和完整 `url`
82
+ 5. **编辑文档** → 若第 1 步确认支持读取,可先 get_doc_content 了解当前内容,再 edit_doc_content 覆写;若不支持读取,只在用户明确提供要覆写的内容时再执行 edit
83
+ 6. **回复用户链接** → 若要把新文档发给用户,直接返回第 4 步 `create_doc` 的完整 `url`;禁止自行拼接、截短或去掉查询参数
84
+
85
+ ## 输出约束
86
+
87
+ 当你刚创建完企业微信文档并准备回复用户时,严格遵守以下规则:
88
+
89
+ 1. 只从 `create_doc` 的原始返回结果中取 `url`
90
+ 2. 不要把 `docid` 转成新的链接
91
+ 3. 不要删除 `?scode=...`、`from=` 等查询参数
92
+ 4. 不要把链接改写成 markdown 链接文本后再手工抄写 URL
93
+ 5. 如果需要摘要,摘要单独写;链接单独保留完整原文
94
+
95
+ 正确示例:
96
+
97
+ ```text
98
+ 文档已创建,完整链接如下:
99
+ https://doc.weixin.qq.com/doc/xxx?scode=abc
100
+ ```
101
+
102
+ 错误示例:
103
+
104
+ ```text
105
+ https://doc.weixin.qq.com/doc/xxx
106
+ ```
@@ -0,0 +1,56 @@
1
+ # create_doc API
2
+
3
+ 新建文档、表格或智能表格。创建成功后返回文档访问链接和 docid。
4
+
5
+ ## 技能定义
6
+
7
+ ```json
8
+ {
9
+ "name": "create_doc",
10
+ "description": "新建文档、表格或智能表格。支持在指定空间和目录下创建,可设置文档管理员。创建成功后返回文档访问链接和 docid(docid 仅在创建时返回,需妥善保存)。注意:创建智能表格(doc_type=10)时,文档会默认包含一个子表,可通过 smartsheet_get_sheet 查询其 sheet_id,无需额外调用 smartsheet_add_sheet。",
11
+ "inputSchema": {
12
+ "properties": {
13
+ "doc_type": {
14
+ "description": "文档类型:3-文档,10-智能表格",
15
+ "enum": [3, 10],
16
+ "title": "Doc Type",
17
+ "type": "integer"
18
+ },
19
+ "doc_name": {
20
+ "description": "文档名字,最多 255 个字符,超过会被截断",
21
+ "title": "Doc Name",
22
+ "type": "string"
23
+ }
24
+ },
25
+ "required": ["doc_type", "doc_name"],
26
+ "title": "create_docArguments",
27
+ "type": "object"
28
+ }
29
+ }
30
+ ```
31
+
32
+ ## 请求示例
33
+
34
+ ```json
35
+ {
36
+ "doc_type": 3,
37
+ "doc_name": "项目周报"
38
+ }
39
+ ```
40
+
41
+ ## 响应示例
42
+
43
+ ```json
44
+ {
45
+ "errcode": 0,
46
+ "errmsg": "ok",
47
+ "url": "https://doc.weixin.qq.com/doc/xxx",
48
+ "docid": "DOCID"
49
+ }
50
+ ```
51
+
52
+ ## 注意事项
53
+
54
+ - `doc_type=3` 创建普通文档
55
+ - `doc_type=10` 创建智能表格,默认包含一个子表
56
+ - docid 仅在创建时返回,后续无法再获取,务必保存
@@ -0,0 +1,68 @@
1
+ # edit_doc_content API
2
+
3
+ 编辑(覆写)文档内容。
4
+
5
+ ## 技能定义
6
+
7
+ ```json
8
+ {
9
+ "name": "edit_doc_content",
10
+ "description": "编辑文档内容",
11
+ "inputSchema": {
12
+ "properties": {
13
+ "docid": {
14
+ "description": "文档 id,与 url 二选一传入",
15
+ "title": "Docid",
16
+ "type": "string"
17
+ },
18
+ "url": {
19
+ "description": "文档的访问链接,与 docid 二选一传入",
20
+ "title": "URL",
21
+ "type": "string"
22
+ },
23
+ "content": {
24
+ "description": "覆写的文档内容",
25
+ "title": "Content",
26
+ "type": "string"
27
+ },
28
+ "content_type": {
29
+ "description": "内容类型格式。1:markdown",
30
+ "enum": [1],
31
+ "title": "Content Type",
32
+ "type": "integer"
33
+ }
34
+ },
35
+ "oneOf": [
36
+ { "required": ["docid", "content", "content_type"] },
37
+ { "required": ["url", "content", "content_type"] }
38
+ ],
39
+ "title": "edit_doc_contentArguments",
40
+ "type": "object"
41
+ }
42
+ }
43
+ ```
44
+
45
+ ## 请求示例
46
+
47
+ ```json
48
+ {
49
+ "docid": "DOCID",
50
+ "content": "# 标题\n\n正文内容",
51
+ "content_type": 1
52
+ }
53
+ ```
54
+
55
+ ## 响应示例
56
+
57
+ ```json
58
+ {
59
+ "errcode": 0,
60
+ "errmsg": "ok"
61
+ }
62
+ ```
63
+
64
+ ## 注意事项
65
+
66
+ - `content_type` 当前仅支持 `1`(Markdown 格式)
67
+ - 此操作为**覆写**,会替换文档全部内容
68
+ - 建议先调用 `get_document` 了解当前内容再编辑
@@ -0,0 +1,88 @@
1
+ # get_doc_content API
2
+
3
+ 获取企业微信文档的完整内容数据,以 Markdown 格式返回。该接口采用异步轮询机制:首次调用无需传 task_id,接口会返回 task_id;若 task_done 为 false,需携带该 task_id 再次调用,直到 task_done 为 true 时返回完整内容。
4
+
5
+ ## 技能定义
6
+
7
+ ```json
8
+ {
9
+ "name": "get_doc_content",
10
+ "description": "获取企业微信文档的完整内容数据,以 Markdown 格式返回。该接口采用异步轮询机制:首次调用无需传 task_id,接口会返回 task_id;若 task_done 为 false,需携带该 task_id 再次调用,直到 task_done 为 true 时返回完整内容。",
11
+ "inputSchema": {
12
+ "properties": {
13
+ "docid": {
14
+ "description": "文档的 docid,与 url 二选一传入",
15
+ "title": "Doc ID",
16
+ "type": "string"
17
+ },
18
+ "url": {
19
+ "description": "文档的访问链接,与 docid 二选一传入",
20
+ "title": "URL",
21
+ "type": "string"
22
+ },
23
+ "type": {
24
+ "description": "内容返回格式。2: Markdown 格式",
25
+ "enum": [2],
26
+ "title": "Type",
27
+ "type": "integer"
28
+ },
29
+ "task_id": {
30
+ "description": "任务 ID,用于异步轮询。初次调用时不填,后续轮询时填写上次返回的 task_id",
31
+ "title": "Task ID",
32
+ "type": "string"
33
+ }
34
+ },
35
+ "oneOf": [
36
+ { "required": ["docid", "type"] },
37
+ { "required": ["url", "type"] }
38
+ ],
39
+ "title": "get_doc_contentArguments",
40
+ "type": "object"
41
+ }
42
+ }
43
+ ```
44
+
45
+ ## 参数说明
46
+
47
+ | 参数 | 类型 | 必填 | 说明 |
48
+ |---|---|---|---|
49
+ | docid | string | 与 url 二选一 | 文档的 docid |
50
+ | url | string | 与 docid 二选一 | 文档的访问链接 |
51
+ | type | integer | 是 | 内容返回格式,固定传 `2`(Markdown 格式) |
52
+ | task_id | string | 否 | 任务 ID,初次调用不填,后续轮询时填写上次返回的 task_id |
53
+
54
+ ## 异步轮询机制
55
+
56
+ 1. **首次调用**:传入 `docid`/`url` 和 `type: 2`,不传 `task_id`
57
+ 2. **检查响应**:若 `task_done` 为 `false`,记录返回的 `task_id`
58
+ 3. **轮询调用**:携带 `task_id` 再次调用,直到 `task_done` 为 `true`
59
+ 4. **获取内容**:当 `task_done` 为 `true` 时,`content` 字段包含完整的 Markdown 内容
60
+
61
+ ## 请求示例
62
+
63
+ ```json
64
+ // 首次调用
65
+ {
66
+ "docid": "DOCID",
67
+ "type": 2
68
+ }
69
+
70
+ // 轮询调用
71
+ {
72
+ "docid": "DOCID",
73
+ "type": 2,
74
+ "task_id": "xxx"
75
+ }
76
+ ```
77
+
78
+ ## 响应示例
79
+
80
+ ```json
81
+ {
82
+ "errcode": 0,
83
+ "errmsg": "ok",
84
+ "content": "# 文档标题\n\n文档正文内容...",
85
+ "task_id": "xxxxx",
86
+ "task_done": true
87
+ }
88
+ ```