--- name: anyshare-mcp-skills description: "AnyShare 企业云盘技能。支持:搜索文件、上传/下载文件、分享链接读取、全文写作(生成大纲→确认→写正文)、Bot 智能问答。触发词:AnyShare、asmcp、文档库、文件管理、知识库、anyshare.aishu.cn 分享链接。" homepage: "https://anyshare.aishu.cn" metadata: '{"openclaw":{"category":"productivity","emoji":"📁","requires":{"bins":["agent-browser","mcporter"]},"openclawSkillsEntryFile":"openclaw.skill-entry.json"}}' --- # AnyShare MCP 技能 > **首次使用本技能时,配置步骤的权威来源是 [setup.md](setup.md)。** > SKILL.md 只做摘要+跳转,**配置细节以 setup.md 为准**(避免两处表述漂移)。 --- ## ⚠️ 执行前必读 ### 强制前置阅读(按需必读,否则跳过) | 操作 | 必须先读 | 为何 | |------|----------|------| | 首次使用本技能(配置 asmcp.url) | **[setup.md](setup.md)** 全章 | 配置步骤唯一权威来源;包含 mcporter.json 写入、daemon 重启、openclaw.json 合并、企业地址确认话术 | | 执行任何认证 / auth_login 前 | **[references/auth.md](references/auth.md)** 第 1~5 步 | 认证流程步骤编号、Cookie 提取方式、状态文件路径均以此为准 | | 调用任何业务工具(file_search / upload / download 等)前 | **[references/tool-params.md](references/tool-params.md)** 对应工具节 | 参数格式(key=value)、固定字段、禁止传参、不传参;与此处示例保持一致 | | **进入场景四(全文写作)前** | **本 SKILL.md → 场景四 → C8 进门卡点** | **必须持 docid;未持则先走 file_search 或场景五 获取,禁止绕过(C8 违规)** | | 排障 / 401 / 认证失败 | **[references/troubleshooting.md](references/troubleshooting.md)** | 错误码含义、常见现象与处理方式均在此 | ### 硬卡点表 | # | 规则 | 关联场景 | |---|------|---------| | C1 | 搜索文件**只用 `file_search`**,禁止 RAG 类工具或目录树展开 | 场景一 | | C2 | 展示搜索/列目录结果前,**必须先调 `file_convert_path` 再输出**(禁止跳过) | 场景一、场景五 | | C3 | 上传/下载前,**必须用户明确回复"是"确认 docid**,禁止代选 | 场景二、场景三 | | **C4** | **大纲未确认前禁止调用 `__大纲写作__1`**(大纲门闩) | 场景四 | | **C5** | `source_ranges[].id` **必须传 id**(docid 最后一段),禁止传完整 docid | 场景四 | | **C6** | **禁止用 screenshot 解析分享链接的 item_id**,以 `agent-browser get url` 为准 | 场景五 | | **C7** | `item_id` **禁止臆造**,须从实际访问后的 URL 中解析 | 场景五 | | **C8** | **进入 chat_send(全文写作)前必须持有 docid**。若尚无 docid,须先通过场景一(关键词搜索)或场景五(解析分享链接)获取,禁止自行判断"docid 不可用"而绕过本文档处理流程另起炉灶。 | 场景四 | | **C9** | **在场原则(System-Internal-Only)**:持有 docid 后,所有后续操作(阅读、摘要、写作、导出)必须通过 AnyShare 工具完成,禁止下载到本地后跳出系统处理。C8 管"进入",C9 管"离开"。 | 所有含 docid 的场景 | --- ## 🔄 完整执行流程 ``` 用户输入 │ ▼ ① 首次使用?── 是 ──→ 阅读 setup.md,执行 Step 1~4 │ → 向用户汇报 asmcp.url + 连通性 │ → 确认是否为**本企业**正式端点 否 ▼ ② 认证检查(自动)── 失败 ──→ 认证恢复(references/auth.md 第 1~6 步)──→ 重试验证 │ │ │ 通过 ◀────────────────────────────────────┘ ▼ ③ 意图识别 │ ├─ 分享链接?── 是 ──→ 场景五(读取链接 → 获取 docid) │ ├─ 书写类诉求?(生成/撰写/改写/续写/润色/文章/报告/文案/大纲/材料)── 是 ──→ 确认全文写作? │ │ │ 是 ◀─────────────────┘ │ ▼ │ ⚠️ C8 强制预检: │ "是否已持有本次写作所需的 docid?" │ 否 ──→ 场景一(关键词搜索)获取 docid │ │ 或场景五(解析分享链接)获取 docid │ │ 获取后返回此节点重新判断 │ 是 │ ▼ │ 场景四:全文写作 │ ① docid/id → ② 大纲 → ③ 确认 → ④ 正文 │ │ 否 ──→ chat_send 简化问答 │ ├─ 搜索 / 查看文件 ──→ 场景一 │ ├─ 上传文件 ──→ 场景二 │ └─ 下载文件 ──→ 场景三 ``` --- ## 📌 核心概念速查 | 术语 | 说明 | 传参规则 | |------|------|---------| | **docid** | 完整路径,`gns://` 开头,是文档在 AnyShare 系统内的唯一标识 | 传给 `folder_sub_objects`、`file_upload`、`file_osdownload`、`file_convert_path`(均须完整 `gns://…`) | | **id** | docid 的最后一段 | 传给 `chat_send` 的 `source_ranges[].id`(**不传**完整 docid,见 C5) | | **namepath** | 云盘展示用路径,由 `file_convert_path` 返回 | 仅供阅读,不作 docid 传参 | | **sharedlink** | `https://anyshare.aishu.cn/link/AR...` | 用 `agent-browser get url` 解析 item_id | > 完整说明:[references/concepts.md](references/concepts.md) --- ## 🏛️ AnyShare 在场原则(System-Internal-Only Principle) > **这是本技能最根本的运行假设,所有场景均以此为前提。** ### 原则内容 **一旦通过 AnyShare 系统获取到 docid,该文档的所有后续操作都必须通过 AnyShare 工具完成,禁止跳出系统处理。** 换言之: - ✅ 持有 docid → 用 `chat_send`(全文写作 / 摘要 / 问答) - ✅ 持有 docid → 用 `file_convert_path`(查看路径) - ✅ 持有 docid → 用 `file_osdownload`(下载,但下载后仍须回到 AnyShare 工具链处理) - ❌ 持有 docid,却去下载文件到本地后用外部工具(markitdown、LLM 直接总结等)"替代" AnyShare 工具链 → **在场原则违规** ### 为什么这条原则重要 docid 是文档在 AnyShare 系统内的"在场证明"。AI 一旦持有 docid,意味着文档已经在 AnyShare 的管理范围内。跳出系统去处理,等于放弃了 AnyShare 已有的权限管控、操作审计、内容安全策略,是系统性风险。 ### 典型失控模式(供自检) | 失控模式 | 为什么会发生 | 正确做法 | |----------|-------------|---------| | "已有 docid,但还是下载了 PPTX 用 markitdown 提取内容" | AI 认为"外部工具效果更好" | 用 `chat_send` + `source_ranges` 替代 | | "已有 docid,但决定直接帮用户总结内容" | AI 认为"用 LLM 总结更快" | 用 `chat_send` 简化问答替代 | | "已有 docid,但去查本地文件" | AI 遗忘了 docid 的存在 | 回到 docid,用 AnyShare 工具继续 | ### 在场原则与 C8 的关系 C8 约束的是"进入 chat_send 前必须持有 docid",在场原则约束的是"持有 docid 后不得离开 AnyShare 系统"。两者共同构成了完整的边界控制:C8 管入口,在场原则管出口。 --- ## 📂 场景一:文件/关键词搜索 > **前置阅读**:tool-params.md → `file_search` 节(参数格式+固定字段说明) ### 步骤 **第 1 步:`file_search`** ```json { "name": "file_search", "arguments": { "keyword": "<用户关键词>", "type": "doc", "start": 0, "rows": 25, "range": [], "dimension": ["basename"], "model": "phrase" } } ``` > ⚠️ `dimension: ["basename"]` + `model: "phrase"` **必须固定**,不随关键词变化。省略会导致正文/多字段命中,而非按名匹配。 **第 2 步:展示结果(必须含三要素)** 对每条结果:**先调 `file_convert_path`** → 再展示: - **名称**:`basename` - **大小**:`size = -1` → 目录;`size ≥ 0` → 实际字节数 - **云盘路径**:`namepath`(来自 `file_convert_path` 返回) > ⚠️ **C1 + C2**:禁止跳过 `file_convert_path`;禁止用 docid/序号代替 namepath 展示。 **第 3 步:用户确认 docid(如需操作)** **分页提示(hits ≥ 25 时强制显示):** > 找到 X 条(已展示前 25 条),是否: > 1. **查看更多**(翻页) 2. **更换关键词** 3. **缩小范围**(加 range) **按文件夹名查看子文件:** 1. 搜索结果中找 `size = -1` 且 basename 一致的项 2. 对该 docid 先调 `file_convert_path` 展示目录 namepath(C2) 3. 再调 `folder_sub_objects` 列出子文件 --- ## 📂 场景二:上传文件 ### 步骤 **第 1 步:搜索目标目录**(`file_search` + `file_convert_path`,**必须 C3**) **展示确认模板:** > 即将上传到: > - 文件名:`<本地文件名>` > - 云盘路径:`file_convert_path` 返回的 `namepath` > - docid:`gns://...` > > 确认继续?回复"是",或提供其他目标路径。 **第 2 步:用户回复"是"后锁定 docid(C3)** **第 3 步:`file_upload`** ```json { "name": "file_upload", "arguments": { "docid": "<用户确认的 docid(完整)>", "file_path": "<本地真实路径>" } } ``` **第 4 步:汇报** - docid 必须展示为 **`gns://` 开头完整路径**(禁止只展示 id/十六进制串) - 对新文件 docid 调 `file_convert_path`,一并展示 `namepath` --- ## 📂 场景三:下载文件 ### 步骤 **第 1 步:搜索目标文件**(`file_search` + `file_convert_path`,**必须 C3**) **展示确认模板:** > 即将下载: > - 文件名:`` > - 大小:` 字节` > - 云盘路径:`file_convert_path` 返回的 `namepath` > - docid:`gns://...` > > 确认继续?回复"是",或选择其他文件。 **第 2 步:用户回复"是"后锁定 docid(C3)** **第 3 步:`file_osdownload`** ```json { "name": "file_osdownload", "arguments": { "docid": "<用户确认的 docid(完整)>" } } ``` --- ## 📂 场景四:全文写作 > **前置阅读**:tool-params.md → `chat_send` 节(参数格式、`source_ranges` 传参规则) **入口**:用户已确认走全文写作流程。 ### ⚠️ C8 进门卡点(C-gate 0):进入前必须持有 docid > **这是本场景的第一道门。任何时候未持有 docid,都必须先出去获取,不得绕过。** **进门前自问:** > "我是否已为本次写作任务持有至少一个可用的 docid?" - **是** → 进入步骤 1 - **否(docid 尚未获取)** → 必须先执行以下之一: - **路径 A**:`file_search`(关键词搜索)→ 获取 docid → 返回本场景 - **路径 B**:场景五(解析分享链接)→ 获取 docid → 返回本场景 - **路径 C**:若用户直接提供了文件 docid → 直接进入步骤 1 - **禁止**:自行判断"docid 拿不到"而改用本地写作、摘要总结等绕过手段(违者属 C8 违规) > **C8 违规示例(摘录本次失控案例,供自检):** > - "这些是本地 PPTX 文件,不是知识库文档,source_ranges 用不了,所以我直接自己写"→ **C8 违规**,正确做法是先把文件上传 AnyShare 或找到云端对应 docid 再调用 chat_send > - "这个文档没法获取 docid,直接帮用户总结好了" → **C8 违规** ### ⚠️ 大纲门闩(C4) 禁止跳过"生成大纲 → 用户确认"直接生成正文。 ### 步骤 **第 1 步:确认文档 id(已在 C8 获取)** - 分享链接 → 场景五解析出 id - 关键词 → `file_search` 确认文档 id **第 2 步:生成大纲(`__全文写作__2`)** ```json { "name": "chat_send", "arguments": { "query": "<用户写作任务描述>", "selection": "", "times": 1, "skill_name": "__全文写作__2", "web_search_mode": "off", "datasource": [], "source_ranges": [{ "id": "<文档的 id>", "type": "doc" }], "template_id": 1, "interrupted_parent_qa_id": "" } } ``` → 展示大纲 → **等待用户确认**(C4) **第 3 步:生成正文(`__大纲写作__1`)** 仅在大纲确认后调用(用第 2 步返回的 `conversation_id`): ```json { "name": "chat_send", "arguments": { "query": "基于大纲生成文档", "selection": "<已确认的大纲全文>", "conversation_id": "<步骤2返回的 conversation_id>", "times": 1, "skill_name": "__大纲写作__1", "web_search_mode": "off", "datasource": [], "source_ranges": [{ "id": "<文档的 id>", "type": "doc" }], "interrupted_parent_qa_id": "" } } ``` **第 4 步:导出**(保存本地 / 上传至 AnyShare 复用场景二) > ⚠️ **C5**:`source_ranges[].id` 传 id(docid 最后一段),不传完整 docid。 --- ## 📂 场景五:分享链接读取 > **前置阅读**:auth.md → 登录填表步骤(账号密码索取+snapshot -i 用法) **触发**:用户提供 `https://anyshare.aishu.cn/link/AR...` > ⚠️ **C6 + C7**:item_id 只能从 `agent-browser get url` 解析,禁止 screenshot,禁止臆造。 ### 步骤 **第 1 步:无头浏览器跟随重定向** ```bash agent-browser open "https://anyshare.aishu.cn/link/<分享ID>" agent-browser wait --load networkidle agent-browser get url ← 获取含 item_id 的落地 URL ``` **第 1.5 步:遇登录页 → 填入账号密码** 1. 向用户**当面索取**账号 + 密码(禁止从文件读取) 2. `agent-browser snapshot -i` 获取无障碍树 refs 3. `fill` 账号/密码 → `click` 登录 → `wait --load networkidle` 4. 再次 `get url` 获取登录后落地 URL **第 2 步:解析 URL 中的 `item_id`** 1. 从 URL 提取 `item_id`(已 URL 编码) 2. 解码 → 完整 docid 3. 取最后一段 → id 4. 根据 `item_type` 分流: - `folder` → 第 3 步A - `file` / 其他 → 第 3 步B **第 3 步A:文件夹** 1. `file_convert_path` → 展示目录 `namepath`(C2) 2. `folder_sub_objects` → 列出子文件 **第 3 步B:文件** - 走场景四(全文写作):id 传给场景四第 1 步 - 或简化问答:`chat_send` + `source_ranges` --- ## 🎯 意图模糊时的确认模板 当用户意图**不清晰**、无法判断是否在 AnyShare 操作或做哪类操作时,使用以下模板(仅一次,不叠套): ``` 请确认: 1. 目标系统:是否在 AnyShare 操作? 1) 是 2) 其他系统 2. 具体操作: 1) 搜索 / 查看文件 2) 上传或下载文件 3) 智能问答 / 全文写作 4) 其他(文档库浏览、换账号等) 回复示例:「1 2」表示在 AnyShare 上传或下载。 ``` **回复 → 执行路径:** | 回复 | 场景 | |------|------| | `1 + 1` | 场景一 | | `1 + 2`(上传) | 场景二 | | `1 + 2`(下载) | 场景三 | | `1 + 3` | 场景四 | | `1 + 4` | 澄清子意图 | | `2` | 不走本技能 | --- ## 📖 补充资料(权威来源) | 文件 | 权威内容 | 用于 | |------|---------|------| | **[setup.md](setup.md)** | asmcp.url 写入步骤、daemon 重启、企业地址确认话术 | 首次配置(**唯一权威来源**) | | [references/auth.md](references/auth.md) | 认证 1~5 步、恢复 1~6 步、Token 刷新、状态文件 | 认证相关操作 | | [references/concepts.md](references/concepts.md) | docid/id/namepath/sharedlink 完整说明 | 概念确认 | | [references/tool-params.md](references/tool-params.md) | 各工具参数 schema、固定字段、禁止传参 | 工具调用前 | | [references/troubleshooting.md](references/troubleshooting.md) | 错误码、常见现象与处理 | 排障 | | [SECURITY.md](SECURITY.md) | 安全约束、敏感信息处理 | 安全审计 |