Просмотр исходного кода

整理工作区:企微助手新增输出目录标准模块;根目录文档归入 docs;忽略 node_modules 与本地资料

gangvy 2 месяцев назад
Родитель
Сommit
be9ad83d13
100 измененных файлов с 23551 добавлено и 60 удалено
  1. 3 1
      .claude/settings.json
  2. 17 0
      .gitignore
  3. 17 0
      claude-code/claude-code-qiwe-assistant/.env.example
  4. 5 0
      claude-code/claude-code-qiwe-assistant/.gitignore
  5. 10 0
      claude-code/claude-code-qiwe-assistant/.mcp.json
  6. 160 0
      claude-code/claude-code-qiwe-assistant/README.md
  7. 12 0
      claude-code/claude-code-qiwe-assistant/THIRD_PARTY_NOTICES.md
  8. 48 0
      claude-code/claude-code-qiwe-assistant/bin/qiwe-official-cli.js
  9. 100 0
      claude-code/claude-code-qiwe-assistant/docs/OUTPUT-STANDARD.md
  10. 0 0
      claude-code/claude-code-qiwe-assistant/docs/generated/.gitkeep
  11. 0 0
      claude-code/claude-code-qiwe-assistant/docs/guides/.gitkeep
  12. 0 0
      claude-code/claude-code-qiwe-assistant/docs/specs/.gitkeep
  13. 5229 0
      claude-code/claude-code-qiwe-assistant/mcp/catalog/qiwe-endpoints.json
  14. 100 0
      claude-code/claude-code-qiwe-assistant/mcp/src/core/api-catalog.js
  15. 244 0
      claude-code/claude-code-qiwe-assistant/mcp/src/core/credentials.js
  16. 93 0
      claude-code/claude-code-qiwe-assistant/mcp/src/core/output-paths.js
  17. 30 0
      claude-code/claude-code-qiwe-assistant/mcp/src/core/result-envelope.js
  18. 390 0
      claude-code/claude-code-qiwe-assistant/mcp/src/core/wecom-cli-runtime.js
  19. 164 0
      claude-code/claude-code-qiwe-assistant/mcp/src/providers/fmode-wecom-gateway.js
  20. 207 0
      claude-code/claude-code-qiwe-assistant/mcp/src/providers/wecom-official-cli.js
  21. 277 0
      claude-code/claude-code-qiwe-assistant/mcp/src/server.js
  22. 289 0
      claude-code/claude-code-qiwe-assistant/mcp/src/tools/qiwe-api-catalog-run.js
  23. 321 0
      claude-code/claude-code-qiwe-assistant/mcp/src/tools/qiwe-login-run.js
  24. 128 0
      claude-code/claude-code-qiwe-assistant/mcp/src/tools/qiwe-subscription-run.js
  25. 13 0
      claude-code/claude-code-qiwe-assistant/mcp/src/tools/wecom-official-cli-run.js
  26. 1178 0
      claude-code/claude-code-qiwe-assistant/package-lock.json
  27. 23 0
      claude-code/claude-code-qiwe-assistant/package.json
  28. 157 0
      claude-code/claude-code-qiwe-assistant/scripts/build-catalog.py
  29. 27 0
      claude-code/claude-code-qiwe-assistant/scripts/install-wecom-cli.js
  30. 193 0
      claude-code/claude-code-qiwe-assistant/scripts/smoke-test.js
  31. 77 0
      claude-code/claude-code-qiwe-assistant/scripts/validate-output-standard.js
  32. 84 0
      claude-code/claude-code-qiwe-assistant/scripts/wecom-cli-smoke-test.js
  33. 65 0
      claude-code/claude-code-qiwe-assistant/skills/qiwe-api-catalog/SKILL.md
  34. 39 0
      claude-code/claude-code-qiwe-assistant/skills/qiwe-capability-router/SKILL.md
  35. 42 0
      claude-code/claude-code-qiwe-assistant/skills/qiwe-login/SKILL.md
  36. 96 0
      claude-code/claude-code-qiwe-assistant/skills/qiwe-official-doc/SKILL.md
  37. 82 0
      claude-code/claude-code-qiwe-assistant/skills/qiwe-official-meeting/SKILL.md
  38. 12 0
      claude-code/claude-code-qiwe-assistant/wecom-cli-runtime.json
  39. 1 1
      claude-code/claude-code-voc-intelligence/.claude-plugin/plugin.json
  40. 25 6
      claude-code/claude-code-voc-intelligence/bin/claude-voc.js
  41. 20 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/1688.json
  42. 151 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/amazon.json
  43. 68 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/beike.json
  44. 139 1
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/bilibili.json
  45. 18 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/dewu.json
  46. 90 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/douban.json
  47. 261 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/douyin.json
  48. 85 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/douyin_ec.json
  49. 287 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/douyin_xingtu.json
  50. 59 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/facebook.json
  51. 334 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/imdb.json
  52. 118 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/instagram.json
  53. 77 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/jd.json
  54. 93 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/kuaishou.json
  55. 11 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/llm.json
  56. 1044 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/overseas-ecom.json
  57. 43 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/reddit.json
  58. 40 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/search.json
  59. 226 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/taobao.json
  60. 159 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/tiktok.json
  61. 68 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/tiktok_shop.json
  62. 52 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/toutiao.json
  63. 51 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/twitter.json
  64. 29 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/web.json
  65. 225 1
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/weibo.json
  66. 509 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/weixin.json
  67. 296 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/weixin_channels.json
  68. 35 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/xianyu.json
  69. 509 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/xiaohongshu.json
  70. 168 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/xiaohongshu_pgy.json
  71. 37 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/youku.json
  72. 169 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/youtube.json
  73. 113 0
      claude-code/claude-code-voc-intelligence/mcp/catalog/params/zhihu.json
  74. 6971 2
      claude-code/claude-code-voc-intelligence/mcp/catalog/voc-social-endpoints.json
  75. 104 0
      claude-code/claude-code-voc-intelligence/mcp/src/core/activation.js
  76. 211 0
      claude-code/claude-code-voc-intelligence/mcp/src/core/version-check.js
  77. 56 0
      claude-code/claude-code-voc-intelligence/mcp/src/providers/overseas-gateway.js
  78. 3 0
      claude-code/claude-code-voc-intelligence/mcp/src/server.js
  79. 10 2
      claude-code/claude-code-voc-intelligence/mcp/src/tools/voc-api-catalog-run.js
  80. 2 2
      claude-code/claude-code-voc-intelligence/package-lock.json
  81. 1 1
      claude-code/claude-code-voc-intelligence/package.json
  82. 58 2
      claude-code/claude-code-voc-intelligence/skill-package-manifest.json
  83. 7 0
      claude-code/claude-code-voc-intelligence/skills/douyin-trend-intelligence/SKILL.md
  84. 11 5
      claude-code/claude-code-voc-intelligence/skills/voc-api-catalog/SKILL.md
  85. 3 1
      claude-code/claude-code-voc-intelligence/skills/voc-api-catalog/references/error-codes.md
  86. 7 0
      claude-code/claude-code-voc-intelligence/skills/xiaohongshu-trend-intelligence/SKILL.md
  87. 101 23
      claude-code/fmode-listen/skills/fmode-listen/scripts/listen-runner.mjs
  88. 10 6
      dist/claude-code-voc-intelligence-suite-manifest.json
  89. BIN
      dist/claude-code-voc-intelligence.zip
  90. 6 6
      dist/npm/claude-code-voc-npm-package-manifest.json
  91. 0 0
      docs/WORKSHOP-SKILL-MAPPING.md
  92. 237 0
      docs/fmode-listen-用户调用文档.md
  93. 0 0
      docs/other/AI实战营资料清单_实战1-实战2.docx
  94. 0 0
      docs/other/AI实战营资料清单_实战1-实战2.md
  95. 0 0
      docs/other/AI实战营资料清单_群内发送版.txt
  96. 0 0
      docs/other/douyin-speaking-daily-followup-course-scripts.md
  97. 0 0
      docs/other/douyin-speaking-daily-p0-install-notes.txt
  98. 116 0
      docs/qiwe-api文档/api.md
  99. 95 0
      docs/voc-03-design.md
  100. BIN
      docs/voc-skill-student-course/VOC实战课-FmodeStudio技能项目模板.pptx

+ 3 - 1
.claude/settings.json

@@ -1,7 +1,9 @@
 {
   "permissions": {
     "allow": [
-      "Bash(node \"e:/workspace/openclaw-voc-skill/claude-code-voc-intelligence/mcp/src/tools/xiaohongshu-trend-run.js\" --collection-mode live --profile \"e:/workspace/openclaw-voc-skill/claude-code-voc-intelligence/memory-templates/xiaohongshu-trend-profile.json\" --output \"outputs/claude-code-xhs-live\" --keyword-limit 1 --notes-per-keyword 1 --max-comment-pages 1 --assistant-message-only)"
+      "Bash(node \"e:/workspace/openclaw-voc-skill/claude-code-voc-intelligence/mcp/src/tools/xiaohongshu-trend-run.js\" --collection-mode live --profile \"e:/workspace/openclaw-voc-skill/claude-code-voc-intelligence/memory-templates/xiaohongshu-trend-profile.json\" --output \"outputs/claude-code-xhs-live\" --keyword-limit 1 --notes-per-keyword 1 --max-comment-pages 1 --assistant-message-only)",
+      "Bash(python -c ' *)",
+      "Bash(powershell.exe -NoProfile -Command '$dirs = Get-ChildItem '\\\\''C:\\\\Users\\\\刚sir\\\\AppData\\\\Roaming\\\\Devin\\\\logs'\\\\'' -Directory | Sort-Object Name -Descending | Select-Object -First 1; Write-Host '\\\\''Latest: '\\\\'' $dirs.Name; Get-ChildItem $dirs.FullName -Recurse -Filter '\\\\''*.log'\\\\'' | ForEach-Object { $c = Get-Content $_.FullName -Tail 10 -ErrorAction SilentlyContinue; if\\($c -and $c.Trim\\(\\)\\) { Write-Host '\\\\''=== '\\\\'' $_.Name '\\\\'' ==='\\\\''; $c; Write-Host '\\\\'''\\\\'' } }')"
     ]
   }
 }

+ 17 - 0
.gitignore

@@ -27,3 +27,20 @@ claude-code/*.zip
 
 # Generated runtime memory
 memory/douyin-speaking-history.json
+
+# Scratch run logs
+build.out
+fulltest.out
+fulltest.err
+publish.out
+
+# Dependencies
+node_modules/
+
+# Session transfer / local-only material
+.devin-transfer/
+inputs/
+milin-clashverge-wireguard-udp443.yaml
+
+# Backup files
+*.bak-*

+ 17 - 0
claude-code/claude-code-qiwe-assistant/.env.example

@@ -0,0 +1,17 @@
+# Fmode 网关转发的企业微信接口
+QIWE_API_BASE=https://server.fmode.cn/api/qiwe
+
+# 可选:稳定标识一个企微设备;留空时技能首次使用会自动生成并保存。
+QIWE_UID=
+
+# 可选:通常会自动复用 Claude Code 已配置的 Fmode NewAPI sk- token。
+# 也可以显式配置平台 sessionToken 或 Fmode API token。
+QIWE_AUTH_TOKEN=
+
+# 企业微信接口访问凭据和设备上下文仅由 Fmode 网关管理,客户端无需配置。
+
+# 可选:覆盖企业微信官方 CLI 程序缓存目录。
+QIWE_OFFICIAL_CLI_RUNTIME_DIR=
+
+# 可选:覆盖官方 CLI 的本地加密认证目录;默认 ~/.config/wecom。
+WECOM_CLI_CONFIG_DIR=

+ 5 - 0
claude-code/claude-code-qiwe-assistant/.gitignore

@@ -0,0 +1,5 @@
+node_modules/
+outputs/
+.env
+.env.local
+!.env.example

+ 10 - 0
claude-code/claude-code-qiwe-assistant/.mcp.json

@@ -0,0 +1,10 @@
+{
+  "mcpServers": {
+    "qiwe": {
+      "command": "node",
+      "args": [
+        "./mcp/src/server.js"
+      ]
+    }
+  }
+}

+ 160 - 0
claude-code/claude-code-qiwe-assistant/README.md

@@ -0,0 +1,160 @@
+# 企业微信助手技能包
+
+提供两套相互独立的企业微信能力:
+
+1. 原有 **全量接口清单 + Fmode 网关转发 + 扫码登录 + 包月订阅管理**;
+2. 新增 **企业微信官方 CLI**,用于会议、文档等官方机器人能力。
+
+原有接口、登录和订阅请求仍统一经过:
+
+```text
+Claude Code / MCP
+  → Fmode 网关转发的企业微信接口
+  → Fmode 网关完成鉴权、订阅校验和设备上下文处理
+  → 企业微信服务
+```
+
+> 当前技能侧已经按 Fmode 网关协议实现;正式使用前需要在 Fmode 网关启用企业微信接口路由。
+
+官方 CLI 是第二条独立通道:技能包不会修改官方程序,而是在首次使用时把固定版本下载到用户缓存;官方机器人凭据由 CLI 在本地加密保存,不经过 Fmode 网关。
+
+## 组成
+
+```text
+├── .mcp.json
+├── .env.example
+├── bin/qiwe-official-cli.js
+├── wecom-cli-runtime.json
+├── mcp/
+│   ├── catalog/qiwe-endpoints.json
+│   └── src/
+│       ├── server.js
+│       ├── core/api-catalog.js
+│       ├── core/wecom-cli-runtime.js
+│       ├── core/credentials.js
+│       ├── providers/fmode-wecom-gateway.js
+│       ├── providers/wecom-official-cli.js
+│       └── tools/
+│           ├── qiwe-api-catalog-run.js
+│           ├── qiwe-login-run.js
+│           ├── qiwe-subscription-run.js
+│           └── wecom-official-cli-run.js
+├── skills/
+│   ├── qiwe-api-catalog/SKILL.md
+│   ├── qiwe-login/SKILL.md
+│   ├── qiwe-capability-router/SKILL.md
+│   ├── qiwe-official-meeting/SKILL.md
+│   └── qiwe-official-doc/SKILL.md
+├── docs/                             # 文档(specs/ guides/ generated/,规则见 OUTPUT-STANDARD.md)
+│   └── OUTPUT-STANDARD.md
+└── outputs/                          # 运行期生成文件,按类别归档,git 忽略
+```
+
+## 输出与目录标准
+
+所有生成文件遵循 [docs/OUTPUT-STANDARD.md](docs/OUTPUT-STANDARD.md):
+
+- 运行期产物统一写入 `outputs/<类别>/`(`login`、`api-calls`、`subscription`、`meetings`、`docs`、`messages`、`smoke`、`tmp`),根目录可用 `QIWE_OUTPUTS_DIR` 覆盖;
+- 覆盖型文件用 latest 模式(如 `outputs/login/qiwe-login-qrcode.png`),按次归档用 run 模式(`outputs/<类别>/<YYYY-MM-DD>/<HHmmss>-<slug>/` + `manifest.json`);
+- 路径一律通过 `mcp/src/core/output-paths.js` 解析;
+- 校验:`npm run outputs:validate`。
+
+## MCP 工具
+
+| 工具 | 说明 |
+|---|---|
+| `qiwe_api_search` | 检索 100+ 个企业微信接口 |
+| `qiwe_api_doc` | 查看参数、返回字段和调用模板 |
+| `qiwe_api_call` | `POST /api/qiwe/doApi`,传 `{uid, method, params}` |
+| `qiwe_login_status` | `GET /api/qiwe/login/status?uid=` |
+| `qiwe_login_start` | `POST /api/qiwe/login/start` 并保存二维码 |
+| `qiwe_login_check` | `POST /api/qiwe/login/check` |
+| `qiwe_login_verify` | `POST /api/qiwe/login/verify` |
+| `qiwe_subscription_status` | 查询订阅、席位、到期时间和余额 |
+| `qiwe_subscribe` | 开通、续费或增购席位 |
+| `qiwe_subscription_auto_renew` | 设置自动续费 |
+| `qiwe_official_status` | 检查官方 CLI 下载与授权状态 |
+| `qiwe_official_prepare` | 下载并缓存固定版本官方 CLI |
+| `qiwe_official_help` | 读取官方 category/method 帮助 |
+| `qiwe_official_call` | 结构化调用官方通讯录、文档、会议、消息、日程和待办能力 |
+
+## 官方 CLI 通道
+
+官方 CLI 保持原样,不复制或修改官方 Skills。本技能包自己的会议、文档 Skills 通过统一 MCP 适配层调用 CLI。
+
+运行时版本固定在 `wecom-cli-runtime.json`,默认安装到用户缓存:
+
+- Windows:`%LOCALAPPDATA%\Fmode\qiwe-assistant\wecom-cli\<version>`
+- macOS:`~/Library/Caches/fmode/qiwe-assistant/wecom-cli/<version>`
+- Linux:`~/.cache/fmode/qiwe-assistant/wecom-cli/<version>`
+
+可以让 Skill 首次使用时调用 `qiwe_official_prepare`,也可以提前下载:
+
+```bash
+npm run wecom:install
+```
+
+首次使用官方能力需要完成一次企业微信扫码:
+
+```bash
+npm run wecom:init
+```
+
+检查状态:
+
+```bash
+npm run wecom:status
+```
+
+官方 CLI 的认证默认保存在 `~/.config/wecom`,也可由 `WECOM_CLI_CONFIG_DIR` 覆盖。该认证与 Fmode token、`QIWE_UID` 和个人企微设备登录完全独立。
+
+## 鉴权和本地配置
+
+- 请求头统一为 `Authorization: Bearer <Fmode token>`。
+- 优先自动读取 Claude Code 已配置的 Fmode NewAPI `sk-` token。
+- 也支持 `QIWE_AUTH_TOKEN`、`FMODE_API_KEY`、`FMODE_API_TOKEN`、`NEWAPI_TOKEN` 或平台 sessionToken。
+- `QIWE_API_BASE` 默认 `https://server.fmode.cn/api/qiwe`。
+- `QIWE_UID` 是客户端设备别名;未配置时会生成随机稳定 uid,并写入 `.env.local` 和 `~/.claude/qiwe-credentials.json`。
+- 企业微信接口访问凭据和设备上下文由 Fmode 网关管理,不会出现在技能配置或返回结果中。
+
+## 首次使用
+
+1. `qiwe_subscription_status` 检查订阅;
+2. 未订阅时调用 `qiwe_subscribe`,`seats` 表示企微账号席位数;
+3. `qiwe_login_start` 生成二维码;
+4. 用户扫码后每 3–5 秒调用 `qiwe_login_check`;
+5. 状态 `10` 时用 `qiwe_login_verify` 提交 6 位验证码;
+6. 状态 `2` 后用 `qiwe_api_call` 调业务接口。
+
+业务调用只传清单中的业务参数:
+
+```json
+{
+  "id": "msg.sendText",
+  "params": {
+    "toId": "168...",
+    "content": "hello",
+    "isNoNeedRead": false
+  }
+}
+```
+
+## 安装与验证
+
+```bash
+npm install
+npm run check
+npm run smoke
+npm run outputs:validate
+```
+
+冒烟测试会启动本地 mock Fmode 网关,验证 Authorization、`uid/method/params` 请求信封、登录和订阅接口,不访问真实服务。
+同时会使用本地假 CLI 验证官方运行时状态、结构化参数传递和命令注入防护,不访问真实企业微信。
+
+## 限制
+
+- `cloud` 模块的 multipart 文件直传尚未由 Fmode 网关支持,`qiwe_api_call` 会拒绝这类接口。
+- `/login/*`、`/client/*` 不允许通过 `qiwe_api_call` 透传,必须使用登录专用工具。
+- 服务端未挂载前,默认生产地址会返回不可用;可通过 `QIWE_API_BASE` 指向测试环境。
+- 官方 CLI 首次下载需要 npm 网络访问,首次业务调用前需要独立完成企业微信机器人扫码授权。
+- 官方 CLI 通道失败不会替代或改变原有 Fmode 网关接口通道。

+ 12 - 0
claude-code/claude-code-qiwe-assistant/THIRD_PARTY_NOTICES.md

@@ -0,0 +1,12 @@
+# Third-Party Notices
+
+## WeCom CLI
+
+This package can download and execute the official WeCom CLI without modifying it.
+
+- Package: `@wecom/cli`
+- Pinned runtime version: `0.1.9`
+- Source: https://github.com/WeComTeam/wecom-cli
+- License: MIT
+
+The official CLI is downloaded into a user-level cache on demand and keeps its own encrypted authentication configuration. It is not copied into this repository, and its credentials are not sent through the Fmode gateway.

+ 48 - 0
claude-code/claude-code-qiwe-assistant/bin/qiwe-official-cli.js

@@ -0,0 +1,48 @@
+#!/usr/bin/env node
+const {
+  runtimeManifest,
+  prepareOfficialCli,
+  runOfficialCli,
+  getOfficialCliStatus,
+  getInitCommand,
+  sanitizeCliText
+} = require('../mcp/src/core/wecom-cli-runtime');
+
+async function main() {
+  const args = process.argv.slice(2);
+  const command = args[0];
+
+  if (command === 'install') {
+    const installed = await prepareOfficialCli({ force: args.includes('--force') });
+    console.log(
+      JSON.stringify(
+        {
+          status: 'ok',
+          package: runtimeManifest.package,
+          version: runtimeManifest.version,
+          cached: installed.cached
+        },
+        null,
+        2
+      )
+    );
+    return;
+  }
+
+  if (command === 'status') {
+    const status = await getOfficialCliStatus();
+    console.log(JSON.stringify({ ...status, initCommand: status.ready ? undefined : getInitCommand() }, null, 2));
+    return;
+  }
+
+  const result = await runOfficialCli(args, {
+    inherited: true,
+    timeoutMs: command === 'init' ? 10 * 60 * 1000 : 120000
+  });
+  if (result.exitCode !== 0) process.exit(result.exitCode);
+}
+
+main().catch(error => {
+  console.error(`qiwe-official-cli failed: ${sanitizeCliText(error.message)}`);
+  process.exit(1);
+});

+ 100 - 0
claude-code/claude-code-qiwe-assistant/docs/OUTPUT-STANDARD.md

@@ -0,0 +1,100 @@
+# 输出与目录标准(claude-code-qiwe-assistant)
+
+本文件定义技能包所有生成文件的目录规则。任何工具、脚本或 Skill 生成文件时必须遵循本标准,并通过 `mcp/src/core/output-paths.js` 模块解析路径,禁止直接拼 `process.cwd() + 'outputs'`。
+
+## 1. 顶层目录职责
+
+```text
+claude-code-qiwe-assistant/
+├── bin/          # CLI 入口,不生成文件
+├── mcp/          # MCP 服务源码与接口清单(catalog 为构建产物,由 scripts/build-catalog.py 生成)
+├── skills/       # SKILL.md 定义,只读
+├── scripts/      # 构建 / 安装 / 冒烟脚本
+├── docs/         # 人工与生成文档(见第 4 节)
+└── outputs/      # 所有运行期生成文件(见第 2 节,git 忽略)
+```
+
+## 2. /outputs 生成规则
+
+统一根目录:`<包根>/outputs`,可用环境变量 `QIWE_OUTPUTS_DIR` 覆盖。目录不存在时由 `output-paths.js` 自动创建。
+
+第一层为固定类别,禁止在 outputs 根目录直接放文件:
+
+| 类别 | 用途 |
+|---|---|
+| `login/` | 扫码登录二维码与预览页(保持固定文件名,最新一次覆盖) |
+| `api-calls/` | `qiwe_api_call` 落盘的请求/响应样本 |
+| `subscription/` | 订阅、席位、余额查询快照 |
+| `meetings/` | 官方 CLI 会议相关导出 |
+| `docs/` | 官方 CLI 文档能力导出 |
+| `messages/` | 消息发送记录与回执 |
+| `smoke/` | 冒烟测试产物 |
+| `tmp/` | 临时文件,可随时清理 |
+
+### 2.1 两种落盘模式
+
+1. **latest 模式**(固定文件名,覆盖写):适用于"只关心最新一份"的文件,如登录二维码。
+   路径:`outputs/<类别>/<固定文件名>`,通过 `latestPath(category, filename)` 获取。
+2. **run 模式**(按次归档):适用于每次运行都要保留的产物。
+   路径:`outputs/<类别>/<YYYY-MM-DD>/<HHmmss>-<slug>/`,通过 `createRunDir(category, slug)` 创建。
+   每个 run 目录必须包含 `manifest.json`(用 `writeRunManifest(runDir, meta)` 生成),至少含:
+
+```json
+{
+  "createdAt": "2026-07-12T09:00:00.000Z",
+  "tool": "qiwe_official_call",
+  "summary": {},
+  "files": ["meeting-list.json"]
+}
+```
+
+### 2.2 命名规则
+
+- 目录与文件名一律小写 kebab-case;slug 由 `slugify()` 生成,最长 60 字符。
+- 日期用 `YYYY-MM-DD`,时间用 `HHmmss`(UTC)。
+- 禁止绝对路径、空格和平台保留字符。
+
+### 2.3 保留与清理
+
+- `tmp/` 可随时删除;其余类别按日期目录归档,建议保留最近 30 天。
+- `outputs/` 整体在 `.gitignore` 中,不入库。
+
+## 3. 输出模块 API
+
+`mcp/src/core/output-paths.js` 暴露:
+
+```js
+outputsRoot()                       // outputs 根目录(含 QIWE_OUTPUTS_DIR 覆盖)
+categoryDir(category)               // 确保并返回类别目录
+latestPath(category, filename)      // latest 模式路径
+createRunDir(category, slug, date?) // run 模式目录
+writeRunManifest(runDir, manifest)  // 写 manifest.json
+slugify(value) / dateStamp() / timeStamp()
+OUTPUT_CATEGORIES                   // 允许的类别列表
+```
+
+新增输出类别时:先在 `OUTPUT_CATEGORIES` 注册,再更新本文件第 2 节表格。
+
+## 4. /docs 生成规则
+
+```text
+docs/
+├── OUTPUT-STANDARD.md   # 本标准
+├── specs/               # 设计与需求规格(人工撰写,kebab-case.md)
+├── guides/              # 使用指南、课程讲义
+└── generated/           # 脚本生成的文档,文件头必须注明生成脚本与时间,不手工编辑
+```
+
+- 生成型文档只能写入 `docs/generated/`,并以 `<主题>-<YYYY-MM-DD>.md` 命名;
+- 运行期数据(JSON 快照、日志、二维码等)一律进 `outputs/`,不得写入 `docs/`;
+- `docs/` 入库(git 跟踪),`outputs/` 不入库。
+
+## 5. 校验
+
+运行 `npm run outputs:validate`(`scripts/validate-output-standard.js`)检查:
+
+1. outputs 第一层只包含注册类别;
+2. run 模式目录包含 `manifest.json`;
+3. docs 第一层只包含本节列出的文件与目录。
+
+`npm run check` 已包含上述脚本的语法检查。

+ 0 - 0
claude-code/claude-code-qiwe-assistant/docs/generated/.gitkeep


+ 0 - 0
claude-code/claude-code-qiwe-assistant/docs/guides/.gitkeep


+ 0 - 0
claude-code/claude-code-qiwe-assistant/docs/specs/.gitkeep


+ 5229 - 0
claude-code/claude-code-qiwe-assistant/mcp/catalog/qiwe-endpoints.json

@@ -0,0 +1,5229 @@
+{
+ "version": "0.2.0",
+ "updatedAt": "2026-07-10",
+ "source": "企业微信开放接口资料",
+ "gateway": {
+  "baseUrl": "https://server.fmode.cn/api/qiwe",
+  "endpoint": "POST {baseUrl}/doApi",
+  "auth": "Authorization: Bearer <Fmode token>",
+  "envelope": "Fmode 网关请求信封:{\"uid\": \"<本地稳定设备标识>\", \"method\": \"<接口 method 路径>\", \"params\": {...}};企业微信接口访问凭据和设备上下文由 Fmode 网关管理。",
+  "note": "所有业务请求均通过 Fmode 网关转发的企业微信接口执行。清单未登记的普通 JSON 接口可用 qiwe_api_call 传 rawMethod + params;登录和设备接口必须使用 qiwe_login_* 专用工具。"
+ },
+ "modules": [
+  "client",
+  "cloud",
+  "contact",
+  "label",
+  "login",
+  "msg",
+  "room",
+  "session",
+  "sns",
+  "user"
+ ],
+ "endpoints": [
+  {
+   "id": "room.openidToId",
+   "module": "room",
+   "title": "OpenID转Roomid",
+   "summary": "OpenID转Roomid 将 OpenID 转换为 Roomid,用于群聊等场景下的用户标识映射。",
+   "method": "/room/openidToId",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "OpenID转Roomid.md",
+   "tags": [
+    "群模块",
+    "room",
+    "OpenID转Roomid",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "openRoomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群openid。单个查询"
+    },
+    {
+     "name": "openRoomIdList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "群openid列表。批量查询(当单个查询时,批量查询不会生效,只能任选其一)"
+    },
+    {
+     "name": "corpAgentId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "企业应用id,请从企业模块-企业应用相关API中获取"
+    }
+   ],
+   "responseHint": "data 字段:roomId(目标群聊 ID,可通过群分页或群详情接口获取 roomId);roomIdList(群Id列表)"
+  },
+  {
+   "id": "contact.openidToId",
+   "module": "contact",
+   "title": "Openid转Userid",
+   "summary": "Openid转Userid • OpenID:就是官方API的 external_userid(客户的唯一身份证)",
+   "method": "/contact/openidToId",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "Openid转Userid.md",
+   "tags": [
+    "contact",
+    "Openid转Userid",
+    "联系人模块",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "openIdList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "用户openid"
+    },
+    {
+     "name": "openPartyIdList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "部门openid"
+    },
+    {
+     "name": "corpAgentId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "企业应用id,请从企业模块-企业应用相关API中获取"
+    }
+   ],
+   "responseHint": "data 字段:vid2UserIdList(Vid2用户Id列表);partyId2OpenPartyIdList(PartyId2OpenPartyId列表);vid2OpenIdList(Vid2OpenId列表)"
+  },
+  {
+   "id": "room.openid",
+   "module": "room",
+   "title": "Roomid转OpenID",
+   "summary": "Roomid转OpenID 将 Roomid 转换为 OpenID,用于跨场景的用户标识映射。",
+   "method": "/room/openid",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "Roomid转OpenID.md",
+   "tags": [
+    "群模块",
+    "room",
+    "Roomid转OpenID",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "corpAgentId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "请从企业模块-企业应用相关API中获取"
+    }
+   ],
+   "responseHint": "data 字段:openRoomId(Open群Id)"
+  },
+  {
+   "id": "contact.openid",
+   "module": "contact",
+   "title": "Userid转Openid",
+   "summary": "Userid转Openid OpenID:就是官方API的 external_userid(客户的唯一身份证)",
+   "method": "/contact/openid",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "Userid转Openid.md",
+   "tags": [
+    "contact",
+    "联系人模块",
+    "Userid转Openid",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "userIdList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "用户id列表"
+    },
+    {
+     "name": "corpAgentId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "请从企业模块-企业应用相关API中获取"
+    }
+   ],
+   "responseHint": "data 字段:openUserList(Open用户列表)"
+  },
+  {
+   "id": "msg.syncCollectionMsg",
+   "module": "msg",
+   "title": "个人收藏-分页",
+   "summary": "个人收藏-分页 • 接口返回结果包含 表情收藏列表 和 消息收藏列表 。",
+   "method": "/msg/syncCollectionMsg",
+   "category": [
+    "API参考",
+    "基础能力",
+    "个人模块"
+   ],
+   "docFile": "个人收藏-分页.md",
+   "tags": [
+    "基础能力",
+    "个人收藏-分页",
+    "msg",
+    "个人模块",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "msgSeq",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "分页使用,首次传0,下次传入返回值seq"
+    },
+    {
+     "name": "limit",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "每页数量"
+    }
+   ],
+   "responseHint": "data 字段:lastSeq(最后序号);list(列表)"
+  },
+  {
+   "id": "msg.insertCollectionMsg",
+   "module": "msg",
+   "title": "个人收藏-添加GIF表情",
+   "summary": "个人收藏-添加GIF表情 提示: 上传表情文件时,单文件大小不允许超过 1MB ,超出限制会导致添加失败",
+   "method": "/msg/insertCollectionMsg",
+   "category": [
+    "API参考",
+    "基础能力",
+    "个人模块"
+   ],
+   "docFile": "个人收藏-添加GIF表情.md",
+   "tags": [
+    "基础能力",
+    "个人收藏-添加GIF表情",
+    "msg",
+    "个人模块",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "msgData",
+     "in": "body",
+     "type": "object",
+     "required": true,
+     "desc": "消息数据",
+     "children": [
+      {
+       "name": "fileMd5",
+       "in": "body",
+       "type": "string",
+       "required": true,
+       "desc": "图片md5"
+      },
+      {
+       "name": "fileHttpUrl",
+       "in": "body",
+       "type": "string",
+       "required": true,
+       "desc": "接口详情见: 文件CDN转URL"
+      }
+     ]
+    },
+    {
+     "name": "type",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "类型编号。"
+    }
+   ]
+  },
+  {
+   "id": "label.editLabel",
+   "module": "label",
+   "title": "个人标签-增删改",
+   "summary": "个人标签-增删改 对个人标签进行新增、修改或删除操作。",
+   "method": "/label/editLabel",
+   "category": [
+    "API参考",
+    "客户管理",
+    "标签模块"
+   ],
+   "docFile": "个人标签-增删改.md",
+   "tags": [
+    "label",
+    "标签模块",
+    "个人标签-增删改",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "opType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "1 新建标签, 此时必须设置 labelName 和 labelSuperId;2 删除标签,此时必须设置 labelId;3 修改标签, 此时必须设置 labelId 和 labelName,labelSuperId;"
+    },
+    {
+     "name": "paramList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "Param列表",
+     "children": [
+      {
+       "name": "labelId",
+       "in": "body",
+       "type": "string",
+       "required": false,
+       "desc": "标签ID"
+      },
+      {
+       "name": "labelSuperId",
+       "in": "body",
+       "type": "string",
+       "required": false,
+       "desc": "个人标签所属的分组ID"
+      },
+      {
+       "name": "labelName",
+       "in": "body",
+       "type": "string",
+       "required": false,
+       "desc": "标签名称"
+      }
+     ]
+    }
+   ]
+  },
+  {
+   "id": "cloud.wxDownload",
+   "module": "cloud",
+   "title": "个微文件下载",
+   "summary": "个微文件下载 - 下载地址为临时云资源,非官方CDN,7–15天不定期清理,请及时下载。",
+   "method": "/cloud/wxDownload",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "文件与媒体(下载",
+    "上传)"
+   ],
+   "docFile": "个微文件下载.md",
+   "tags": [
+    "个微文件下载",
+    "文件与媒体(下载",
+    "上传)",
+    "cloud",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "fileAeskey",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件Aeskey"
+    },
+    {
+     "name": "fileAuthkey",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件Authkey"
+    },
+    {
+     "name": "fileSize",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "文件大小"
+    },
+    {
+     "name": "fileType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "1: 大图. 如果【接收图片消息】中的字段 image_has_hd=1,或者fileBigHttpUrl有值, 则可以使用这个type下载2: 小图. 如果image_has_hd=0,或者fileMiddleHttpUrl有值, 则应该用这个type下载3: 视频/图片缩略图,对应thumb这个字段4: 视频5: 文件/语音文件"
+    },
+    {
+     "name": "fileUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件链接"
+    }
+   ],
+   "responseHint": "data 字段:cloudUrl(云端文件地址。)"
+  },
+  {
+   "id": "cloud.wxDownloadAsync",
+   "module": "cloud",
+   "title": "个微文件异步下载",
+   "summary": "个微文件异步下载 - 下载地址为临时云资源,非官方CDN,7–15天不定期清理,请及时下载。• 异步下载结果通过回调通知,详情查阅回调结构说明中的 API 异步消息响应。• 根据回调返回的 requestId 值查询,requestId 一致即为对应下载结果。",
+   "method": "/cloud/wxDownloadAsync",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "文件与媒体(下载",
+    "上传)"
+   ],
+   "docFile": "个微文件异步下载.md",
+   "tags": [
+    "文件与媒体(下载",
+    "上传)",
+    "个微文件异步下载",
+    "cloud",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "fileAeskey",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件Aeskey"
+    },
+    {
+     "name": "fileAuthkey",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件Authkey"
+    },
+    {
+     "name": "fileSize",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "文件大小"
+    },
+    {
+     "name": "fileType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "1: 大图. 如果【接收图片消息】中的字段 image_has_hd=1,或者fileBigHttpUrl有值, 则可以使用这个type下载2: 小图. 如果image_has_hd=0,或者fileMiddleHttpUrl有值, 则应该用这个type下载3: 视频/图片缩略图,对应thumb这个字段4: 视频5: 文件/语音文件"
+    },
+    {
+     "name": "fileUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件链接"
+    }
+   ],
+   "responseHint": "data 字段:requestId(请使用requestId 去消息回调中获取文件地址)"
+  },
+  {
+   "id": "login.verifyLoginQrcode",
+   "module": "login",
+   "title": "二维码-code验证(步骤4)",
+   "summary": "二维码-code验证收到 6 位验证码后,调用本接口完成校验。 收到6位数验证码,执行此接口验证• 验证码校验成功后,必须再次调用 二维码状态-检测(步骤3) 接口,此时状态码将变为 Status=2,代表登录成功。",
+   "method": "/login/verifyLoginQrcode",
+   "category": [
+    "API参考",
+    "基础能力",
+    "登录模块"
+   ],
+   "docFile": "二维码-code验证(步骤4).md",
+   "tags": [
+    "基础能力",
+    "二维码-code验证(步骤4)",
+    "登录模块",
+    "login",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "code",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "手机端 6 位验证码。"
+    }
+   ]
+  },
+  {
+   "id": "login.getLoginQrcode",
+   "module": "login",
+   "title": "二维码-获取(步骤2)",
+   "summary": "二维码-获取 获取登录二维码及 loginQrcodeKey,供手机企微扫码完成设备绑定。 • 首次登录:请使用参数 useCache=false,获取全新二维码。 • 旧设备异常:提示设备不存在/不在线时,先调用恢复设备接口,再获取二维码。 • 恢复设备后:请使用参数 useCache=true,获取缓存二维码。",
+   "method": "/login/getLoginQrcode",
+   "category": [
+    "API参考",
+    "基础能力",
+    "登录模块"
+   ],
+   "docFile": "二维码-获取(步骤2).md",
+   "tags": [
+    "基础能力",
+    "登录模块",
+    "login",
+    "二维码-获取(步骤2)",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "useCache",
+     "in": "body",
+     "type": "boolean",
+     "required": true,
+     "desc": "是否使用缓存二维码,首次登录传 false。"
+    }
+   ],
+   "responseHint": "data 字段:loginQrcodeBase64Data(二维码 Base64 图片。);loginQrcodeKey(二维码key)"
+  },
+  {
+   "id": "login.checkLoginQrCode",
+   "module": "login",
+   "title": "二维码状态-检测(步骤3)",
+   "summary": "二维码状态-检测 获取二维码后,需轮询调用本接口,实时获取用户的扫码进度。 核心逻辑 • 请求频率:建议轮询间隔 2-3 秒,避免请求过于频繁。 • 生命周期:从“获取二维码”开始,到“登录成功/失败”结束。超时将报错。",
+   "method": "/login/checkLoginQrCode",
+   "category": [
+    "API参考",
+    "基础能力",
+    "登录模块"
+   ],
+   "docFile": "二维码状态-检测(步骤3).md",
+   "tags": [
+    "基础能力",
+    "登录模块",
+    "二维码状态-检测(步骤3)",
+    "login",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    }
+   ],
+   "responseHint": "data 字段:corpId(企业 ID。);corpLogo(企业 Logo URL。);loginQrcodeKey(二维码 Key);loginQrcodeStatus(扫码状态:-1 未登陆,需要扫码登陆 · 0 未登陆,可免扫码登陆 · 1 已扫码待确认 · 2 登陆成功 · 4 用户取消登陆 · 10 已扫码确认,待检测6位验证码);nickname(昵称);userId(用户id);avatarUrl(头像 URL。)"
+  },
+  {
+   "id": "cloud.cdnBigFileUploadByUrlAsync",
+   "module": "cloud",
+   "title": "企微大文件异步上传",
+   "summary": "企微大文件异步上传 - 异步上传结果通过回调通知,详情查阅回调结构说明中的 API 异步消息响应。• 根据回调返回的 requestId 值查询,requestId 一致即为对应上传结果。",
+   "method": "/cloud/cdnBigFileUploadByUrlAsync",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "文件与媒体(下载",
+    "上传)"
+   ],
+   "docFile": "企微大文件异步上传.md",
+   "tags": [
+    "文件与媒体(下载",
+    "企微大文件异步上传",
+    "上传)",
+    "cloud",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true
+    },
+    {
+     "name": "filename",
+     "in": "body",
+     "type": "string",
+     "required": true
+    },
+    {
+     "name": "fileUrl",
+     "in": "body",
+     "type": "string",
+     "required": true
+    },
+    {
+     "name": "fileType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "22大视频 35文件"
+    }
+   ],
+   "responseHint": "data 字段:requestId(请求Id)"
+  },
+  {
+   "id": "cloud.wxWorkDownload",
+   "module": "cloud",
+   "title": "企微文件下载",
+   "summary": "企微文件下载 - 下载地址为临时云资源,非官方CDN,7–15天不定期清理,请及时下载。",
+   "method": "/cloud/wxWorkDownload",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "文件与媒体(下载",
+    "上传)"
+   ],
+   "docFile": "企微文件下载.md",
+   "tags": [
+    "文件与媒体(下载",
+    "企微文件下载",
+    "上传)",
+    "cloud",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "fileAeskey",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件Aeskey"
+    },
+    {
+     "name": "fileId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件 ID"
+    },
+    {
+     "name": "fileSize",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "文件大小"
+    },
+    {
+     "name": "fileType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "文件类型编号。"
+    }
+   ],
+   "responseHint": "data 字段:cloudUrl(云端文件地址。)"
+  },
+  {
+   "id": "cloud.cdnUploadByUrlAsync",
+   "module": "cloud",
+   "title": "企微文件异步上传",
+   "summary": "企微文件异步上传 - 异步上传结果通过回调通知,详情查阅回调结构说明中的 API 异步消息响应。• 根据回调返回的 requestId 值查询,requestId 一致即为对应上传结果。",
+   "method": "/cloud/cdnUploadByUrlAsync",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "文件与媒体(下载",
+    "上传)"
+   ],
+   "docFile": "企微文件异步上传.md",
+   "tags": [
+    "文件与媒体(下载",
+    "企微文件异步上传",
+    "上传)",
+    "cloud",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "filename",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件名称"
+    },
+    {
+     "name": "fileUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件url地址"
+    },
+    {
+     "name": "fileType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "1: jpg图片4: mp4视频5: 文件(也包括语音silk文件)"
+    }
+   ],
+   "responseHint": "data 字段:requestId(请求Id)"
+  },
+  {
+   "id": "cloud.wxWorkDownloadAsync",
+   "module": "cloud",
+   "title": "企微文件异步下载",
+   "summary": "企微文件异步下载 - 下载地址为临时云资源,非官方CDN,7–15天不定期清理,请及时下载。• 异步下载结果通过回调通知,详情查阅回调结构说明中的 API 异步消息响应。• 根据回调返回的 requestId 值查询,requestId 一致即为对应下载结果。",
+   "method": "/cloud/wxWorkDownloadAsync",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "文件与媒体(下载",
+    "上传)"
+   ],
+   "docFile": "企微文件异步下载.md",
+   "tags": [
+    "文件与媒体(下载",
+    "企微文件异步下载",
+    "上传)",
+    "cloud",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "fileAeskey",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件Aeskey"
+    },
+    {
+     "name": "fileId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件 ID"
+    },
+    {
+     "name": "fileSize",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "文件大小"
+    },
+    {
+     "name": "fileType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "1: 大图. 如果【接收图片消息】中的字段 image_has_hd=1, 则可以使用这个type下载2: 小图. 如果image_has_hd=0, 则应该用这个type下载3: 视频/图片缩略图,对应thumb这个字段4: 视频5: 文件/语音文件"
+    }
+   ],
+   "responseHint": "data 字段:requestId(请使用requestId 去消息回调中获取文件地址)"
+  },
+  {
+   "id": "session.getSessionPage",
+   "module": "session",
+   "title": "会话分页",
+   "summary": "会话分页 分页查询会话列表,包含单聊与群聊会话。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/session/getSessionPage",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "会话模块"
+   ],
+   "docFile": "会话分页.md",
+   "tags": [
+    "会话与消息",
+    "会话模块",
+    "session",
+    "会话分页",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "currentSeq",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "暂时不支持。分页使用,首次传0,下次传入返回值currentSeq"
+    }
+   ],
+   "responseHint": "data 字段:currentSeq(下次请求时应传入的currentSeq);hasMore(是否有更多);sessionCount(会话数量);sessionList(会话列表)"
+  },
+  {
+   "id": "session.getSessionList",
+   "module": "session",
+   "title": "会话组-查询",
+   "summary": "会话组-查询 查询会话分组列表及每个分组下的会话归属。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/session/getSessionList",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "会话模块"
+   ],
+   "docFile": "会话组-查询.md",
+   "tags": [
+    "会话与消息",
+    "会话模块",
+    "session",
+    "会话组-查询",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    }
+   ],
+   "responseHint": "data 字段:collectList(通讯录列表);shieldList(免打扰列表);topList(置顶列表);markList(标记列表)"
+  },
+  {
+   "id": "session.setSessionCmd",
+   "module": "session",
+   "title": "会话组-编辑",
+   "summary": "会话组-编辑 创建、修改或删除会话分组,整理会话列表结构。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/session/setSessionCmd",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "会话模块"
+   ],
+   "docFile": "会话组-编辑.md",
+   "tags": [
+    "会话与消息",
+    "会话组-编辑",
+    "会话模块",
+    "session",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "chatId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "会话id"
+    },
+    {
+     "name": "chatType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "1: 置顶 2: 取消置顶 3: 开启免打扰 4: 取消免打扰 5: 保存群聊到通讯录 6: 从通讯录移除群聊 7: 标记 8:取消标记"
+    }
+   ]
+  },
+  {
+   "id": "msg.statusModify",
+   "module": "msg",
+   "title": "修改消息状态",
+   "summary": "修改消息状态 批量查询朋友圈动态的详细内容,包括图片、视频与互动信息。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/statusModify",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "修改消息状态.md",
+   "tags": [
+    "修改消息状态",
+    "会话与消息",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "chatId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "会话id,=sessionId"
+    },
+    {
+     "name": "modifyType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "1: 标记为已读 2: 标记为未读 3: 清空聊天记录 4: 从聊天列表删除该聊天"
+    }
+   ]
+  },
+  {
+   "id": "room.modifyRoomNotice",
+   "module": "room",
+   "title": "修改群公告",
+   "summary": "修改群公告 修改指定群聊的公告内容。",
+   "method": "/room/modifyRoomNotice",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "修改群公告.md",
+   "tags": [
+    "修改群公告",
+    "群模块",
+    "room",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "notice",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群公告。"
+    }
+   ]
+  },
+  {
+   "id": "room.modifyRoomNickname",
+   "module": "room",
+   "title": "修改群内昵称",
+   "summary": "修改群内昵称 修改当前账号在指定群内的显示昵称。",
+   "method": "/room/modifyRoomNickname",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "修改群内昵称.md",
+   "tags": [
+    "群模块",
+    "room",
+    "修改群内昵称",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "nickname",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "用户昵称。"
+    }
+   ]
+  },
+  {
+   "id": "room.modifyRoomName",
+   "module": "room",
+   "title": "修改群名称",
+   "summary": "修改群名称 修改指定群聊的名称。",
+   "method": "/room/modifyRoomName",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "修改群名称.md",
+   "tags": [
+    "群模块",
+    "room",
+    "客户管理",
+    "修改群名称",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "name",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "名称"
+    }
+   ]
+  },
+  {
+   "id": "room.modifyRoomRemarkName",
+   "module": "room",
+   "title": "修改群备注",
+   "summary": "修改群备注 群备注仅自己可见",
+   "method": "/room/modifyRoomRemarkName",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "修改群备注.md",
+   "tags": [
+    "群模块",
+    "room",
+    "修改群备注",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "remarkName",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "备注名称"
+    }
+   ]
+  },
+  {
+   "id": "client.stopClient",
+   "module": "client",
+   "title": "停用设备",
+   "summary": "停用设备 设备切换 如需更换新设备或重新开始流程,请遵循 “先停再建” 原则:• 第一步:停用设备 调用「停用设备」接口,释放当前占用的资源。• 第二步:创建设备 调用 创建设备(步骤1) 接口,初始化全新的设备环境。",
+   "method": "/client/stopClient",
+   "category": [
+    "API参考",
+    "基础能力",
+    "登录模块"
+   ],
+   "docFile": "停用设备.md",
+   "tags": [
+    "基础能力",
+    "登录模块",
+    "client",
+    "停用设备",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    }
+   ]
+  },
+  {
+   "id": "contact.updateWxWorkContact",
+   "module": "contact",
+   "title": "内部联系人信息-更新",
+   "summary": "内部联系人信息-更新 更新内部联系人的备注等资料信息。",
+   "method": "/contact/updateWxWorkContact",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "内部联系人信息-更新.md",
+   "tags": [
+    "contact",
+    "联系人模块",
+    "客户管理",
+    "内部联系人信息-更新",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "userId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "用户id"
+    },
+    {
+     "name": "remark",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "备注名。"
+    },
+    {
+     "name": "desc",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "描述"
+    }
+   ]
+  },
+  {
+   "id": "contact.getWxWorkContactList",
+   "module": "contact",
+   "title": "内部联系人分页",
+   "summary": "内部联系人分页 分页拉取企业内部联系人(同事)列表。",
+   "method": "/contact/getWxWorkContactList",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "内部联系人分页.md",
+   "tags": [
+    "contact",
+    "内部联系人分页",
+    "联系人模块",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "clientVersion",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "客户端版本号。"
+    },
+    {
+     "name": "limit",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "每页数量"
+    }
+   ],
+   "responseHint": "data 字段:contactCount(联系人数量);contactList(联系人列表);currentVersion(下次请求时应传入的currentVersion);hasMore(是否有更多)"
+  },
+  {
+   "id": "label.syncLabelList",
+   "module": "label",
+   "title": "列表分页",
+   "summary": "列表分页 分页查询列表数据。",
+   "method": "/label/syncLabelList",
+   "category": [
+    "API参考",
+    "客户管理",
+    "标签模块"
+   ],
+   "docFile": "列表分页.md",
+   "tags": [
+    "label",
+    "标签模块",
+    "客户管理",
+    "列表分页",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "currentSeq",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "分页使用,首次传0,下次传入返回值currentSeq"
+    },
+    {
+     "name": "labelType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "1 企业标签 =2 个人标签"
+    }
+   ],
+   "responseHint": "data 字段:currentSeq(下次请求时应传入的currentSeq);hasMore(是否有更多);labelCount(标签数量);labelList(标签列表)"
+  },
+  {
+   "id": "room.createRoom",
+   "module": "room",
+   "title": "创建群",
+   "summary": "创建群 创建新的群聊。",
+   "method": "/room/createRoom",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "创建群.md",
+   "tags": [
+    "群模块",
+    "room",
+    "客户管理",
+    "创建群",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "isOuterRoom",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "是否外部群"
+    },
+    {
+     "name": "memberList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "成员列表。"
+    }
+   ],
+   "responseHint": "data 字段:memberList(群成员列表);roomCreatetime(创建时间);roomCreatorId(创建人id);roomId(群id)"
+  },
+  {
+   "id": "client.createClient",
+   "module": "client",
+   "title": "创建设备(步骤1)",
+   "summary": "创建设备 — 获取虚拟设备实例 通过该接口创建一个企业微信云设备实例,返回 guid(设备唯一标识)。后续所有操作(扫码登录、收发消息等)均依赖此 guid。 重要:创建/恢复设备后 5 分钟内未完成登录,该实例将自动清理。代理地区务必与企微手机登录所在地一致,严禁异省,否则可能导致登录失败。",
+   "method": "/client/createClient",
+   "category": [
+    "API参考",
+    "基础能力",
+    "登录模块"
+   ],
+   "docFile": "创建设备(步骤1).md",
+   "tags": [
+    "基础能力",
+    "登录模块",
+    "创建设备(步骤1)",
+    "client",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "proxyUrl",
+     "in": "body",
+     "type": "string",
+     "required": false,
+     "desc": "- **网络方式2:自定义代理ip** 格式必须为: socks5://user:password@ip:port,如无验证直接写地址即可。目前只支持socks5。 示例:socks5://root:123456@192.168.88.242:1080"
+    },
+    {
+     "name": "areaCode",
+     "in": "body",
+     "type": "integer",
+     "required": false,
+     "desc": "- **网络方式1:使用地区ID** 110000:北京市 | 120000:天津市 | 130000:河北省 | 140000:山西省 150000:内蒙古 | 210000:辽宁省 | 220000:吉林省 | 230000:黑龙江省 310000:上海市 | 320000:江苏省 | 330000:浙江省 | 340000:安徽省 350000:福建省 | 360000:江西省 | 370000:山东省 | 410000:河南省 420000:湖北省 | 430000:湖南省 | 440000:广东省 | 450000:广 西 460000:海南省 | 500000:重庆市 | 510000:四川省 | 520000:贵州省 530000:云南省 | 540000:西 藏 | 610000:陕西省 | 620000:甘肃省 630000:青海省 | 640000:宁 夏 | 650000:新 疆"
+    },
+    {
+     "name": "deviceName",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "用于在控制台辨识不同设备,如「张三的iPad"
+    },
+    {
+     "name": "deviceType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "设备类型:0 = iPad(推荐),2 = Windows"
+    },
+    {
+     "name": "clientVersion",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "iPad 最新版5.0.2.206376 = ,Windows 最新版5.0.2.6011。如无特殊需求置空即可"
+    },
+    {
+     "name": "aid",
+     "in": "body",
+     "type": "string",
+     "required": false,
+     "desc": "- **网络方式3:本地代理** 需配合 Aid 客户端工具使用:[Win Aid 工具下载](https://download-1308498490.cos.ap-guangzhou.myqcloud.com/gewe-AidNet-win64.exe_20260425_200627.zip?q-sign-algorithm=sha1&q-ak=AKIDmOkqfDUUDfqjMincBSSAbleGaeQv96mB&q-sign-time=1777118830;10417032430&q-key-time=1777118830;10417032430&q-header-list=host&q-url-param-list=&q-signature=3a7cabdea6463d09f51936f1f5fdad111dc70e9c) 需在本地电脑运行 Aid 客户端 24小时在线 提供最稳定、最纯净的网络环境"
+    }
+   ],
+   "responseHint": "data 字段:guid(参数 guid)"
+  },
+  {
+   "id": "sns.deleteSns",
+   "module": "sns",
+   "title": "删除朋友圈",
+   "summary": "删除朋友圈 删除指定朋友圈动态。",
+   "method": "/sns/deleteSns",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "朋友圈模块"
+   ],
+   "docFile": "删除朋友圈.md",
+   "tags": [
+    "sns",
+    "朋友圈模块",
+    "删除朋友圈",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "snsId",
+     "in": "body",
+     "type": "number",
+     "required": true,
+     "desc": "朋友圈Id"
+    }
+   ]
+  },
+  {
+   "id": "contact.deleteContact",
+   "module": "contact",
+   "title": "删除联系人",
+   "summary": "删除联系人 删除指定联系人,解除好友关系或从列表中移除。",
+   "method": "/contact/deleteContact",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "删除联系人.md",
+   "tags": [
+    "contact",
+    "联系人模块",
+    "删除联系人",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "userId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "用户id"
+    }
+   ]
+  },
+  {
+   "id": "msg.sendGif",
+   "module": "msg",
+   "title": "发送GIF表情消息",
+   "summary": "发送GIF表情消息 发送GIF表情步骤方法一: GIF图片上传:调用 文件上传 接口。 获取GIF的CdnUrl:调用 文件CDN转URL 接口。 发送GIF表情步骤方法二: 获取收藏表情列表:通过调用 收藏分页 API,过滤出 表情收藏列表 。",
+   "method": "/msg/sendGif",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "发送GIF表情消息.md",
+   "tags": [
+    "会话与消息",
+    "发送GIF表情消息",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "wxFileUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "Wx文件链接"
+    },
+    {
+     "name": "toId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "接收方 ID,联系人传 userId,群聊传 roomId。"
+    }
+   ],
+   "responseHint": "data 字段:isSendSuccess(是否发送成功);msgServerId(消息id,用于撤回消息);msgType(是否发送成功);msgUniqueIdentifier(消息唯一标识);seq(消息序号);timestamp(时间戳)"
+  },
+  {
+   "id": "msg.sendPersonalCard",
+   "module": "msg",
+   "title": "发送名片消息",
+   "summary": "发送名片消息 取消群内置顶消息。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/sendPersonalCard",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "发送名片消息.md",
+   "tags": [
+    "会话与消息",
+    "发送名片消息",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "sharedId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "要分享的好友id"
+    },
+    {
+     "name": "toId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "接收方 ID,联系人传 userId,群聊传 roomId。"
+    }
+   ],
+   "responseHint": "data 字段:isSendSuccess(是否发送成功);msgServerId(消息id,用于撤回消息);msgType(消息类型);msgUniqueIdentifier(消息唯一标识);seq(消息序号);timestamp(时间戳)"
+  },
+  {
+   "id": "msg.sendImage",
+   "module": "msg",
+   "title": "发送图片消息",
+   "summary": "发送图片消息 图片格式 JPG 图片消息参数:通过接口 文件上传 或 文件上传-URL 获取发送图片参数。也可通过回调获取相应参数。",
+   "method": "/msg/sendImage",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "发送图片消息.md",
+   "tags": [
+    "发送图片消息",
+    "会话与消息",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "fileAesKey",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件密钥"
+    },
+    {
+     "name": "fileId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件id"
+    },
+    {
+     "name": "fileMd5",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件md5值"
+    },
+    {
+     "name": "fileSize",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "文件大小"
+    },
+    {
+     "name": "filename",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件名称"
+    },
+    {
+     "name": "toId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "接收方 ID,联系人传 userId,群聊传 roomId。"
+    }
+   ],
+   "responseHint": "data 字段:isSendSuccess(是否发送成功);msgServerId(消息id,用于撤回消息);msgType(消息类型);msgUniqueIdentifier(消息唯一标识);seq(消息序号);timestamp(时间戳)"
+  },
+  {
+   "id": "msg.sendLocation",
+   "module": "msg",
+   "title": "发送定位消息",
+   "summary": "发送定位消息 查询群发任务的执行状态与发送结果。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/sendLocation",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "发送定位消息.md",
+   "tags": [
+    "会话与消息",
+    "msg",
+    "发送定位消息",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "title",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "标题"
+    },
+    {
+     "name": "address",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "地址"
+    },
+    {
+     "name": "latitude",
+     "in": "body",
+     "type": "number",
+     "required": true,
+     "desc": "纬度"
+    },
+    {
+     "name": "longitude",
+     "in": "body",
+     "type": "number",
+     "required": true,
+     "desc": "经度"
+    },
+    {
+     "name": "toId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "接收方 ID,联系人传 userId,群聊传 roomId。"
+    }
+   ],
+   "responseHint": "data 字段:isSendSuccess(是否发送成功);msgServerId(消息id,用于撤回消息);msgType(消息类型);msgUniqueIdentifier(消息唯一标识);seq(消息序号);timestamp(时间戳)"
+  },
+  {
+   "id": "msg.sendWeapp",
+   "module": "msg",
+   "title": "发送小程序消息",
+   "summary": "发送小程序消息 将指定消息设为群内置顶,方便成员查看重要通知。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/sendWeapp",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "发送小程序消息.md",
+   "tags": [
+    "发送小程序消息",
+    "会话与消息",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "appId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "小程序appid"
+    },
+    {
+     "name": "coverFileAesKey",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "封面文件AesKey"
+    },
+    {
+     "name": "coverFileId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "封面图id"
+    },
+    {
+     "name": "coverFileSize",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "封面图大小"
+    },
+    {
+     "name": "desc",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "描述"
+    },
+    {
+     "name": "pagePath",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "小程序页面路径。"
+    },
+    {
+     "name": "thumbUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "缩略图 URL。"
+    },
+    {
+     "name": "title",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "标题"
+    },
+    {
+     "name": "username",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "账号原始id"
+    },
+    {
+     "name": "toId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "接收方 ID,联系人传 userId,群聊传 roomId。"
+    }
+   ],
+   "responseHint": "data 字段:isSendSuccess(是否发送成功);msgServerId(消息id,用于撤回消息);msgType(消息类型);msgUniqueIdentifier(消息唯一标识);seq(消息序号);timestamp(时间戳)"
+  },
+  {
+   "id": "msg.sendFile",
+   "module": "msg",
+   "title": "发送文件消息",
+   "summary": "发送纯文本消息 向指定联系人或群聊发送文件。发送前请确认接收方 ID(toId 或 roomId)正确。",
+   "method": "/msg/sendFile",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "发送文件消息.md",
+   "tags": [
+    "会话与消息",
+    "发送文件消息",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "fileAesKey",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "大文件时,可为空;否则必填"
+    },
+    {
+     "name": "fileId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件id"
+    },
+    {
+     "name": "fileSize",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "文件大小"
+    },
+    {
+     "name": "filename",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件名称"
+    },
+    {
+     "name": "toId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "接收方 ID,联系人传 userId,群聊传 roomId。"
+    }
+   ],
+   "responseHint": "data 字段:isSendSuccess(是否发送成功);msgServerId(消息id,用于撤回消息);msgType(消息类型);msgUniqueIdentifier(消息唯一标识);seq(消息序号);timestamp(时间戳)"
+  },
+  {
+   "id": "sns.postSns",
+   "module": "sns",
+   "title": "发送朋友圈",
+   "summary": "发送朋友圈 • 支持文本 + 图片/视频/视频号/链接等类型的发送,其中图片一次可以发送多个。• 图片/视频/视频号/链接,每次发送最多只能选择其中的一种类型。",
+   "method": "/sns/postSns",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "朋友圈模块"
+   ],
+   "docFile": "发送朋友圈.md",
+   "tags": [
+    "sns",
+    "朋友圈模块",
+    "发送朋友圈",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "postType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "0图片/视频,1链接/视频号"
+    },
+    {
+     "name": "content",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "消息内容"
+    },
+    {
+     "name": "visibleUserIdList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "指定好友可见。可不传,此时全部好友可见"
+    },
+    {
+     "name": "mediaList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "Media列表",
+     "children": [
+      {
+       "name": "fileType",
+       "in": "body",
+       "type": "integer",
+       "required": false,
+       "desc": "1:图片2: 视频 【注:如果发送视频,则 media_list 必须携带视频缩略图的参数,成对】3: 视频缩略图"
+      },
+      {
+       "name": "fileSize",
+       "in": "body",
+       "type": "integer",
+       "required": false,
+       "desc": "文件大小"
+      },
+      {
+       "name": "fileId",
+       "in": "body",
+       "type": "string",
+       "required": false,
+       "desc": "文件id"
+      },
+      {
+       "name": "videoLength",
+       "in": "body",
+       "type": "integer",
+       "required": false
+      },
+      {
+       "name": "fileWidth",
+       "in": "body",
+       "type": "integer",
+       "required": false,
+       "desc": "文件宽度"
+      },
+      {
+       "name": "fileHeight",
+       "in": "body",
+       "type": "integer",
+       "required": false,
+       "desc": "文件高度"
+      }
+     ]
+    },
+    {
+     "name": "linkInfo",
+     "in": "body",
+     "type": "object",
+     "required": false,
+     "desc": "postType=1时必填;=0时置空即可",
+     "children": [
+      {
+       "name": "title",
+       "in": "body",
+       "type": "string",
+       "required": false,
+       "desc": "视频号消息回调=channelName"
+      },
+      {
+       "name": "contentUrl",
+       "in": "body",
+       "type": "string",
+       "required": false,
+       "desc": "消息链接"
+      },
+      {
+       "name": "wxFinderInfo",
+       "in": "body",
+       "type": "object",
+       "required": false,
+       "desc": "视频号信息",
+       "children": [
+        {
+         "name": "desc",
+         "in": "body",
+         "type": "string",
+         "required": true,
+         "desc": "视频号消息回调=channelName,or自定义"
+        },
+        {
+         "name": "coverUrl",
+         "in": "body",
+         "type": "string",
+         "required": true,
+         "desc": "视频号消息回调=coverUrl,or自定义"
+        },
+        {
+         "name": "thumbUrl",
+         "in": "body",
+         "type": "string",
+         "required": true,
+         "desc": "视频号消息回调=coverUrl,or自定义"
+        },
+        {
+         "name": "extras",
+         "in": "body",
+         "type": "string",
+         "required": true,
+         "desc": "视频号消息回调=encodeData"
+        },
+        {
+         "name": "feedId",
+         "in": "body",
+         "type": "string",
+         "required": true,
+         "desc": "视频号消息回调=feedId"
+        },
+        {
+         "name": "feedNo",
+         "in": "body",
+         "type": "string",
+         "required": true,
+         "desc": "视频号消息回调=feedNo"
+        },
+        {
+         "name": "avatar",
+         "in": "body",
+         "type": "string",
+         "required": true,
+         "desc": "视频号消息回调=headImgUrl"
+        },
+        {
+         "name": "nickname",
+         "in": "body",
+         "type": "string",
+         "required": true,
+         "desc": "视频号消息回调=headImgUrl"
+        },
+        {
+         "name": "feedType",
+         "in": "body",
+         "type": "integer",
+         "required": true,
+         "desc": "视频号=4"
+        }
+       ]
+      }
+     ]
+    }
+   ],
+   "responseHint": "data 字段:snsDetail(朋友圈Detail);totalSendCount(总数发送数量)"
+  },
+  {
+   "id": "msg.sendHyperText",
+   "module": "msg",
+   "title": "发送混合文本消息",
+   "summary": "发送纯文本消息 向指定联系人或群聊发送混合文本。发送前请确认接收方 ID(toId 或 roomId)正确。",
+   "method": "/msg/sendHyperText",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "发送混合文本消息.md",
+   "tags": [
+    "会话与消息",
+    "发送混合文本消息",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "content",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "消息内容",
+     "children": [
+      {
+       "name": "subtype",
+       "in": "body",
+       "type": "integer",
+       "required": false,
+       "desc": "=0表示普通文本 =1表示@具体人,text为对方的userId, 当送0时为@所有人 =2表示系统表情 eg:[微笑][憨笑]"
+      },
+      {
+       "name": "text",
+       "in": "body",
+       "type": "string",
+       "required": false
+      }
+     ]
+    },
+    {
+     "name": "toId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "接收方 ID,联系人传 userId,群聊传 roomId。"
+    }
+   ],
+   "responseHint": "data 字段:isSendSuccess(是否发送成功);msgServerId(消息id,用于撤回消息);msgType(消息类型);msgUniqueIdentifier(消息唯一标识);seq(消息序号);timestamp(时间戳)"
+  },
+  {
+   "id": "msg.sendText",
+   "module": "msg",
+   "title": "发送纯文本消息",
+   "summary": "发送纯文本消息 向指定联系人或群聊发送纯文本。发送前请确认接收方 ID(toId 或 roomId)正确。",
+   "method": "/msg/sendText",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "发送纯文本消息.md",
+   "tags": [
+    "会话与消息",
+    "msg",
+    "消息模块 ",
+    "发送纯文本消息",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "content",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "消息内容"
+    },
+    {
+     "name": "toId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "接收方 ID,联系人传 userId,群聊传 roomId。"
+    },
+    {
+     "name": "isNoNeedRead",
+     "in": "body",
+     "type": "boolean",
+     "required": true,
+     "desc": "是否禁止回执,默认不禁止 false(true/false)"
+    }
+   ],
+   "responseHint": "data 字段:isSendSuccess(是否发送成功);msgServerId(用于撤回消息);msgType(消息类型);msgUniqueIdentifier(消息唯一标识);seq(消息序号);timestamp(时间戳)"
+  },
+  {
+   "id": "msg.sendFeedVideo",
+   "module": "msg",
+   "title": "发送视频号消息",
+   "summary": "发送视频号消息 通过群发助手向多个客户批量发送消息,适用于营销通知等场景。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/sendFeedVideo",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "发送视频号消息.md",
+   "tags": [
+    "发送视频号消息",
+    "会话与消息",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "channelName",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "频道名称"
+    },
+    {
+     "name": "channelUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "频道链接"
+    },
+    {
+     "name": "coverUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "封面链接"
+    },
+    {
+     "name": "encodeData",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "编码数据"
+    },
+    {
+     "name": "headImgUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "头像图片链接"
+    },
+    {
+     "name": "feedId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "动态Id"
+    },
+    {
+     "name": "feedNo",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "动态编号"
+    },
+    {
+     "name": "username",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "用户名"
+    },
+    {
+     "name": "toId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "接收方 ID,联系人传 userId,群聊传 roomId。"
+    }
+   ],
+   "responseHint": "data 字段:isSendSuccess(是否发送成功);msgServerId(消息id,用于撤回消息);msgType(是否发送成功);msgUniqueIdentifier(消息唯一标识);seq(消息序号);timestamp(时间戳)"
+  },
+  {
+   "id": "msg.sendVideo",
+   "module": "msg",
+   "title": "发送视频消息",
+   "summary": "发送视频消息 MP4格式",
+   "method": "/msg/sendVideo",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "发送视频消息.md",
+   "tags": [
+    "会话与消息",
+    "发送视频消息",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "fileAesKey",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "fileId包含*字符时非必须,为空即可"
+    },
+    {
+     "name": "fileId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件 ID"
+    },
+    {
+     "name": "fileMd5",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件md5值"
+    },
+    {
+     "name": "fileSize",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "文件大小"
+    },
+    {
+     "name": "filename",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件名称"
+    },
+    {
+     "name": "coverImageSize",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "封面图片尺寸"
+    },
+    {
+     "name": "duration",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "时长(秒)。"
+    },
+    {
+     "name": "toId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "接收方 ID,联系人传 userId,群聊传 roomId。"
+    },
+    {
+     "name": "previewImgUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "fileId包含*字符时上送,否则为空即可"
+    }
+   ],
+   "responseHint": "data 字段:isSendSuccess(是否发送成功);msgServerId(消息id,用于撤回消息);msgType(消息类型);msgUniqueIdentifier(消息唯一标识);seq(消息序号);timestamp(时间戳)"
+  },
+  {
+   "id": "msg.sendVoice",
+   "module": "msg",
+   "title": "发送语音消息",
+   "summary": "发送语音消息 修改消息的已读/未读等状态标记。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/sendVoice",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "发送语音消息.md",
+   "tags": [
+    "会话与消息",
+    "发送语音消息",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "fileAesKey",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件密钥"
+    },
+    {
+     "name": "fileId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件id"
+    },
+    {
+     "name": "fileSize",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "文件大小"
+    },
+    {
+     "name": "voiceTime",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "Voice时间"
+    },
+    {
+     "name": "toId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "接收方 ID,联系人传 userId,群聊传 roomId。"
+    }
+   ],
+   "responseHint": "data 字段:isSendSuccess(是否发送成功);msgServerId(消息id,用于撤回消息);msgType(消息类型);msgUniqueIdentifier(消息唯一标识);seq(消息序号);timestamp(时间戳)"
+  },
+  {
+   "id": "msg.sendLink",
+   "module": "msg",
+   "title": "发送链接消息",
+   "summary": "发送链接消息 查询指定群聊的置顶消息列表。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/sendLink",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "发送链接消息.md",
+   "tags": [
+    "会话与消息",
+    "发送链接消息",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "title",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "标题"
+    },
+    {
+     "name": "iconUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "图标链接"
+    },
+    {
+     "name": "linkUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "链接链接"
+    },
+    {
+     "name": "desc",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "描述"
+    },
+    {
+     "name": "toId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "接收方 ID,联系人传 userId,群聊传 roomId。"
+    }
+   ],
+   "responseHint": "data 字段:isSendSuccess(是否发送成功);msgServerId(消息id,用于撤回消息);msgType(消息类型);msgUniqueIdentifier(消息唯一标识);seq(消息序号);timestamp(时间戳)"
+  },
+  {
+   "id": "room.roomRemoveAdmin",
+   "module": "room",
+   "title": "取消群管理员",
+   "summary": "取消群管理员 取消群聊管理员身份。",
+   "method": "/room/roomRemoveAdmin",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "取消群管理员.md",
+   "tags": [
+    "群模块",
+    "room",
+    "取消群管理员",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "memberList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "成员列表。"
+    }
+   ]
+  },
+  {
+   "id": "contact.agreeContact",
+   "module": "contact",
+   "title": "同意申请",
+   "summary": "同意申请 同意好友或入群等相关申请。",
+   "method": "/contact/agreeContact",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "同意申请.md",
+   "tags": [
+    "contact",
+    "联系人模块",
+    "客户管理",
+    "同意申请",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "userId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "用户id"
+    },
+    {
+     "name": "corpId",
+     "in": "body",
+     "type": "string",
+     "required": false,
+     "desc": "企业 ID。"
+    }
+   ]
+  },
+  {
+   "id": "msg.syncMsg",
+   "module": "msg",
+   "title": "同步历史消息分页",
+   "summary": "同步历史消息分页 为外部联系人添加或移除客户标签,用于客户分层管理。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/syncMsg",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "同步历史消息分页.md",
+   "tags": [
+    "同步历史消息分页",
+    "会话与消息",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "msgSeq",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "分页使用,首次传0,下次传入返回值msgSeq"
+    },
+    {
+     "name": "limit",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "每页数量"
+    }
+   ],
+   "responseHint": "data 字段:hasMore(是否有更多);syncMsgList(Sync消息列表);travelSyncKey(同步 Key)"
+  },
+  {
+   "id": "contact.updateWxContact",
+   "module": "contact",
+   "title": "外部联系人信息-更新",
+   "summary": "外部联系人信息-更新 更新外部联系人的备注、标签等可编辑信息。",
+   "method": "/contact/updateWxContact",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "外部联系人信息-更新.md",
+   "tags": [
+    "contact",
+    "联系人模块",
+    "客户管理",
+    "外部联系人信息-更新",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "userId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "用户id"
+    },
+    {
+     "name": "remark",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "备注名。"
+    },
+    {
+     "name": "desc",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "描述"
+    },
+    {
+     "name": "mobileList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "手机号列表"
+    }
+   ]
+  },
+  {
+   "id": "contact.getWxContactList",
+   "module": "contact",
+   "title": "外部联系人分页",
+   "summary": "外部联系人分页 通过查询 外部联系人分页 获取 userid ,再调用 联系人详情 - 批量 接口进行查询联系人信息。 查询后保存 ,不用一直调用,后续可以根据回调保存数据",
+   "method": "/contact/getWxContactList",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "外部联系人分页.md",
+   "tags": [
+    "contact",
+    "外部联系人分页",
+    "联系人模块",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "currentSeq",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "联系人比较多时,可以用此字段分页查询。首次传0,之后传上一次查询返回的值; 传这个值可以只拉取出现变更的好友;"
+    },
+    {
+     "name": "limit",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "每页数量"
+    },
+    {
+     "name": "bizType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "1、外部联系人信息变动的数据 2、好友申请的数据 收到好友申请通知时,需要通过这个值来拉取好友申请通知。"
+    }
+   ],
+   "responseHint": "data 字段:currentSeq(下次请求时应传入的currentSeq);contactCount(联系人数量);hasMore(是否有更多);contactList(联系人列表)"
+  },
+  {
+   "id": "label.contactEditLabel",
+   "module": "label",
+   "title": "客户标签-增删",
+   "summary": "客户标签-增删 客户标签说明 客户标签分为两类:企业标签、个人标签。 请求参数 labelIdList 、 labelSuperIdList 、 labelOwnerList 必须一一对应,且数组长度必须保持一致。",
+   "method": "/label/contactEditLabel",
+   "category": [
+    "API参考",
+    "客户管理",
+    "标签模块"
+   ],
+   "docFile": "客户标签-增删.md",
+   "tags": [
+    "客户标签-增删",
+    "label",
+    "标签模块",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "opType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "1:增加成员 2:删除成员"
+    },
+    {
+     "name": "paramList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "Param列表",
+     "children": [
+      {
+       "name": "labelIdList",
+       "in": "body",
+       "type": "array",
+       "required": false,
+       "desc": "标签id列表"
+      },
+      {
+       "name": "labelSuperIdList",
+       "in": "body",
+       "type": "array",
+       "required": false,
+       "desc": "个人标签所属的分组ID"
+      },
+      {
+       "name": "labelOwnerList",
+       "in": "body",
+       "type": "array",
+       "required": false,
+       "desc": "个人标签送标签创建人userId,企业标签送corpId"
+      },
+      {
+       "name": "userId",
+       "in": "body",
+       "type": "string",
+       "required": false,
+       "desc": "用户id"
+      }
+     ]
+    }
+   ]
+  },
+  {
+   "id": "room.enableChangeRoomName",
+   "module": "room",
+   "title": "开启群改名",
+   "summary": "开启群改名 设置是否允许群成员修改群名称。",
+   "method": "/room/enableChangeRoomName",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "开启群改名.md",
+   "tags": [
+    "群模块",
+    "room",
+    "客户管理",
+    "开启群改名",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "newFlag",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "从群详情/或群成员变动API中获取,注意区别roomFlag与roomNewFlag"
+    },
+    {
+     "name": "disable",
+     "in": "body",
+     "type": "boolean",
+     "required": true,
+     "desc": "是否开启"
+    }
+   ]
+  },
+  {
+   "id": "room.openInviteConfirm",
+   "module": "room",
+   "title": "开启群邀请确认",
+   "summary": "开启群邀请确认 提示: roomFlag 传错可能导致群其它状态错乱",
+   "method": "/room/openInviteConfirm",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "开启群邀请确认.md",
+   "tags": [
+    "群模块",
+    "room",
+    "开启群邀请确认",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "isOpen",
+     "in": "body",
+     "type": "boolean",
+     "required": true,
+     "desc": "是否开启"
+    },
+    {
+     "name": "roomFlag",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "群原Flag,可通过群分页或群详情接口获取"
+    }
+   ]
+  },
+  {
+   "id": "client.restoreClient",
+   "module": "client",
+   "title": "恢复设备",
+   "summary": "恢复设备 • 离线后先调用此接口恢复设备,在调用二维码-获取(步骤2)进行登录扫码操作",
+   "method": "/client/restoreClient",
+   "category": [
+    "API参考",
+    "基础能力",
+    "登录模块"
+   ],
+   "docFile": "恢复设备.md",
+   "tags": [
+    "基础能力",
+    "恢复设备",
+    "登录模块",
+    "client",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    }
+   ]
+  },
+  {
+   "id": "room.agreeInviteByLink",
+   "module": "room",
+   "title": "接受群邀请-By链接",
+   "summary": "接受群邀请-By链接 通过群邀请链接加入群聊。",
+   "method": "/room/agreeInviteByLink",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "接受群邀请-By链接.md",
+   "tags": [
+    "群模块",
+    "room",
+    "客户管理",
+    "接受群邀请-By链接",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "joinCode",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "加入码"
+    },
+    {
+     "name": "joinType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "默认2,从回调处信息中获取"
+    }
+   ],
+   "responseHint": "data 字段:status(Success/InviteTicketUsed);roomId(Success时不为空);vid(Vid 标识)"
+  },
+  {
+   "id": "msg.revokeMsg",
+   "module": "msg",
+   "title": "撤回消息",
+   "summary": "撤回消息 查询群发助手可用规则与配额限制。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/revokeMsg",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "撤回消息.md",
+   "tags": [
+    "会话与消息",
+    "msg",
+    "消息模块 ",
+    "撤回消息",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "chatId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "会话id,=sessionId"
+    },
+    {
+     "name": "msgServerId",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "消息id"
+    }
+   ]
+  },
+  {
+   "id": "cloud.cdnWxDownload",
+   "module": "cloud",
+   "title": "文件CDN转URL",
+   "summary": "文件CDN转URL - 返回响应地址是官方CDN地址",
+   "method": "/cloud/cdnWxDownload",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "文件与媒体(下载",
+    "上传)"
+   ],
+   "docFile": "文件CDN转URL.md",
+   "tags": [
+    "文件与媒体(下载",
+    "上传)",
+    "文件CDN转URL",
+    "cloud",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "fileAeskey",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件Aeskey"
+    },
+    {
+     "name": "fileId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件 ID"
+    },
+    {
+     "name": "fileMd5",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件 MD5"
+    }
+   ],
+   "responseHint": "data 字段:coverUrl(缩略图url);fileUrl(原图url);fileMd5(原图md5)"
+  },
+  {
+   "id": "cloud.cloudUpload",
+   "module": "cloud",
+   "title": "文件上传-SDK云存储",
+   "summary": "文件上传-SDK云存储 此接口只是单纯将文件上传到sdk配置对象内容存储服务上,并不会和企业微信服务API交互!!! 此接口上传数据只能做用短期临时存储,所有数据会定期全部清理",
+   "method": "/cloud/cloudUpload",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "文件与媒体(下载",
+    "上传)"
+   ],
+   "docFile": "文件上传-SDK云存储.md",
+   "tags": [
+    "文件上传-SDK云存储",
+    "文件与媒体(下载",
+    "上传)",
+    "cloud",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "实例id"
+    },
+    {
+     "name": "file",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件"
+    }
+   ],
+   "apiPath": "/api/qw/doFileApi",
+   "contentType": "multipart/form-data",
+   "flatParams": true,
+   "responseHint": "data 字段:cloudUrl(云端文件地址。)"
+  },
+  {
+   "id": "cloud.cdnBigUploadByUrl",
+   "module": "cloud",
+   "title": "文件上传-URL",
+   "summary": "文件上传-URL 通过 URL 上传文件到云端,获取后续消息发送所需的文件标识。",
+   "method": "/cloud/cdnBigUploadByUrl",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "文件与媒体(下载",
+    "上传)"
+   ],
+   "docFile": "文件上传-URL.md",
+   "tags": [
+    "文件与媒体(下载",
+    "上传)",
+    "cloud",
+    "文件上传-URL",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "filename",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件名"
+    },
+    {
+     "name": "fileUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件链接"
+    },
+    {
+     "name": "fileType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "1: jpg图片4: mp4视频5: 文件(也包括语音amr文件)"
+    }
+   ],
+   "responseHint": "data 字段:fileId(文件 ID);fileKey(文件Key);fileMd5(文件 MD5);fileSize(文件大小);fileThumbSize(文件缩略图尺寸);cloudUrl(云端文件地址。);fileAesKey(文件密钥);filename(文件名)"
+  },
+  {
+   "id": "sns.upload",
+   "module": "sns",
+   "title": "文件上传",
+   "summary": "文件上传 调用 文件上传 完成相关操作。",
+   "method": "/sns/upload",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "朋友圈模块"
+   ],
+   "docFile": "文件上传.md",
+   "tags": [
+    "sns",
+    "朋友圈模块",
+    "文件上传",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true
+    },
+    {
+     "name": "file",
+     "in": "body",
+     "type": "string",
+     "required": true
+    },
+    {
+     "name": "fileType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "文件类型1: 图片2: 视频3: 视频缩略图"
+    }
+   ],
+   "apiPath": "/api/qw/doFileApi",
+   "contentType": "multipart/form-data",
+   "flatParams": true,
+   "responseHint": "data 字段:fileId(文件 ID);fileKey(文件Key);fileMd5(文件md5值);fileSize(文件大小);cloudUrl(云端文件地址。);fileConvertId(发送朋友圈消息、聊天消息时取此字段=fileId);fileWidth(图片格式:jpg,png,gif 时有值);fileHeight(图片格式:jpg,png,gif 时有值);previewImgUrl(预览图片链接);PreviewImgSize(预览图片尺寸);duration(视频时长,单位:秒)"
+  },
+  {
+   "id": "user.setProfile",
+   "module": "user",
+   "title": "更新个人信息",
+   "summary": "更新个人信息 修改当前账号的可编辑个人资料字段。",
+   "method": "/user/setProfile",
+   "category": [
+    "API参考",
+    "基础能力",
+    "个人模块"
+   ],
+   "docFile": "更新个人信息.md",
+   "tags": [
+    "基础能力",
+    "更新个人信息",
+    "user",
+    "个人模块",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "name",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "名字"
+    },
+    {
+     "name": "alias",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "别名"
+    },
+    {
+     "name": "email",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "邮箱"
+    },
+    {
+     "name": "mobile",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "手机号"
+    },
+    {
+     "name": "address",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "地址"
+    },
+    {
+     "name": "gender",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "性别"
+    }
+   ]
+  },
+  {
+   "id": "sns.getSnsRecord",
+   "module": "sns",
+   "title": "朋友圈列表分页",
+   "summary": "朋友圈列表分页 分页查询朋友圈动态列表。",
+   "method": "/sns/getSnsRecord",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "朋友圈模块"
+   ],
+   "docFile": "朋友圈列表分页.md",
+   "tags": [
+    "sns",
+    "朋友圈模块",
+    "朋友圈列表分页",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "maxSeq",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "查询 maxSeq 时间戳(毫秒) 之前发布的朋友圈;0:查全部"
+    },
+    {
+     "name": "limit",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "每页数量"
+    }
+   ],
+   "responseHint": "data 字段:snsDetailList(朋友圈Detail列表)"
+  },
+  {
+   "id": "cloud.cdnBigUpload",
+   "module": "cloud",
+   "title": "本地文件上传",
+   "summary": "本地文件上传 提示: 上传文件超过2M,建议试用异步上传 :::",
+   "method": "/cloud/cdnBigUpload",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "文件与媒体(下载",
+    "上传)"
+   ],
+   "docFile": "本地文件上传.md",
+   "tags": [
+    "文件与媒体(下载",
+    "本地文件上传",
+    "上传)",
+    "cloud",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "实例id"
+    },
+    {
+     "name": "file",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件"
+    },
+    {
+     "name": "fileType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "1: jpg图片4: mp4视频5: 文件(也包括语音amr文件)"
+    }
+   ],
+   "apiPath": "/api/qw/doFileApi",
+   "contentType": "multipart/form-data",
+   "flatParams": true,
+   "responseHint": "data 字段:fileAesKey(文件密钥);fileId(文件 ID);fileKey(文件Key);fileMd5(文件md5值);fileSize(文件大小);fileThumbSize(文件缩略图尺寸);filename(文件名称);cloudUrl(云端文件地址。)"
+  },
+  {
+   "id": "user.getCorpInfo",
+   "module": "user",
+   "title": "查询企业信息",
+   "summary": "查询企业信息 查询当前账号所属企业的基本信息。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/user/getCorpInfo",
+   "category": [
+    "API参考",
+    "基础能力",
+    "个人模块"
+   ],
+   "docFile": "查询企业信息.md",
+   "tags": [
+    "基础能力",
+    "user",
+    "个人模块",
+    "查询企业信息",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "corpIdList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "默认为空时,查询当前账号企业"
+    }
+   ],
+   "responseHint": "data 字段:corpAdminId(企业管理员Id);corpCreateTime(创建时间);corpFullName(企业主体名称);corpId(企业ID);corpName(企业全称);corpOwnerName(企业负责人名称);corpLogo(企业 Logo URL。);corpDesc(企业描述)"
+  },
+  {
+   "id": "contact.addSearchWxContact",
+   "module": "contact",
+   "title": "添加个微",
+   "summary": "添加个微 通过搜索结果,添加个人微信为外部联系人。",
+   "method": "/contact/addSearchWxContact",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "添加个微.md",
+   "tags": [
+    "contact",
+    "联系人模块",
+    "客户管理",
+    "添加个微",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "userId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "用户id"
+    },
+    {
+     "name": "unionId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "用户unionId"
+    },
+    {
+     "name": "verifyText",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "验证消息"
+    }
+   ]
+  },
+  {
+   "id": "contact.addSearchWxWorkContact",
+   "module": "contact",
+   "title": "添加企微",
+   "summary": "添加企微 通过搜索结果,添加企业微信联系人。",
+   "method": "/contact/addSearchWxWorkContact",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "添加企微.md",
+   "tags": [
+    "contact",
+    "添加企微",
+    "联系人模块",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "userId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "用户id"
+    },
+    {
+     "name": "corpId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "企业 ID。"
+    },
+    {
+     "name": "ticket",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "Ticket 凭证"
+    },
+    {
+     "name": "verifyText",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "验证消息"
+    }
+   ]
+  },
+  {
+   "id": "contact.addCardContact",
+   "module": "contact",
+   "title": "添加企微名片",
+   "summary": "添加企微名片 通过企微名片添加联系人。",
+   "method": "/contact/addCardContact",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "添加企微名片.md",
+   "tags": [
+    "contact",
+    "添加企微名片",
+    "联系人模块",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "presenterId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "推荐者userid"
+    },
+    {
+     "name": "fromRoomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "接收人id"
+    },
+    {
+     "name": "userId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "用户id"
+    },
+    {
+     "name": "verifyText",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "验证消息"
+    }
+   ]
+  },
+  {
+   "id": "contact.addDeletedContact",
+   "module": "contact",
+   "title": "添加删除联系人",
+   "summary": "添加删除联系人 - 该场景适用于好友已将您删除,需您主动重新发起好友验证申请。",
+   "method": "/contact/addDeletedContact",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "添加删除联系人.md",
+   "tags": [
+    "contact",
+    "添加删除联系人",
+    "联系人模块",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "userId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "用户id"
+    },
+    {
+     "name": "verifyText",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "验证消息"
+    }
+   ]
+  },
+  {
+   "id": "contact.addRoomContact",
+   "module": "contact",
+   "title": "添加群成员好友",
+   "summary": "添加群成员好友 添加群成员为好友。",
+   "method": "/contact/addRoomContact",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "添加群成员好友.md",
+   "tags": [
+    "contact",
+    "添加群成员好友",
+    "联系人模块",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "userId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "用户id"
+    },
+    {
+     "name": "verifyText",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "验证消息"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    }
+   ]
+  },
+  {
+   "id": "room.roomAddAdmin",
+   "module": "room",
+   "title": "添加群管理员",
+   "summary": "添加群管理员 为群聊添加管理员。",
+   "method": "/room/roomAddAdmin",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "添加群管理员.md",
+   "tags": [
+    "群模块",
+    "room",
+    "添加群管理员",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "memberList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "成员列表。"
+    }
+   ]
+  },
+  {
+   "id": "sns.snsLike",
+   "module": "sns",
+   "title": "点赞/取消赞",
+   "summary": "点赞/取消赞 下载企微/个微文件资源,或将 CDN 文件转为可访问 URL。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/sns/snsLike",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "朋友圈模块"
+   ],
+   "docFile": "点赞_取消赞.md",
+   "tags": [
+    "sns",
+    "朋友圈模块",
+    "点赞/取消赞",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "snsId",
+     "in": "body",
+     "type": "number",
+     "required": true,
+     "desc": "朋友圈Id"
+    },
+    {
+     "name": "snsStatus",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "0点赞,1取消点赞"
+    }
+   ]
+  },
+  {
+   "id": "user.getQrcodeCard",
+   "module": "user",
+   "title": "生成二维码",
+   "summary": "生成二维码 生成当前账号的个人二维码名片,可用于展示或分享。",
+   "method": "/user/getQrcodeCard",
+   "category": [
+    "API参考",
+    "基础能力",
+    "个人模块"
+   ],
+   "docFile": "生成二维码.md",
+   "tags": [
+    "基础能力",
+    "user",
+    "生成二维码",
+    "个人模块",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    }
+   ],
+   "responseHint": "data 字段:qrcodeUrl(二维码地址)"
+  },
+  {
+   "id": "login.checkLogin",
+   "module": "login",
+   "title": "用户状态",
+   "summary": "用户状态 用于查询指定设备的当前登录状态,确认是否已在线。",
+   "method": "/login/checkLogin",
+   "category": [
+    "API参考",
+    "基础能力",
+    "登录模块"
+   ],
+   "docFile": "用户状态.md",
+   "tags": [
+    "基础能力",
+    "登录模块",
+    "用户状态",
+    "login",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    }
+   ],
+   "responseHint": "data 字段:errorCode(错误码);errorMsg(错误消息);userId(用户id);lastActiveTime(最后活跃时间);userOnlineStatus(=-1 未登陆,需要扫码登陆 =0 未登陆,可免扫码登陆 =1 已扫码,待确认 =2 登陆成功 =4 用户取消登陆 =10 已扫码确认,待检测6位验证码);corpLogo(企业 Logo URL。);corpName(公司名称);nickname(昵称)"
+  },
+  {
+   "id": "login.manualLogin",
+   "module": "login",
+   "title": "用户登录(免扫码登录)",
+   "summary": "用户登录(免扫码登录) • 无特殊情况下,无需调用此接口。• 使用条件: 该设备( GUID )之前扫码登录过,且手机端没有剔除该设备。",
+   "method": "/login/manualLogin",
+   "category": [
+    "API参考",
+    "基础能力",
+    "登录模块"
+   ],
+   "docFile": "用户登录(免扫码登录).md",
+   "tags": [
+    "基础能力",
+    "登录模块",
+    "用户登录(免扫码登录)",
+    "login",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    }
+   ]
+  },
+  {
+   "id": "room.prohibitAddMember",
+   "module": "room",
+   "title": "禁止群成员互相添加",
+   "summary": "禁止群成员互相添加 设置是否禁止群成员互相添加好友。",
+   "method": "/room/prohibitAddMember",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "禁止群成员互相添加.md",
+   "tags": [
+    "禁止群成员互相添加",
+    "群模块",
+    "room",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "disable",
+     "in": "body",
+     "type": "boolean",
+     "required": true,
+     "desc": "是否禁止"
+    },
+    {
+     "name": "newFlag",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "从群详情/或群成员变动API中获取,注意区别roomFlag与roomNewFlag"
+    }
+   ]
+  },
+  {
+   "id": "room.prohibitChangeRoomName",
+   "module": "room",
+   "title": "禁止群改名",
+   "summary": "禁止群改名 禁止群成员修改群名称。",
+   "method": "/room/prohibitChangeRoomName",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "禁止群改名.md",
+   "tags": [
+    "群模块",
+    "room",
+    "禁止群改名",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "目标群聊 ID,可通过群分页或群详情接口获取 roomId"
+    },
+    {
+     "name": "newFlag",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "是否禁止"
+    },
+    {
+     "name": "disable",
+     "in": "body",
+     "type": "boolean",
+     "required": true,
+     "desc": "从群详情/或群成员变动API中获取,注意区别roomFlag与roomNewFlag"
+    }
+   ]
+  },
+  {
+   "id": "room.removeRoomMember",
+   "module": "room",
+   "title": "移除成员",
+   "summary": "移除成员 将成员移出群聊。",
+   "method": "/room/removeRoomMember",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "移除成员.md",
+   "tags": [
+    "群模块",
+    "room",
+    "移除成员",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "isOuterRoom",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "是否外部群"
+    },
+    {
+     "name": "memberList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "成员列表。"
+    }
+   ]
+  },
+  {
+   "id": "room.getRoomQrCode",
+   "module": "room",
+   "title": "群二维码",
+   "summary": "群二维码 获取群聊邀请二维码,可用于分享入群。",
+   "method": "/room/getRoomQrCode",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "群二维码.md",
+   "tags": [
+    "群模块",
+    "群二维码",
+    "room",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    }
+   ],
+   "responseHint": "data 字段:qrcodeData(二维码数据);roomHeadimgUrl(群Headimg链接)"
+  },
+  {
+   "id": "room.getRoomList",
+   "module": "room",
+   "title": "群分页",
+   "summary": "群分页 本接口仅支持查询本人创建的群组。如需查询全部群组,需结合 会话分页 接口使用,包含已保存至通讯录的群聊及其他临时群会话。 sessionType=1 时为群 id。",
+   "method": "/room/getRoomList",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "群分页.md",
+   "tags": [
+    "群模块",
+    "群分页",
+    "room",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "nextStartIndex",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "分页使用,首次传0,下次传入返回值nextStartIndex"
+    }
+   ],
+   "responseHint": "data 字段:hasMore(是否有更多);nextStartIndex(下次请求时应传入的nextStartIndex);roomCount(数量);roomList(群列表。)"
+  },
+  {
+   "id": "msg.sendGroupMsgStatus",
+   "module": "msg",
+   "title": "群发助手-状态查询",
+   "summary": "群发助手-状态查询 删除朋友圈动态下的指定评论。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/sendGroupMsgStatus",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "群发助手-状态查询.md",
+   "tags": [
+    "会话与消息",
+    "群发助手-状态查询",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "groupMsgId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群发消息id"
+    },
+    {
+     "name": "endDetailId",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "用户状态列表最大查询量"
+    }
+   ],
+   "responseHint": "data 字段:customerList(用户状态列表);hasSend(是否发送);isEnd(是否End);total(总数)"
+  },
+  {
+   "id": "msg.sendGroupMsgRule",
+   "module": "msg",
+   "title": "群发助手-规则查询",
+   "summary": "群发助手-规则查询 对个人标签进行新增、修改或删除操作。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/sendGroupMsgRule",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "群发助手-规则查询.md",
+   "tags": [
+    "会话与消息",
+    "msg",
+    "消息模块 ",
+    "群发助手-规则查询",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    }
+   ],
+   "responseHint": "data 字段:type(1=每日可接收1条;2=每周可接收7条;3=每月可接收条数为当月天数)"
+  },
+  {
+   "id": "msg.sendGroupMsg",
+   "module": "msg",
+   "title": "群发助手发送",
+   "summary": "群发助手发送 对朋友圈动态发表评论或追评。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/sendGroupMsg",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "群发助手发送.md",
+   "tags": [
+    "会话与消息",
+    "群发助手发送",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "msgList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "消息列表",
+     "children": [
+      {
+       "name": "msgData",
+       "in": "body",
+       "type": "object",
+       "required": false,
+       "desc": "【与发送消息里面的字段相同, 不需要'toId'这个字段】",
+       "children": [
+        {
+         "name": "content",
+         "in": "body",
+         "type": "string",
+         "required": true
+        }
+       ]
+      },
+      {
+       "name": "type",
+       "in": "body",
+       "type": "integer",
+       "required": false,
+       "desc": "0: 文本 13: 链接 14: 图片 15: 文件 23: 视频 78: 小程序"
+      }
+     ]
+    },
+    {
+     "name": "sendType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "0: 表示外部联系人 1: 表示外部群"
+    },
+    {
+     "name": "toIdList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "发送成员列表"
+    }
+   ],
+   "responseHint": "data 字段:groupMsgId(分组消息Id)"
+  },
+  {
+   "id": "room.getRoomIncrSync",
+   "module": "room",
+   "title": "群成员变动查询",
+   "summary": "群成员变动查询 •用于解决群成员数量较多时,添加、删除成员同步成本高、工作量大的问题。",
+   "method": "/room/getRoomIncrSync",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "群成员变动查询.md",
+   "tags": [
+    "群成员变动查询",
+    "群模块",
+    "room",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "ver",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "首次为0,查询指定偏移之后所有变动"
+    },
+    {
+     "name": "nowMemberCount",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群成员数量"
+    }
+   ],
+   "responseHint": "data 字段:roomList(群列表);msg(返回说明。)"
+  },
+  {
+   "id": "room.confirmInvitedMemberList",
+   "module": "room",
+   "title": "群成员邀请确认(管理员)",
+   "summary": "群成员邀请确认(管理员) 管理员确认群成员邀请。",
+   "method": "/room/confirmInvitedMemberList",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "群成员邀请确认(管理员).md",
+   "tags": [
+    "群成员邀请确认(管理员)",
+    "群模块",
+    "room",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "inviterId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "邀请人 ID"
+    },
+    {
+     "name": "InviteMsgServerId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "邀请消息服务端Id"
+    },
+    {
+     "name": "inviteCode",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "邀请码"
+    },
+    {
+     "name": "InvitedMemberList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "Invited成员列表"
+    }
+   ]
+  },
+  {
+   "id": "msg.roomTopMessageList",
+   "module": "msg",
+   "title": "群消息置顶-列表",
+   "summary": "群消息置顶-列表 发布一条朋友圈动态,可包含文字、图片或视频。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/roomTopMessageList",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "群消息置顶-列表.md",
+   "tags": [
+    "会话与消息",
+    "群消息置顶-列表",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    }
+   ],
+   "responseHint": "data 字段:list(列表)"
+  },
+  {
+   "id": "msg.roomTopMessageSet",
+   "module": "msg",
+   "title": "群消息置顶-添加",
+   "summary": "群消息置顶-添加 删除已发布的朋友圈动态。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/roomTopMessageSet",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "群消息置顶-添加.md",
+   "tags": [
+    "会话与消息",
+    "群消息置顶-添加",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "msgId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "消息 ID,用于引用、撤回。"
+    },
+    {
+     "name": "msgSenderId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "消息发送人userId"
+    },
+    {
+     "name": "msgTimestamp",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "消息发送时间戳"
+    },
+    {
+     "name": "msgData",
+     "in": "body",
+     "type": "object",
+     "required": true,
+     "desc": "消息内容,根据msgType不同,msgData也不同。数据格式详见各个消息的发送api",
+     "children": [
+      {
+       "name": "content",
+       "in": "body",
+       "type": "string",
+       "required": true
+      }
+     ]
+    },
+    {
+     "name": "msgType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "消息类型编号。"
+    }
+   ]
+  },
+  {
+   "id": "msg.roomTopMessageCancel",
+   "module": "msg",
+   "title": "群消息置顶-移除",
+   "summary": "群消息置顶-移除 对朋友圈动态点赞或取消点赞。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/roomTopMessageCancel",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "群消息置顶-移除.md",
+   "tags": [
+    "会话与消息",
+    "群消息置顶-移除",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "seq",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "消息序号"
+    }
+   ]
+  },
+  {
+   "id": "room.dismissRoom",
+   "module": "room",
+   "title": "群解散",
+   "summary": "群解散 解散指定群聊,解散后群聊不可恢复,请谨慎操作。",
+   "method": "/room/dismissRoom",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "群解散.md",
+   "tags": [
+    "群模块",
+    "room",
+    "群解散",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    }
+   ]
+  },
+  {
+   "id": "room.batchGetRoomDetail",
+   "module": "room",
+   "title": "群详情-批量",
+   "summary": "群详情-批量 群成员名称需调用 联系人详情 接口获取。 本接口查询群基本信息,支持批量查询。 查询群详情时,先调用 群分页 获取群 roomId ,并将群数据缓存至本地,再根据 roomId 查询详情。",
+   "method": "/room/batchGetRoomDetail",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "群详情-批量.md",
+   "tags": [
+    "群模块",
+    "room",
+    "群详情-批量",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomIdList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "群id列表"
+    }
+   ],
+   "responseHint": "data 字段:roomList(群列表)"
+  },
+  {
+   "id": "contact.searchContact",
+   "module": "contact",
+   "title": "联系人搜索",
+   "summary": "联系人搜索 按手机号搜索联系人,可快速定位目标用户。",
+   "method": "/contact/searchContact",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "联系人搜索.md",
+   "tags": [
+    "contact",
+    "联系人模块",
+    "客户管理",
+    "联系人搜索",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "keyword",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "搜索手机号。"
+    }
+   ],
+   "responseHint": "data 字段:searchStatus(Search状态);workUserInfo(企微用户信息);wxUserInfo(微信用户信息)"
+  },
+  {
+   "id": "contact.searchContact.联系人详情_By二维码",
+   "module": "contact",
+   "title": "联系人详情-By二维码",
+   "summary": "联系人详情-By二维码 调用方需要将个微、企V名片二维码中的url提取出来",
+   "method": "/contact/searchContact",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "联系人详情-By二维码.md",
+   "tags": [
+    "contact",
+    "联系人详情-By二维码",
+    "联系人模块",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "qrUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "二维码中的url"
+    }
+   ],
+   "responseHint": "data 字段:recommendContact(企V账号信息);wxInfo(个V账号信息)"
+  },
+  {
+   "id": "contact.batchGetUserinfo",
+   "module": "contact",
+   "title": "联系人详情-批量",
+   "summary": "联系人详情-批量 本接口用于查询联系人基本信息,支持批量查询。 允许查询好友、非好友的联系人信息。 查询联系人详情时,需先调用 外部联系人分页 获取用户 userid ,并将联系人数据缓存至本地,再根据 userid 查询详情。",
+   "method": "/contact/batchGetUserinfo",
+   "category": [
+    "API参考",
+    "客户管理",
+    "联系人模块"
+   ],
+   "docFile": "联系人详情-批量.md",
+   "tags": [
+    "contact",
+    "联系人详情-批量",
+    "联系人模块",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "userIdList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "用户id列表"
+    }
+   ],
+   "responseHint": "data 字段:contactList(联系人列表)"
+  },
+  {
+   "id": "user.getProfile",
+   "module": "user",
+   "title": "获取个人信息",
+   "summary": "获取个人信息 获取当前登录账号的个人资料,包括昵称、头像、企业等信息。 guid 即后台登录的设备 ID,是接口调用时标识设备身份的关键参数。",
+   "method": "/user/getProfile",
+   "category": [
+    "API参考",
+    "基础能力",
+    "个人模块"
+   ],
+   "docFile": "获取个人信息.md",
+   "tags": [
+    "基础能力",
+    "user",
+    "个人模块",
+    "获取个人信息",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    }
+   ],
+   "responseHint": "data 字段:acctid(账户id);alias(别名);corpId(企业 ID。);gender(0未,1男,2女);groupId(分组Id);internationCode(86);mobile(手机号);nickname(昵称);realName(真实姓名);userId(用户id);avatarUrl(头像 URL。)"
+  },
+  {
+   "id": "sns.getSnsDetail",
+   "module": "sns",
+   "title": "获取详情-批量",
+   "summary": "获取详情-批量 根据 userId 列表批量查询联系人朋友圈详细信息。",
+   "method": "/sns/getSnsDetail",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "朋友圈模块"
+   ],
+   "docFile": "获取详情-批量.md",
+   "tags": [
+    "获取详情-批量",
+    "sns",
+    "朋友圈模块",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "snsIdList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "朋友圈Id列表"
+    }
+   ],
+   "responseHint": "data 字段:snsDetailList(朋友圈Detail列表)"
+  },
+  {
+   "id": "client.setCallback",
+   "module": "client",
+   "title": "设置回调地址",
+   "summary": "设置回调地址 • 作用范围: 按 Token 配置,一个 Token 下的所有账号共用此回调地址。• 数据隔离: 回调内容包含 guid ,方便您的后端区分是哪个账号收到的消息。• msgType 包含系统、聊天消息类型,详见回调结构说明。 注意:回调地址须为公网可访问的 HTTPS URL 或者 域名。",
+   "method": "/client/setCallback",
+   "category": [
+    "API参考",
+    "基础能力",
+    "登录模块"
+   ],
+   "docFile": "设置回调地址.md",
+   "tags": [
+    "基础能力",
+    "登录模块",
+    "client",
+    "设置回调地址",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "callbackUrl",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "Webhook 回调地址,需公网可访问的 https URL。"
+    },
+    {
+     "name": "authSecret",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "鉴权密钥"
+    },
+    {
+     "name": "authType",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "Authorization"
+    }
+   ]
+  },
+  {
+   "id": "sns.snsComment",
+   "module": "sns",
+   "title": "评论/追评",
+   "summary": "评论/追评 调用 评论/追评,需传入已登录设备的 guid。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/sns/snsComment",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "朋友圈模块"
+   ],
+   "docFile": "评论_追评.md",
+   "tags": [
+    "评论/追评",
+    "sns",
+    "朋友圈模块",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "snsId",
+     "in": "body",
+     "type": "number",
+     "required": true,
+     "desc": "朋友圈消息对应的id"
+    },
+    {
+     "name": "content",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "消息内容。"
+    },
+    {
+     "name": "refCommentId",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "默认传0 如果需要回复别人的评论则传别人评论的id 从获取朋友圈列表中获取"
+    }
+   ]
+  },
+  {
+   "id": "sns.deleteSnsComment",
+   "module": "sns",
+   "title": "评论删除",
+   "summary": "评论删除 调用 评论删除,需传入已登录设备的 guid。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/sns/deleteSnsComment",
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "朋友圈模块"
+   ],
+   "docFile": "评论删除.md",
+   "tags": [
+    "sns",
+    "朋友圈模块",
+    "评论删除",
+    "媒体与运营",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "snsId",
+     "in": "body",
+     "type": "number",
+     "required": true,
+     "desc": "朋友圈消息对应的id"
+    },
+    {
+     "name": "content",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "消息内容。"
+    },
+    {
+     "name": "commentId",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "评论id"
+    }
+   ]
+  },
+  {
+   "id": "msg.voiceToTextQuery",
+   "module": "msg",
+   "title": "语音转文字-任务查询",
+   "summary": "语音转文字-任务查询 分页拉取朋友圈动态列表。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/voiceToTextQuery",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "语音转文字-任务查询.md",
+   "tags": [
+    "会话与消息",
+    "语音转文字-任务查询",
+    "msg",
+    "消息模块 ",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "msgServerId",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "消息id"
+    },
+    {
+     "name": "voiceId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "语音 ID"
+    }
+   ],
+   "responseHint": "data 字段:text(文本);isEnd(任务是否执行完成)"
+  },
+  {
+   "id": "msg.voiceToTextApply",
+   "module": "msg",
+   "title": "语音转文字-任务申请",
+   "summary": "语音转文字-任务申请 分页拉取历史聊天记录,适用于消息归档与同步场景。 注意:须传入 guid,为已登录云设备唯一标识,通过创建设备接口获取。",
+   "method": "/msg/voiceToTextApply",
+   "category": [
+    "API参考",
+    "会话与消息",
+    "消息模块 "
+   ],
+   "docFile": "语音转文字-任务申请.md",
+   "tags": [
+    "会话与消息",
+    "msg",
+    "消息模块 ",
+    "语音转文字-任务申请",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "msgServerId",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "消息id"
+    }
+   ],
+   "responseHint": "data 字段:voiceId(语音 ID)"
+  },
+  {
+   "id": "user.logout",
+   "module": "user",
+   "title": "账号退出",
+   "summary": "账号退出 退出当前设备绑定的企微账号登录状态。",
+   "method": "/user/logout",
+   "category": [
+    "API参考",
+    "基础能力",
+    "登录模块"
+   ],
+   "docFile": "账号退出.md",
+   "tags": [
+    "基础能力",
+    "登录模块",
+    "账号退出",
+    "user",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    }
+   ]
+  },
+  {
+   "id": "room.changeRoomMaster",
+   "module": "room",
+   "title": "转让群主",
+   "summary": "转让群主 将群主身份转让给其他群成员。",
+   "method": "/room/changeRoomMaster",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "转让群主.md",
+   "tags": [
+    "群模块",
+    "room",
+    "转让群主",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "newOwnerId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "新群主id"
+    }
+   ]
+  },
+  {
+   "id": "room.quitRoom",
+   "module": "room",
+   "title": "退群",
+   "summary": "退群 退出指定群聊。",
+   "method": "/room/quitRoom",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "退群.md",
+   "tags": [
+    "退群",
+    "群模块",
+    "room",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    }
+   ]
+  },
+  {
+   "id": "room.inviteRoomMember",
+   "module": "room",
+   "title": "邀请/添加成员",
+   "summary": "邀请/添加成员 向已有群聊邀请或添加新成员。",
+   "method": "/room/inviteRoomMember",
+   "category": [
+    "API参考",
+    "客户管理",
+    "群模块"
+   ],
+   "docFile": "邀请_添加成员.md",
+   "tags": [
+    "群模块",
+    "room",
+    "邀请/添加成员",
+    "客户管理",
+    "API参考"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid,由「创建设备」接口返回,业务接口必传。"
+    },
+    {
+     "name": "roomId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "群聊 ID。"
+    },
+    {
+     "name": "isOuterRoom",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "是否外部群"
+    },
+    {
+     "name": "memberList",
+     "in": "body",
+     "type": "array",
+     "required": true,
+     "desc": "成员列表"
+    }
+   ]
+  },
+  {
+   "id": "cloud.bigFileDownloadAsync",
+   "module": "cloud",
+   "title": "企微大文件异步下载",
+   "summary": "文件大于 20M 使用此接口;下载地址为临时云资源(7–15 天不定期清理);异步结果通过回调通知,根据 requestId 匹配。注意:官方文档未公布该接口的 method 路由值,qiwe_api_call 无法直接调用,请参考 docUrl 官方文档确认后用 rawMethod 调用。",
+   "method": null,
+   "category": [
+    "API参考",
+    "媒体与运营",
+    "文件与媒体(下载/上传)"
+   ],
+   "docFile": "企微大文件异步下载.md",
+   "tags": [
+    "cloud",
+    "企微大文件异步下载",
+    "媒体与运营",
+    "API参考",
+    "大文件",
+    "下载"
+   ],
+   "params": [
+    {
+     "name": "guid",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "设备唯一标识 guid"
+    },
+    {
+     "name": "filekey",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "当 fileId 以 * 开头时为空;否则不为空"
+    },
+    {
+     "name": "fileId",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件 Id"
+    },
+    {
+     "name": "fileSize",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "文件大小"
+    },
+    {
+     "name": "fileType",
+     "in": "body",
+     "type": "integer",
+     "required": true,
+     "desc": "22 大视频 35 文件"
+    },
+    {
+     "name": "filename",
+     "in": "body",
+     "type": "string",
+     "required": true,
+     "desc": "文件名"
+    }
+   ],
+   "responseHint": "data 字段:requestId(请求 Id,用于在回调中匹配异步下载结果)"
+  }
+ ]
+}

+ 100 - 0
claude-code/claude-code-qiwe-assistant/mcp/src/core/api-catalog.js

@@ -0,0 +1,100 @@
+const fs = require('fs');
+const path = require('path');
+
+const CATALOG_PATH = path.resolve(__dirname, '..', '..', 'catalog', 'qiwe-endpoints.json');
+
+let cached;
+
+function loadCatalog() {
+  if (cached) return cached;
+  const raw = fs.readFileSync(CATALOG_PATH, 'utf8').replace(/^\uFEFF/, '');
+  cached = JSON.parse(raw);
+  return cached;
+}
+
+function listEndpoints() {
+  return loadCatalog().endpoints || [];
+}
+
+function listModules() {
+  return loadCatalog().modules || [];
+}
+
+function normalize(value) {
+  return String(value || '').trim().toLowerCase();
+}
+
+function findEndpoint(idOrMethod) {
+  const needle = normalize(idOrMethod);
+  if (!needle) return undefined;
+  const endpoints = listEndpoints();
+  return (
+    endpoints.find(item => normalize(item.id) === needle) ||
+    endpoints.find(item => normalize(item.method) === needle) ||
+    endpoints.find(item => normalize(item.method).replace(/^\//, '') === needle.replace(/^\//, ''))
+  );
+}
+
+function scoreEndpoint(endpoint, terms) {
+  if (!terms.length) return 1;
+  const haystack = normalize([
+    endpoint.id,
+    endpoint.module,
+    endpoint.title,
+    endpoint.summary,
+    endpoint.method,
+    (endpoint.category || []).join(' '),
+    (endpoint.tags || []).join(' ')
+  ].join(' '));
+  let score = 0;
+  for (const term of terms) {
+    if (!term) continue;
+    if (haystack.includes(term)) score += 1;
+  }
+  return score;
+}
+
+function searchEndpoints({ query, module, tag, limit = 30 } = {}) {
+  const terms = normalize(query).split(/\s+/).filter(Boolean);
+  const moduleKey = normalize(module);
+  const tagKey = normalize(tag);
+  let results = listEndpoints().map(endpoint => ({
+    endpoint,
+    score: scoreEndpoint(endpoint, terms)
+  }));
+  if (moduleKey) {
+    results = results.filter(item => normalize(item.endpoint.module) === moduleKey);
+  }
+  if (tagKey) {
+    results = results.filter(item =>
+      (item.endpoint.tags || []).some(t => normalize(t).includes(tagKey)) ||
+      (item.endpoint.category || []).some(c => normalize(c).includes(tagKey))
+    );
+  }
+  results = results.filter(item => item.score > 0);
+  results.sort((a, b) => b.score - a.score);
+  return results.slice(0, Math.max(1, limit)).map(item => item.endpoint);
+}
+
+function summarizeEndpoint(endpoint) {
+  return {
+    id: endpoint.id,
+    module: endpoint.module,
+    title: endpoint.title,
+    method: endpoint.method,
+    category: (endpoint.category || []).join(' > '),
+    requiredParams: (endpoint.params || [])
+      .filter(p => p.required && !/^(guid|tokenId)$/i.test(p.name))
+      .map(p => p.name)
+  };
+}
+
+module.exports = {
+  CATALOG_PATH,
+  loadCatalog,
+  listEndpoints,
+  listModules,
+  findEndpoint,
+  searchEndpoints,
+  summarizeEndpoint
+};

+ 244 - 0
claude-code/claude-code-qiwe-assistant/mcp/src/core/credentials.js

@@ -0,0 +1,244 @@
+const crypto = require('crypto');
+const fs = require('fs');
+const path = require('path');
+const os = require('os');
+
+const DEFAULT_API_BASE = 'https://server.fmode.cn/api/qiwe';
+const CREDENTIALS_FILE = path.join(os.homedir(), '.claude', 'qiwe-credentials.json');
+
+function readJsonMaybe(filePath) {
+  try {
+    if (!filePath || !fs.existsSync(filePath)) return {};
+    return JSON.parse(fs.readFileSync(filePath, 'utf8').replace(/^\uFEFF/, ''));
+  } catch {
+    return {};
+  }
+}
+
+function firstNonEmpty(values) {
+  return values.find(value => typeof value === 'string' && value.trim()) || '';
+}
+
+function readEnvFileMaybe(filePath) {
+  try {
+    if (!filePath || !fs.existsSync(filePath)) return {};
+    const env = {};
+    const content = fs.readFileSync(filePath, 'utf8').replace(/^\uFEFF/, '');
+    for (const rawLine of content.split(/\r?\n/)) {
+      const line = rawLine.trim();
+      if (!line || line.startsWith('#')) continue;
+      const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);
+      if (!match) continue;
+      let value = match[2].trim();
+      if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
+        value = value.slice(1, -1);
+      }
+      env[match[1]] = value;
+    }
+    return env;
+  } catch {
+    return {};
+  }
+}
+
+function envCandidates() {
+  const candidates = [];
+  let current = process.cwd();
+  while (current) {
+    candidates.push(path.join(current, '.env.local'));
+    candidates.push(path.join(current, '.env'));
+    const parent = path.dirname(current);
+    if (parent === current) break;
+    current = parent;
+  }
+  candidates.push(path.resolve(__dirname, '..', '..', '..', '.env.local'));
+  candidates.push(path.resolve(__dirname, '..', '..', '..', '.env'));
+  return [...new Set(candidates)];
+}
+
+function readEnvFiles() {
+  return envCandidates().reduce((merged, filePath) => {
+    const next = readEnvFileMaybe(filePath);
+    for (const [key, value] of Object.entries(next)) {
+      if (!merged[key]) merged[key] = value;
+    }
+    return merged;
+  }, {});
+}
+
+function readClaudeSettingsEnv() {
+  const files = [
+    path.join(os.homedir(), '.claude', 'settings.json'),
+    path.join(os.homedir(), '.claude', 'settings.local.json'),
+    path.join(process.cwd(), '.claude', 'settings.json'),
+    path.join(process.cwd(), '.claude', 'settings.local.json')
+  ];
+  const merged = {};
+  for (const filePath of files) {
+    const json = readJsonMaybe(filePath);
+    const env = json && typeof json.env === 'object' && json.env ? json.env : null;
+    if (!env) continue;
+    for (const [key, value] of Object.entries(env)) {
+      if (!merged[key] && typeof value === 'string' && value.trim()) merged[key] = value;
+    }
+  }
+  return merged;
+}
+
+function readFmodeConfig() {
+  const files = [
+    path.join(os.homedir(), '.fmode', 'config.json'),
+    path.join(process.cwd(), '.fmode', 'config.json')
+  ];
+  const merged = {};
+  for (const filePath of files) {
+    const json = readJsonMaybe(filePath);
+    for (const [key, value] of Object.entries(json || {})) {
+      if (merged[key] === undefined) merged[key] = value;
+    }
+  }
+  return merged;
+}
+
+function pickFmodeAnthropicToken(env) {
+  const token = env && typeof env.ANTHROPIC_AUTH_TOKEN === 'string' ? env.ANTHROPIC_AUTH_TOKEN.trim() : '';
+  if (!token || !/^sk-/i.test(token) || /^sk-ant-/i.test(token)) return '';
+  const base = String((env && (env.ANTHROPIC_BASE_URL || env.ANTHROPIC_API_BASE)) || '').toLowerCase();
+  if (base && !base.includes('fmode')) return '';
+  return token;
+}
+
+function normalizeToken(value) {
+  return String(value || '').trim().replace(/^Bearer\s+/i, '');
+}
+
+function readQiweAuthToken(input = {}) {
+  const fileEnv = readEnvFiles();
+  const claudeEnv = readClaudeSettingsEnv();
+  const fmodeConfig = readFmodeConfig();
+  const token = firstNonEmpty([
+    input.authToken,
+    input.fmodeApiKey,
+    input.fmodeApiToken,
+    input.sessionToken,
+    input.apiToken,
+    input.token,
+    fileEnv.QIWE_AUTH_TOKEN,
+    fileEnv.FMODE_API_KEY,
+    fileEnv.FMODE_API_TOKEN,
+    fileEnv.NEWAPI_TOKEN,
+    fileEnv.VOC_TOKEN,
+    fileEnv.VOC_SOCIAL_TOKEN,
+    process.env.QIWE_AUTH_TOKEN,
+    process.env.FMODE_API_KEY,
+    process.env.FMODE_API_TOKEN,
+    process.env.NEWAPI_TOKEN,
+    process.env.VOC_TOKEN,
+    process.env.VOC_SOCIAL_TOKEN,
+    fmodeConfig.newapiToken,
+    fmodeConfig.newApiToken,
+    fmodeConfig.fmodeApiKey,
+    fmodeConfig.fmodeApiToken,
+    claudeEnv.FMODE_API_KEY,
+    claudeEnv.NEWAPI_TOKEN,
+    pickFmodeAnthropicToken(process.env),
+    pickFmodeAnthropicToken(claudeEnv)
+  ]);
+  return normalizeToken(token);
+}
+
+function readCredentialsFile() {
+  return readJsonMaybe(CREDENTIALS_FILE);
+}
+
+function readQiweUid(input = {}) {
+  const fileEnv = readEnvFiles();
+  const creds = readCredentialsFile();
+  return firstNonEmpty([
+    input.uid,
+    input.qiweUid,
+    fileEnv.QIWE_UID,
+    process.env.QIWE_UID,
+    creds.uid
+  ]);
+}
+
+function readQiweApiBase(input = {}) {
+  const fileEnv = readEnvFiles();
+  const creds = readCredentialsFile();
+  return String(firstNonEmpty([
+    input.apiBase,
+    input.baseUrl,
+    fileEnv.QIWE_API_BASE,
+    fileEnv.QIWE_RELAY_BASE_URL,
+    process.env.QIWE_API_BASE,
+    process.env.QIWE_RELAY_BASE_URL,
+    creds.apiBase,
+    DEFAULT_API_BASE
+  ]) || DEFAULT_API_BASE).replace(/\/$/, '');
+}
+
+function saveQiweClientConfig({ uid, apiBase } = {}) {
+  const saved = [];
+  try {
+    const dir = path.dirname(CREDENTIALS_FILE);
+    if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
+    const current = readCredentialsFile();
+    const next = { ...current };
+    if (uid) next.uid = uid;
+    if (apiBase) next.apiBase = apiBase;
+    next.updatedAt = new Date().toISOString();
+    fs.writeFileSync(CREDENTIALS_FILE, JSON.stringify(next, null, 2), 'utf8');
+    saved.push(CREDENTIALS_FILE);
+  } catch {
+    // ignore, fall through to env file
+  }
+  try {
+    const envPath = path.join(process.cwd(), '.env.local');
+    const pairs = [];
+    if (uid) pairs.push(['QIWE_UID', uid]);
+    if (apiBase) pairs.push(['QIWE_API_BASE', apiBase]);
+    if (pairs.length) {
+      let content = fs.existsSync(envPath) ? fs.readFileSync(envPath, 'utf8') : '';
+      for (const [key, value] of pairs) {
+        const line = `${key}=${value}`;
+        const re = new RegExp(`^${key}\\s*=.*$`, 'm');
+        content = re.test(content)
+          ? content.replace(re, line)
+          : `${content.replace(/\n*$/, '')}${content ? '\n' : ''}${line}\n`;
+      }
+      fs.writeFileSync(envPath, content, 'utf8');
+      saved.push(envPath);
+    }
+  } catch {
+    // ignore
+  }
+  return saved;
+}
+
+function ensureQiweUid(input = {}) {
+  const existing = readQiweUid(input);
+  if (existing) return existing;
+  const uid = `qiwe-${crypto.randomUUID()}`;
+  saveQiweClientConfig({ uid, apiBase: readQiweApiBase(input) });
+  return uid;
+}
+
+function isConfigured(input = {}) {
+  return Boolean(readQiweAuthToken(input) && readQiweUid(input));
+}
+
+module.exports = {
+  DEFAULT_API_BASE,
+  CREDENTIALS_FILE,
+  readQiweAuthToken,
+  readQiweUid,
+  ensureQiweUid,
+  readQiweApiBase,
+  saveQiweClientConfig,
+  isConfigured,
+  readEnvFiles,
+  readClaudeSettingsEnv,
+  readFmodeConfig,
+  pickFmodeAnthropicToken
+};

+ 93 - 0
claude-code/claude-code-qiwe-assistant/mcp/src/core/output-paths.js

@@ -0,0 +1,93 @@
+const fs = require('fs');
+const path = require('path');
+
+const PACKAGE_ROOT = path.resolve(__dirname, '..', '..', '..');
+
+const OUTPUT_CATEGORIES = Object.freeze([
+  'login',
+  'api-calls',
+  'subscription',
+  'meetings',
+  'docs',
+  'messages',
+  'smoke',
+  'tmp'
+]);
+
+function outputsRoot() {
+  const override = process.env.QIWE_OUTPUTS_DIR;
+  if (override && String(override).trim()) return path.resolve(String(override).trim());
+  return path.join(PACKAGE_ROOT, 'outputs');
+}
+
+function ensureDir(dirPath) {
+  fs.mkdirSync(dirPath, { recursive: true });
+  return dirPath;
+}
+
+function assertCategory(category) {
+  if (!OUTPUT_CATEGORIES.includes(category)) {
+    throw new Error(`未知输出类别 "${category}",允许的类别:${OUTPUT_CATEGORIES.join(', ')}`);
+  }
+  return category;
+}
+
+function slugify(value, fallback = 'run') {
+  const slug = String(value || '')
+    .trim()
+    .toLowerCase()
+    .replace(/[^a-z0-9\u4e00-\u9fa5]+/g, '-')
+    .replace(/^-+|-+$/g, '')
+    .slice(0, 60);
+  return slug || fallback;
+}
+
+function dateStamp(date = new Date()) {
+  return date.toISOString().slice(0, 10);
+}
+
+function timeStamp(date = new Date()) {
+  return date.toISOString().slice(11, 19).replace(/:/g, '');
+}
+
+function categoryDir(category) {
+  return ensureDir(path.join(outputsRoot(), assertCategory(category)));
+}
+
+function latestPath(category, filename) {
+  return path.join(categoryDir(category), filename);
+}
+
+function createRunDir(category, slug, date = new Date()) {
+  const dir = path.join(
+    categoryDir(category),
+    dateStamp(date),
+    `${timeStamp(date)}-${slugify(slug)}`
+  );
+  return ensureDir(dir);
+}
+
+function writeRunManifest(runDir, manifest = {}) {
+  const filePath = path.join(runDir, 'manifest.json');
+  const body = {
+    createdAt: new Date().toISOString(),
+    ...manifest,
+    files: (manifest.files || []).map(file => path.relative(runDir, path.resolve(runDir, file)))
+  };
+  fs.writeFileSync(filePath, JSON.stringify(body, null, 2), 'utf8');
+  return filePath;
+}
+
+module.exports = {
+  PACKAGE_ROOT,
+  OUTPUT_CATEGORIES,
+  outputsRoot,
+  ensureDir,
+  slugify,
+  dateStamp,
+  timeStamp,
+  categoryDir,
+  latestPath,
+  createRunDir,
+  writeRunManifest
+};

+ 30 - 0
claude-code/claude-code-qiwe-assistant/mcp/src/core/result-envelope.js

@@ -0,0 +1,30 @@
+function okResult(payload = {}) {
+  return {
+    status: 'ok',
+    assistantMessage: payload.assistantMessage || '',
+    summary: payload.summary || {},
+    data: payload.data || {},
+    files: payload.files || [],
+    nextActions: payload.nextActions || [],
+    warnings: payload.warnings || [],
+    errors: payload.errors || []
+  };
+}
+
+function errorResult(message, payload = {}) {
+  return {
+    status: 'error',
+    assistantMessage: message,
+    summary: payload.summary || {},
+    data: payload.data || {},
+    files: payload.files || [],
+    nextActions: payload.nextActions || [],
+    warnings: payload.warnings || [],
+    errors: payload.errors || [{ message }]
+  };
+}
+
+module.exports = {
+  okResult,
+  errorResult
+};

+ 390 - 0
claude-code/claude-code-qiwe-assistant/mcp/src/core/wecom-cli-runtime.js

@@ -0,0 +1,390 @@
+const fs = require('fs');
+const os = require('os');
+const path = require('path');
+const spawn = require('cross-spawn');
+
+const manifestPath = path.resolve(__dirname, '../../../wecom-cli-runtime.json');
+const runtimeManifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
+const INSTALL_LOCK_STALE_MS = 10 * 60 * 1000;
+const DEFAULT_INSTALL_TIMEOUT_MS = 5 * 60 * 1000;
+const DEFAULT_CALL_TIMEOUT_MS = 120000;
+const MAX_CAPTURE_BYTES = 10 * 1024 * 1024;
+
+function expandHome(value) {
+  const text = String(value || '');
+  if (text === '~') return os.homedir();
+  if (text.startsWith(`~${path.sep}`) || text.startsWith('~/') || text.startsWith('~\\')) {
+    return path.join(os.homedir(), text.slice(2));
+  }
+  return text;
+}
+
+function getPlatformKey() {
+  return `${process.platform}-${process.arch}`;
+}
+
+function isSupportedPlatform() {
+  return runtimeManifest.supportedPlatforms.includes(getPlatformKey());
+}
+
+function getRuntimeRoot() {
+  if (process.env.QIWE_OFFICIAL_CLI_RUNTIME_DIR) {
+    return path.resolve(expandHome(process.env.QIWE_OFFICIAL_CLI_RUNTIME_DIR));
+  }
+
+  if (process.platform === 'win32') {
+    const base = process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local');
+    return path.join(base, 'Fmode', 'qiwe-assistant', 'wecom-cli');
+  }
+
+  if (process.platform === 'darwin') {
+    return path.join(os.homedir(), 'Library', 'Caches', 'fmode', 'qiwe-assistant', 'wecom-cli');
+  }
+
+  const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');
+  return path.join(base, 'fmode', 'qiwe-assistant', 'wecom-cli');
+}
+
+function getRuntimeDir() {
+  return path.join(getRuntimeRoot(), runtimeManifest.version);
+}
+
+function getOfficialConfigDir() {
+  const configured = process.env.WECOM_CLI_CONFIG_DIR;
+  return configured
+    ? path.resolve(expandHome(configured))
+    : path.join(os.homedir(), '.config', 'wecom');
+}
+
+function getCliPackagePath(runtimeDir = getRuntimeDir()) {
+  return path.join(runtimeDir, 'node_modules', '@wecom', 'cli', 'package.json');
+}
+
+function getCliEntrypoint(runtimeDir = getRuntimeDir()) {
+  return path.join(runtimeDir, 'node_modules', '@wecom', 'cli', 'bin', 'wecom.js');
+}
+
+function inspectInstalledRuntime(runtimeDir = getRuntimeDir()) {
+  const packagePath = getCliPackagePath(runtimeDir);
+  const entrypoint = getCliEntrypoint(runtimeDir);
+  if (!fs.existsSync(packagePath) || !fs.existsSync(entrypoint)) {
+    return {
+      installed: false,
+      valid: false,
+      expectedVersion: runtimeManifest.version
+    };
+  }
+
+  try {
+    const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
+    return {
+      installed: true,
+      valid: packageJson.name === runtimeManifest.package && packageJson.version === runtimeManifest.version,
+      packageName: packageJson.name,
+      version: packageJson.version,
+      expectedVersion: runtimeManifest.version
+    };
+  } catch {
+    return {
+      installed: true,
+      valid: false,
+      expectedVersion: runtimeManifest.version
+    };
+  }
+}
+
+function sanitizeCliText(value) {
+  return String(value || '')
+    .replace(/Bearer\s+[^"'\s,}]+/gi, 'Bearer [REDACTED]')
+    .replace(
+      /("(?:[^"]*secret|access[_-]?token|authorization|credentials?|provider(?:name|host)?|vendor(?:name|host)?|upstream(?:name|host)?)"\s*:\s*")([^"]+)(")/gi,
+      '$1[REDACTED]$3'
+    )
+    .replace(/(Bot\s+Secret\s*[:=]\s*)\S+/gi, '$1[REDACTED]')
+    .replace(/((?:provider|vendor|upstream)(?:Name|Host)?\s*[:=]\s*)[^\s,}]+/gi, '$1[REDACTED]');
+}
+
+function sanitizeOfficialPayload(value) {
+  if (Array.isArray(value)) return value.map(sanitizeOfficialPayload);
+  if (value && typeof value === 'object') {
+    const output = {};
+    for (const [key, item] of Object.entries(value)) {
+      if (
+        /^(?:secret|bot_?secret|client_?secret|access_?token|authorization|credentials?|provider(?:Name|Host)?|vendor(?:Name|Host)?|upstream(?:Name|Host)?)$/i.test(
+          key
+        )
+      ) {
+        continue;
+      }
+      output[key] = sanitizeOfficialPayload(item);
+    }
+    return output;
+  }
+  return typeof value === 'string' ? sanitizeCliText(value) : value;
+}
+
+function runProcess(command, args, options = {}) {
+  const timeoutMs = options.timeoutMs || DEFAULT_CALL_TIMEOUT_MS;
+  const inherited = options.inherited === true;
+  const maxCaptureBytes = options.maxCaptureBytes || MAX_CAPTURE_BYTES;
+
+  return new Promise((resolve, reject) => {
+    let stdout = '';
+    let stderr = '';
+    let capturedBytes = 0;
+    let settled = false;
+    let timedOut = false;
+    const child = spawn(command, args, {
+      cwd: options.cwd || os.homedir(),
+      env: options.env || process.env,
+      shell: false,
+      windowsHide: !inherited,
+      stdio: inherited ? 'inherit' : ['ignore', 'pipe', 'pipe']
+    });
+
+    const timer = setTimeout(() => {
+      timedOut = true;
+      child.kill();
+    }, timeoutMs);
+
+    function capture(kind, chunk) {
+      capturedBytes += chunk.length;
+      if (capturedBytes > maxCaptureBytes) {
+        child.kill();
+        return;
+      }
+      if (kind === 'stdout') stdout += chunk.toString('utf8');
+      else stderr += chunk.toString('utf8');
+    }
+
+    if (!inherited) {
+      child.stdout.on('data', chunk => capture('stdout', chunk));
+      child.stderr.on('data', chunk => capture('stderr', chunk));
+    }
+
+    child.on('error', error => {
+      if (settled) return;
+      settled = true;
+      clearTimeout(timer);
+      reject(error);
+    });
+
+    child.on('close', (code, signal) => {
+      if (settled) return;
+      settled = true;
+      clearTimeout(timer);
+      if (timedOut) {
+        const error = new Error(`process timed out after ${timeoutMs}ms`);
+        error.kind = 'timeout';
+        reject(error);
+        return;
+      }
+      if (capturedBytes > maxCaptureBytes) {
+        const error = new Error(`process output exceeded ${maxCaptureBytes} bytes`);
+        error.kind = 'output_limit';
+        reject(error);
+        return;
+      }
+      resolve({
+        exitCode: Number.isInteger(code) ? code : 1,
+        signal,
+        stdout,
+        stderr
+      });
+    });
+  });
+}
+
+async function acquireInstallLock(lockPath, waitTimeoutMs = DEFAULT_INSTALL_TIMEOUT_MS) {
+  const startedAt = Date.now();
+  while (Date.now() - startedAt < waitTimeoutMs) {
+    try {
+      const handle = await fs.promises.open(lockPath, 'wx');
+      await handle.writeFile(`${process.pid}\n${new Date().toISOString()}\n`);
+      return async () => {
+        await handle.close().catch(() => {});
+        await fs.promises.rm(lockPath, { force: true }).catch(() => {});
+      };
+    } catch (error) {
+      if (error.code !== 'EEXIST') throw error;
+      try {
+        const stat = await fs.promises.stat(lockPath);
+        if (Date.now() - stat.mtimeMs > INSTALL_LOCK_STALE_MS) {
+          await fs.promises.rm(lockPath, { force: true });
+          continue;
+        }
+      } catch (statError) {
+        if (statError.code !== 'ENOENT') throw statError;
+        continue;
+      }
+      await new Promise(resolve => setTimeout(resolve, 250));
+    }
+  }
+  throw new Error('等待企业微信官方 CLI 安装锁超时');
+}
+
+function assertRuntimeRequirements() {
+  const nodeMajor = Number(process.versions.node.split('.')[0]);
+  if (!Number.isFinite(nodeMajor) || nodeMajor < 18) {
+    throw new Error(`企业微信官方 CLI 需要 Node.js >= 18,当前版本为 ${process.versions.node}`);
+  }
+  if (!isSupportedPlatform()) {
+    throw new Error(
+      `企业微信官方 CLI 不支持当前平台 ${getPlatformKey()};支持 ${runtimeManifest.supportedPlatforms.join(', ')}`
+    );
+  }
+}
+
+async function prepareOfficialCli(options = {}) {
+  assertRuntimeRequirements();
+  const runtimeRoot = getRuntimeRoot();
+  const runtimeDir = getRuntimeDir();
+  const force = options.force === true;
+  const installTimeoutMs = options.timeoutMs || DEFAULT_INSTALL_TIMEOUT_MS;
+  const current = inspectInstalledRuntime(runtimeDir);
+  if (current.valid && !force) return { ...current, runtimeDir, cached: true };
+
+  await fs.promises.mkdir(runtimeRoot, { recursive: true });
+  const lockPath = path.join(runtimeRoot, `.${runtimeManifest.version}.install.lock`);
+  const releaseLock = await acquireInstallLock(lockPath, installTimeoutMs);
+  let tempDir;
+  try {
+    const afterLock = inspectInstalledRuntime(runtimeDir);
+    if (afterLock.valid && !force) return { ...afterLock, runtimeDir, cached: true };
+
+    tempDir = path.join(runtimeRoot, `.${runtimeManifest.version}.tmp-${process.pid}-${Date.now()}`);
+    await fs.promises.rm(tempDir, { recursive: true, force: true });
+    await fs.promises.mkdir(tempDir, { recursive: true });
+
+    const npmCommand = process.platform === 'win32' ? 'npm.cmd' : 'npm';
+    const installResult = await runProcess(
+      npmCommand,
+      [
+        'install',
+        '--prefix',
+        tempDir,
+        `${runtimeManifest.package}@${runtimeManifest.version}`,
+        '--omit=dev',
+        '--no-audit',
+        '--no-fund',
+        '--save-exact'
+      ],
+      { timeoutMs: installTimeoutMs, cwd: runtimeRoot }
+    );
+
+    if (installResult.exitCode !== 0) {
+      throw new Error(
+        `下载企业微信官方 CLI 失败(exit ${installResult.exitCode}):${sanitizeCliText(
+          installResult.stderr || installResult.stdout
+        ).trim()}`
+      );
+    }
+
+    const installed = inspectInstalledRuntime(tempDir);
+    if (!installed.valid) {
+      throw new Error(
+        `企业微信官方 CLI 安装校验失败:期望 ${runtimeManifest.package}@${runtimeManifest.version}`
+      );
+    }
+
+    await fs.promises.rm(runtimeDir, { recursive: true, force: true });
+    await fs.promises.rename(tempDir, runtimeDir);
+    tempDir = undefined;
+    return { ...installed, runtimeDir, cached: false };
+  } finally {
+    if (tempDir) await fs.promises.rm(tempDir, { recursive: true, force: true }).catch(() => {});
+    await releaseLock();
+  }
+}
+
+function parseCliOutput(stdout) {
+  const text = String(stdout || '').trim();
+  if (!text) return undefined;
+  try {
+    return sanitizeOfficialPayload(JSON.parse(text));
+  } catch {
+    return undefined;
+  }
+}
+
+async function runOfficialCli(args, options = {}) {
+  if (!Array.isArray(args) || args.some(item => typeof item !== 'string')) {
+    throw new Error('CLI arguments must be an array of strings');
+  }
+  if (options.ensure !== false) await prepareOfficialCli();
+
+  const runtime = inspectInstalledRuntime();
+  if (!runtime.valid) throw new Error('企业微信官方 CLI 尚未安装或版本校验失败');
+
+  const result = await runProcess(
+    process.execPath,
+    [getCliEntrypoint(), ...args],
+    {
+      timeoutMs: options.timeoutMs || DEFAULT_CALL_TIMEOUT_MS,
+      inherited: options.inherited === true,
+      cwd: options.cwd || os.homedir(),
+      env: { ...process.env, ...(options.env || {}) }
+    }
+  );
+
+  return {
+    ...result,
+    stdout: sanitizeCliText(result.stdout),
+    stderr: sanitizeCliText(result.stderr),
+    parsed: parseCliOutput(result.stdout)
+  };
+}
+
+async function getOfficialCliStatus() {
+  const runtime = inspectInstalledRuntime();
+  const configDir = getOfficialConfigDir();
+  const botConfigExists = fs.existsSync(path.join(configDir, 'bot.enc'));
+  const mcpConfigExists = fs.existsSync(path.join(configDir, 'mcp_config.enc'));
+  let authorized = false;
+
+  if (runtime.valid) {
+    try {
+      const authResult = await runOfficialCli(['auth', 'show', '--auth-status'], {
+        ensure: false,
+        timeoutMs: 10000
+      });
+      authorized = authResult.exitCode === 0 && authResult.stdout.trim() === 'authorized';
+    } catch {
+      authorized = false;
+    }
+  }
+
+  return {
+    supported: isSupportedPlatform(),
+    platform: getPlatformKey(),
+    packageName: runtimeManifest.package,
+    expectedVersion: runtimeManifest.version,
+    installed: runtime.installed === true,
+    valid: runtime.valid === true,
+    installedVersion: runtime.version,
+    authorized,
+    mcpConfigExists,
+    ready: runtime.valid === true && authorized && botConfigExists && mcpConfigExists
+  };
+}
+
+function getInitCommand() {
+  const wrapperPath = path.resolve(__dirname, '../../../bin/qiwe-official-cli.js');
+  return `"${process.execPath}" "${wrapperPath}" init`;
+}
+
+module.exports = {
+  runtimeManifest,
+  getPlatformKey,
+  getRuntimeRoot,
+  getRuntimeDir,
+  getOfficialConfigDir,
+  getCliEntrypoint,
+  inspectInstalledRuntime,
+  sanitizeCliText,
+  sanitizeOfficialPayload,
+  prepareOfficialCli,
+  runOfficialCli,
+  getOfficialCliStatus,
+  getInitCommand
+};

+ 164 - 0
claude-code/claude-code-qiwe-assistant/mcp/src/providers/fmode-wecom-gateway.js

@@ -0,0 +1,164 @@
+const { DEFAULT_API_BASE } = require('../core/credentials');
+
+function redactSecret(value) {
+  return String(value || '')
+    .replace(/Bearer\s+[^"'\s,}]+/gi, 'Bearer [REDACTED]')
+    .replace(/\bsk-[A-Za-z0-9_-]{6,}\b/g, 'sk-[REDACTED]')
+    .replace(/\br:[A-Za-z0-9]{4,}\b/g, 'r:[REDACTED]')
+    .replace(/("Authorization"\s*:\s*")([^"]+)(")/gi, '$1[REDACTED]$3')
+    .replace(/https?:\/\/[^\s"'))]*/gi, '[外部链接]')
+    .replace(/\btokenId\b/gi, '服务凭据')
+    .replace(/\bguid\b/gi, '设备标识');
+}
+
+function sanitizePayload(value) {
+  if (Array.isArray(value)) return value.map(sanitizePayload);
+  if (value && typeof value === 'object') {
+    const output = {};
+    for (const [key, item] of Object.entries(value)) {
+      if (
+        /^(tokenId|guid|provider(?:Name|Host)?|vendor(?:Name|Host)?|upstream(?:Name|Host)?|source|supportUrl|docUrl|docsUrl|consoleUrl|apiHost|host|domain)$/i.test(
+          key
+        )
+      ) {
+        continue;
+      }
+      output[key] = sanitizePayload(item);
+    }
+    return output;
+  }
+  return typeof value === 'string' ? redactSecret(value) : value;
+}
+
+function classifyError({ httpStatus, code, message }) {
+  const status = Number(code) || Number(httpStatus) || 0;
+  const text = String(message || '');
+  if (status === 401 || /认证失败|登录失效|token.*(无效|失效|过期|错误)|未授权|unauthorized/i.test(text)) {
+    return 'auth';
+  }
+  if (status === 402 || /余额不足|未开通.*订阅|订阅.*到期|自动续费失败|套餐|额度不足/i.test(text)) {
+    return 'billing';
+  }
+  if (status === 403 || /席位已满|无权限|permission|forbidden/i.test(text)) {
+    return 'permission';
+  }
+  if (/未登录|掉线|离线|设备不存在|uid=.*未登录/i.test(text)) {
+    return 'device';
+  }
+  if ([400, 404, 422].includes(status) || /参数|缺少|必填|invalid|bad request/i.test(text)) {
+    return 'request';
+  }
+  if (status >= 500 || httpStatus >= 500) return 'upstream';
+  return 'business';
+}
+
+function buildGatewayUrl(apiBase, gatewayPath, query = {}) {
+  const root = String(apiBase || DEFAULT_API_BASE).replace(/\/$/, '');
+  const url = new URL(`${root}/${String(gatewayPath || '').replace(/^\//, '')}`);
+  for (const [key, value] of Object.entries(query || {})) {
+    if (value !== undefined && value !== null && value !== '') url.searchParams.set(key, String(value));
+  }
+  return url.toString();
+}
+
+function isSuccessCode(json) {
+  if (!json || typeof json !== 'object' || json.code === undefined) return true;
+  return [0, 200].includes(Number(json.code));
+}
+
+function publicErrorMessage(kind) {
+  const messages = {
+    auth: '鉴权失败',
+    billing: '订阅或余额校验失败',
+    permission: '席位或权限不足',
+    device: '设备未登录或已离线',
+    request: '请求参数错误',
+    upstream: '企业微信服务暂时不可用',
+    business: '企业微信业务请求失败'
+  };
+  return messages[kind] || messages.business;
+}
+
+async function callFmodeWecomGateway({
+  gatewayPath,
+  httpMethod = 'POST',
+  query,
+  body,
+  token,
+  apiBase,
+  timeoutMs = 60000
+}) {
+  if (!gatewayPath) {
+    const err = new Error('missing gatewayPath');
+    err.kind = 'request';
+    throw err;
+  }
+  if (!token) {
+    const err = new Error('missing fmode authorization token');
+    err.kind = 'auth';
+    err.httpStatus = 401;
+    throw err;
+  }
+
+  const url = buildGatewayUrl(apiBase, gatewayPath, query);
+  const method = String(httpMethod || 'POST').toUpperCase();
+  const controller = new AbortController();
+  const timer = setTimeout(() => controller.abort(), timeoutMs);
+  let response;
+  try {
+    response = await fetch(url, {
+      method,
+      headers: {
+        Authorization: `Bearer ${token}`,
+        Accept: 'application/json',
+        ...(body !== undefined ? { 'Content-Type': 'application/json' } : {})
+      },
+      body: body === undefined ? undefined : JSON.stringify(body),
+      signal: controller.signal
+    });
+  } catch (error) {
+    const err = new Error('网络请求失败');
+    err.kind = 'upstream';
+    err.httpStatus = 0;
+    throw err;
+  } finally {
+    clearTimeout(timer);
+  }
+
+  const text = await response.text();
+  let json;
+  try {
+    json = JSON.parse(text);
+  } catch {
+    json = undefined;
+  }
+
+  if (!response.ok || !isSuccessCode(json)) {
+    const code = json && json.code !== undefined ? Number(json.code) : response.status;
+    const message =
+      (json && (json.mess || json.msg || json.message || json.data?.mess || json.data?.message)) ||
+      text.slice(0, 500) ||
+      `HTTP ${response.status}`;
+    const kind = classifyError({ httpStatus: response.status, code, message });
+    const err = new Error(publicErrorMessage(kind));
+    err.kind = kind;
+    err.httpStatus = code || response.status;
+    err.bizCode = code;
+    throw err;
+  }
+
+  const safeJson = sanitizePayload(json);
+  return {
+    httpStatus: response.status,
+    json: safeJson,
+    data: safeJson && safeJson.data !== undefined ? safeJson.data : safeJson || redactSecret(text)
+  };
+}
+
+module.exports = {
+  callFmodeWecomGateway,
+  buildGatewayUrl,
+  redactSecret,
+  sanitizePayload,
+  classifyError
+};

+ 207 - 0
claude-code/claude-code-qiwe-assistant/mcp/src/providers/wecom-official-cli.js

@@ -0,0 +1,207 @@
+const { okResult, errorResult } = require('../core/result-envelope');
+const {
+  runtimeManifest,
+  prepareOfficialCli,
+  runOfficialCli,
+  getOfficialCliStatus,
+  getInitCommand,
+  sanitizeCliText
+} = require('../core/wecom-cli-runtime');
+
+const OFFICIAL_CATEGORIES = new Set(['contact', 'doc', 'meeting', 'msg', 'schedule', 'todo']);
+const METHOD_PATTERN = /^[a-z][a-z0-9_]*$/;
+
+function needsInitialization(output) {
+  return /未找到 MCP 配置缓存|请先运行.*init|unauthorized/i.test(String(output || ''));
+}
+
+function initializationError() {
+  const initCommand = getInitCommand();
+  return errorResult('企业微信官方 CLI 尚未完成初始化,请先扫码授权。', {
+    summary: {
+      channel: 'official-cli',
+      needsInitialization: true
+    },
+    nextActions: [
+      {
+        action: 'run_command',
+        command: initCommand,
+        description: '在终端中运行官方 CLI 初始化并完成企业微信扫码'
+      }
+    ]
+  });
+}
+
+async function qiweOfficialStatus() {
+  const status = await getOfficialCliStatus();
+  const nextActions = [];
+  if (!status.installed || !status.valid) {
+    nextActions.push({
+      action: 'qiwe_official_prepare',
+      description: `下载并缓存 ${runtimeManifest.package}@${runtimeManifest.version}`
+    });
+  } else if (!status.ready) {
+    nextActions.push({
+      action: 'run_command',
+      command: getInitCommand(),
+      description: '在终端中运行官方 CLI 初始化并完成企业微信扫码'
+    });
+  }
+
+  return okResult({
+    assistantMessage: status.ready
+      ? '企业微信官方 CLI 已安装并完成授权,可以调用官方会议、文档等能力。'
+      : status.valid
+        ? '企业微信官方 CLI 已安装,但尚未完成扫码授权。'
+        : '企业微信官方 CLI 尚未安装。',
+    summary: {
+      channel: 'official-cli',
+      ...status
+    },
+    nextActions
+  });
+}
+
+async function qiweOfficialPrepare({ force = false } = {}) {
+  try {
+    const installed = await prepareOfficialCli({ force });
+    const status = await getOfficialCliStatus();
+    return okResult({
+      assistantMessage: installed.cached
+        ? `企业微信官方 CLI ${runtimeManifest.version} 已存在,无需重复下载。`
+        : `企业微信官方 CLI ${runtimeManifest.version} 下载并校验成功。`,
+      summary: {
+        channel: 'official-cli',
+        installed: true,
+        version: runtimeManifest.version,
+        cached: installed.cached,
+        ready: status.ready
+      },
+      nextActions: status.ready
+        ? []
+        : [
+            {
+              action: 'run_command',
+              command: getInitCommand(),
+              description: '在终端中完成一次企业微信扫码授权'
+            }
+          ]
+    });
+  } catch (error) {
+    return errorResult(`企业微信官方 CLI 准备失败:${sanitizeCliText(error.message)}`, {
+      summary: {
+        channel: 'official-cli',
+        installed: false
+      }
+    });
+  }
+}
+
+async function qiweOfficialHelp({ category, method } = {}) {
+  if (method && !category) return errorResult('查询方法帮助时必须同时提供 category。');
+  if (category && !OFFICIAL_CATEGORIES.has(category)) {
+    return errorResult(`不支持的官方 CLI category:${category}`);
+  }
+  if (method && !METHOD_PATTERN.test(method)) return errorResult('method 格式无效。');
+
+  const args = [];
+  if (category) args.push(category);
+  if (method) args.push(method);
+  args.push('--help');
+
+  try {
+    const result = await runOfficialCli(args, { timeoutMs: 60000 });
+    const combined = `${result.stdout}\n${result.stderr}`.trim();
+    if (result.exitCode !== 0) {
+      if (needsInitialization(combined)) return initializationError();
+      return errorResult(`读取企业微信官方 CLI 帮助失败:${combined || `exit ${result.exitCode}`}`, {
+        summary: {
+          channel: 'official-cli',
+          category,
+          method,
+          exitCode: result.exitCode
+        }
+      });
+    }
+
+    return okResult({
+      assistantMessage: category
+        ? `已读取企业微信官方 CLI ${method ? `${category}.${method}` : category} 帮助。`
+        : '已读取企业微信官方 CLI 总帮助。',
+      summary: {
+        channel: 'official-cli',
+        category,
+        method
+      },
+      data: {
+        help: result.stdout.trim()
+      },
+      warnings: result.stderr.trim() ? [result.stderr.trim()] : []
+    });
+  } catch (error) {
+    return errorResult(`读取企业微信官方 CLI 帮助失败:${sanitizeCliText(error.message)}`);
+  }
+}
+
+async function qiweOfficialCall({ category, method, args = {}, timeoutMs } = {}) {
+  if (!OFFICIAL_CATEGORIES.has(category)) {
+    return errorResult(`不支持的官方 CLI category:${category || '未提供'}`);
+  }
+  if (!METHOD_PATTERN.test(String(method || ''))) return errorResult('method 格式无效。');
+  if (!args || typeof args !== 'object' || Array.isArray(args)) {
+    return errorResult('args 必须是 JSON 对象。');
+  }
+
+  try {
+    const result = await runOfficialCli(
+      [category, method, '--json', JSON.stringify(args)],
+      { timeoutMs: timeoutMs || 120000 }
+    );
+    const combined = `${result.stdout}\n${result.stderr}`.trim();
+    if (result.exitCode !== 0) {
+      if (needsInitialization(combined)) return initializationError();
+      return errorResult(
+        `企业微信官方 CLI 调用失败(${category}.${method}):${combined || `exit ${result.exitCode}`}`,
+        {
+          summary: {
+            channel: 'official-cli',
+            category,
+            method,
+            exitCode: result.exitCode
+          }
+        }
+      );
+    }
+
+    return okResult({
+      assistantMessage: `企业微信官方 CLI 调用成功:${category}.${method}`,
+      summary: {
+        channel: 'official-cli',
+        category,
+        method,
+        exitCode: result.exitCode
+      },
+      data: result.parsed !== undefined ? { response: result.parsed } : { output: result.stdout.trim() },
+      warnings: result.stderr.trim() ? [result.stderr.trim()] : []
+    });
+  } catch (error) {
+    return errorResult(
+      `企业微信官方 CLI 调用异常(${category}.${method}):${sanitizeCliText(error.message)}`,
+      {
+        summary: {
+          channel: 'official-cli',
+          category,
+          method
+        }
+      }
+    );
+  }
+}
+
+module.exports = {
+  OFFICIAL_CATEGORIES,
+  qiweOfficialStatus,
+  qiweOfficialPrepare,
+  qiweOfficialHelp,
+  qiweOfficialCall
+};

+ 277 - 0
claude-code/claude-code-qiwe-assistant/mcp/src/server.js

@@ -0,0 +1,277 @@
+#!/usr/bin/env node
+const { McpServer } = require('@modelcontextprotocol/sdk/server/mcp.js');
+const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
+const { z } = require('zod');
+const { searchQiweApis, getQiweApiDoc, callQiweApi } = require('./tools/qiwe-api-catalog-run');
+const {
+  qiweLoginStatus,
+  qiweLoginStart,
+  qiweLoginCheck,
+  qiweLoginVerify
+} = require('./tools/qiwe-login-run');
+const {
+  qiweSubscriptionStatus,
+  qiweSubscribe,
+  qiweSubscriptionAutoRenew
+} = require('./tools/qiwe-subscription-run');
+const {
+  qiweOfficialStatus,
+  qiweOfficialPrepare,
+  qiweOfficialHelp,
+  qiweOfficialCall
+} = require('./tools/wecom-official-cli-run');
+
+function asToolResult(result) {
+  const normalized = result && typeof result === 'object' ? result : { status: 'ok', assistantMessage: String(result) };
+  return {
+    content: [
+      {
+        type: 'text',
+        text: normalized.assistantMessage || JSON.stringify(normalized, null, 2)
+      }
+    ],
+    structuredContent: normalized,
+    isError: normalized.status === 'error'
+  };
+}
+
+function wrap(handler) {
+  return async (input = {}) => {
+    try {
+      return asToolResult(await handler(input));
+    } catch (error) {
+      return asToolResult({
+        status: 'error',
+        assistantMessage: `工具执行异常:${error && error.message ? error.message : error}`,
+        errors: [{ message: String(error && error.message ? error.message : error) }]
+      });
+    }
+  };
+}
+
+function createServer() {
+  const server = new McpServer({
+    name: 'enterprise-wechat-assistant',
+    version: '0.3.0'
+  });
+
+  server.registerTool(
+    'qiwe_api_search',
+    {
+      title: '检索企业微信开放接口清单',
+      description: [
+        '检索企业微信能力的全量接口清单(100+ 个接口:登录/设备、消息收发、群管理、联系人、朋友圈、标签、会话、文件等模块)。',
+        '当需要对企业微信做任何操作(发消息、拉群、加好友、同步消息、发朋友圈等)时,先来这里查有哪些接口。',
+        '入参 query(关键词,中英文均可)、module(模块 key:login/client/msg/room/contact/sns/label/session/user/cloud)、tag、limit 均可选;都不传返回全量清单。'
+      ].join(' '),
+      inputSchema: {
+        query: z.string().optional(),
+        module: z.string().optional(),
+        tag: z.string().optional(),
+        limit: z.number().int().min(1).max(200).optional()
+      }
+    },
+    wrap(searchQiweApis)
+  );
+
+  server.registerTool(
+    'qiwe_api_doc',
+    {
+      title: '读取企业微信接口的详细参数文档',
+      description: '读取清单中某个企业微信接口的完整参数文档(参数表、必填项、返回字段说明、调用模板)。入参 id(如 msg.sendText,来自 qiwe_api_search)或 method 路径(如 /msg/sendText)。',
+      inputSchema: {
+        id: z.string().optional(),
+        method: z.string().optional()
+      }
+    },
+    wrap(getQiweApiDoc)
+  );
+
+  server.registerTool(
+    'qiwe_api_call',
+    {
+      title: '调用企业微信开放接口',
+      description: [
+        '通过 Fmode 网关转发的企业微信接口执行请求,接口访问凭据和设备上下文由 Fmode 网关管理。',
+        '推荐传 id(清单接口 id)+ params;未登记接口可传 rawMethod(如 /msg/sendText)+ params。',
+        '客户端只需 Fmode 鉴权 token 和 uid,不接触企业微信接口访问凭据。'
+      ].join(' '),
+      inputSchema: {
+        id: z.string().optional(),
+        rawMethod: z.string().optional(),
+        params: z.record(z.any()).optional(),
+        uid: z.string().optional(),
+        authToken: z.string().optional(),
+        apiBase: z.string().optional()
+      }
+    },
+    wrap(callQiweApi)
+  );
+
+  server.registerTool(
+    'qiwe_login_status',
+    {
+      title: '查询企业微信登录/配置状态',
+      description: '通过 Fmode 网关转发的企业微信接口查询当前 uid 对应的设备在线状态。技能包安装后、或任何接口报设备/登录错误时先调用。',
+      inputSchema: {
+        uid: z.string().optional(),
+        authToken: z.string().optional(),
+        apiBase: z.string().optional()
+      }
+    },
+    wrap(qiweLoginStatus)
+  );
+
+  server.registerTool(
+    'qiwe_login_start',
+    {
+      title: '开始企业微信扫码登录',
+      description: [
+        '通过 Fmode 网关转发的企业微信接口创建或复用 uid 对应的设备并生成企业微信登录二维码。',
+        '二维码保存到 outputs/login/qiwe-login-qrcode.png,并默认打开预览页;传 openBrowser=false 可关闭。',
+        '需要有效企微包月订阅和可用席位;无需提供企业微信接口访问凭据、代理或设备参数。'
+      ].join(' '),
+      inputSchema: {
+        uid: z.string().optional(),
+        authToken: z.string().optional(),
+        apiBase: z.string().optional(),
+        openBrowser: z.boolean().optional()
+      }
+    },
+    wrap(qiweLoginStart)
+  );
+
+  server.registerTool(
+    'qiwe_login_check',
+    {
+      title: '检测扫码登录状态',
+      description: '通过 Fmode 网关转发的企业微信接口轮询扫码登录状态(用户扫码后每 3-5 秒调一次)。状态 10 表示需要 6 位验证码;manual=true 时先尝试免扫码登录。',
+      inputSchema: {
+        manual: z.boolean().optional(),
+        uid: z.string().optional(),
+        authToken: z.string().optional(),
+        apiBase: z.string().optional()
+      }
+    },
+    wrap(qiweLoginCheck)
+  );
+
+  server.registerTool(
+    'qiwe_login_verify',
+    {
+      title: '提交扫码登录的 6 位验证码',
+      description: '当 qiwe_login_check 返回状态 10(需要验证码)时,向用户索要手机端显示的 6 位验证码并通过本工具提交,随后再调 qiwe_login_check 确认登录成功。',
+      inputSchema: {
+        code: z.string(),
+        uid: z.string().optional(),
+        authToken: z.string().optional(),
+        apiBase: z.string().optional()
+      }
+    },
+    wrap(qiweLoginVerify)
+  );
+
+  server.registerTool(
+    'qiwe_subscription_status',
+    {
+      title: '查询企微包月订阅与席位状态',
+      description: '查询企微包月订阅、到期时间、自动续费、已购/已用席位和飞马余额。首次登录或收到 402/403 时先调用。',
+      inputSchema: {
+        authToken: z.string().optional(),
+        apiBase: z.string().optional()
+      }
+    },
+    wrap(qiweSubscriptionStatus)
+  );
+
+  server.registerTool(
+    'qiwe_subscribe',
+    {
+      title: '开通、续费或增购企微席位',
+      description: '使用飞马余额开通或续费企微包月订阅。1 个席位对应 1 个企业微信账号;seats 不传时默认 1。',
+      inputSchema: {
+        seats: z.number().int().min(1).optional(),
+        authToken: z.string().optional(),
+        apiBase: z.string().optional()
+      }
+    },
+    wrap(qiweSubscribe)
+  );
+
+  server.registerTool(
+    'qiwe_subscription_auto_renew',
+    {
+      title: '设置企微订阅自动续费',
+      description: '开启或关闭企微包月订阅到期自动续费。',
+      inputSchema: {
+        autoRenew: z.boolean(),
+        authToken: z.string().optional(),
+        apiBase: z.string().optional()
+      }
+    },
+    wrap(qiweSubscriptionAutoRenew)
+  );
+
+  server.registerTool(
+    'qiwe_official_status',
+    {
+      title: '检查企业微信官方 CLI 状态',
+      description: '检查固定版本官方 CLI 是否已下载、版本是否正确,以及官方机器人扫码授权是否完成。此工具与 Fmode 网关登录状态完全独立。',
+      inputSchema: {}
+    },
+    wrap(qiweOfficialStatus)
+  );
+
+  server.registerTool(
+    'qiwe_official_prepare',
+    {
+      title: '下载企业微信官方 CLI',
+      description: '将固定版本 @wecom/cli 下载到用户级缓存并校验。不会全局安装,不修改官方 CLI,也不会改动 Fmode 网关转发的企业微信接口通道。',
+      inputSchema: {
+        force: z.boolean().optional()
+      }
+    },
+    wrap(qiweOfficialPrepare)
+  );
+
+  server.registerTool(
+    'qiwe_official_help',
+    {
+      title: '读取企业微信官方 CLI 帮助',
+      description: '读取官方 CLI 总帮助、category 工具列表或具体 method 的参数 schema。category/method 级帮助需要先完成官方 CLI 初始化。',
+      inputSchema: {
+        category: z.enum(['contact', 'doc', 'meeting', 'msg', 'schedule', 'todo']).optional(),
+        method: z.string().regex(/^[a-z][a-z0-9_]*$/).optional()
+      }
+    },
+    wrap(qiweOfficialHelp)
+  );
+
+  server.registerTool(
+    'qiwe_official_call',
+    {
+      title: '调用企业微信官方 CLI 能力',
+      description: '通过固定版本官方 CLI 调用通讯录、文档、会议、消息、日程或待办。参数以结构化 JSON 传递,不经过 shell,也不经过 Fmode 网关。',
+      inputSchema: {
+        category: z.enum(['contact', 'doc', 'meeting', 'msg', 'schedule', 'todo']),
+        method: z.string().regex(/^[a-z][a-z0-9_]*$/),
+        args: z.record(z.any()).optional(),
+        timeoutMs: z.number().int().min(1000).max(300000).optional()
+      }
+    },
+    wrap(qiweOfficialCall)
+  );
+
+  return server;
+}
+
+async function main() {
+  const server = createServer();
+  const transport = new StdioServerTransport();
+  await server.connect(transport);
+}
+
+main().catch(error => {
+  console.error('enterprise-wechat-assistant mcp server failed:', error);
+  process.exit(1);
+});

+ 289 - 0
claude-code/claude-code-qiwe-assistant/mcp/src/tools/qiwe-api-catalog-run.js

@@ -0,0 +1,289 @@
+const {
+  loadCatalog,
+  listEndpoints,
+  listModules,
+  findEndpoint,
+  searchEndpoints,
+  summarizeEndpoint
+} = require('../core/api-catalog');
+const { readQiweAuthToken, ensureQiweUid, readQiweApiBase } = require('../core/credentials');
+const { callFmodeWecomGateway, redactSecret } = require('../providers/fmode-wecom-gateway');
+const { okResult, errorResult } = require('../core/result-envelope');
+
+function buildCallTemplate(endpoint) {
+  const args = { id: endpoint.id, params: {} };
+  for (const param of endpoint.params || []) {
+    if (param.required && !/^(guid|tokenId)$/i.test(param.name)) args.params[param.name] = `<${param.name}>`;
+  }
+  return args;
+}
+
+async function searchQiweApis(input = {}) {
+  const catalog = loadCatalog();
+  const query = input.query || input.q || input.keyword || '';
+  const matches = (query || input.module || input.tag)
+    ? searchEndpoints({ query, module: input.module, tag: input.tag, limit: input.limit || 30 })
+    : listEndpoints();
+  const results = matches.map(summarizeEndpoint);
+  const lines = [
+    '## 企业微信开放接口清单',
+    '',
+    `Fmode 网关转发:${catalog.gateway.endpoint.replace('{baseUrl}', catalog.gateway.baseUrl)},接口访问凭据和设备上下文均由 Fmode 网关管理。`,
+    `模块:${listModules().join(', ')}`,
+    query ? `匹配关键词「${query}」的接口(${results.length} 条):` : `全部已登记接口(${results.length} 条):`,
+    '',
+    ...results.map(
+      item =>
+        `- ${item.id} | ${item.title}(method: ${item.method})必填参数: ${item.requiredParams.join(', ') || '无'}`
+    ),
+    '',
+    '下一步:用 qiwe_api_doc 读取某个接口的详细参数文档,再用 qiwe_api_call 传参调用。',
+    '清单里没有的接口,可直接用 qiwe_api_call 传 rawMethod + params 调用。'
+  ];
+  return okResult({
+    assistantMessage: lines.join('\n'),
+    summary: { total: results.length, query: query || null, module: input.module || null },
+    data: { endpoints: results, gateway: catalog.gateway, modules: listModules() }
+  });
+}
+
+function renderParamLines(params, indent = '') {
+  const lines = [];
+  for (const p of params || []) {
+    if (/^(guid|tokenId)$/i.test(p.name)) continue;
+    const flag = p.required ? '必填' : '可选';
+    lines.push(`${indent}- ${p.name}(${p.type}, ${flag}):${redactSecret(p.desc || '')}`);
+    if (p.children) lines.push(...renderParamLines(p.children, indent + '  '));
+  }
+  return lines;
+}
+
+function publicParams(params) {
+  return (params || [])
+    .filter(p => !/^(guid|tokenId)$/i.test(p.name))
+    .map(p => ({
+      ...p,
+      desc: redactSecret(p.desc || ''),
+      ...(p.children ? { children: publicParams(p.children) } : {})
+    }));
+}
+
+async function getQiweApiDoc(input = {}) {
+  const idOrMethod = input.id || input.endpointId || input.method || input.path;
+  if (!idOrMethod) {
+    return errorResult('请提供接口 id 或 method 路径(可先用 qiwe_api_search 查清单)。');
+  }
+  const endpoint = findEndpoint(idOrMethod);
+  if (!endpoint) {
+    return errorResult(
+      `清单里没有找到接口「${idOrMethod}」。可用 qiwe_api_search 查询,或直接用 qiwe_api_call 传 rawMethod 调用未登记接口。`
+    );
+  }
+  const template = buildCallTemplate(endpoint);
+  const lines = [
+    `## ${endpoint.title}(${endpoint.id})`,
+    '',
+    redactSecret(endpoint.summary || ''),
+    '',
+    `method: ${endpoint.method || '(官方文档未公布,暂不可通过 qiwe_api_call 直接调用)'}(分类:${(endpoint.category || []).join(' > ') || '无'})`,
+    endpoint.apiPath ? `注意:本接口走 ${endpoint.apiPath}${endpoint.contentType ? `(${endpoint.contentType})` : ''};Fmode 网关当前尚未支持 multipart 文件传输,qiwe_api_call 暂不可调用。` : '',
+    '',
+    '参数:',
+    ...renderParamLines(endpoint.params),
+    '',
+    endpoint.responseHint ? `返回:${redactSecret(endpoint.responseHint)}` : '',
+    '',
+    '调用示例(传给 qiwe_api_call):',
+    '```json',
+    JSON.stringify(template, null, 2),
+    '```'
+  ].filter(line => line !== '');
+  return okResult({
+    assistantMessage: lines.join('\n'),
+    summary: { id: endpoint.id, method: endpoint.method },
+    data: {
+      endpoint: {
+        id: endpoint.id,
+        module: endpoint.module,
+        title: endpoint.title,
+        summary: redactSecret(endpoint.summary),
+        method: endpoint.method,
+        category: endpoint.category,
+        tags: endpoint.tags,
+        params: publicParams(endpoint.params),
+        responseHint: redactSecret(endpoint.responseHint),
+        apiPath: endpoint.apiPath,
+        contentType: endpoint.contentType
+      },
+      callTemplate: template
+    }
+  });
+}
+
+const BLOCKED_METHOD_PREFIXES = ['/login/', '/client/'];
+
+async function callQiweApi(input = {}) {
+  const idOrMethod = input.id || input.endpointId;
+  const rawMethod = input.rawMethod || input.method || (idOrMethod ? null : input.path);
+  const endpoint = (idOrMethod || rawMethod) ? findEndpoint(idOrMethod || rawMethod) : undefined;
+
+  if (!endpoint && !rawMethod) {
+    return errorResult('请提供接口 id(先用 qiwe_api_search 查清单),或提供 rawMethod 调用未登记接口。');
+  }
+
+  const token = readQiweAuthToken(input);
+  if (!token) {
+    return {
+      status: 'needs_auth',
+      assistantMessage: [
+        '还没有找到 Fmode 鉴权 token,无法调用由 Fmode 网关转发的企业微信接口。',
+        '',
+        '优先使用 Claude Code 已配置的 Fmode NewAPI sk- token;也可配置 QIWE_AUTH_TOKEN、FMODE_API_KEY 或平台 sessionToken。',
+        '配置鉴权后先调用 qiwe_subscription_status,再用 qiwe_login_start 完成企微扫码登录。'
+      ].join('\n'),
+      summary: { errorKind: 'missing_auth_token', recoverable: true },
+      data: {},
+      files: [],
+      nextActions: ['配置 Fmode 鉴权 token', '调用 qiwe_subscription_status 查看订阅状态'],
+      warnings: [],
+      errors: []
+    };
+  }
+
+  const method = endpoint ? endpoint.method : rawMethod;
+  if (BLOCKED_METHOD_PREFIXES.some(prefix => String(method || '').startsWith(prefix))) {
+    return errorResult('登录和设备类接口必须使用 qiwe_login_* 专用工具,不能通过 qiwe_api_call 透传。');
+  }
+  const params = input.params && typeof input.params === 'object' ? { ...input.params } : {};
+
+  if (endpoint) {
+    if (!endpoint.method) {
+      return errorResult(
+        `接口「${endpoint.title}」(${endpoint.id})官方文档未公布 method 路由值,暂无法通过 Fmode 网关调用。`,
+        { summary: { endpoint: endpoint.id, errorKind: 'no_method' } }
+      );
+    }
+    if (endpoint.apiPath && endpoint.apiPath !== '/api/qw/doApi') {
+      return errorResult(
+        `接口 ${endpoint.id} 走 ${endpoint.apiPath}(${endpoint.contentType || 'multipart'}),Fmode 网关当前尚未支持文件流,qiwe_api_call 暂不可调用。`
+      );
+    }
+    const topMissing = (endpoint.params || [])
+      .filter(
+        p =>
+          p.name !== 'guid' &&
+          p.required &&
+          (params[p.name] === undefined || params[p.name] === null || params[p.name] === '')
+      )
+      .map(p => p.name);
+    if (topMissing.length) {
+      return {
+        status: 'needs_input',
+        assistantMessage: `缺少必填参数:${topMissing.join(', ')}。请用 qiwe_api_doc 查看参数说明后补齐再调用。`,
+        summary: { endpoint: endpoint.id, missing: topMissing },
+        data: { endpoint: summarizeEndpoint(endpoint), missing: topMissing },
+        files: [],
+        nextActions: ['用 qiwe_api_doc 核对必填参数', '补齐参数后重新调用'],
+        warnings: [],
+        errors: [{ message: `缺少必填参数:${topMissing.join(', ')}`, kind: 'request' }]
+      };
+    }
+  }
+
+  const apiBase = readQiweApiBase(input);
+  const uid = ensureQiweUid(input);
+  try {
+    const result = await callFmodeWecomGateway({
+      gatewayPath: '/doApi',
+      body: { uid, method, params },
+      token,
+      apiBase
+    });
+    return okResult({
+      assistantMessage: `调用成功:${method}。`,
+      summary: { endpoint: endpoint ? endpoint.id : method, method, uid, httpStatus: result.httpStatus },
+      data: { result: result.data }
+    });
+  } catch (error) {
+    const kind = String((error && error.kind) || 'upstream');
+    const httpStatus = Number(error && error.httpStatus) || 0;
+    const safeMessage = redactSecret(error && error.message ? error.message : 'request failed');
+
+    if (kind === 'auth') {
+      return {
+        status: 'needs_auth',
+        assistantMessage: 'Fmode 鉴权 token 无效或已失效,请更新 QIWE_AUTH_TOKEN/FMODE_API_KEY 或重新登录平台后重试。',
+        summary: { endpoint: endpoint ? endpoint.id : method, errorKind: kind, httpStatus, recoverable: true },
+        data: {},
+        files: [],
+        nextActions: ['更新 Fmode 鉴权 token 后重新调用'],
+        warnings: [],
+        errors: []
+      };
+    }
+    if (kind === 'device') {
+      return {
+        status: 'needs_login',
+        assistantMessage: `接口 ${method} 返回登录态错误(${safeMessage})。请先用 qiwe_login_status 检查,再用 qiwe_login_start 重新扫码登录。`,
+        summary: { endpoint: endpoint ? endpoint.id : method, errorKind: kind, httpStatus, recoverable: true },
+        data: { message: safeMessage },
+        files: [],
+        nextActions: ['调用 qiwe_login_status 检查设备在线状态', '掉线则调用 qiwe_login_start 重新登录'],
+        warnings: [],
+        errors: [{ message: safeMessage, kind, httpStatus }]
+      };
+    }
+    if (kind === 'billing') {
+      return {
+        status: 'needs_subscription',
+        assistantMessage: `企微订阅或飞马余额不足(${safeMessage})。请先调用 qiwe_subscription_status,必要时用 qiwe_subscribe 开通或续费。`,
+        summary: { endpoint: endpoint ? endpoint.id : method, errorKind: kind, httpStatus },
+        data: { message: safeMessage },
+        files: [],
+        nextActions: ['调用 qiwe_subscription_status', '调用 qiwe_subscribe 开通或续费'],
+        warnings: [],
+        errors: []
+      };
+    }
+    if (kind === 'permission') {
+      return {
+        status: 'needs_seat',
+        assistantMessage: `企微席位或权限不足(${safeMessage})。请调用 qiwe_subscription_status 检查并按需增购席位。`,
+        summary: { endpoint: endpoint ? endpoint.id : method, errorKind: kind, httpStatus },
+        data: { message: safeMessage },
+        files: [],
+        nextActions: ['调用 qiwe_subscription_status', '调用 qiwe_subscribe 增购席位'],
+        warnings: [],
+        errors: []
+      };
+    }
+    if (kind === 'request') {
+      return {
+        status: 'needs_input',
+        assistantMessage: `接口 ${method} 返回入参错误(${safeMessage})。请用 qiwe_api_doc 核对参数后重试。`,
+        summary: { endpoint: endpoint ? endpoint.id : method, errorKind: kind, httpStatus },
+        data: { message: safeMessage },
+        files: [],
+        nextActions: ['用 qiwe_api_doc 核对参数', '修正参数后重新调用'],
+        warnings: [],
+        errors: [{ message: safeMessage, kind, httpStatus }]
+      };
+    }
+    return {
+      status: kind === 'business' ? 'business_error' : 'gateway_unstable',
+      assistantMessage: `接口 ${method} 调用失败:${safeMessage}${kind === 'upstream' ? '(Fmode 网关暂时不稳定,稍后重试即可)' : ''}`,
+      summary: { endpoint: endpoint ? endpoint.id : method, errorKind: kind, httpStatus },
+      data: { message: safeMessage },
+      files: [],
+      nextActions: kind === 'upstream' ? ['稍后重试该接口调用'] : ['根据错误信息调整后重试'],
+      warnings: [],
+      errors: [{ message: safeMessage, kind, httpStatus }]
+    };
+  }
+}
+
+module.exports = {
+  searchQiweApis,
+  getQiweApiDoc,
+  callQiweApi
+};

+ 321 - 0
claude-code/claude-code-qiwe-assistant/mcp/src/tools/qiwe-login-run.js

@@ -0,0 +1,321 @@
+const fs = require('fs');
+const path = require('path');
+const { spawn } = require('child_process');
+const {
+  readQiweAuthToken,
+  ensureQiweUid,
+  readQiweApiBase,
+  saveQiweClientConfig
+} = require('../core/credentials');
+const { callFmodeWecomGateway, redactSecret } = require('../providers/fmode-wecom-gateway');
+const { okResult, errorResult } = require('../core/result-envelope');
+const { latestPath } = require('../core/output-paths');
+
+const QR_STATUS = {
+  '-1': '未登录,需要扫码登录',
+  '0': '未登录,可尝试免扫码登录',
+  '1': '已扫码,等待手机端确认',
+  '2': '登录成功',
+  '4': '用户在手机端取消了登录',
+  '10': '已扫码确认,需要输入手机端 6 位验证码'
+};
+
+function authRequiredResult() {
+  return {
+    status: 'needs_auth',
+    assistantMessage: [
+      '还没有找到 Fmode 鉴权 token,无法调用由 Fmode 网关转发的企业微信接口。',
+      '优先复用 Claude Code 已配置的 Fmode NewAPI sk- token;也可配置 QIWE_AUTH_TOKEN、FMODE_API_KEY 或平台 sessionToken。',
+      '企业微信接口访问凭据和设备上下文由 Fmode 网关管理,技能不会读取或保存。'
+    ].join('\n'),
+    summary: { configured: false, errorKind: 'missing_auth_token', recoverable: true },
+    data: {},
+    files: [],
+    nextActions: ['配置 Fmode 鉴权 token 后重试'],
+    warnings: [],
+    errors: []
+  };
+}
+
+function saveQrcodeImage(base64Data) {
+  try {
+    const filePath = latestPath('login', 'qiwe-login-qrcode.png');
+    const data = String(base64Data || '').replace(/^data:image\/\w+;base64,/, '');
+    fs.writeFileSync(filePath, Buffer.from(data, 'base64'));
+    return filePath;
+  } catch {
+    return '';
+  }
+}
+
+function saveQrcodePreviewHtml(qrcodeImagePath) {
+  try {
+    const htmlPath = latestPath('login', 'qiwe-login-qrcode.html');
+    const html = [
+      '<!DOCTYPE html>',
+      '<html lang="zh-CN">',
+      '<head><meta charset="utf-8"><title>企业微信扫码登录</title>',
+      '<style>body{font-family:sans-serif;display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh;margin:0;background:#f5f6f7}img{width:280px;height:280px;border:1px solid #e0e0e0;border-radius:8px;background:#fff;padding:12px}h1{font-size:20px;color:#333}p{color:#666;font-size:14px}</style>',
+      '</head>',
+      '<body>',
+      '<h1>请用手机企业微信扫码登录</h1>',
+      `<img src="${path.basename(qrcodeImagePath)}" alt="登录二维码">`,
+      '<p>扫码后请在手机上确认登录。二维码约 4 分钟内有效,过期请重新生成。</p>',
+      '</body></html>'
+    ].join('\n');
+    fs.writeFileSync(htmlPath, html, 'utf8');
+    return htmlPath;
+  } catch {
+    return '';
+  }
+}
+
+function openInBrowser(target) {
+  try {
+    const platform = process.platform;
+    let cmd;
+    let args;
+    if (platform === 'win32') {
+      cmd = 'cmd';
+      args = ['/c', 'start', '', target];
+    } else if (platform === 'darwin') {
+      cmd = 'open';
+      args = [target];
+    } else {
+      cmd = 'xdg-open';
+      args = [target];
+    }
+    const child = spawn(cmd, args, { detached: true, stdio: 'ignore' });
+    child.unref();
+    return true;
+  } catch {
+    return false;
+  }
+}
+
+function gatewayErrorResult(error, stage, fallbackMessage) {
+  const safeMessage = redactSecret(error && error.message);
+  const kind = String((error && error.kind) || 'upstream');
+  if (kind === 'auth') {
+    return {
+      ...authRequiredResult(),
+      assistantMessage: `Fmode 鉴权失败(${safeMessage})。请更新鉴权 token 后重试。`,
+      summary: { stage, errorKind: kind, recoverable: true }
+    };
+  }
+  if (kind === 'billing') {
+    return {
+      status: 'needs_subscription',
+      assistantMessage: `企微订阅未开通、已到期或飞马余额不足(${safeMessage})。请先调用 qiwe_subscription_status,必要时用 qiwe_subscribe 开通或续费。`,
+      summary: { stage, errorKind: kind, recoverable: true },
+      data: {},
+      files: [],
+      nextActions: ['调用 qiwe_subscription_status', '调用 qiwe_subscribe 开通或续费'],
+      warnings: [],
+      errors: []
+    };
+  }
+  if (kind === 'permission') {
+    return {
+      status: 'needs_seat',
+      assistantMessage: `企微席位或权限不足(${safeMessage})。请查看订阅状态并增购席位后重试。`,
+      summary: { stage, errorKind: kind, recoverable: true },
+      data: {},
+      files: [],
+      nextActions: ['调用 qiwe_subscription_status', '调用 qiwe_subscribe 增购席位'],
+      warnings: [],
+      errors: []
+    };
+  }
+  return errorResult(`${fallbackMessage}:${safeMessage}`, {
+    summary: { stage, errorKind: kind },
+    nextActions: ['稍后重试', '若持续失败,请检查 Fmode 网关的企业微信接口状态']
+  });
+}
+
+async function qiweLoginStatus(input = {}) {
+  const token = readQiweAuthToken(input);
+  if (!token) return authRequiredResult();
+  const uid = ensureQiweUid(input);
+  const apiBase = readQiweApiBase(input);
+  try {
+    const result = await callFmodeWecomGateway({
+      gatewayPath: '/login/status',
+      httpMethod: 'GET',
+      query: { uid },
+      token,
+      apiBase
+    });
+    const data = result.data || {};
+    const online = Boolean(data.online);
+    return okResult({
+      assistantMessage: data.configured
+        ? online
+          ? `企业微信设备在线(uid: ${uid}),可以直接调用业务接口。`
+          : `企业微信设备当前不在线(状态 ${data.statusCode ?? '未知'}),请调用 qiwe_login_start 重新登录。`
+        : `当前 uid(${uid})尚未配置企业微信设备,请调用 qiwe_login_start 开始扫码登录。`,
+      summary: {
+        configured: Boolean(data.configured),
+        online,
+        uid,
+        statusCode: data.statusCode ?? null
+      },
+      data: {
+        uid,
+        configured: Boolean(data.configured),
+        online,
+        statusCode: data.statusCode ?? null,
+        detail: data.detail
+      },
+      nextActions: online ? [] : ['调用 qiwe_login_start 开始扫码登录']
+    });
+  } catch (error) {
+    return gatewayErrorResult(error, 'loginStatus', '查询登录状态失败');
+  }
+}
+
+async function qiweLoginStart(input = {}) {
+  const token = readQiweAuthToken(input);
+  if (!token) return authRequiredResult();
+  const uid = ensureQiweUid(input);
+  const apiBase = readQiweApiBase(input);
+  if (input.persistConfig !== false) saveQiweClientConfig({ uid, apiBase });
+  try {
+    const result = await callFmodeWecomGateway({
+      gatewayPath: '/login/start',
+      body: { uid },
+      token,
+      apiBase
+    });
+    const data = result.data || {};
+    const filePath = saveQrcodeImage(data.loginQrcodeBase64Data);
+    const htmlPath = filePath ? saveQrcodePreviewHtml(filePath) : '';
+    const opened = input.openBrowser === false ? false : Boolean(htmlPath && openInBrowser(htmlPath));
+    return okResult({
+      assistantMessage: [
+        `企业微信登录二维码已由 Fmode 网关生成(uid: ${uid})。`,
+        opened
+          ? `已自动打开二维码预览页:${htmlPath}`
+          : filePath
+            ? `请打开或展示二维码图片:${filePath}`
+            : 'Fmode 网关未返回可保存的二维码图片,请重试。',
+        '用户扫码并在手机上确认后,调用 qiwe_login_check 轮询状态。',
+        '如果返回状态 10,请向用户索要 6 位验证码并调用 qiwe_login_verify。'
+      ].join('\n'),
+      summary: {
+        uid,
+        qrcodeFile: filePath || null,
+        previewFile: htmlPath || null,
+        browserOpened: opened
+      },
+      data: {
+        uid,
+        qrcodeFile: filePath || null,
+        previewFile: htmlPath || null,
+        browserOpened: opened,
+        loginQrcodeBase64Data: filePath ? undefined : data.loginQrcodeBase64Data
+      },
+      files: [filePath, htmlPath].filter(Boolean),
+      nextActions: ['确认用户看到二维码并扫码', '调用 qiwe_login_check 轮询登录状态']
+    });
+  } catch (error) {
+    return gatewayErrorResult(error, 'loginStart', '生成登录二维码失败');
+  }
+}
+
+async function qiweLoginCheck(input = {}) {
+  const token = readQiweAuthToken(input);
+  if (!token) return authRequiredResult();
+  const uid = ensureQiweUid(input);
+  const apiBase = readQiweApiBase(input);
+  try {
+    const result = await callFmodeWecomGateway({
+      gatewayPath: '/login/check',
+      body: { uid, manual: Boolean(input.manual) },
+      token,
+      apiBase
+    });
+    const data = result.data || {};
+    const statusCode = String(data.status);
+    const statusText = QR_STATUS[statusCode] || `未知状态 ${statusCode}`;
+    const detail = data.detail || {};
+    if (statusCode === '2') {
+      return okResult({
+        assistantMessage: `企业微信登录成功!账号:${detail.nickname || detail.userId || '未知'}。后续业务请求将通过 Fmode 网关转发的企业微信接口执行。`,
+        summary: {
+          loggedIn: true,
+          uid,
+          statusCode: 2,
+          userId: detail.userId,
+          nickname: detail.nickname,
+          corpId: detail.corpId
+        },
+        data: { uid, status: detail }
+      });
+    }
+    if (statusCode === '10') {
+      return {
+        status: 'needs_verify_code',
+        assistantMessage: '用户已在手机上确认,但需要输入手机端显示的 6 位验证码。请取得验证码后调用 qiwe_login_verify。',
+        summary: { loggedIn: false, uid, statusCode: 10 },
+        data: { uid, status: detail },
+        files: [],
+        nextActions: ['向用户索要 6 位验证码', '调用 qiwe_login_verify'],
+        warnings: [],
+        errors: []
+      };
+    }
+    return okResult({
+      assistantMessage: `当前扫码状态:${statusCode}(${statusText})。${
+        ['-1', '1'].includes(statusCode)
+          ? '请继续等待用户扫码/确认,3-5 秒后再次调用 qiwe_login_check。'
+          : statusCode === '4'
+            ? '用户取消了登录,可重新调用 qiwe_login_start。'
+            : statusCode === '0'
+              ? '可再次调用 qiwe_login_check 并传 manual=true 尝试免扫码登录。'
+              : ''
+      }`,
+      summary: { loggedIn: false, uid, statusCode: Number(statusCode) },
+      data: { uid, status: detail },
+      nextActions:
+        statusCode === '4'
+          ? ['重新调用 qiwe_login_start']
+          : statusCode === '0'
+            ? ['调用 qiwe_login_check,传 manual=true']
+            : ['稍后再次调用 qiwe_login_check']
+    });
+  } catch (error) {
+    return gatewayErrorResult(error, 'loginCheck', '检测扫码状态失败');
+  }
+}
+
+async function qiweLoginVerify(input = {}) {
+  const token = readQiweAuthToken(input);
+  if (!token) return authRequiredResult();
+  const uid = ensureQiweUid(input);
+  const code = String(input.code || '').trim();
+  if (!/^\d{6}$/.test(code)) return errorResult('请提供手机端显示的 6 位数字验证码(入参 code)。');
+  const apiBase = readQiweApiBase(input);
+  try {
+    await callFmodeWecomGateway({
+      gatewayPath: '/login/verify',
+      body: { uid, code },
+      token,
+      apiBase
+    });
+    return okResult({
+      assistantMessage: '验证码已提交。请调用 qiwe_login_check 再次确认登录状态。',
+      summary: { verified: true, uid },
+      nextActions: ['调用 qiwe_login_check 确认登录状态']
+    });
+  } catch (error) {
+    return gatewayErrorResult(error, 'loginVerify', '验证码校验失败');
+  }
+}
+
+module.exports = {
+  qiweLoginStatus,
+  qiweLoginStart,
+  qiweLoginCheck,
+  qiweLoginVerify
+};

+ 128 - 0
claude-code/claude-code-qiwe-assistant/mcp/src/tools/qiwe-subscription-run.js

@@ -0,0 +1,128 @@
+const { readQiweAuthToken, readQiweApiBase } = require('../core/credentials');
+const { callFmodeWecomGateway, redactSecret } = require('../providers/fmode-wecom-gateway');
+const { okResult, errorResult } = require('../core/result-envelope');
+
+function authRequiredResult() {
+  return {
+    status: 'needs_auth',
+    assistantMessage: '还没有找到 Fmode 鉴权 token,无法调用由 Fmode 网关转发的企业微信接口。请配置 QIWE_AUTH_TOKEN、FMODE_API_KEY 或平台 sessionToken 后重试。',
+    summary: { errorKind: 'missing_auth_token', recoverable: true },
+    data: {},
+    files: [],
+    nextActions: ['配置 Fmode 鉴权 token 后重试'],
+    warnings: [],
+    errors: []
+  };
+}
+
+function subscriptionError(error, stage) {
+  const safeMessage = redactSecret(error && error.message);
+  const kind = String((error && error.kind) || 'upstream');
+  if (kind === 'auth') return authRequiredResult();
+  if (kind === 'billing') {
+    return {
+      status: 'needs_recharge',
+      assistantMessage: `飞马余额不足或订阅扣费失败(${safeMessage})。请充值后重新调用 qiwe_subscribe。`,
+      summary: { stage, errorKind: kind, recoverable: true },
+      data: {},
+      files: [],
+      nextActions: ['充值飞马余额', '重新调用 qiwe_subscribe'],
+      warnings: [],
+      errors: []
+    };
+  }
+  return errorResult(`企微订阅操作失败:${safeMessage}`, {
+    summary: { stage, errorKind: kind },
+    nextActions: ['稍后重试', '若持续失败,请检查 Fmode 网关的企业微信接口状态']
+  });
+}
+
+async function qiweSubscriptionStatus(input = {}) {
+  const token = readQiweAuthToken(input);
+  if (!token) return authRequiredResult();
+  try {
+    const result = await callFmodeWecomGateway({
+      gatewayPath: '/subscribe/status',
+      httpMethod: 'GET',
+      token,
+      apiBase: readQiweApiBase(input)
+    });
+    const data = result.data || {};
+    return okResult({
+      assistantMessage: data.subscribed
+        ? `企微包月订阅有效:${data.usedSeats ?? 0}/${data.seats ?? 0} 个席位已使用,到期时间 ${data.expireAt || '未知'}。`
+        : '企微包月订阅尚未开通或已到期,请调用 qiwe_subscribe 开通或续费。',
+      summary: {
+        subscribed: Boolean(data.subscribed),
+        seats: data.seats ?? null,
+        usedSeats: data.usedSeats ?? null,
+        expireAt: data.expireAt || null,
+        autoRenew: data.autoRenew ?? null,
+        balance: data.balance
+      },
+      data,
+      nextActions: data.subscribed ? [] : ['调用 qiwe_subscribe 开通或续费']
+    });
+  } catch (error) {
+    return subscriptionError(error, 'subscriptionStatus');
+  }
+}
+
+async function qiweSubscribe(input = {}) {
+  const token = readQiweAuthToken(input);
+  if (!token) return authRequiredResult();
+  const seats = input.seats === undefined ? undefined : Number(input.seats);
+  if (seats !== undefined && (!Number.isInteger(seats) || seats < 1)) {
+    return errorResult('seats 必须是大于等于 1 的整数。');
+  }
+  try {
+    const result = await callFmodeWecomGateway({
+      gatewayPath: '/subscribe',
+      body: seats === undefined ? {} : { seats },
+      token,
+      apiBase: readQiweApiBase(input)
+    });
+    const data = result.data || {};
+    return okResult({
+      assistantMessage: `企微包月订阅已开通或续费:${data.seats ?? seats ?? 1} 个席位,到期时间 ${data.expireAt || '未知'}。`,
+      summary: {
+        subscribed: true,
+        seats: data.seats ?? seats ?? 1,
+        expireAt: data.expireAt || null,
+        autoRenew: data.autoRenew ?? null
+      },
+      data,
+      nextActions: ['调用 qiwe_login_start 添加或重新登录企业微信账号']
+    });
+  } catch (error) {
+    return subscriptionError(error, 'subscribe');
+  }
+}
+
+async function qiweSubscriptionAutoRenew(input = {}) {
+  const token = readQiweAuthToken(input);
+  if (!token) return authRequiredResult();
+  if (typeof input.autoRenew !== 'boolean') return errorResult('autoRenew 必须是 boolean。');
+  try {
+    const result = await callFmodeWecomGateway({
+      gatewayPath: '/subscribe/autoRenew',
+      body: { autoRenew: input.autoRenew },
+      token,
+      apiBase: readQiweApiBase(input)
+    });
+    const data = result.data || {};
+    return okResult({
+      assistantMessage: `企微订阅自动续费已${data.autoRenew ? '开启' : '关闭'}。`,
+      summary: { autoRenew: Boolean(data.autoRenew) },
+      data
+    });
+  } catch (error) {
+    return subscriptionError(error, 'subscriptionAutoRenew');
+  }
+}
+
+module.exports = {
+  qiweSubscriptionStatus,
+  qiweSubscribe,
+  qiweSubscriptionAutoRenew
+};

+ 13 - 0
claude-code/claude-code-qiwe-assistant/mcp/src/tools/wecom-official-cli-run.js

@@ -0,0 +1,13 @@
+const {
+  qiweOfficialStatus,
+  qiweOfficialPrepare,
+  qiweOfficialHelp,
+  qiweOfficialCall
+} = require('../providers/wecom-official-cli');
+
+module.exports = {
+  qiweOfficialStatus,
+  qiweOfficialPrepare,
+  qiweOfficialHelp,
+  qiweOfficialCall
+};

+ 1178 - 0
claude-code/claude-code-qiwe-assistant/package-lock.json

@@ -0,0 +1,1178 @@
+{
+  "name": "claude-code-qiwe-assistant",
+  "version": "0.3.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "claude-code-qiwe-assistant",
+      "version": "0.3.0",
+      "dependencies": {
+        "@modelcontextprotocol/sdk": "^1.12.1",
+        "cross-spawn": "7.0.6",
+        "zod": "^3.24.1"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
+    "node_modules/@hono/node-server": {
+      "version": "1.19.14",
+      "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.14.tgz",
+      "integrity": "sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18.14.1"
+      },
+      "peerDependencies": {
+        "hono": "^4"
+      }
+    },
+    "node_modules/@modelcontextprotocol/sdk": {
+      "version": "1.29.0",
+      "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.29.0.tgz",
+      "integrity": "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@hono/node-server": "^1.19.9",
+        "ajv": "^8.17.1",
+        "ajv-formats": "^3.0.1",
+        "content-type": "^1.0.5",
+        "cors": "^2.8.5",
+        "cross-spawn": "^7.0.5",
+        "eventsource": "^3.0.2",
+        "eventsource-parser": "^3.0.0",
+        "express": "^5.2.1",
+        "express-rate-limit": "^8.2.1",
+        "hono": "^4.11.4",
+        "jose": "^6.1.3",
+        "json-schema-typed": "^8.0.2",
+        "pkce-challenge": "^5.0.0",
+        "raw-body": "^3.0.0",
+        "zod": "^3.25 || ^4.0",
+        "zod-to-json-schema": "^3.25.1"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "peerDependencies": {
+        "@cfworker/json-schema": "^4.1.1",
+        "zod": "^3.25 || ^4.0"
+      },
+      "peerDependenciesMeta": {
+        "@cfworker/json-schema": {
+          "optional": true
+        },
+        "zod": {
+          "optional": false
+        }
+      }
+    },
+    "node_modules/accepts": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+      "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-types": "^3.0.0",
+        "negotiator": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "8.20.0",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
+      "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
+      "license": "MIT",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.3",
+        "fast-uri": "^3.0.1",
+        "json-schema-traverse": "^1.0.0",
+        "require-from-string": "^2.0.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/ajv-formats": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
+      "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^8.0.0"
+      },
+      "peerDependencies": {
+        "ajv": "^8.0.0"
+      },
+      "peerDependenciesMeta": {
+        "ajv": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/body-parser": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz",
+      "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==",
+      "license": "MIT",
+      "dependencies": {
+        "bytes": "^3.1.2",
+        "content-type": "^2.0.0",
+        "debug": "^4.4.3",
+        "http-errors": "^2.0.1",
+        "iconv-lite": "^0.7.2",
+        "on-finished": "^2.4.1",
+        "qs": "^6.15.2",
+        "raw-body": "^3.0.2",
+        "type-is": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/body-parser/node_modules/content-type": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz",
+      "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/bytes": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/call-bind-apply-helpers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/call-bound": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+      "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "get-intrinsic": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/content-disposition": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz",
+      "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/content-type": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+      "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie-signature": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+      "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.6.0"
+      }
+    },
+    "node_modules/cors": {
+      "version": "2.8.6",
+      "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
+      "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
+      "license": "MIT",
+      "dependencies": {
+        "object-assign": "^4",
+        "vary": "^1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+      "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/debug": {
+      "version": "4.4.3",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+      "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.3"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/depd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/dunder-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "gopd": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+      "license": "MIT"
+    },
+    "node_modules/encodeurl": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+      "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/es-define-property": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-errors": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/es-object-atoms": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz",
+      "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+      "license": "MIT"
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/eventsource": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz",
+      "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==",
+      "license": "MIT",
+      "dependencies": {
+        "eventsource-parser": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/eventsource-parser": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz",
+      "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18.0.0"
+      }
+    },
+    "node_modules/express": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
+      "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
+      "license": "MIT",
+      "dependencies": {
+        "accepts": "^2.0.0",
+        "body-parser": "^2.2.1",
+        "content-disposition": "^1.0.0",
+        "content-type": "^1.0.5",
+        "cookie": "^0.7.1",
+        "cookie-signature": "^1.2.1",
+        "debug": "^4.4.0",
+        "depd": "^2.0.0",
+        "encodeurl": "^2.0.0",
+        "escape-html": "^1.0.3",
+        "etag": "^1.8.1",
+        "finalhandler": "^2.1.0",
+        "fresh": "^2.0.0",
+        "http-errors": "^2.0.0",
+        "merge-descriptors": "^2.0.0",
+        "mime-types": "^3.0.0",
+        "on-finished": "^2.4.1",
+        "once": "^1.4.0",
+        "parseurl": "^1.3.3",
+        "proxy-addr": "^2.0.7",
+        "qs": "^6.14.0",
+        "range-parser": "^1.2.1",
+        "router": "^2.2.0",
+        "send": "^1.1.0",
+        "serve-static": "^2.2.0",
+        "statuses": "^2.0.1",
+        "type-is": "^2.0.1",
+        "vary": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/express-rate-limit": {
+      "version": "8.5.2",
+      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.2.tgz",
+      "integrity": "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==",
+      "license": "MIT",
+      "dependencies": {
+        "ip-address": "^10.2.0"
+      },
+      "engines": {
+        "node": ">= 16"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/express-rate-limit"
+      },
+      "peerDependencies": {
+        "express": ">= 4.11"
+      }
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "license": "MIT"
+    },
+    "node_modules/fast-uri": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz",
+      "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fastify"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/fastify"
+        }
+      ],
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/finalhandler": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
+      "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.4.0",
+        "encodeurl": "^2.0.0",
+        "escape-html": "^1.0.3",
+        "on-finished": "^2.4.1",
+        "parseurl": "^1.3.3",
+        "statuses": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 18.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/forwarded": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fresh": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+      "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind-apply-helpers": "^1.0.2",
+        "es-define-property": "^1.0.1",
+        "es-errors": "^1.3.0",
+        "es-object-atoms": "^1.1.1",
+        "function-bind": "^1.1.2",
+        "get-proto": "^1.0.1",
+        "gopd": "^1.2.0",
+        "has-symbols": "^1.1.0",
+        "hasown": "^2.0.2",
+        "math-intrinsics": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+      "license": "MIT",
+      "dependencies": {
+        "dunder-proto": "^1.0.1",
+        "es-object-atoms": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/gopd": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hasown": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+      "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+      "license": "MIT",
+      "dependencies": {
+        "function-bind": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/hono": {
+      "version": "4.12.27",
+      "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.27.tgz",
+      "integrity": "sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=16.9.0"
+      }
+    },
+    "node_modules/http-errors": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+      "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+      "license": "MIT",
+      "dependencies": {
+        "depd": "~2.0.0",
+        "inherits": "~2.0.4",
+        "setprototypeof": "~1.2.0",
+        "statuses": "~2.0.2",
+        "toidentifier": "~1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+      "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "license": "ISC"
+    },
+    "node_modules/ip-address": {
+      "version": "10.2.0",
+      "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz",
+      "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 12"
+      }
+    },
+    "node_modules/ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/is-promise": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+      "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
+      "license": "MIT"
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+      "license": "ISC"
+    },
+    "node_modules/jose": {
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.3.tgz",
+      "integrity": "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/panva"
+      }
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+      "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+      "license": "MIT"
+    },
+    "node_modules/json-schema-typed": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz",
+      "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==",
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/math-intrinsics": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/media-typer": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+      "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/merge-descriptors": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+      "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.54.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+      "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+      "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": "^1.54.0"
+      },
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "license": "MIT"
+    },
+    "node_modules/negotiator": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+      "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.4",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/on-finished": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+      "license": "MIT",
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "license": "ISC",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-to-regexp": {
+      "version": "8.4.2",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz",
+      "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/pkce-challenge": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz",
+      "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=16.20.0"
+      }
+    },
+    "node_modules/proxy-addr": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+      "license": "MIT",
+      "dependencies": {
+        "forwarded": "0.2.0",
+        "ipaddr.js": "1.9.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/qs": {
+      "version": "6.15.3",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz",
+      "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "es-define-property": "^1.0.1",
+        "side-channel": "^1.1.1"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/range-parser": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz",
+      "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/raw-body": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
+      "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
+      "license": "MIT",
+      "dependencies": {
+        "bytes": "~3.1.2",
+        "http-errors": "~2.0.1",
+        "iconv-lite": "~0.7.0",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/router": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+      "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.4.0",
+        "depd": "^2.0.0",
+        "is-promise": "^4.0.0",
+        "parseurl": "^1.3.3",
+        "path-to-regexp": "^8.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      }
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "license": "MIT"
+    },
+    "node_modules/send": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
+      "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.4.3",
+        "encodeurl": "^2.0.0",
+        "escape-html": "^1.0.3",
+        "etag": "^1.8.1",
+        "fresh": "^2.0.0",
+        "http-errors": "^2.0.1",
+        "mime-types": "^3.0.2",
+        "ms": "^2.1.3",
+        "on-finished": "^2.4.1",
+        "range-parser": "^1.2.1",
+        "statuses": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/serve-static": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz",
+      "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
+      "license": "MIT",
+      "dependencies": {
+        "encodeurl": "^2.0.0",
+        "escape-html": "^1.0.3",
+        "parseurl": "^1.3.3",
+        "send": "^1.2.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+      "license": "ISC"
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "license": "MIT",
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/side-channel": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz",
+      "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.4",
+        "side-channel-list": "^1.0.1",
+        "side-channel-map": "^1.0.1",
+        "side-channel-weakmap": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-list": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+      "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+      "license": "MIT",
+      "dependencies": {
+        "es-errors": "^1.3.0",
+        "object-inspect": "^1.13.4"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-map": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+      "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/side-channel-weakmap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+      "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bound": "^1.0.2",
+        "es-errors": "^1.3.0",
+        "get-intrinsic": "^1.2.5",
+        "object-inspect": "^1.13.3",
+        "side-channel-map": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/statuses": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+      "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/toidentifier": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/type-is": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz",
+      "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==",
+      "license": "MIT",
+      "dependencies": {
+        "content-type": "^2.0.0",
+        "media-typer": "^1.1.0",
+        "mime-types": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/type-is/node_modules/content-type": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz",
+      "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=18"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/express"
+      }
+    },
+    "node_modules/unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+      "license": "ISC"
+    },
+    "node_modules/zod": {
+      "version": "3.25.76",
+      "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
+      "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/colinhacks"
+      }
+    },
+    "node_modules/zod-to-json-schema": {
+      "version": "3.25.2",
+      "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz",
+      "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==",
+      "license": "ISC",
+      "peerDependencies": {
+        "zod": "^3.25.28 || ^4"
+      }
+    }
+  }
+}

+ 23 - 0
claude-code/claude-code-qiwe-assistant/package.json

@@ -0,0 +1,23 @@
+{
+  "name": "claude-code-qiwe-assistant",
+  "version": "0.3.0",
+  "description": "企业微信技能包:保留 Fmode 网关转发的企业微信接口,并增加按需下载的官方 CLI 会议与文档能力",
+  "main": "mcp/src/server.js",
+  "scripts": {
+    "check": "node --check mcp/src/server.js && node --check mcp/src/core/api-catalog.js && node --check mcp/src/core/credentials.js && node --check mcp/src/core/result-envelope.js && node --check mcp/src/core/output-paths.js && node --check mcp/src/core/wecom-cli-runtime.js && node --check mcp/src/providers/fmode-wecom-gateway.js && node --check mcp/src/providers/wecom-official-cli.js && node --check mcp/src/tools/qiwe-api-catalog-run.js && node --check mcp/src/tools/qiwe-login-run.js && node --check mcp/src/tools/qiwe-subscription-run.js && node --check mcp/src/tools/wecom-official-cli-run.js && node --check bin/qiwe-official-cli.js && node --check scripts/install-wecom-cli.js && node --check scripts/smoke-test.js && node --check scripts/wecom-cli-smoke-test.js && node --check scripts/validate-output-standard.js",
+    "start": "node mcp/src/server.js",
+    "smoke": "node scripts/smoke-test.js && node scripts/wecom-cli-smoke-test.js",
+    "outputs:validate": "node scripts/validate-output-standard.js",
+    "wecom:install": "node scripts/install-wecom-cli.js",
+    "wecom:status": "node bin/qiwe-official-cli.js status",
+    "wecom:init": "node bin/qiwe-official-cli.js init"
+  },
+  "dependencies": {
+    "@modelcontextprotocol/sdk": "^1.12.1",
+    "cross-spawn": "7.0.6",
+    "zod": "^3.24.1"
+  },
+  "engines": {
+    "node": ">=18"
+  }
+}

+ 157 - 0
claude-code/claude-code-qiwe-assistant/scripts/build-catalog.py

@@ -0,0 +1,157 @@
+#!/usr/bin/env python3
+"""Build the enterprise WeChat endpoint catalog from markdown OpenAPI docs."""
+import re, yaml, json, html, os, sys, glob
+
+DOCS = sys.argv[1] if len(sys.argv) > 1 else os.environ.get('QIWE_DOCS_DIR')
+OUT = sys.argv[2] if len(sys.argv) > 2 else os.path.join(os.path.dirname(__file__), '..', 'mcp', 'catalog', 'qiwe-endpoints.json')
+if not DOCS:
+    raise SystemExit('请通过第一个参数或 QIWE_DOCS_DIR 指定接口文档目录')
+
+def strip_html(s):
+    if not s: return ''
+    s = re.sub(r'<[^>]+>', '', str(s))
+    s = html.unescape(s)
+    return re.sub(r'\s+', ' ', s).strip()
+
+def simplify_props(schema, required=None, prefix=''):
+    out = []
+    props = (schema or {}).get('properties') or {}
+    req = set((schema or {}).get('required') or [])
+    for name, spec in props.items():
+        name = str(name).strip()
+        desc = strip_html(spec.get('description') or spec.get('title') or '')
+        typ = spec.get('type', 'string')
+        entry = {'name': prefix + name, 'in': 'body', 'type': typ, 'required': name in req}
+        if desc: entry['desc'] = desc[:600]
+        if typ == 'object' and spec.get('properties'):
+            entry['children'] = simplify_props(spec)
+        if typ == 'array' and isinstance(spec.get('items'), dict) and spec['items'].get('properties'):
+            entry['children'] = simplify_props(spec['items'])
+        out.append(entry)
+    return out
+
+def response_hint(post):
+    try:
+        schema = post['responses']['200']['content']['application/json']['schema']
+    except Exception:
+        return ''
+    data = (schema.get('properties') or {}).get('data') or {}
+    if data.get('type') == 'array':
+        data = data.get('items') or {}
+    fields = []
+    for k, v in (data.get('properties') or {}).items():
+        d = strip_html(v.get('description') or v.get('title') or '')
+        fields.append(f"{str(k).strip()}{'('+d[:120]+')' if d else ''}")
+    return ('data 字段:' + ';'.join(fields[:15])) if fields else ''
+
+endpoints = []
+skipped = []
+for path in sorted(glob.glob(os.path.join(DOCS, '*.md'))):
+    fname = os.path.basename(path)
+    text = open(path, encoding='utf-8').read()
+    m = re.search(r'```yaml\n(.*?)\n```', text, re.S)
+    if not m:
+        skipped.append(fname); continue
+    try:
+        spec = yaml.safe_load(m.group(1))
+        paths = spec['paths']
+        api_path = next(p for p in ('/api/qw/doApi', '/qiwe/api/qw/doApi', '/api/qw/doFileApi') if p in paths)
+        post = paths[api_path]['post']
+    except Exception:
+        skipped.append(fname); continue
+    is_file_api = 'doFileApi' in api_path
+    content = post['requestBody']['content']
+    content_type = 'application/json' if 'application/json' in content else next(iter(content))
+    body = content[content_type].get('schema') or {}
+    props = body.get('properties') or {}
+    method_desc = (props.get('method') or {}).get('description', '')
+    mm = re.search(r'(/[a-z]+/[A-Za-z0-9_]+)', strip_html(method_desc))
+    if not mm:
+        mm = re.search(r'(/[a-z]+/[A-Za-z0-9_]+)', method_desc)
+    if not mm and (props.get('method') or {}).get('example'):
+        mm = re.search(r'(/[a-z]+/[A-Za-z0-9_]+)', str(props['method']['example']))
+    if not mm:
+        mm = re.search(r'method[\'"::\s]*[\'"]?(/[a-z]+/[A-Za-z0-9_]+)', text)
+    if not mm:
+        skipped.append(fname); continue
+    method_path = mm.group(1)
+    title = strip_html(post.get('summary') or fname[:-3])
+    tags_raw = post.get('tags') or []
+    category = tags_raw[0].split('/') if tags_raw else []
+    params_schema = props.get('params')
+    if params_schema:
+        params = simplify_props(params_schema)
+    else:
+        flat = {'properties': {k: v for k, v in props.items() if k not in ('method', 'tokenId')},
+                'required': [k for k in (body.get('required') or []) if k not in ('method', 'tokenId')]}
+        params = simplify_props(flat)
+    module = method_path.split('/')[1]
+    ep = {
+        'id': f"{module}.{method_path.split('/')[2]}",
+        'module': module,
+        'title': title,
+        'summary': strip_html(re.sub(r'(?s)<details.*?</details>', '', post.get('description') or ''))[:300],
+        'method': method_path,
+        'category': [c for c in category if c],
+        'docFile': fname,
+        'tags': list({module, title, *[c for c in category if c]}),
+        'params': params,
+    }
+    if is_file_api:
+        ep['apiPath'] = '/api/qw/doFileApi'
+        ep['contentType'] = content_type
+        ep['flatParams'] = True
+    hint = response_hint(post)
+    if hint: ep['responseHint'] = hint[:800]
+    endpoints.append(ep)
+
+# 官方文档未公布 method 的接口,手工登记以保证清单全量可检索
+MANUAL_ENDPOINTS = [
+    {
+        'id': 'cloud.bigFileDownloadAsync',
+        'module': 'cloud',
+        'title': '企微大文件异步下载',
+        'summary': '文件大于 20M 使用此接口;下载地址为临时云资源(7–15 天不定期清理);异步结果通过回调通知,根据 requestId 匹配。当前未登记 method 路由值,qiwe_api_call 暂不可调用。',
+        'method': None,
+        'category': ['API参考', '媒体与运营', '文件与媒体(下载/上传)'],
+        'docFile': '企微大文件异步下载.md',
+        'tags': ['cloud', '企微大文件异步下载', '媒体与运营', 'API参考', '大文件', '下载'],
+        'params': [
+            {'name': 'guid', 'in': 'body', 'type': 'string', 'required': True, 'desc': '设备唯一标识 guid'},
+            {'name': 'filekey', 'in': 'body', 'type': 'string', 'required': True, 'desc': '当 fileId 以 * 开头时为空;否则不为空'},
+            {'name': 'fileId', 'in': 'body', 'type': 'string', 'required': True, 'desc': '文件 Id'},
+            {'name': 'fileSize', 'in': 'body', 'type': 'integer', 'required': True, 'desc': '文件大小'},
+            {'name': 'fileType', 'in': 'body', 'type': 'integer', 'required': True, 'desc': '22 大视频 35 文件'},
+            {'name': 'filename', 'in': 'body', 'type': 'string', 'required': True, 'desc': '文件名'}
+        ],
+        'responseHint': 'data 字段:requestId(请求 Id,用于在回调中匹配异步下载结果)'
+    }
+]
+endpoints.extend(MANUAL_ENDPOINTS)
+
+# de-dup ids
+seen = {}
+for ep in endpoints:
+    if ep['id'] in seen:
+        ep['id'] = ep['id'] + '.' + re.sub(r'\W+', '_', ep['title'])[:24]
+    seen[ep['id']] = True
+
+catalog = {
+    'version': '0.2.0',
+    'updatedAt': '2026-07-10',
+    'source': '企业微信开放接口资料',
+    'gateway': {
+        'baseUrl': 'https://server.fmode.cn/api/qiwe',
+        'endpoint': 'POST {baseUrl}/doApi',
+        'auth': 'Authorization: Bearer <Fmode token>',
+        'envelope': 'Fmode 网关请求信封:{"uid": "<本地稳定设备标识>", "method": "<接口 method 路径>", "params": {...}};企业微信接口访问凭据和设备上下文由 Fmode 网关管理。',
+        'note': '所有业务请求均通过 Fmode 网关转发的企业微信接口执行。清单未登记的普通 JSON 接口可用 qiwe_api_call 传 rawMethod + params;登录和设备接口必须使用 qiwe_login_* 专用工具。'
+    },
+    'modules': sorted({ep['module'] for ep in endpoints}),
+    'endpoints': endpoints,
+}
+os.makedirs(os.path.dirname(OUT), exist_ok=True)
+json.dump(catalog, open(OUT, 'w', encoding='utf-8'), ensure_ascii=False, indent=1)
+print('endpoints:', len(endpoints))
+print('modules:', catalog['modules'])
+print('skipped:', skipped)

+ 27 - 0
claude-code/claude-code-qiwe-assistant/scripts/install-wecom-cli.js

@@ -0,0 +1,27 @@
+#!/usr/bin/env node
+const {
+  runtimeManifest,
+  prepareOfficialCli,
+  getOfficialCliStatus,
+  getInitCommand,
+  sanitizeCliText
+} = require('../mcp/src/core/wecom-cli-runtime');
+
+async function main() {
+  const installed = await prepareOfficialCli({ force: process.argv.includes('--force') });
+  const status = await getOfficialCliStatus();
+  console.log(
+    installed.cached
+      ? `${runtimeManifest.package}@${runtimeManifest.version} 已存在。`
+      : `${runtimeManifest.package}@${runtimeManifest.version} 下载并校验成功。`
+  );
+  if (!status.ready) {
+    console.log('首次使用官方会议、文档等能力前,请运行:');
+    console.log(getInitCommand());
+  }
+}
+
+main().catch(error => {
+  console.error(`安装企业微信官方 CLI 失败:${sanitizeCliText(error.message)}`);
+  process.exit(1);
+});

+ 193 - 0
claude-code/claude-code-qiwe-assistant/scripts/smoke-test.js

@@ -0,0 +1,193 @@
+#!/usr/bin/env node
+const assert = require('assert');
+const http = require('http');
+const { loadCatalog, searchEndpoints, findEndpoint } = require('../mcp/src/core/api-catalog');
+const { searchQiweApis, getQiweApiDoc, callQiweApi } = require('../mcp/src/tools/qiwe-api-catalog-run');
+const {
+  qiweLoginStatus,
+  qiweLoginStart,
+  qiweLoginCheck,
+  qiweLoginVerify
+} = require('../mcp/src/tools/qiwe-login-run');
+const {
+  qiweSubscriptionStatus,
+  qiweSubscribe,
+  qiweSubscriptionAutoRenew
+} = require('../mcp/src/tools/qiwe-subscription-run');
+
+const PRIVATE_PROVIDER_NAME = ['private', 'provider'].join('-');
+const PRIVATE_PROVIDER_HOST = ['private', 'provider', 'invalid'].join('.');
+const PRIVATE_CREDENTIAL_KEY = ['token', 'Id'].join('');
+
+function assertProviderHidden(value) {
+  const output = JSON.stringify(value);
+  assert(!output.includes(PRIVATE_PROVIDER_NAME));
+  assert(!output.includes(PRIVATE_PROVIDER_HOST));
+  assert(!output.includes('server-only-guid'));
+  assert(!output.includes('server-only-token'));
+}
+
+function readBody(req) {
+  return new Promise(resolve => {
+    let body = '';
+    req.setEncoding('utf8');
+    req.on('data', chunk => {
+      body += chunk;
+    });
+    req.on('end', () => resolve(body ? JSON.parse(body) : undefined));
+  });
+}
+
+async function startMockGateway() {
+  const requests = [];
+  const server = http.createServer(async (req, res) => {
+    const body = await readBody(req);
+    const url = new URL(req.url, 'http://localhost');
+    requests.push({
+      method: req.method,
+      path: url.pathname,
+      query: Object.fromEntries(url.searchParams.entries()),
+      authorization: req.headers.authorization,
+      body
+    });
+
+    let data;
+    if (url.pathname === '/doApi') {
+      data = {
+        nickname: '测试账号',
+        echoedMethod: body.method,
+        guid: 'server-only-guid',
+        [PRIVATE_CREDENTIAL_KEY]: 'server-only-token',
+        provider: PRIVATE_PROVIDER_NAME,
+        providerName: PRIVATE_PROVIDER_NAME,
+        providerHost: PRIVATE_PROVIDER_HOST,
+        supportUrl: `https://${PRIVATE_PROVIDER_HOST}/help`,
+        diagnostic: `See https://${PRIVATE_PROVIDER_HOST}/diagnostic`
+      };
+    } else if (url.pathname === '/login/status') {
+      data = { configured: true, online: true, statusCode: 2 };
+    } else if (url.pathname === '/login/start') {
+      data = { uid: body.uid, guid: 'server-only-guid', loginQrcodeBase64Data: Buffer.from('mock-png').toString('base64') };
+    } else if (url.pathname === '/login/check') {
+      data = { uid: body.uid, guid: 'server-only-guid', status: 2, detail: { nickname: '测试账号', userId: 'u-1' } };
+    } else if (url.pathname === '/login/verify') {
+      data = { accepted: true };
+    } else if (url.pathname === '/subscribe/status') {
+      data = {
+        subscribed: true,
+        seats: 2,
+        usedSeats: 1,
+        expireAt: '2026-08-10T00:00:00.000Z',
+        autoRenew: true,
+        balance: 1000
+      };
+    } else if (url.pathname === '/subscribe') {
+      data = { seats: body.seats || 1, expireAt: '2026-08-10T00:00:00.000Z', autoRenew: true };
+    } else if (url.pathname === '/subscribe/autoRenew') {
+      data = { autoRenew: body.autoRenew };
+    } else {
+      res.writeHead(404, { 'Content-Type': 'application/json' });
+      res.end(JSON.stringify({ code: 404, mess: 'not found' }));
+      return;
+    }
+
+    res.writeHead(200, { 'Content-Type': 'application/json' });
+    res.end(JSON.stringify({ code: 200, data }));
+  });
+  await new Promise(resolve => server.listen(0, '127.0.0.1', resolve));
+  const address = server.address();
+  return {
+    requests,
+    apiBase: `http://127.0.0.1:${address.port}`,
+    close: () => new Promise(resolve => server.close(resolve))
+  };
+}
+
+async function main() {
+  const catalog = loadCatalog();
+  assert(catalog.endpoints.length >= 100, 'catalog should contain 100+ endpoints');
+  assert(catalog.gateway.baseUrl.includes('server.fmode.cn/api/qiwe'));
+  assert(catalog.endpoints.every(endpoint => !Object.hasOwn(endpoint, 'docUrl')));
+  assertProviderHidden(catalog);
+  console.log(`[ok] catalog loaded: ${catalog.endpoints.length} endpoints`);
+
+  const hits = searchEndpoints({ query: '发送 文本' });
+  assert(hits.length > 0 && hits[0].module === 'msg');
+  assert(findEndpoint('/login/getLoginQrcode'));
+  const searchResult = await searchQiweApis({ query: '朋友圈' });
+  assert(searchResult.status === 'ok' && searchResult.data.endpoints.length > 0);
+  assertProviderHidden(searchResult);
+  const doc = await getQiweApiDoc({ id: 'user.getProfile' });
+  assert(doc.status === 'ok' && doc.data.callTemplate);
+  assertProviderHidden(doc);
+  assert(!JSON.stringify(doc).includes('"guid"'));
+  console.log('[ok] catalog search and docs');
+
+  const gateway = await startMockGateway();
+  const common = {
+    authToken: 'sk-test-relay-token',
+    uid: 'qiwe-smoke-device',
+    apiBase: gateway.apiBase,
+    persistConfig: false
+  };
+  try {
+    const call = await callQiweApi({ ...common, id: 'user.getProfile', params: {} });
+    assert.strictEqual(call.status, 'ok');
+    const apiRequest = gateway.requests.at(-1);
+    assert.strictEqual(apiRequest.path, '/doApi');
+    assert.strictEqual(apiRequest.authorization, 'Bearer sk-test-relay-token');
+    assert.deepStrictEqual(apiRequest.body, {
+      uid: 'qiwe-smoke-device',
+      method: '/user/getProfile',
+      params: {}
+    });
+    assert(!JSON.stringify(apiRequest.body).includes('tokenId'));
+    assert(!JSON.stringify(apiRequest.body).includes('guid'));
+    assertProviderHidden(call);
+    console.log('[ok] qiwe_api_call uses the Fmode gateway envelope without private credentials');
+
+    const blocked = await callQiweApi({ ...common, rawMethod: '/login/manualLogin', params: {} });
+    assert.strictEqual(blocked.status, 'error');
+    assert.strictEqual(gateway.requests.at(-1), apiRequest);
+
+    const subscription = await qiweSubscriptionStatus(common);
+    assert.strictEqual(subscription.status, 'ok');
+    assert.strictEqual(subscription.summary.subscribed, true);
+    const subscribed = await qiweSubscribe({ ...common, seats: 3 });
+    assert.strictEqual(subscribed.status, 'ok');
+    assert.strictEqual(gateway.requests.at(-1).body.seats, 3);
+    const autoRenew = await qiweSubscriptionAutoRenew({ ...common, autoRenew: false });
+    assert.strictEqual(autoRenew.status, 'ok');
+    assert.strictEqual(gateway.requests.at(-1).body.autoRenew, false);
+    console.log('[ok] subscription tools use Fmode gateway routes');
+
+    const status = await qiweLoginStatus(common);
+    assert.strictEqual(status.status, 'ok');
+    assert.strictEqual(gateway.requests.at(-1).query.uid, common.uid);
+    const start = await qiweLoginStart({ ...common, openBrowser: false });
+    assert.strictEqual(start.status, 'ok');
+    assertProviderHidden(start);
+    const check = await qiweLoginCheck(common);
+    assert.strictEqual(check.status, 'ok');
+    assert.strictEqual(check.summary.loggedIn, true);
+    assertProviderHidden(check);
+    const verify = await qiweLoginVerify({ ...common, code: '123456' });
+    assert.strictEqual(verify.status, 'ok');
+    assert.deepStrictEqual(gateway.requests.at(-1).body, { uid: common.uid, code: '123456' });
+    console.log('[ok] login tools use uid-based Fmode gateway routes and hide internal identifiers');
+
+    for (const request of gateway.requests) {
+      assert.strictEqual(request.authorization, 'Bearer sk-test-relay-token');
+    }
+    console.log(`[ok] ${gateway.requests.length} mock Fmode gateway requests authenticated`);
+  } finally {
+    await gateway.close();
+  }
+
+  console.log('\nAll smoke tests passed.');
+}
+
+main().catch(error => {
+  console.error('smoke test failed:', error);
+  process.exit(1);
+});

+ 77 - 0
claude-code/claude-code-qiwe-assistant/scripts/validate-output-standard.js

@@ -0,0 +1,77 @@
+#!/usr/bin/env node
+const fs = require('fs');
+const path = require('path');
+const {
+  PACKAGE_ROOT,
+  OUTPUT_CATEGORIES,
+  outputsRoot
+} = require('../mcp/src/core/output-paths');
+
+const DOCS_ALLOWED = new Set(['OUTPUT-STANDARD.md', 'specs', 'guides', 'generated']);
+const RUN_DIR_RE = /^\d{6}-[a-z0-9\u4e00-\u9fa5-]+$/;
+const DATE_DIR_RE = /^\d{4}-\d{2}-\d{2}$/;
+
+const problems = [];
+
+function listEntries(dir) {
+  if (!fs.existsSync(dir)) return [];
+  return fs.readdirSync(dir, { withFileTypes: true });
+}
+
+function checkOutputs() {
+  const root = outputsRoot();
+  for (const entry of listEntries(root)) {
+    if (!entry.isDirectory()) {
+      problems.push(`outputs 根目录不允许直接放文件:outputs/${entry.name}`);
+      continue;
+    }
+    if (!OUTPUT_CATEGORIES.includes(entry.name)) {
+      problems.push(`outputs 下存在未注册类别:outputs/${entry.name}(允许:${OUTPUT_CATEGORIES.join(', ')})`);
+      continue;
+    }
+    checkCategory(path.join(root, entry.name), entry.name);
+  }
+}
+
+function checkCategory(dir, category) {
+  for (const entry of listEntries(dir)) {
+    if (!entry.isDirectory()) continue; // latest 模式文件
+    if (!DATE_DIR_RE.test(entry.name)) {
+      problems.push(`outputs/${category}/${entry.name} 不是 YYYY-MM-DD 日期目录`);
+      continue;
+    }
+    const dateDir = path.join(dir, entry.name);
+    for (const run of listEntries(dateDir)) {
+      const rel = `outputs/${category}/${entry.name}/${run.name}`;
+      if (!run.isDirectory()) {
+        problems.push(`${rel} 应为 run 目录而不是文件`);
+        continue;
+      }
+      if (!RUN_DIR_RE.test(run.name)) {
+        problems.push(`${rel} 不符合 HHmmss-<slug> 命名`);
+      }
+      if (!fs.existsSync(path.join(dateDir, run.name, 'manifest.json'))) {
+        problems.push(`${rel} 缺少 manifest.json`);
+      }
+    }
+  }
+}
+
+function checkDocs() {
+  const docsDir = path.join(PACKAGE_ROOT, 'docs');
+  for (const entry of listEntries(docsDir)) {
+    if (!DOCS_ALLOWED.has(entry.name)) {
+      problems.push(`docs 第一层存在未注册条目:docs/${entry.name}(允许:${[...DOCS_ALLOWED].join(', ')})`);
+    }
+  }
+}
+
+checkOutputs();
+checkDocs();
+
+if (problems.length) {
+  console.error('输出目录标准校验失败:');
+  for (const problem of problems) console.error(`  - ${problem}`);
+  process.exit(1);
+}
+console.log('输出目录标准校验通过(outputs 与 docs 均符合 docs/OUTPUT-STANDARD.md)。');

+ 84 - 0
claude-code/claude-code-qiwe-assistant/scripts/wecom-cli-smoke-test.js

@@ -0,0 +1,84 @@
+#!/usr/bin/env node
+const assert = require('assert');
+const fs = require('fs');
+const os = require('os');
+const path = require('path');
+
+async function main() {
+  const tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'qiwe-official-cli-test-'));
+  const runtimeRoot = path.join(tempRoot, 'runtime');
+  const configDir = path.join(tempRoot, 'config');
+  process.env.QIWE_OFFICIAL_CLI_RUNTIME_DIR = runtimeRoot;
+  process.env.WECOM_CLI_CONFIG_DIR = configDir;
+
+  const runtime = require('../mcp/src/core/wecom-cli-runtime');
+  const provider = require('../mcp/src/providers/wecom-official-cli');
+  try {
+    const emptyStatus = await runtime.getOfficialCliStatus();
+    assert.strictEqual(emptyStatus.installed, false);
+    assert.strictEqual(emptyStatus.ready, false);
+
+    const packageDir = path.join(runtime.getRuntimeDir(), 'node_modules', '@wecom', 'cli');
+    fs.mkdirSync(path.join(packageDir, 'bin'), { recursive: true });
+    fs.writeFileSync(
+      path.join(packageDir, 'package.json'),
+      JSON.stringify({
+        name: runtime.runtimeManifest.package,
+        version: runtime.runtimeManifest.version
+      })
+    );
+    fs.writeFileSync(
+      path.join(packageDir, 'bin', 'wecom.js'),
+      [
+        "const args = process.argv.slice(2);",
+        "if (args.join(' ') === 'auth show --auth-status') { console.log('authorized'); process.exit(0); }",
+        "if (args.at(-1) === '--help') { console.log(`help:${args.slice(0, -1).join('.') || 'root'}`); process.exit(0); }",
+        "const jsonIndex = args.indexOf('--json');",
+        "const input = jsonIndex >= 0 ? JSON.parse(args[jsonIndex + 1]) : {};",
+        "console.log(JSON.stringify({ errcode: 0, category: args[0], method: args[1], input, bot_secret: 'server-only-secret', accessToken: 'server-only-token', providerName: 'private-provider', doc_url: 'https://docs.example.test/document/1' }));"
+      ].join('\n')
+    );
+    fs.mkdirSync(configDir, { recursive: true });
+    fs.writeFileSync(path.join(configDir, 'bot.enc'), 'test');
+    fs.writeFileSync(path.join(configDir, 'mcp_config.enc'), 'test');
+
+    const readyStatus = await runtime.getOfficialCliStatus();
+    assert.strictEqual(readyStatus.valid, true);
+    assert.strictEqual(readyStatus.authorized, true);
+    assert.strictEqual(readyStatus.ready, true);
+
+    const help = await provider.qiweOfficialHelp({ category: 'meeting', method: 'create_meeting' });
+    assert.strictEqual(help.status, 'ok');
+    assert.strictEqual(help.data.help, 'help:meeting.create_meeting');
+
+    const call = await provider.qiweOfficialCall({
+      category: 'doc',
+      method: 'create_doc',
+      args: { doc_type: 3, doc_name: '测试文档; echo unsafe' }
+    });
+    assert.strictEqual(call.status, 'ok');
+    assert.strictEqual(call.data.response.category, 'doc');
+    assert.strictEqual(call.data.response.method, 'create_doc');
+    assert.strictEqual(call.data.response.input.doc_name, '测试文档; echo unsafe');
+    assert(!Object.hasOwn(call.data.response, 'bot_secret'));
+    assert(!Object.hasOwn(call.data.response, 'accessToken'));
+    assert(!Object.hasOwn(call.data.response, 'providerName'));
+    assert.strictEqual(call.data.response.doc_url, 'https://docs.example.test/document/1');
+
+    const invalidMethod = await provider.qiweOfficialCall({
+      category: 'doc',
+      method: 'create_doc; echo unsafe',
+      args: {}
+    });
+    assert.strictEqual(invalidMethod.status, 'error');
+
+    console.log('[ok] official CLI runtime status, structured help and shell-safe calls');
+  } finally {
+    fs.rmSync(tempRoot, { recursive: true, force: true });
+  }
+}
+
+main().catch(error => {
+  console.error('official CLI smoke test failed:', error);
+  process.exit(1);
+});

+ 65 - 0
claude-code/claude-code-qiwe-assistant/skills/qiwe-api-catalog/SKILL.md

@@ -0,0 +1,65 @@
+---
+name: qiwe-api-catalog
+description: 通过 Fmode 网关转发的企业微信接口调用消息、群管理、联系人、朋友圈、标签、会话、账号和文件等 100+ 个能力;先查清单、读文档,再用 qiwe_api_call 调用。企业微信接口访问凭据由 Fmode 网关管理。
+---
+
+# 企业微信接口清单驱动调用
+
+## 调用架构
+
+所有普通业务请求都通过 Fmode 网关转发的企业微信接口:
+
+```json
+{
+  "uid": "<本地稳定设备标识>",
+  "method": "/msg/sendText",
+  "params": {
+    "toId": "168...",
+    "content": "hello"
+  }
+}
+```
+
+请求头使用 Fmode 鉴权:
+
+```text
+Authorization: Bearer <Fmode token>
+```
+
+Fmode 网关负责:
+
+- 校验用户或公司身份;
+- 检查企微包月订阅;
+- 将 `uid` 映射为设备上下文;
+- 管理企业微信接口访问凭据;
+- 转发企业微信接口请求并返回结果。
+
+客户端不得索要、保存或传递企业微信接口访问凭据。
+
+## 标准流程
+
+1. 用 `qiwe_api_search` 按关键词、module 或 tag 找接口;
+2. 用 `qiwe_api_doc` 核对必填参数和返回字段;
+3. 用 `qiwe_api_call` 传 `id + params`;
+4. 收到订阅错误时调用 `qiwe_subscription_status`,必要时用 `qiwe_subscribe`;
+5. 收到登录态错误时调用 `qiwe_login_status`,必要时转 `qiwe-login` 技能重新扫码。
+
+清单里没有的普通 JSON 接口可以传 `rawMethod + params`。`/login/*`、`/client/*` 必须走登录专用工具,不能透传。
+
+## 模块
+
+- `msg`:消息收发、撤回、群发、历史消息同步;
+- `room`:建群、成员、管理员、公告、群二维码等;
+- `contact`:联系人、好友申请与客户管理;
+- `sns`:朋友圈发布、列表、点赞与评论;
+- `label`:个人标签和客户标签;
+- `session`:会话分页与会话组;
+- `user`:个人与企业信息;
+- `cloud`:文件接口;multipart 文件直传目前不经过中转;
+- `login` / `client`:仅用于文档检索,实际操作走 `qiwe-login`。
+
+## 注意事项
+
+- 消息发送前通常需要先查询联系人 `userId` 或群 `roomId`。
+- 批量发送、加好友、拉群等操作应控制频率并遵守平台风控。
+- 不向用户展示 Authorization、Fmode token、接口服务提供方名称、相关域名或内部错误栈。

+ 39 - 0
claude-code/claude-code-qiwe-assistant/skills/qiwe-capability-router/SKILL.md

@@ -0,0 +1,39 @@
+---
+name: qiwe-capability-router
+description: 在 Fmode 网关转发的企业微信接口与官方 CLI 通道之间选择正确能力。文档、会议、日程、待办优先使用官方 CLI;客户、客户群、朋友圈、标签、个人企微设备登录等继续使用原有企业微信接口工具。
+---
+
+# 企业微信双通道能力路由
+
+本技能包包含两套相互独立的企业微信通道,不混用认证信息。
+
+## 路由规则
+
+| 用户意图 | 使用通道 |
+|---|---|
+| 普通文档、在线表格、智能表格、智能文档 | 企业微信官方 CLI |
+| 会议、日程、待办 | 企业微信官方 CLI |
+| 客户、外部联系人、客户群、朋友圈、标签 | Fmode 网关企业微信接口工具 `qiwe_api_*` |
+| 个人企微设备扫码登录、掉线恢复 | Fmode 网关登录工具 `qiwe_login_*` |
+| 订阅、席位、余额 | Fmode 网关订阅工具 `qiwe_subscription_*` |
+| 通讯录、消息 | 根据用户指定的身份和授权范围选择;不确定时先询问 |
+
+## 官方 CLI 通道
+
+1. 调用 `qiwe_official_status`;
+2. CLI 未安装时调用 `qiwe_official_prepare`;
+3. 未授权时把工具返回的初始化命令交给用户在终端运行;
+4. 用 `qiwe_official_help` 核对方法参数;
+5. 用 `qiwe_official_call` 执行。
+
+## Fmode 网关接口通道
+
+原有流程保持不变:
+
+1. `qiwe_api_search`;
+2. `qiwe_api_doc`;
+3. `qiwe_api_call`;
+4. 登录问题转 `qiwe-login`;
+5. 订阅问题调用 `qiwe_subscription_*`。
+
+不得把官方机器人凭据传给 Fmode 网关,也不得用 Fmode token 初始化官方 CLI。

+ 42 - 0
claude-code/claude-code-qiwe-assistant/skills/qiwe-login/SKILL.md

@@ -0,0 +1,42 @@
+---
+name: qiwe-login
+description: 通过 Fmode 网关转发的企业微信接口完成扫码登录和订阅管理。适用于首次使用、设备掉线、qiwe_api_call 返回 needs_login、订阅未开通或席位不足;客户端只使用 Fmode 鉴权 token 和 uid,企业微信接口访问凭据由 Fmode 网关管理。
+---
+
+# 企业微信扫码登录
+
+## 严格流程
+
+1. **检查订阅**:调用 `qiwe_subscription_status`。
+   - 未订阅或已到期:调用 `qiwe_subscribe`;
+   - 席位已满:用 `qiwe_subscribe` 传新的总 `seats` 数增购;
+   - 余额不足:引导用户充值飞马余额后重试。
+2. **检查设备**:调用 `qiwe_login_status`。
+   - `online=true`:无需重新登录;
+   - 未配置或离线:继续下一步。
+3. **生成二维码**:调用 `qiwe_login_start`。
+   - 工具通过 `/api/qiwe/login/start` 请求 Fmode 网关;
+   - 二维码保存到 `outputs/qiwe-login-qrcode.png`,默认打开 HTML 预览;
+   - 把二维码展示给用户,用手机企业微信扫码并确认。
+4. **轮询状态**:每 3–5 秒调用 `qiwe_login_check`。
+   - `-1 / 1`:继续等待;
+   - `0`:可传 `manual: true` 尝试免扫码登录;
+   - `2`:登录成功;
+   - `4`:用户取消,重新调用 `qiwe_login_start`;
+   - `10`:进入验证码流程。
+5. **验证码**:状态 `10` 时向用户索要手机端显示的 6 位验证码,调用 `qiwe_login_verify`,然后再次检查状态。
+6. **验证业务链路**:登录成功后调用 `qiwe_api_call`(例如 `user.getProfile`)。
+
+## 配置
+
+- `QIWE_API_BASE` 默认 `https://server.fmode.cn/api/qiwe`;
+- Fmode token 自动从 Claude Code / Fmode 配置读取,也可显式设置 `QIWE_AUTH_TOKEN`;
+- `QIWE_UID` 未配置时自动生成并持久化;
+- 不读取、保存或要求用户提供企业微信接口访问凭据。
+
+## 安全约定
+
+- 不展示或记录 Authorization 和 Fmode token;
+- 不向用户暴露接口服务提供方名称、相关域名或控制台;
+- 不绕过 Fmode 网关直连内部服务;
+- 不通过 `qiwe_api_call` 调用 `/login/*` 或 `/client/*`。

+ 96 - 0
claude-code/claude-code-qiwe-assistant/skills/qiwe-official-doc/SKILL.md

@@ -0,0 +1,96 @@
+---
+name: qiwe-official-doc
+description: 通过企业微信官方 CLI 创建普通文档、读取 Markdown 内容和覆写文档。适用于企业微信文档或 doc.weixin.qq.com/doc/ 链接;在线表格、智能表格和智能文档应路由到后续对应技能。
+---
+
+# 企业微信官方普通文档
+
+本技能只处理 URL 形如 `https://doc.weixin.qq.com/doc/*` 的普通文档,通过 `qiwe_official_*` MCP 工具调用官方 CLI。
+
+以下类型不由本技能直接处理:
+
+| URL | 类型 |
+|---|---|
+| `/sheet/*` | 在线表格 |
+| `/smartsheet/*` | 智能表格 |
+| `/smartpage/*` | 智能文档 |
+
+## 前置检查
+
+1. 调用 `qiwe_official_status`;
+2. 未安装时调用 `qiwe_official_prepare`;
+3. 未初始化时停止业务调用,把返回的初始化命令交给用户完成扫码;
+4. 调用 `qiwe_official_help` 核对当前方法参数。
+
+## 支持的方法
+
+| 意图 | category | method |
+|---|---|---|
+| 创建普通文档 | `doc` | `create_doc` |
+| 读取 Markdown 内容 | `doc` | `get_doc_content` |
+| 用 Markdown 覆写正文 | `doc` | `edit_doc_content` |
+
+## 创建文档
+
+创建普通文档时:
+
+```json
+{
+  "category": "doc",
+  "method": "create_doc",
+  "args": {
+    "doc_type": 3,
+    "doc_name": "项目周报"
+  }
+}
+```
+
+`create_doc` 只创建空白文档。用户同时给出正文时,创建成功后再调用 `edit_doc_content` 写入 Markdown。返回 `docid` 和 URL。
+
+## 读取内容
+
+使用 `docid` 或 URL 二选一定位,`type` 固定为 `2`:
+
+```json
+{
+  "docid": "DOC_ID",
+  "type": 2
+}
+```
+
+读取是异步任务:
+
+1. 首次不传 `task_id`;
+2. `task_done=false` 时保存返回的 `task_id`;
+3. 携带同一 `task_id` 继续调用;
+4. `task_done=true` 后返回完整 Markdown 内容。
+
+## 覆写正文
+
+`edit_doc_content` 会替换全部正文,参数中的 `content_type` 固定为 `1`。
+
+执行前:
+
+1. 如果用户未明确要求覆盖,先读取现有内容;
+2. 说明该操作会替换全部正文;
+3. 展示变更摘要并取得确认;
+4. 再调用:
+
+```json
+{
+  "category": "doc",
+  "method": "edit_doc_content",
+  "args": {
+    "docid": "DOC_ID",
+    "content": "# 新正文",
+    "content_type": 1
+  }
+}
+```
+
+## 错误处理
+
+- `851002 incompatible doc type`:重新识别 URL 类型,不要继续用普通文档方法;
+- 未初始化:提示官方 CLI 初始化,不调用原有 `qiwe_login_*`;
+- 方法或 schema 变化:重新调用 `qiwe_official_help`;
+- 不展示机器人 Secret、Authorization 或本地加密配置内容。

+ 82 - 0
claude-code/claude-code-qiwe-assistant/skills/qiwe-official-meeting/SKILL.md

@@ -0,0 +1,82 @@
+---
+name: qiwe-official-meeting
+description: 通过企业微信官方 CLI 创建、查询、取消会议及维护受邀成员。适用于预约会议、查看会议列表或详情、取消会议、添加或移除参会人;不使用原有个人企微设备接口。
+---
+
+# 企业微信官方会议
+
+所有会议操作通过本技能包的 `qiwe_official_*` MCP 工具调用官方 CLI,不直接拼接 shell 命令。
+
+## 前置检查
+
+1. 调用 `qiwe_official_status`;
+2. 未安装时调用 `qiwe_official_prepare`,成功后再次检查状态;
+3. 未初始化时停止业务调用,把返回的初始化命令交给用户完成一次扫码;
+4. 初始化完成后再继续。
+
+## 支持的方法
+
+| 意图 | category | method |
+|---|---|---|
+| 创建预约会议 | `meeting` | `create_meeting` |
+| 查询会议列表 | `meeting` | `list_user_meetings` |
+| 获取会议详情 | `meeting` | `get_meeting_info` |
+| 取消会议 | `meeting` | `cancel_meeting` |
+| 全量更新受邀成员 | `meeting` | `set_invite_meeting_members` |
+
+每次首次使用或参数不确定时,先调用 `qiwe_official_help` 读取当前固定 CLI 版本的方法 schema。
+
+## 创建会议
+
+至少确认:
+
+- 标题;
+- 开始日期、时间和时区;
+- 时长(秒);
+- 可选描述、地点、参与人和会议设置。
+
+参与人只有姓名时,先调用官方 `contact.get_userlist`,在返回结果中按姓名或别名匹配 `userid`;存在多个同名结果时必须让用户确认。
+
+调用示例参数:
+
+```json
+{
+  "category": "meeting",
+  "method": "create_meeting",
+  "args": {
+    "title": "周例会",
+    "meeting_start_datetime": "2026-07-13 15:00",
+    "meeting_duration": 3600,
+    "invitees": {
+      "userid": ["zhangsan"]
+    }
+  }
+}
+```
+
+创建成功后返回会议 ID、链接和会议号。展示会议号时放在回复开头的单独一行,并按每三位加连字符:
+
+```text
+#会议号: 123-456-789
+```
+
+## 查询会议
+
+- 列表查询的时间范围限制为当日及前后 30 天;
+- `limit` 最大 100;
+- 用户按名称查会议时,先取列表,再逐个读取详情匹配标题和时间;
+- 涉及分页时使用 `next_cursor` 继续查询。
+
+## 取消和成员更新
+
+- 取消前先读取会议详情,展示标题和开始时间并要求确认;
+- `set_invite_meeting_members` 是全量覆盖,不是增量添加;
+- 修改成员前先读取当前详情,计算新的完整成员列表并让用户确认;
+- 不确定 `meetingid` 时先通过列表和详情定位,不能猜测。
+
+## 错误处理
+
+- 未初始化:提示执行官方初始化命令,不转到原有 `qiwe_login_*`;
+- 方法或参数变化:重新调用 `qiwe_official_help`;
+- 官方通道失败不影响原有 Fmode 网关接口通道;
+- 不展示机器人 Secret、Authorization 或本地加密配置内容。

+ 12 - 0
claude-code/claude-code-qiwe-assistant/wecom-cli-runtime.json

@@ -0,0 +1,12 @@
+{
+  "package": "@wecom/cli",
+  "version": "0.1.9",
+  "node": ">=18",
+  "supportedPlatforms": [
+    "darwin-arm64",
+    "darwin-x64",
+    "linux-arm64",
+    "linux-x64",
+    "win32-x64"
+  ]
+}

+ 1 - 1
claude-code/claude-code-voc-intelligence/.claude-plugin/plugin.json

@@ -1,7 +1,7 @@
 {
   "name": "voc-intelligence",
   "description": "VOC intelligence skills for Claude Code: end-to-end VOC business workflows, Xiaohongshu and Douyin trend reports, live social VOC collection, Fmode Doubao image analysis, token/recharge checks, evidence-card outputs, prioritized issue pools, single-problem deep dives, competitor maps, 7-day content plans, VOC-backed speaking script co-creation, boss/operator action plans, and multi-turn memory.",
-  "version": "0.3.26",
+  "version": "0.3.30",
   "author": {
     "name": "nkkj-BrainHack"
   }

+ 25 - 6
claude-code/claude-code-voc-intelligence/bin/claude-voc.js

@@ -3,6 +3,7 @@ const fs = require('fs');
 const os = require('os');
 const path = require('path');
 const { spawnSync } = require('child_process');
+const { ensureActivated } = require('../mcp/src/core/activation');
 
 const SOURCE_ROOT = path.resolve(__dirname, '..');
 const WORKSPACE_ROOT = process.cwd();
@@ -34,6 +35,7 @@ function usage() {
     'Usage:',
     '  claude-voc install',
     '  claude-voc workspace',
+    '  claude-voc workspace --activate',
     '  claude-voc install --workspace --smoke',
     '  claude-voc check',
     '  claude-voc smoke',
@@ -43,6 +45,7 @@ function usage() {
     'npx:',
     '  npx @vocmarket/voc-skill install',
     '  npx @vocmarket/voc-skill workspace --smoke',
+    '  npx @vocmarket/voc-skill workspace --activate   (其他 AI 编程器渠道专用:安装并按状态弹付费)',
     '',
     'Options:',
     '  --workspace      Install into ./.claude/plugins/voc-intelligence',
@@ -50,6 +53,8 @@ function usage() {
     '  --force          Allow overwriting an existing custom target',
     '  --skip-install   Skip npm install after copying files',
     '  --smoke          Run sample/preference/MCP smoke checks after install',
+    '  --activate       安装后按 token 状态激活:无 token 弹付费/登录页,有 token 直接放行(外部 AI IDE 专用,不影响 --smoke)',
+    '  --channel <name> 付费归因渠道名(claude-code/codex/workbuddy)',
     '  --help, -h       Show help'
   ].join('\n');
 }
@@ -65,6 +70,8 @@ function parseArgs(argv) {
     target: DEFAULT_TARGET,
     skipInstall: false,
     smoke: false,
+    activate: false,
+    channel: 'external',
     force: false,
     help: false
   };
@@ -88,6 +95,12 @@ function parseArgs(argv) {
       opts.skipInstall = true;
     } else if (token === '--smoke') {
       opts.smoke = true;
+    } else if (token === '--activate') {
+      opts.activate = true;
+    } else if (token === '--channel') {
+      opts.channel = argv[++i];
+    } else if (token.startsWith('--channel=')) {
+      opts.channel = token.slice('--channel='.length);
     } else if (token === '--help' || token === '-h') {
       opts.help = true;
     }
@@ -716,7 +729,7 @@ function printPath(opts) {
   }
 }
 
-function main() {
+async function main() {
   const directCommand = process.argv[2];
   if (directCommand === 'image' || directCommand === 'fmode-image') {
     run(process.execPath, ['mcp/src/tools/fmode-image-analysis.js', ...process.argv.slice(3)], SOURCE_ROOT);
@@ -728,17 +741,23 @@ function main() {
     console.log(usage());
     return;
   }
-  if (opts.command === 'install') return install(opts);
+  if (opts.command === 'install') {
+    install(opts);
+    if (opts.activate) {
+      await ensureActivated({ channel: opts.channel });
+    }
+    return;
+  }
   if (opts.command === 'check') return check(opts);
   if (opts.command === 'smoke') return smoke(opts);
   if (opts.command === 'path') return printPath(opts);
   throw new Error(`Unknown command: ${opts.command}\n\n${usage()}`);
 }
 
-try {
-  main();
-} catch (error) {
+main().catch((error) => {
   console.error('');
   console.error(`claude-voc failed: ${error.message}`);
   process.exit(1);
-}
+});
+
+

+ 20 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/1688.json

@@ -0,0 +1,20 @@
+{
+  "1688.get_item_detail_v1": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "1688上的唯一商品标识符。"
+    }
+  ],
+  "1688.search_item_list_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    }
+  ]
+}

+ 151 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/amazon.json

@@ -0,0 +1,151 @@
+{
+  "amazon.search_products_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词或ASIN以查找亚马逊商品。"
+    },
+    {
+      "name": "country",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "亚马逊市场的国家代码。\n\n可用值:\n- `US`:美国\n- `AU`:澳大利亚\n- `BR`:巴西\n- `CA`:加拿大\n- `CN`:中国\n- `FR`:法国\n- `DE`:德国\n- `IN`:印度\n- `IT`:意大利\n- `MX`:墨西哥\n- `NL`:荷兰\n- `SG`:新加坡\n- `ES`:西班牙\n- `TR`:土耳其\n- `AE`:阿拉伯联合酋长国\n- `GB`:英国\n- `JP`:日本\n- `SA`:沙特阿拉伯\n- `PL`:波兰\n- `SE`:瑞典\n- `BE`:比利时\n- `EG`:埃及\n- `ZA`:南非\n- `IE`:爱尔兰",
+      "default": "US"
+    },
+    {
+      "name": "sortBy",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "亚马逊商品搜索结果的排序方式。\n\n可用值:\n- `RELEVANCE`:相关性\n- `LOWEST_PRICE`:最低价\n- `HIGHEST_PRICE`:最高价\n- `REVIEWS`:评论数\n- `NEWEST`:最新\n- `BEST_SELLERS`:热销商品",
+      "default": "RELEVANCE"
+    },
+    {
+      "name": "productCondition",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "亚马逊搜索结果的商品状况筛选。\n\n可用值:\n- `ALL`:所有商品状况\n- `NEW`:全新商品\n- `USED`:二手商品\n- `RENEWED`:翻新商品\n- `COLLECTIBLE`:收藏品",
+      "default": "ALL"
+    },
+    {
+      "name": "isPrime",
+      "in": "query",
+      "type": "boolean",
+      "required": false,
+      "desc": "是否仅返回Prime合格商品。",
+      "default": false
+    },
+    {
+      "name": "dealsAndDiscounts",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "亚马逊搜索结果的优惠和折扣筛选。\n\n可用值:\n- `NONE`:不按优惠或折扣筛选\n- `ALL_DISCOUNTS`:返回折扣商品\n- `TODAYS_DEALS`:返回今日特惠",
+      "default": "NONE"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    }
+  ],
+  "amazon.get_product_detail_v1": [
+    {
+      "name": "asin",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "ASIN(亚马逊标准识别号)。"
+    },
+    {
+      "name": "country",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "亚马逊产品的国家代码。\n\n可用值:\n- `US`: 美国\n- `AU`: 澳大利亚\n- `BR`: 巴西\n- `CA`: 加拿大\n- `CN`: 中国\n- `FR`: 法国\n- `DE`: 德国\n- `IN`: 印度\n- `IT`: 意大利\n- `MX`: 墨西哥\n- `NL`: 荷兰\n- `SG`: 新加坡\n- `ES`: 西班牙\n- `TR`: 土耳其\n- `AE`: 阿拉伯联合酋长国\n- `GB`: 英国\n- `JP`: 日本\n- `SA`: 沙特阿拉伯\n- `PL`: 波兰\n- `SE`: 瑞典\n- `BE`: 比利时\n- `EG`: 埃及\n- `ZA`: 南非\n- `IE`: 爱尔兰",
+      "default": "US"
+    }
+  ],
+  "amazon.get_product_top_reviews_v1": [
+    {
+      "name": "asin",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "ASIN(亚马逊标准识别号)。"
+    },
+    {
+      "name": "country",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "亚马逊产品的国家代码。\n\n可用值:\n- `US`: 美国\n- `AU`: 澳大利亚\n- `BR`: 巴西\n- `CA`: 加拿大\n- `CN`: 中国\n- `FR`: 法国\n- `DE`: 德国\n- `IN`: 印度\n- `IT`: 意大利\n- `MX`: 墨西哥\n- `NL`: 荷兰\n- `SG`: 新加坡\n- `ES`: 西班牙\n- `TR`: 土耳其\n- `AE`: 阿拉伯联合酋长国\n- `GB`: 英国\n- `JP`: 日本\n- `SA`: 沙特阿拉伯\n- `PL`: 波兰\n- `SE`: 瑞典\n- `BE`: 比利时\n- `EG`: 埃及\n- `ZA`: 南非\n- `IE`: 爱尔兰",
+      "default": "US"
+    }
+  ],
+  "amazon.get_best_sellers_v1": [
+    {
+      "name": "category",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "热销商品分类路径,例如 'baby-products' 或 'baby-products/166777011',来自亚马逊热销商品URL。"
+    },
+    {
+      "name": "country",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "亚马逊产品的国家代码。\n\n可用值:\n- `US`: 美国\n- `AU`: 澳大利亚\n- `BR`: 巴西\n- `CA`: 加拿大\n- `CN`: 中国\n- `FR`: 法国\n- `DE`: 德国\n- `IN`: 印度\n- `IT`: 意大利\n- `MX`: 墨西哥\n- `NL`: 荷兰\n- `SG`: 新加坡\n- `ES`: 西班牙\n- `TR`: 土耳其\n- `AE`: 阿拉伯联合酋长国\n- `GB`: 英国\n- `JP`: 日本\n- `SA`: 沙特阿拉伯\n- `PL`: 波兰\n- `SE`: 瑞典\n- `BE`: 比利时\n- `EG`: 埃及\n- `ZA`: 南非\n- `IE`: 爱尔兰",
+      "default": "US"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    }
+  ],
+  "amazon.get_category_products_v1": [
+    {
+      "name": "categoryId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "例如:https://amazon.com/s?node=172282 - 亚马逊类别 ID 为 172282"
+    },
+    {
+      "name": "country",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "亚马逊产品的国家代码。\n\n可用值:\n- `US`: 美国\n- `AU`: 澳大利亚\n- `BR`: 巴西\n- `CA`: 加拿大\n- `CN`: 中国\n- `FR`: 法国\n- `DE`: 德国\n- `IN`: 印度\n- `IT`: 意大利\n- `MX`: 墨西哥\n- `NL`: 荷兰\n- `SG`: 新加坡\n- `ES`: 西班牙\n- `TR`: 土耳其\n- `AE`: 阿拉伯联合酋长国\n- `GB`: 英国\n- `JP`: 日本\n- `SA`: 沙特阿拉伯\n- `PL`: 波兰\n- `SE`: 瑞典\n- `BE`: 比利时\n- `EG`: 埃及\n- `ZA`: 南非\n- `IE`: 爱尔兰",
+      "default": "US"
+    },
+    {
+      "name": "sortBy",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "排序方式。\n\n可用值:\n- `RELEVANCE`: 相关性\n- `LOWEST_PRICE`: 最低价格\n- `HIGHEST_PRICE`: 最高价格\n- `REVIEWS`: 评论\n- `NEWEST`: 最新\n- `BEST_SELLERS`: 畅销品",
+      "default": "RELEVANCE"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    }
+  ]
+}

+ 68 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/beike.json

@@ -0,0 +1,68 @@
+{
+  "beike.ershoufang_detail_v1": [
+    {
+      "name": "cityId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "城市ID(例如,北京为'110000')。"
+    },
+    {
+      "name": "houseCode",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "房源信息的唯一标识符。"
+    }
+  ],
+  "beike.get_ershoufang_list_v1": [
+    {
+      "name": "cityId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "城市ID(例如,北京为'110000')。"
+    },
+    {
+      "name": "condition",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "筛选条件(例如:区域、价格范围、户型)。",
+      "default": ""
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "分页偏移量,从0开始(例如:0、20、40...)。",
+      "default": 0
+    }
+  ],
+  "beike.community_list_v1": [
+    {
+      "name": "cityId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "城市ID(例如,北京为'110000')。"
+    },
+    {
+      "name": "condition",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "社区筛选条件。",
+      "default": ""
+    },
+    {
+      "name": "limitOffset",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "分页偏移量,从0开始(例如:0、20、40...)。",
+      "default": 0
+    }
+  ]
+}

+ 139 - 1
claude-code/claude-code-voc-intelligence/mcp/catalog/params/bilibili.json

@@ -651,5 +651,143 @@
     }
   ],
   "bilibili.app.fetch_cinema_tab": [],
-  "bilibili.app.fetch_bangumi_tab": []
+  "bilibili.app.fetch_bangumi_tab": [],
+  "bilibili.get_video_detail_v2": [
+    {
+      "name": "bvid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "哔哩哔哩 视频 ID (BVID)。"
+    }
+  ],
+  "bilibili.get_user_video_list_v2": [
+    {
+      "name": "uid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "哔哩哔哩用户ID (UID)。"
+    },
+    {
+      "name": "param",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "来自先前响应的分页参数。"
+    }
+  ],
+  "bilibili.get_user_detail_v2": [
+    {
+      "name": "uid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "哔哩哔哩用户ID (UID)。"
+    }
+  ],
+  "bilibili.get_video_danmu_v2": [
+    {
+      "name": "aid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "哔哩哔哩归档ID (AID)。"
+    },
+    {
+      "name": "cid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "哔哩哔哩聊天ID (CID)。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于分页的页码。"
+    }
+  ],
+  "bilibili.get_video_comment_v2": [
+    {
+      "name": "aid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "哔哩哔哩归档ID (AID)。"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "分页游标。"
+    }
+  ],
+  "bilibili.search_video_v2": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于分页的页码。"
+    },
+    {
+      "name": "order",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索结果排序标准。\n\n可用值:\n- `general`: 综合\n- `click`: 最多播放\n- `pubdate`: 最新发布\n- `dm`: 最多弹幕\n- `stow`: 最多收藏",
+      "default": "general"
+    }
+  ],
+  "bilibili.share_url_transfer_v1": [
+    {
+      "name": "shareUrl",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "哔哩哔哩分享URL(必须以 https://b23.tv/ 开头)。"
+    }
+  ],
+  "bilibili.get_user_relation_stat_v1": [
+    {
+      "name": "wmid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "哔哩哔哩用户ID(WMID)。"
+    }
+  ],
+  "bilibili.get_video_caption_v2": [
+    {
+      "name": "bvid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "哔哩哔哩 视频 ID (BVID)。"
+    },
+    {
+      "name": "aid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "哔哩哔哩 AID。"
+    },
+    {
+      "name": "cid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "哔哩哔哩 CID。"
+    }
+  ]
 }

+ 18 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/dewu.json

@@ -0,0 +1,18 @@
+{
+  "dewu.search_item_list_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "分页页码。第一页为 1。"
+    }
+  ]
+}

+ 90 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/douban.json

@@ -0,0 +1,90 @@
+{
+  "douban.get_movie_reviews_v1": [
+    {
+      "name": "subjectId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "豆瓣电影或电视剧条目的唯一标识符。"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序顺序。\n\n可用值:\n- `time`: 时间\n- `hotest`: 最热",
+      "default": "time"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    }
+  ],
+  "douban.get_movie_review_detail_v1": [
+    {
+      "name": "reviewId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "豆瓣上特定评论的唯一ID。"
+    }
+  ],
+  "douban.get_movie_comments_v1": [
+    {
+      "name": "subjectId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "豆瓣电影或电视剧条目的唯一标识符。"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序顺序。\n\n可用值:\n- `time`: 时间\n- `new_score`: 新评分",
+      "default": "time"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    }
+  ],
+  "douban.get_subject_detail_v1": [
+    {
+      "name": "subjectId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "豆瓣电影或电视剧条目的唯一标识符。"
+    }
+  ],
+  "douban.get_recent_hot_movie_v1": [
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    }
+  ],
+  "douban.get_recent_hot_tv_v1": [
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    }
+  ]
+}

+ 261 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/douyin.json

@@ -6780,5 +6780,266 @@
       "default": "SHORT_VIDEO",
       "desc": "平台类型。 可用值: - `SHORT_VIDEO`: 短视频 - `LIVE_STREAMING`: 直播 - `PICTURE_TEXT`: 图文 - `SHORT_DRAMA`: 短剧"
     }
+  ],
+  "douyin.search_video_v4": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "sortType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索结果排序标准。\n\n可用值:\n- `_0`:综合\n- `_1`:点赞最多\n- `_2`:最新",
+      "default": "_0"
+    },
+    {
+      "name": "publishTime",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "按视频发布时间范围筛选。\n\n可用值:\n- `_0`: 不限\n- `_1`: 最近24小时\n- `_7`: 最近7天\n- `_180`: 最近6个月",
+      "default": "_0"
+    },
+    {
+      "name": "duration",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "按视频时长筛选。\n\n可用值:\n- `_0`: 不限时长\n- `_1`: 1分钟以内\n- `_2`: 1-5分钟\n- `_3`: 超过5分钟",
+      "default": "_0"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "页码(从1开始)。",
+      "default": 1
+    },
+    {
+      "name": "searchId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索ID;当页码大于1时必须提供(使用上一次响应返回的search_id值)。"
+    }
+  ],
+  "douyin.hot_search_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "可选的搜索关键词。"
+    },
+    {
+      "name": "contentType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "顶级内容类型。只能选择一种内容类型。\n\n可选值:\n- `ALL`:所有内容类型。\n- `FASHION`:时尚。\n- `TECHNOLOGY`:科技。\n- `SCIENCE`:科学。\n- `PHOTOGRAPHY`:摄影与摄像。\n- `FOOD`:美食。\n- `MOTHER_BABY`:母婴。\n- `PARENTING`:育儿。\n- `DRAMA`:戏剧。\n- `GAME`:游戏。\n- `AUTOMOTIVE`:汽车。\n- `ANIMAL`:动物。\n- `TRAVEL`:旅行。\n- `DANCE`:舞蹈。\n- `TRADITIONAL_CULTURE`:传统文化。\n- `ART`:艺术。\n- `SPORTS`:体育。\n- `MUSIC`:音乐。\n- `LIFE_RECORD`:生活记录。\n- `HOME_LIVING`:家居生活。\n- `LEISURE_ENTERTAINMENT`:休闲娱乐。\n- `WORKPLACE`:职场。\n- `AGRICULTURE`:农业。\n- `CASUAL`:随拍。\n- `ACG`:动漫、漫画与游戏。\n- `MOVIE`:电影。\n- `TV_SERIES`:电视剧。\n- `VARIETY_SHOW`:综艺。\n- `CELEBRITY`:明星。\n- `HUMANITIES_SOCIAL_SCIENCE`:人文社科。\n- `EDUCATION_CAMPUS`:教育校园。\n- `EMOTION`:情感。\n- `FINANCE`:财经。\n- `PUBLIC_WELFARE`:公益。 可选值: ALL, FASHION, TECHNOLOGY, SCIENCE, PHOTOGRAPHY, FOOD, MOTHER_BABY, PARENTING, DRAMA, GAME, AUTOMOTIVE, ANIMAL, TRAVEL, DANCE, TRADITIONAL_CULTURE, ART, SPORTS, MUSIC, LIFE_RECORD, HOME_LIVING, LEISURE_ENTERTAINMENT, WORKPLACE, AGRICULTURE, CASUAL, ACG, MOVIE, TV_SERIES, VARIETY_SHOW, CELEBRITY, HUMANITIES_SOCIAL_SCIENCE, EDUCATION_CAMPUS, EMOTION, FINANCE, PUBLIC_WELFARE",
+      "default": "ALL"
+    },
+    {
+      "name": "videoType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "视频类型筛选。\n\n可选值:\n- `ALL`:所有视频类型。\n- `XINGTU_VIDEO`:星图商业视频。\n- `NATURAL_VIDEO`:自然视频。 可选值: ALL, XINGTU_VIDEO, NATURAL_VIDEO",
+      "default": "ALL"
+    },
+    {
+      "name": "sortType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "热门内容结果的排序标准。\n\n可选值:\n- `COMPREHENSIVE`:综合排序。\n- `HIGH_INTERACTION`:最高互动量。\n- `HIGH_LIKE`:最高点赞量。\n- `HIGH_COMMENT`:最高评论量。\n- `HIGH_SHARE`:最高分享量。 可选值: COMPREHENSIVE, HIGH_INTERACTION, HIGH_LIKE, HIGH_COMMENT, HIGH_SHARE",
+      "default": "COMPREHENSIVE"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "页码(从1开始)。每页固定10条。",
+      "default": 1
+    },
+    {
+      "name": "likeCountMin",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "最低原始点赞数。"
+    },
+    {
+      "name": "likeCountMax",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "最高原始点赞数。"
+    },
+    {
+      "name": "commentCountMin",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "最低原始评论数。"
+    },
+    {
+      "name": "commentCountMax",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "最高原始评论数。"
+    },
+    {
+      "name": "shareCountMin",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "最低原始分享数。"
+    },
+    {
+      "name": "shareCountMax",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "最高原始分享数。"
+    },
+    {
+      "name": "interactionCountMin",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "最低原始互动数。"
+    },
+    {
+      "name": "interactionCountMax",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "最高原始互动数。"
+    },
+    {
+      "name": "followerCountMin",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "最低原始创作者粉丝数。"
+    },
+    {
+      "name": "followerCountMax",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "最高原始创作者粉丝数。"
+    }
+  ],
+  "douyin.search_user_v2": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "页码(从1开始)。",
+      "default": 1
+    },
+    {
+      "name": "userType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "按用户类型筛选。\n\n可用值:\n- `common_user`: 普通用户\n- `enterprise_user`: 企业用户\n- `personal_user`: 已认证个人用户"
+    }
+  ],
+  "douyin.get_user_video_list_v3": [
+    {
+      "name": "secUid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "抖音上的唯一用户ID(sec_uid)。"
+    },
+    {
+      "name": "maxCursor",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "分页游标;第一页使用 0,后续页面使用前一次响应中的 `max_cursor`。",
+      "default": 0
+    }
+  ],
+  "douyin.get_video_detail_v2": [
+    {
+      "name": "videoId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "视频唯一标识符(aweme_id 或 model_id)。"
+    }
+  ],
+  "douyin.get_video_comment_v1": [
+    {
+      "name": "awemeId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "视频唯一标识符(aweme_id)。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "页码(从1开始)。",
+      "default": 1
+    }
+  ],
+  "douyin.get_video_sub_comment_v1": [
+    {
+      "name": "commentId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "顶级评论的唯一标识符。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "页码(从1开始)。",
+      "default": 1
+    }
+  ],
+  "douyin.get_user_detail_v3": [
+    {
+      "name": "secUid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "抖音上的唯一用户ID(sec_uid)。"
+    }
+  ],
+  "douyin.share_url_transfer_v1": [
+    {
+      "name": "shareUrl",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "抖音短视频分享链接。"
+    }
   ]
 }

+ 85 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/douyin_ec.json

@@ -0,0 +1,85 @@
+{
+  "douyin_ec.get_item_detail_v1": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "抖音电商上商品的唯一ID。"
+    }
+  ],
+  "douyin_ec.get_item_detail_v2": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "抖音电商上商品的唯一ID。"
+    }
+  ],
+  "douyin_ec.get_item_sku_info_v1": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "抖音电商上商品的唯一ID。"
+    }
+  ],
+  "douyin_ec.search_item_list_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于分页的页码。"
+    },
+    {
+      "name": "searchId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索ID;使用上次响应返回的search_id值获取后续页面。",
+      "default": ""
+    }
+  ],
+  "douyin_ec.get_item_comments_v1": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "抖音电商上商品的唯一ID。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "分页评论的页码。"
+    }
+  ],
+  "douyin_ec.get_shop_item_list_v1": [
+    {
+      "name": "shopId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "抖音电商店铺的唯一ID。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于分页的页码。"
+    }
+  ]
+}

+ 287 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/douyin_xingtu.json

@@ -0,0 +1,287 @@
+{
+  "douyin_xingtu.get_kol_info_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "platformChannel",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "平台渠道。\n\n可用值:\n- `_1`: 短视频\n- `_10`: 直播",
+      "default": "_1"
+    }
+  ],
+  "douyin_xingtu.get_kol_audience_distribution_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    }
+  ],
+  "douyin_xingtu.get_kol_fans_distribution_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "fansType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "粉丝类型。\n\n可选值:\n- `_1`:粉丝画像\n- `_5`:铁粉画像 可选值: _1, _5",
+      "default": "_1"
+    }
+  ],
+  "douyin_xingtu.get_kol_marketing_info_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "platformChannel",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "平台渠道。\n\n可用值:\n- `_1`: 短视频\n- `_10`: 直播",
+      "default": "_1"
+    }
+  ],
+  "douyin_xingtu.get_kol_spread_info_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "type",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "传播信息类型。\n\n可用值:\n- `_1`: 个人视频\n- `_2`: 星图视频",
+      "default": "_1"
+    },
+    {
+      "name": "range",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "时间范围。\n\n可用值:\n- `_2`: 最近30天\n- `_3`: 最近90天",
+      "default": "_2"
+    },
+    {
+      "name": "flowType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "流量类型。",
+      "default": "1"
+    },
+    {
+      "name": "onlyAssign",
+      "in": "query",
+      "type": "boolean",
+      "required": false,
+      "desc": "仅指定笔记。",
+      "default": false
+    }
+  ],
+  "douyin_xingtu.get_kol_convert_ability_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "range",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "时间范围。\n\n可用值:\n- `_2`: 最近30天\n- `_3`: 最近90天"
+    }
+  ],
+  "douyin_xingtu.get_kol_show_items_v2_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "onlyAssign",
+      "in": "query",
+      "type": "boolean",
+      "required": false,
+      "desc": "是否为星图视频,false 为个人视频。",
+      "default": false
+    }
+  ],
+  "douyin_xingtu.get_kol_link_info_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "industryTag",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "行业标签。",
+      "default": ""
+    }
+  ],
+  "douyin_xingtu.get_kol_convert_videos_or_products_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "detailType",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "资源类型。\n\n可用值:\n- `_1`: 视频数据\n- `_2`: 商品数据"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "页码。"
+    }
+  ],
+  "douyin_xingtu.get_kol_link_struct_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    }
+  ],
+  "douyin_xingtu.get_kol_touch_distribution_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    }
+  ],
+  "douyin_xingtu.get_kol_cp_info_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    }
+  ],
+  "douyin_xingtu.get_kol_rec_videos_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    }
+  ],
+  "douyin_xingtu.get_kol_daily_fans_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "startDate",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "开始日期 (yyyy-MM-dd)。"
+    },
+    {
+      "name": "endDate",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "结束日期 (yyyy-MM-dd)。"
+    }
+  ],
+  "douyin_xingtu.get_author_hot_comment_tokens_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    }
+  ],
+  "douyin_xingtu.get_author_content_hot_keywords_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    }
+  ],
+  "douyin_xingtu.get_author_commerce_spread_info_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    }
+  ],
+  "douyin_xingtu.get_author_commerce_seed_base_info_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "range",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "时间范围。"
+    }
+  ],
+  "douyin_xingtu.get_video_detail_v1": [
+    {
+      "name": "detailId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "视频详情ID。"
+    }
+  ]
+}

+ 59 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/facebook.json

@@ -0,0 +1,59 @@
+{
+  "facebook.search_post_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于在公开帖子中搜索的关键词。支持基础文本匹配。"
+    },
+    {
+      "name": "startDate",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索范围的开始日期(包含),格式为 yyyy-MM-dd。"
+    },
+    {
+      "name": "endDate",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索范围的结束日期(包含),格式为 yyyy-MM-dd。"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于获取下一组结果的分页游标。",
+      "default": ""
+    }
+  ],
+  "facebook.get_profile_id_v1": [
+    {
+      "name": "url",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "Facebook资料URL的路径部分。不要包含 `https://www.facebook.com`。示例:`/people/To-Bite/pfbid021XLeDjjZjsoWse1H43VEgb3i1uCLTpBvXSvrnL2n118YPtMF5AZkBrZobhWWdHTHl/`"
+    }
+  ],
+  "facebook.get_profile_posts_v1": [
+    {
+      "name": "profileId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "唯一的Facebook个人资料ID。"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于获取下一组结果的分页游标。",
+      "default": ""
+    }
+  ]
+}

+ 334 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/imdb.json

@@ -0,0 +1,334 @@
+{
+  "imdb.title_release_expectation_query_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_extended_details_query_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_top_cast_and_crew_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_base_query_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_redux_overview_query_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_did_you_know_query_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_critics_review_summary_query_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_awards_summary_query_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_user_reviews_summary_query_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_plot_query_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_contribution_questions_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_details_query_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_box_office_summary_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_more_like_this_query_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.main_search_query_v1": [
+    {
+      "name": "searchTerm",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "要搜索的术语(例如 'fire')。"
+    },
+    {
+      "name": "type",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索结果中包含的类别。\n\n可用值:\n- `Top`:热门结果\n- `Movies`:电影\n- `Shows`:电视节目\n- `People`:人物\n- `Interests`:兴趣\n- `Episodes`:剧集\n- `Podcast`:播客\n- `Video_games`:视频游戏",
+      "default": "Top"
+    },
+    {
+      "name": "limit",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "返回的最大结果数量(1-300)。",
+      "default": 25
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.streaming_picks_query_v1": [
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.news_by_category_query_v1": [
+    {
+      "name": "category",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于筛选的新闻类别。\n\n可用值:\n- `TOP`: 头条新闻\n- `MOVIE`: 电影新闻\n- `TV`: 电视新闻\n- `CELEBRITY`: 名人新闻"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_chart_rankings_v1": [
+    {
+      "name": "rankingsChartType",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "要获取的排行榜类型。\n\n可用值:\n- `TOP_250`: 电影 Top 250\n- `TOP_250_TV`: 电视剧 Top 250"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ],
+  "imdb.title_countries_of_origin_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "该标题的唯一IMDb ID(例如:tt12037194)。"
+    },
+    {
+      "name": "languageCountry",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "语言与国家/地区偏好。\n\n可用值:\n- `en_US`: 英语(美国)\n- `fr_CA`: 法语(加拿大)\n- `fr_FR`: 法语(法国)\n- `de_DE`: 德语(德国)\n- `hi_IN`: 印地语(印度)\n- `it_IT`: 意大利语(意大利)\n- `pt_BR`: 葡萄牙语(巴西)\n- `es_ES`: 西班牙语(西班牙)\n- `es_US`: 西班牙语(美国)\n- `es_MX`: 西班牙语(墨西哥)",
+      "default": "en_US"
+    }
+  ]
+}

+ 118 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/instagram.json

@@ -1526,5 +1526,123 @@
       "required": true,
       "desc": "Instagram帖子完整URL/Full Instagram post URL"
     }
+  ],
+  "instagram.get_user_detail_v1": [
+    {
+      "name": "username",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "要检索个人资料详情的Instagram用户名。"
+    }
+  ],
+  "instagram.get_post_detail_v1": [
+    {
+      "name": "code",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "Instagram帖子的唯一短代码(例如'DRhvwVLAHAG')。"
+    }
+  ],
+  "instagram.get_user_posts_v1": [
+    {
+      "name": "username",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "要检索其已发布帖子的Instagram用户名。"
+    },
+    {
+      "name": "paginationToken",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于检索下一页结果的令牌。",
+      "default": ""
+    }
+  ],
+  "instagram.search_reels_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于筛选Reels的搜索关键词或话题标签。"
+    },
+    {
+      "name": "paginationToken",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于检索下一页结果的令牌。",
+      "default": ""
+    }
+  ],
+  "instagram.search_hashtag_posts_v1": [
+    {
+      "name": "hashtag",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "要搜索的话题标签或关键词。"
+    },
+    {
+      "name": "endCursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于检索下一页结果的游标。",
+      "default": ""
+    }
+  ],
+  "instagram.get_post_comments_v1": [
+    {
+      "name": "code",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "Instagram 帖子的唯一短代码。"
+    },
+    {
+      "name": "minId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "上一次响应中返回的 next_min_id 分页游标。",
+      "default": ""
+    },
+    {
+      "name": "sortOrder",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "评论的排序方式。\n\n可选值:\n- `popular`: 热门\n- `newest`: 最新 可选值: popular, newest",
+      "default": "newest"
+    }
+  ],
+  "instagram.get_comment_replies_v1": [
+    {
+      "name": "mediaId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "Instagram 帖子的数字媒体 ID。"
+    },
+    {
+      "name": "commentId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "要获取回复的父评论 ID。"
+    },
+    {
+      "name": "minId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "上一次响应中返回的 next_min_child_cursor 分页游标。",
+      "default": ""
+    }
   ]
 }

+ 77 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/jd.json

@@ -0,0 +1,77 @@
+{
+  "jd.get_item_detail_v1": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "京东商品的唯一产品标识符(商品ID)。"
+    }
+  ],
+  "jd.get_item_detail_v2": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "京东商品的唯一产品标识符(商品ID)。"
+    }
+  ],
+  "jd.get_item_price_v1": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "京东商品的唯一产品标识符(商品ID)。"
+    }
+  ],
+  "jd.search_item_list_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于分页的页码。"
+    }
+  ],
+  "jd.get_item_comments_v1": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "京东商品的唯一产品标识符(商品ID)。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "分页评论的页码。"
+    }
+  ],
+  "jd.get_shop_item_list_v1": [
+    {
+      "name": "shopId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "京东上的唯一店铺标识符(店铺 ID)。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "分页评论的页码。"
+    }
+  ]
+}

+ 93 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/kuaishou.json

@@ -556,5 +556,98 @@
       "default": "",
       "desc": "首次留空,翻页传上一页响应的 pcursor"
     }
+  ],
+  "kuaishou.search_video_v2": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于查找视频的搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "结果页码,从1开始。",
+      "default": 1
+    }
+  ],
+  "kuaishou.search_user_v2": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于查找用户的搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "结果页码,从1开始。",
+      "default": 1
+    }
+  ],
+  "kuaishou.get_user_video_list_v2": [
+    {
+      "name": "userId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "快手平台上的唯一用户ID。"
+    },
+    {
+      "name": "pcursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于后续页面的分页游标。"
+    }
+  ],
+  "kuaishou.get_video_detail_v2": [
+    {
+      "name": "videoId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "快手视频的唯一ID,例如 `3xg9avuebhtfcku`"
+    }
+  ],
+  "kuaishou.get_video_comment_v1": [
+    {
+      "name": "videoId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "快手视频的唯一ID,例如 `3xbknvct79h46h9` 或 refer_photo_id `177012131237`"
+    },
+    {
+      "name": "pcursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于后续页面的分页游标。"
+    }
+  ],
+  "kuaishou.get_user_detail_v1": [
+    {
+      "name": "userId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "快手平台上的唯一用户ID。"
+    }
+  ],
+  "kuaishou.share_url_transfer_v1": [
+    {
+      "name": "shareUrl",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "快手分享链接(必须以 'https://v.kuaishou.com/' 开头)。"
+    }
   ]
 }

+ 11 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/llm.json

@@ -0,0 +1,11 @@
+{
+  "llm.doubao_answer_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "向豆包提问的关键词或问题。"
+    }
+  ]
+}

+ 1044 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/overseas-ecom.json

@@ -0,0 +1,1044 @@
+{
+  "overseas-ecom.category_tree": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    }
+  ],
+  "overseas-ecom.category_top100": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "NodeId",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "目标类目 NodeId"
+    },
+    {
+      "name": "QueryStart",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "查询开始时间,格式 yyyy-MM-dd,最长可查2年,区间3-40天"
+    },
+    {
+      "name": "QueryDate",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "查询结束时间,格式 yyyy-MM-dd,最近至昨日,区间3-40天"
+    },
+    {
+      "name": "QueryDays",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "指定 QueryDate 未指定 QueryStart 时,从 QueryDate 起的连续天数"
+    }
+  ],
+  "overseas-ecom.category_products": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "NodeId",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "需要查找的类目 NodeId"
+    },
+    {
+      "name": "Page",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "分页,每页最多100个产品,默认1(从1开始)",
+      "default": 1
+    },
+    {
+      "name": "Range",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "按近30日销量倒序的产品数量范围,不指定返回全部,如1000表示前1000个"
+    }
+  ],
+  "overseas-ecom.product_request": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "ASIN",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "需要查询的 ASIN,支持多 ASIN(最多10个,逗号分隔),按数量计费"
+    },
+    {
+      "name": "Trend",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "是否包含趋势数据(trend 结尾字段):1=包含(默认),2=不包含",
+      "default": 1
+    },
+    {
+      "name": "QueryTrendStartDt",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "Trend=1 时指定趋势起始日期 yyyy-MM-dd,默认近15天,>15天消耗加倍"
+    },
+    {
+      "name": "QueryTrendEndDt",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "趋势截止日期 yyyy-MM-dd,与 QueryTrendStartDt 配合使用"
+    }
+  ],
+  "overseas-ecom.product_query": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Query",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "查询方式:1=单条件(默认),2=多条件组合(且关系)",
+      "default": 1
+    },
+    {
+      "name": "QueryType",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "Query=1 时生效:1=同类产品(ASIN) 2=类目(nodeid) 3=品牌 4=卖家名 5=SellerId 6=ABA关键词 7=标题/属性词 8=售价区间 9=月销量区间 10=季节性 11=上架时间 12=星级 13=评论数 14=排名 15=发货方式 16=子体数"
+    },
+    {
+      "name": "Pattern",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "查询关键词/条件值;Query=1 时按 QueryType 含义传值(如 QueryType=7 传标题包含词);Query=2 时传 JSON 数组 [{QueryType,Content},...]"
+    },
+    {
+      "name": "Page",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "分页,每页最多100个产品,默认1",
+      "default": 1
+    },
+    {
+      "name": "QueryMonth",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "回看历史月份数据,格式 yyyy-MM,不指定为实时数据(部分站点支持)"
+    }
+  ],
+  "overseas-ecom.asin_sales_volume": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "ASIN",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "需要查询的 ASIN"
+    },
+    {
+      "name": "Page",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "分页,默认1,每页最多100条",
+      "default": 1
+    },
+    {
+      "name": "QueryDate",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "查询开始时间 yyyy-MM-dd,最早2023-09-01,默认近30日"
+    },
+    {
+      "name": "QueryEndDate",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "查询结束时间 yyyy-MM-dd,默认截止当前"
+    }
+  ],
+  "overseas-ecom.product_variation_history": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "ASIN",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "需要查询的 ASIN"
+    }
+  ],
+  "overseas-ecom.product_reviews_collection": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "ASIN",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "需要采集的 ASIN"
+    },
+    {
+      "name": "Mode",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "采集方式:0=top reviews,1=most recent"
+    },
+    {
+      "name": "Star",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "按星级筛选,多选逗号分隔:1-5星 / 10=消极(1-3星) / 11=积极(4-5星)"
+    },
+    {
+      "name": "OnlyPurchase",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "是否仅采集购买过用户评论:0=不限,1=仅购买过"
+    },
+    {
+      "name": "Page",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "采集页数,可选 1-10"
+    }
+  ],
+  "overseas-ecom.product_reviews_collection_status": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "ASIN",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "需要查询的 ASIN"
+    },
+    {
+      "name": "Update",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "检查距当前 1-240 小时内的采集任务状态,如48表示48小时内"
+    }
+  ],
+  "overseas-ecom.product_reviews_query": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "ASIN",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "需要查询的 ASIN"
+    },
+    {
+      "name": "Querystartdt",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "评论起始时间 yyyy-MM-dd"
+    },
+    {
+      "name": "PageIndex",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "页码索引,默认1,每页100条",
+      "default": 1
+    },
+    {
+      "name": "Star",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "按星级筛选,多选逗号分隔:1-5 / 10=消极 / 11=积极"
+    },
+    {
+      "name": "OnlyPurchase",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "是否仅购买过用户评论:0=不限,1=仅购买过"
+    }
+  ],
+  "overseas-ecom.similar_product_request": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Image",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "查询图片(Base64 编码,建议1M左右,产品占比>80%、背景干净)"
+    }
+  ],
+  "overseas-ecom.similar_product_status": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Update",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "检查距当前 1-240 小时内的搜图任务状态"
+    }
+  ],
+  "overseas-ecom.similar_product_collection": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "TaskId",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "任务 ID"
+    }
+  ],
+  "overseas-ecom.keyword_query": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Pattern",
+      "in": "body",
+      "type": "object",
+      "required": true,
+      "desc": "筛选结构,含 RankCondition 数组,如 {\"RankCondition\":[1,1000]}"
+    },
+    {
+      "name": "PageIndex",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "页码索引,默认1",
+      "default": 1
+    },
+    {
+      "name": "PageSize",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "每页数量,最小20,默认20,最大200",
+      "default": 20
+    }
+  ],
+  "overseas-ecom.keyword_search_results": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Keyword",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "查询的关键词(仅支持 ABA 热搜词)"
+    },
+    {
+      "name": "PageIndex",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "页码索引,默认1",
+      "default": 1
+    },
+    {
+      "name": "PageSize",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "每页数量,最小20,默认20,最大200",
+      "default": 20
+    }
+  ],
+  "overseas-ecom.keyword_request": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Keyword",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "查询的关键词"
+    }
+  ],
+  "overseas-ecom.keyword_search_result_trend": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Keyword",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "ABA 关键词"
+    },
+    {
+      "name": "QueryStart",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "趋势起始月份 yyyy-MM,最早2024-01,默认2024-01",
+      "default": "2024-01"
+    },
+    {
+      "name": "QueryEnd",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "趋势截止月份 yyyy-MM"
+    }
+  ],
+  "overseas-ecom.category_request_keyword": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "NodeId",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "类目 NodeId(仅支持底层类目)"
+    },
+    {
+      "name": "PageIndex",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "页码索引,默认1",
+      "default": 1
+    },
+    {
+      "name": "PageSize",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "每页数量,最小20,默认20,最大200",
+      "default": 20
+    }
+  ],
+  "overseas-ecom.asin_request_keyword": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "ASIN",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "需要查询的 ASIN"
+    },
+    {
+      "name": "PageIndex",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "页码索引,默认1",
+      "default": 1
+    },
+    {
+      "name": "PageSize",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "每页数量,最小20,默认20,最大200",
+      "default": 20
+    }
+  ],
+  "overseas-ecom.keyword_product_ranking": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(仅美国站有效):1=美国"
+    },
+    {
+      "name": "Keyword",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "ABA 关键词"
+    },
+    {
+      "name": "Month",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "查询月份 yyyy-MM(仅美国站有效)"
+    },
+    {
+      "name": "Page",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "页码,默认1,每页最多200条",
+      "default": 1
+    }
+  ],
+  "overseas-ecom.asin_keyword_ranking": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(仅美国站有效):1=美国"
+    },
+    {
+      "name": "Keyword",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "ABA 关键词"
+    },
+    {
+      "name": "ASIN",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "需要查询的 ASIN"
+    },
+    {
+      "name": "QueryStart",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "查询起始时间,最长两年,为空返回近1个月"
+    },
+    {
+      "name": "QueryEnd",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "查询截止时间"
+    },
+    {
+      "name": "Page",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "页码,默认1,每页最多200条",
+      "default": 1
+    }
+  ],
+  "overseas-ecom.keyword_batch_subscription": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Keyword",
+      "in": "body",
+      "type": "array",
+      "required": true,
+      "desc": "需要监控的关键词数组 Array[String]"
+    },
+    {
+      "name": "Mode",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "监控模式:0=电脑浏览器,1=手机浏览器"
+    },
+    {
+      "name": "Area",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "监控地区邮编(不同站点对应不同有效值,如 domain=1 时 10041 等)"
+    },
+    {
+      "name": "Page",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "监控搜索结果页数(每次监控前3页)"
+    },
+    {
+      "name": "Period",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "监控周期配置,格式『星期几|时间段|频率』,如 1|1|1"
+    }
+  ],
+  "overseas-ecom.keyword_tasks": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Keyword",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "模糊匹配要查询的关键词"
+    },
+    {
+      "name": "Taskid",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "指定任务 id(多个逗号分隔)"
+    },
+    {
+      "name": "PageIndex",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "页码索引,默认1",
+      "default": 1
+    },
+    {
+      "name": "PageSize",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "每页数量,最小20,默认20,最大200",
+      "default": 20
+    }
+  ],
+  "overseas-ecom.keyword_batch_task_update": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "TaskId",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "关键词监控任务 id"
+    },
+    {
+      "name": "Update",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "操作类型:0=修改设置 1=暂停 2=启动 9=删除"
+    },
+    {
+      "name": "Mode",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "监控模式:0=电脑浏览器,1=手机浏览器"
+    },
+    {
+      "name": "Area",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "监控地区邮编"
+    },
+    {
+      "name": "Page",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "监控搜索结果页数"
+    },
+    {
+      "name": "Period",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "监控周期配置"
+    }
+  ],
+  "overseas-ecom.keyword_batch_schedule_list": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "TaskId",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "关键词监控任务 id"
+    },
+    {
+      "name": "QueryDate",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "查询日期 yyyy-MM-dd,默认全部批次"
+    }
+  ],
+  "overseas-ecom.keyword_batch_schedule_detail": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "ScheduleId",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "批次任务 id(来自执行批次查询),多 id 逗号分隔,最多20个"
+    }
+  ],
+  "overseas-ecom.bestseller_subscription": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Nodeid",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "需要监控的类目 NodeId"
+    },
+    {
+      "name": "Range",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "最多监控的榜单数据范围(如1代表 top100)"
+    },
+    {
+      "name": "Period",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "监控频率(100=每天0点,106=每天6点等)"
+    },
+    {
+      "name": "BestSellerListType",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "榜单类型(对应不同畅销榜)"
+    }
+  ],
+  "overseas-ecom.bestseller_task": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "PageIndex",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "页码索引,默认1",
+      "default": 1
+    },
+    {
+      "name": "PageSize",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "每页数量,最小20,默认20,最大200",
+      "default": 20
+    }
+  ],
+  "overseas-ecom.bestseller_delete": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Nodeid",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "需要删除的监控类目 NodeId"
+    },
+    {
+      "name": "BestSellerListType",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "榜单类型(1=New Releases,3=Most Wished For 等)"
+    }
+  ],
+  "overseas-ecom.bestseller_data_collect": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Nodeid",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "已监控的类目 NodeId"
+    },
+    {
+      "name": "BestSellerListType",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "榜单类型(1=New Releases 等)"
+    },
+    {
+      "name": "QueryDate",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "查询日期 yyyy-MM-dd HH,未填返回当日第一批"
+    }
+  ],
+  "overseas-ecom.product_seller_tasks": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "PageIndex",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "页码索引,默认1",
+      "default": 1
+    },
+    {
+      "name": "PageSize",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "每页数量,最小20,默认20,最大200",
+      "default": 20
+    }
+  ],
+  "overseas-ecom.product_seller_task_update": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "TaskId",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "跟卖监控任务 id"
+    },
+    {
+      "name": "Update",
+      "in": "body",
+      "type": "integer",
+      "required": true,
+      "desc": "操作类型:0=修改设置 1=暂停 2=启动 9=删除"
+    },
+    {
+      "name": "Period",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "监控周期配置,格式『星期几|时间段|频率』,如 1|1|1"
+    }
+  ],
+  "overseas-ecom.product_seller_schedule_list": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "TaskId",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "跟卖监控任务 id"
+    }
+  ],
+  "overseas-ecom.product_seller_schedule_detail": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "ScheduleId",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "批次任务 id(来自跟卖执行批次查询)"
+    }
+  ],
+  "overseas-ecom.asin_subscription": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Asins",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "订阅配置,格式『+|<asin>|<时间范围>』,+添加/-删除,时间范围1=每天,如 +,B081P4LF73,1|+,B083V76MM7,1"
+    }
+  ],
+  "overseas-ecom.asin_subscription_query": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    }
+  ],
+  "overseas-ecom.asin_subscription_collection": [
+    {
+      "name": "domain",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "站点标识(必填):1=美国 2=英国 3=德国 4=法国 5=意大利 6=加拿大 7=日本 8=西班牙 9=意大利 10=墨西哥 11=阿联酋 12=澳大利亚 13=巴西 14=沙特"
+    },
+    {
+      "name": "Asins",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "已订阅 ASIN 列表,逗号分隔,单次最多100个"
+    }
+  ]
+}

+ 43 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/reddit.json

@@ -794,5 +794,48 @@
       "default": false,
       "desc": "是否需要清洗数据/Whether to clean and format the data"
     }
+  ],
+  "reddit.get_post_detail_v1": [
+    {
+      "name": "postId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "Reddit帖子的唯一标识符(例如't3_1q4aqti')。"
+    }
+  ],
+  "reddit.get_post_comments_v1": [
+    {
+      "name": "postId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "Reddit帖子的唯一标识符。"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "下一页结果的分页令牌。",
+      "default": ""
+    }
+  ],
+  "reddit.search_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索查询关键词。"
+    },
+    {
+      "name": "after",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于检索下一组结果的分页令牌。",
+      "default": ""
+    }
   ]
 }

+ 40 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/search.json

@@ -0,0 +1,40 @@
+{
+  "search.search_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索查询字符串。支持:\n- 多个关键词(AND):keyword1 keyword2\n- 多个关键词(OR):keyword1~keyword2\n- 排除关键词(NOT):required_keyword -excluded_keyword"
+    },
+    {
+      "name": "source",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于搜索过滤的目标社交媒体平台。\n\n可用值:\n- `ALL`:所有平台\n- `NEWS`:新闻\n- `WEIBO`:新浪微博\n- `WEIXIN`:微信\n- `ZHIHU`:知乎\n- `DOUYIN`:抖音\n- `XIAOHONGSHU`:小红书\n- `BILIBILI`:哔哩哔哩\n- `KUAISHOU`:快手",
+      "default": "ALL"
+    },
+    {
+      "name": "start",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索时段的开始时间(yyyy-MM-dd HH:mm:ss)。首次请求时必需。"
+    },
+    {
+      "name": "end",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索时段的结束时间(yyyy-MM-dd HH:mm:ss)。首次请求时必需。"
+    },
+    {
+      "name": "nextCursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "由先前响应中'nextCursor'字段提供的分页游标。"
+    }
+  ]
+}

+ 226 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/taobao.json

@@ -0,0 +1,226 @@
+{
+  "taobao.get_item_detail_v1": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "淘宝/天猫上的唯一商品标识符(商品ID)。"
+    }
+  ],
+  "taobao.get_item_detail_v2": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "淘宝/天猫上的唯一商品标识符(商品ID)。"
+    }
+  ],
+  "taobao.get_item_detail_v4": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "淘宝/天猫上的唯一商品标识符(商品ID)。"
+    }
+  ],
+  "taobao.get_item_detail_v5": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "淘宝/天猫上的唯一商品标识符(商品ID)。"
+    }
+  ],
+  "taobao.get_item_detail_v9": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "淘宝/天猫上的唯一商品标识符(商品ID)。"
+    }
+  ],
+  "taobao.get_item_comment_v3": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "淘宝/天猫上的唯一商品标识符(商品ID)。"
+    },
+    {
+      "name": "orderType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序方式。\n\n可用值:\n- `feedbackdate`:按反馈日期排序\n- `general`:通用排序",
+      "default": "feedbackdate"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    }
+  ],
+  "taobao.get_social_feed_v1": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "淘宝/天猫上的唯一商品标识符(商品ID)。"
+    }
+  ],
+  "taobao.get_shop_item_list_v1": [
+    {
+      "name": "userId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "店铺标识符。也称为卖家ID或用户ID(它们指向相同的值)。"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序方式。\n\n可用值:\n- `_sale`:销量\n- `_default`:默认",
+      "default": "_sale"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    }
+  ],
+  "taobao.get_shop_item_list_v2": [
+    {
+      "name": "userId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "店铺标识符。也称为卖家ID或用户ID(它们指向相同的值)。"
+    },
+    {
+      "name": "shopId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "淘宝/天猫上的唯一店铺标识符(店铺ID)。"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序方式。\n\n可用值:\n- `coefp`:综合排序\n- `hotsell`:热销/销量\n- `oldstarts`:新品/旧品\n- `bid`:价格:从低到高\n- `_bid`:价格:从高到低",
+      "default": "coefp"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    }
+  ],
+  "taobao.get_shop_item_list_v3": [
+    {
+      "name": "userId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "店铺标识符。也称为卖家ID或用户ID(它们指向相同的值)。"
+    },
+    {
+      "name": "shopId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "淘宝/天猫上的唯一店铺标识符(店铺ID)。"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序方式。\n\n可用值:\n- `coefp`:综合排序\n- `hotsell`:热销/销量\n- `oldstarts`:新品/旧品\n- `bid`:价格:从低到高\n- `_bid`:价格:从高到低",
+      "default": "coefp"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    }
+  ],
+  "taobao.get_item_sale_v1": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "淘宝/天猫上的唯一商品标识符(商品ID)。"
+    }
+  ],
+  "taobao.search_item_list_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序方式。\n\n可用值:\n- `_sale`:销量\n- `_bid`:价格:从高到低\n- `bid`:价格:从低到高\n- `_coefp`:通用",
+      "default": "_sale"
+    },
+    {
+      "name": "tmall",
+      "in": "query",
+      "type": "boolean",
+      "required": false,
+      "desc": "是否将结果筛选为仅天猫商品。",
+      "default": false
+    },
+    {
+      "name": "startPrice",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "最低价格筛选(包含)。"
+    },
+    {
+      "name": "endPrice",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "最高价格筛选(包含)。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    }
+  ]
+}

+ 159 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/tiktok.json

@@ -3903,5 +3903,164 @@
       "default": 100,
       "desc": "返回商品数量/Number of products to return"
     }
+  ],
+  "tiktok.get_user_post_v1": [
+    {
+      "name": "secUid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "TikTok用户的唯一安全ID(例如:MS4wLjABAAAAonP2...)。"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "分页游标。首次请求使用 '0',后续请求使用前一次响应返回的 'cursor' 值。",
+      "default": "0"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用户帖子的排序标准。\n\n可用值:\n- `_0`:默认(混合)\n- `_1`:最高点赞数\n- `_2`:最新发布",
+      "default": "_0"
+    }
+  ],
+  "tiktok.get_post_detail_v1": [
+    {
+      "name": "postId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "TikTok帖子的唯一ID。"
+    }
+  ],
+  "tiktok.get_user_detail_v1": [
+    {
+      "name": "uniqueId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用户的唯一标识/用户名(例如 'tiktok')。",
+      "default": ""
+    },
+    {
+      "name": "secUid",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用户的唯一安全ID。",
+      "default": ""
+    }
+  ],
+  "tiktok.get_post_comment_v1": [
+    {
+      "name": "awemeId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "TikTok 帖子的唯一 ID(awemeId)。"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "分页游标。从 '0' 开始。",
+      "default": "0"
+    }
+  ],
+  "tiktok.get_post_sub_comment_v1": [
+    {
+      "name": "awemeId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "TikTok帖子的唯一ID。"
+    },
+    {
+      "name": "commentId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "要获取回复的评论的唯一ID。"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "分页游标。从 '0' 开始。",
+      "default": "0"
+    }
+  ],
+  "tiktok.search_user_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词(例如 'deepseek')。"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "分页游标。从 '0' 开始。",
+      "default": "0"
+    },
+    {
+      "name": "searchId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "从前一个请求返回的 'logid',用于保持搜索结果的一致性。",
+      "default": ""
+    }
+  ],
+  "tiktok.search_post_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词(例如 'deepseek')。"
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "分页偏移量,从0开始,步长为20。",
+      "default": 0
+    },
+    {
+      "name": "sortType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索结果排序标准。\n\n可用值:\n- `RELEVANCE`: 相关性(默认)\n- `MOST_LIKED`: 点赞最多",
+      "default": "RELEVANCE"
+    },
+    {
+      "name": "publishTime",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "按发布时间筛选帖子。\n\n可用值:\n- `ALL`: 全部时间\n- `ONE_DAY`: 最近24小时\n- `ONE_WEEK`: 最近7天\n- `ONE_MONTH`: 最近30天\n- `THREE_MONTHS`: 最近90天\n- `HALF_YEAR`: 最近180天",
+      "default": "ALL"
+    },
+    {
+      "name": "region",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "ISO 3166-1 alpha-2 国家代码(例如 'US'、'GB')。",
+      "default": "US"
+    }
   ]
 }

+ 68 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/tiktok_shop.json

@@ -0,0 +1,68 @@
+{
+  "tiktok_shop.search_products_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "region",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "商品搜索的目标区域。\n\n可选值:\n- `US`:美国\n- `GB`:英国\n- `FR`:法国\n- `SG`:新加坡\n- `MY`:马来西亚\n- `PH`:菲律宾\n- `TH`:泰国\n- `VN`:越南\n- `ID`:印度尼西亚 可选值: US, GB, FR, SG, MY, PH, TH, VN, ID",
+      "default": "US"
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "搜索结果偏移量。",
+      "default": 0
+    },
+    {
+      "name": "pageToken",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "下一页的分页令牌。"
+    }
+  ],
+  "tiktok_shop.get_product_detail_v1": [
+    {
+      "name": "productId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "TikTok Shop 产品 ID。"
+    },
+    {
+      "name": "region",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "商品详情的目标区域。\n\n可选值:\n- `US`:美国\n- `GB`:英国\n- `FR`:法国\n- `SG`:新加坡\n- `MY`:马来西亚\n- `PH`:菲律宾\n- `TH`:泰国\n- `VN`:越南\n- `ID`:印度尼西亚 可选值: US, GB, FR, SG, MY, PH, TH, VN, ID",
+      "default": "US"
+    }
+  ],
+  "tiktok_shop.get_product_detail_v2": [
+    {
+      "name": "productId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "TikTok Shop 产品 ID。"
+    },
+    {
+      "name": "region",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "商品详情的目标区域。\n\n可选值:\n- `FR`:法国 可选值: FR",
+      "default": "FR"
+    }
+  ]
+}

+ 52 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/toutiao.json

@@ -68,5 +68,57 @@
       "required": true,
       "desc": "用户主页链接/User profile URL"
     }
+  ],
+  "toutiao.get_article_detail_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "头条文章的唯一标识符。"
+    }
+  ],
+  "toutiao.get_user_detail_v1": [
+    {
+      "name": "userId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "头条用户的唯一标识符。"
+    }
+  ],
+  "toutiao.search_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词或查询。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    },
+    {
+      "name": "searchId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索会话ID,用于保持分页一致性(第一页无需提供)。",
+      "default": ""
+    }
+  ],
+  "toutiao.search_v2": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词或查询。"
+    }
   ]
 }

+ 51 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/twitter.json

@@ -199,5 +199,56 @@
       "required": false,
       "desc": "游标/Cursor"
     }
+  ],
+  "twitter.search_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "searchType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索结果类型。\n\n可用值:\n- `TOP`:热门搜索结果\n- `LATEST`:最新搜索结果\n- `MEDIA`:媒体搜索结果\n- `PEOPLE`:人物搜索结果\n- `LISTS`:列表搜索结果",
+      "default": "Top"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "由先前响应返回的分页游标。",
+      "default": ""
+    }
+  ],
+  "twitter.get_user_detail_v1": [
+    {
+      "name": "restId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "X 用户的唯一数字标识符(Rest ID)。"
+    }
+  ],
+  "twitter.get_user_posts_v1": [
+    {
+      "name": "restId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "X 用户的唯一数字标识符(Rest ID)。"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于浏览长时线内容的分页游标。",
+      "default": ""
+    }
   ]
 }

+ 29 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/web.json

@@ -0,0 +1,29 @@
+{
+  "web.html_v1": [
+    {
+      "name": "url",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "要获取的网页URL。"
+    }
+  ],
+  "web.rendered_html_v1": [
+    {
+      "name": "url",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "要获取的网页URL。"
+    }
+  ],
+  "web.markdown_v1": [
+    {
+      "name": "url",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "要获取的网页URL。"
+    }
+  ]
+}

+ 225 - 1
claude-code/claude-code-voc-intelligence/mcp/catalog/params/weibo.json

@@ -1130,5 +1130,229 @@
       "desc": "同城热搜城市名称,仅 category=region 时有效,支持: 北京/上海/广州/深圳/杭州/成都/重庆/武汉/南京/天津/西安/长沙/郑州/苏州/东莞/青岛/沈阳/合肥等,默认北京"
     }
   ],
-  "weibo.app.fetch_hot_search_categories": []
+  "weibo.app.fetch_hot_search_categories": [],
+  "weibo.search_all_v2": [
+    {
+      "name": "q",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "startDay",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "开始日期 (yyyy-MM-dd)。"
+    },
+    {
+      "name": "startHour",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "起始小时(0-23)。"
+    },
+    {
+      "name": "endDay",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "结束日期 (yyyy-MM-dd)。"
+    },
+    {
+      "name": "endHour",
+      "in": "query",
+      "type": "integer",
+      "required": true,
+      "desc": "结束小时(0-23)。"
+    },
+    {
+      "name": "hotSort",
+      "in": "query",
+      "type": "boolean",
+      "required": false,
+      "desc": "热门排序,true 表示热门排序,false 表示时间排序。默认为 false。",
+      "default": false
+    },
+    {
+      "name": "contains",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "包含结果集的过滤器。\n\n可用值:\n- `ALL`: 全部\n- `PICTURE`: 包含图片\n- `VIDEO`: 包含视频\n- `MUSIC`: 包含音乐\n- `LINK`: 包含链接",
+      "default": "ALL"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "页码,从1开始。",
+      "default": 1
+    }
+  ],
+  "weibo.get_weibo_detail_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "微博帖子ID。"
+    }
+  ],
+  "weibo.get_user_detail_v3": [
+    {
+      "name": "uid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "微博用户ID (UID)。"
+    }
+  ],
+  "weibo.get_fans_v1": [
+    {
+      "name": "uid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "微博用户ID (UID)。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "页码,从1开始。",
+      "default": 1
+    }
+  ],
+  "weibo.get_followers_v1": [
+    {
+      "name": "uid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "微博用户ID (UID)。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "页码,从1开始。",
+      "default": 1
+    }
+  ],
+  "weibo.get_user_post_v1": [
+    {
+      "name": "uid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "微博用户ID (UID)。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "页码,从1开始。",
+      "default": 1
+    },
+    {
+      "name": "sinceId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "分页游标(since_id)。当 page > 1 时必须提供。"
+    }
+  ],
+  "weibo.get_user_video_list_v1": [
+    {
+      "name": "uid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "微博用户ID (UID)。"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "由先前响应返回的分页游标。"
+    }
+  ],
+  "weibo.tv_component_v1": [
+    {
+      "name": "oid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "微博视频/对象ID。"
+    }
+  ],
+  "weibo.get_post_comments_v1": [
+    {
+      "name": "mid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "微博帖子 mid。"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序顺序。\n\n可用值:\n- `TIME`: 时间\n- `HOT`: 热门",
+      "default": "TIME"
+    },
+    {
+      "name": "maxId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "由先前响应返回的分页游标。"
+    }
+  ],
+  "weibo.search_profile_v1": [
+    {
+      "name": "uid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "微博用户ID (UID)。"
+    },
+    {
+      "name": "q",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "startDay",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "开始日期 (yyyy-MM-dd)。"
+    },
+    {
+      "name": "endDay",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结束日期 (yyyy-MM-dd)。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "页码,从1开始。",
+      "default": 1
+    }
+  ]
 }

+ 509 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/weixin.json

@@ -0,0 +1,509 @@
+{
+  "weixin.get_account_today_articles_v1": [
+    {
+      "name": "biz",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "微信公众号biz id。可从文章URL中的__biz查询参数读取。请使用biz、url或name之一。",
+      "default": ""
+    },
+    {
+      "name": "url",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于识别公众号的微信公众号文章URL。请使用biz、url或name之一。",
+      "default": ""
+    },
+    {
+      "name": "name",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "微信公众号名称或wxid,例如“人民日报”。请使用biz、url或name之一。",
+      "default": ""
+    }
+  ],
+  "weixin.get_account_history_articles_v1": [
+    {
+      "name": "biz",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "微信公众号biz id。可从文章URL中的__biz查询参数读取。请使用biz、url或name之一。",
+      "default": ""
+    },
+    {
+      "name": "url",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于识别公众号的微信公众号文章URL。请使用biz、url或name之一。",
+      "default": ""
+    },
+    {
+      "name": "name",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "微信公众号名称或wxid,例如“人民日报”。请使用biz、url或name之一。",
+      "default": ""
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "从1开始的页码,用于分页获取微信公众号历史文章。",
+      "default": 1
+    }
+  ],
+  "weixin.get_account_history_articles_v2": [
+    {
+      "name": "ghid",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "微信公众号原始id,例如gh_363b924965e9。请使用ghid或url之一。",
+      "default": ""
+    },
+    {
+      "name": "url",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "用于识别公众号并获取历史文章的微信公众号文章URL。请使用ghid或url之一。",
+      "default": ""
+    },
+    {
+      "name": "offset",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "PagingInfo.Offset 由上一次响应返回的偏移游标。第一页时留空。对于此 POST 接口,请以 application/x-www-form-urlencoded 格式在请求体中发送。",
+      "default": ""
+    }
+  ],
+  "weixin.get_article_metrics_v1": [
+    {
+      "name": "articleUrl",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取基本互动指标(如阅读量和点赞数)的微信公众号文章URL。必须以#rd或#wechat_redirect结尾。"
+    }
+  ],
+  "weixin.get_article_metrics_v2": [
+    {
+      "name": "articleUrl",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取扩展互动和文章表现指标的微信公众号文章URL。"
+    }
+  ],
+  "weixin.get_article_detail_v1": [
+    {
+      "name": "articleUrl",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取文章详情内容和元数据的微信公众号文章URL。"
+    },
+    {
+      "name": "mode",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "文章正文格式。TEXT返回纯文本,RICH_TEXT在支持时返回富文本。\n\n可用值:\n- `TEXT`:纯文本文章详情\n- `RICH_TEXT`:富文本文章详情",
+      "default": "TEXT"
+    }
+  ],
+  "weixin.get_article_detail_v2": [
+    {
+      "name": "articleUrl",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取结构化文章详情字段和HTML内容片段的微信公众号文章URL。"
+    }
+  ],
+  "weixin.get_article_detail_v3": [
+    {
+      "name": "articleUrl",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取微信公众号文章详情的文章URL,包含视频相关字段(如有)。"
+    },
+    {
+      "name": "mode",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "文章正文格式。TEXT返回纯文本,RICH_TEXT在支持时返回富文本。\n\n可用值:\n- `TEXT`:纯文本文章详情\n- `RICH_TEXT`:富文本文章详情",
+      "default": "TEXT"
+    }
+  ],
+  "weixin.get_article_detail_v4": [
+    {
+      "name": "articleUrl",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取完整HTML文档的微信公众号文章URL,用于渲染或归档。"
+    }
+  ],
+  "weixin.get_article_detail_v5": [
+    {
+      "name": "articleUrl",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取轻量级文章元数据和状态信息的微信公众号文章URL。"
+    }
+  ],
+  "weixin.get_article_comment_v1": [
+    {
+      "name": "articleUrl",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取文章顶级评论的微信公众号文章URL。"
+    },
+    {
+      "name": "buffer",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "由上一次响应返回的评论分页缓冲区。第一页时留空。对于此 POST 接口,请以 application/x-www-form-urlencoded 格式在请求体中发送。",
+      "default": ""
+    }
+  ],
+  "weixin.get_article_sub_comment_v1": [
+    {
+      "name": "articleUrl",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取顶级评论下回复的微信公众号文章URL。"
+    },
+    {
+      "name": "contentId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取嵌套评论回复的顶级评论内容ID。"
+    }
+  ],
+  "weixin.search_article_hot_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于筛选热门微信公众号文章的可选关键词。",
+      "default": ""
+    },
+    {
+      "name": "publishType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "热门微信公众号文章结果的发布类型筛选。\n\n可选值:\n- `IMAGE_TEXT`: 图文文章\n- `VIDEO`: 纯视频文章\n- `AUDIO`: 纯音频或音乐文章\n- `IMAGE`: 纯图片文章\n- `TEXT`: 纯文字文章\n- `REPRINT`: 转载文章 可选值: IMAGE_TEXT, VIDEO, AUDIO, IMAGE, TEXT, REPRINT",
+      "default": "IMAGE_TEXT"
+    },
+    {
+      "name": "category",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "热门微信公众号文章结果的分类筛选。\n\n可选值:\n- `ALL`: 全部分类\n- `INTERNATIONAL`: 国际\n- `SPORTS`: 体育\n- `ENTERTAINMENT`: 娱乐\n- `SOCIETY`: 社会\n- `FINANCE`: 财经\n- `CURRENT_AFFAIRS`: 时事\n- `TECHNOLOGY`: 科技\n- `EMOTION`: 情感\n- `AUTOMOTIVE`: 汽车\n- `EDUCATION`: 教育\n- `FASHION`: 时尚\n- `GAMES`: 游戏\n- `MILITARY`: 军事\n- `TRAVEL`: 旅游\n- `FOOD`: 美食\n- `CULTURE`: 文化\n- `HEALTH`: 健康\n- `HUMOR`: 幽默\n- `HOME`: 家居\n- `ANIMATION`: 动漫\n- `PETS`: 宠物\n- `PARENTING`: 育儿\n- `ASTROLOGY`: 星座\n- `HISTORY`: 历史\n- `MUSIC`: 音乐\n- `UNCATEGORIZED`: 未分类\n- `COMPREHENSIVE`: 综合\n- `WORKPLACE`: 职场\n- `AGRICULTURE`: 三农\n- `ELDERLY_CARE`: 养老 可选值: ALL, INTERNATIONAL, SPORTS, ENTERTAINMENT, SOCIETY, FINANCE, CURRENT_AFFAIRS, TECHNOLOGY, EMOTION, AUTOMOTIVE, EDUCATION, FASHION, GAMES, MILITARY, TRAVEL, FOOD, CULTURE, HEALTH, HUMOR, HOME, ANIMATION, PETS, PARENTING, ASTROLOGY, HISTORY, MUSIC, UNCATEGORIZED, COMPREHENSIVE, WORKPLACE, AGRICULTURE, ELDERLY_CARE",
+      "default": "ALL"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "热门微信公众号文章结果的页码,从1开始。",
+      "default": 1
+    },
+    {
+      "name": "startDay",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "热门文章搜索的开始日期,格式为yyyy-MM-dd。"
+    },
+    {
+      "name": "endDay",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "热门文章搜索的结束日期,格式为yyyy-MM-dd。"
+    }
+  ],
+  "weixin.search_article_v1": [
+    {
+      "name": "keyword",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "微信公众号文章的搜索关键词。"
+    },
+    {
+      "name": "publishTimeType",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "微信公众号文章搜索发布时间筛选 可选值: ALL, ONE_DAY, SEVEN_DAYS, HALF_YEAR",
+      "default": "ALL"
+    },
+    {
+      "name": "sortType",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "微信公众号文章搜索排序类型 可选值: COMPREHENSIVE, LATEST, HOT",
+      "default": "COMPREHENSIVE"
+    },
+    {
+      "name": "currentPage",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "微信网页搜索分页的当前页码,从1开始。",
+      "default": 1
+    },
+    {
+      "name": "offset",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "上一次响应返回的搜索结果偏移量。第一页使用0。",
+      "default": 0
+    },
+    {
+      "name": "cookies_buffer",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "由上一次微信网页搜索响应返回的 Cookie 分页状态。第一页时留空。对于此 POST 接口,请以 application/x-www-form-urlencoded 格式在请求体中发送。",
+      "default": ""
+    }
+  ],
+  "weixin.search_article_v2": [
+    {
+      "name": "keyword",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "分类微信公众号文章网页搜索的搜索关键词。"
+    },
+    {
+      "name": "subSearchType",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "微信公众号文章分类搜索子类型 可选值: ALL, FOLLOWED, LATEST, RECENT_READ, HOT",
+      "default": "ALL"
+    },
+    {
+      "name": "currentPage",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "微信网页搜索分页的当前页码,从1开始。",
+      "default": 1
+    },
+    {
+      "name": "offset",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "上一次响应返回的搜索结果偏移量。第一页使用0。",
+      "default": 0
+    },
+    {
+      "name": "cookies_buffer",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "由上一次微信网页搜索响应返回的 Cookie 分页状态。第一页时留空。对于此 POST 接口,请以 application/x-www-form-urlencoded 格式在请求体中发送。",
+      "default": ""
+    }
+  ],
+  "weixin.search_miniprogram_v1": [
+    {
+      "name": "keyword",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "微信小程序网页搜索的搜索关键词。"
+    },
+    {
+      "name": "currentPage",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "微信网页搜索分页的当前页码,从1开始。",
+      "default": 1
+    },
+    {
+      "name": "offset",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "上一次响应返回的搜索结果偏移量。第一页使用0。",
+      "default": 0
+    },
+    {
+      "name": "cookies_buffer",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "由上一次微信网页搜索响应返回的 Cookie 分页状态。第一页时留空。对于此 POST 接口,请以 application/x-www-form-urlencoded 格式在请求体中发送。",
+      "default": ""
+    }
+  ],
+  "weixin.search_wechat_index_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于查询微信指数趋势信号的关键词。"
+    }
+  ],
+  "weixin.search_suggestions_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取微信搜索建议的关键词。"
+    },
+    {
+      "name": "businessType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于限定建议结果的微信搜索业务类型。\n\n可选值:\n- `ALL`: 全部\n- `ACCOUNT`: 公众号\n- `ARTICLE`: 文章\n- `CHANNEL`: 视频号\n- `MOMENTS`: 朋友圈\n- `LIVE`: 直播\n- `EMOJI`: 表情\n- `AUDIO`: 音频\n- `BOOK`: 图书\n- `WECHAT_INDEX`: 微信指数\n- `NEWS`: 新闻\n- `MINI_PROGRAM`: 小程序\n- `ENCYCLOPEDIA`: 百科 可选值: ALL, ACCOUNT, ARTICLE, CHANNEL, MOMENTS, LIVE, EMOJI, AUDIO, BOOK, WECHAT_INDEX, NEWS, MINI_PROGRAM, ENCYCLOPEDIA",
+      "default": "ALL"
+    }
+  ],
+  "weixin.search_account_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "微信公众号资料搜索的搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "微信公众号资料搜索的页码,从1开始。",
+      "default": 1
+    }
+  ],
+  "weixin.search_account_v2": [
+    {
+      "name": "keyword",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "搜索微信公众号网页搜索的关键词。"
+    },
+    {
+      "name": "currentPage",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "微信网页搜索分页的当前页码,从1开始。",
+      "default": 1
+    },
+    {
+      "name": "offset",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "上一次响应返回的搜索结果偏移量。第一页使用0。",
+      "default": 0
+    },
+    {
+      "name": "cookies_buffer",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "由上一次微信网页搜索响应返回的 Cookie 分页状态。第一页时留空。对于此 POST 接口,请以 application/x-www-form-urlencoded 格式在请求体中发送。",
+      "default": ""
+    }
+  ],
+  "weixin.get_account_original_count_v1": [
+    {
+      "name": "ghid",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "微信公众号原始id,例如gh_363b924965e9。请使用ghid或url之一。",
+      "default": ""
+    },
+    {
+      "name": "url",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于标识账号的微信公众号文章URL。使用ghid或url。",
+      "default": ""
+    }
+  ],
+  "weixin.get_account_principal_info_v1": [
+    {
+      "name": "biz",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "微信公众号的biz id。使用biz、url或wxid之一。",
+      "default": ""
+    },
+    {
+      "name": "url",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于标识账号的微信公众号文章URL。使用biz、url或wxid之一。",
+      "default": ""
+    },
+    {
+      "name": "wxid",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于标识账号的微信公众号wxid。使用biz、url或wxid之一。",
+      "default": ""
+    }
+  ],
+  "weixin.get_account_basic_info_v1": [
+    {
+      "name": "name",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取基本资料信息的微信公众号名称。"
+    }
+  ],
+  "weixin.convert_article_link_v1": [
+    {
+      "name": "link",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "待转换的微信公众号文章短链接或中间链接。"
+    }
+  ]
+}

+ 296 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/weixin_channels.json

@@ -0,0 +1,296 @@
+{
+  "weixin_channels.search_video_v1": [
+    {
+      "name": "keyword",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "微信视频号视频结果的搜索关键词。"
+    },
+    {
+      "name": "publishTimeType",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "微信视频号视频搜索发布时间筛选 可选值: ALL, ONE_DAY, SEVEN_DAYS, HALF_YEAR",
+      "default": "ALL"
+    },
+    {
+      "name": "sortType",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "微信视频号视频搜索排序类型 可选值: COMPREHENSIVE, LATEST, HOT",
+      "default": "COMPREHENSIVE"
+    },
+    {
+      "name": "currentPage",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "微信视频号网页搜索分页的当前页码,从1开始。",
+      "default": 1
+    },
+    {
+      "name": "offset",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "上一次微信视频号搜索响应返回的搜索结果偏移量。第一页使用0。",
+      "default": 0
+    },
+    {
+      "name": "cookies_buffer",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "由上一次微信视频号网页搜索响应返回的 Cookie 分页状态。第一页时留空。对于此 POST 接口,请以 application/x-www-form-urlencoded 格式在请求体中发送。",
+      "default": ""
+    }
+  ],
+  "weixin_channels.search_video_v2": [
+    {
+      "name": "keyword",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "分类微信视频号视频结果的搜索关键词。"
+    },
+    {
+      "name": "currentPage",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "微信视频号网页搜索分页的当前页码,从1开始。",
+      "default": 1
+    },
+    {
+      "name": "offset",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "上一次微信视频号搜索响应返回的搜索结果偏移量。第一页使用0。",
+      "default": 0
+    },
+    {
+      "name": "cookies_buffer",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "由上一次微信视频号网页搜索响应返回的 Cookie 分页状态。第一页时留空。对于此 POST 接口,请以 application/x-www-form-urlencoded 格式在请求体中发送。",
+      "default": ""
+    }
+  ],
+  "weixin_channels.search_account_v1": [
+    {
+      "name": "keyword",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "微信视频号账号网页搜索的搜索关键词。"
+    },
+    {
+      "name": "currentPage",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "微信视频号网页搜索分页的当前页码,从1开始。",
+      "default": 1
+    },
+    {
+      "name": "offset",
+      "in": "body",
+      "type": "integer",
+      "required": false,
+      "desc": "上一次微信视频号账号搜索响应返回的搜索结果偏移量。第一页使用0。",
+      "default": 0
+    },
+    {
+      "name": "cookies_buffer",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "由上一次微信视频号账号搜索响应返回的 Cookie 分页状态。第一页时留空。对于此 POST 接口,请以 application/x-www-form-urlencoded 格式在请求体中发送。",
+      "default": ""
+    }
+  ],
+  "weixin_channels.search_account_v2": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于查找微信视频号账号及相关视频对象的搜索关键词。"
+    }
+  ],
+  "weixin_channels.search_account_v3": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于解析微信视频号账号ID的搜索关键词。"
+    }
+  ],
+  "weixin_channels.get_account_videos_v1": [
+    {
+      "name": "v2Name",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "视频号账号唯一标识,通常以 @finder 结尾。"
+    },
+    {
+      "name": "last_buffer",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "由上一次微信视频号账号视频响应返回的分页缓冲区。第一页时留空。对于此 POST 接口,请以 application/x-www-form-urlencoded 格式在请求体中发送。",
+      "default": ""
+    }
+  ],
+  "weixin_channels.get_bound_channel_v1": [
+    {
+      "name": "ghid",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于查找绑定视频号账号的微信公众号原始 ID。使用 ghid 或 url。",
+      "default": ""
+    },
+    {
+      "name": "url",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用于查找绑定视频号账号的微信公众号文章 URL。使用 ghid 或 url。",
+      "default": ""
+    }
+  ],
+  "weixin_channels.get_video_basic_info_v1": [
+    {
+      "name": "feedInfo",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "复制的视频号视频链接、finder-preview URL 或短 feed ID。"
+    }
+  ],
+  "weixin_channels.get_video_title_v1": [
+    {
+      "name": "objectId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "视频号视频 object id。"
+    },
+    {
+      "name": "objectNonceId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "可选的视频号 object nonce id。提供可提高查询准确性。",
+      "default": ""
+    }
+  ],
+  "weixin_channels.convert_export_id_v1": [
+    {
+      "name": "exportId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "视频搜索结果返回的加密视频号 exportId。"
+    }
+  ],
+  "weixin_channels.get_video_download_url_v1": [
+    {
+      "name": "objectId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取可下载媒体链接的微信视频号视频对象ID。"
+    },
+    {
+      "name": "objectNonceId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "可选的微信视频号对象nonce ID。提供它可以提高媒体查找的准确性。",
+      "default": ""
+    }
+  ],
+  "weixin_channels.get_video_metrics_v1": [
+    {
+      "name": "objectId",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取互动指标的微信视频号视频对象ID。"
+    },
+    {
+      "name": "objectNonceId",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "可选的微信视频号对象nonce ID。",
+      "default": ""
+    },
+    {
+      "name": "last_buffer",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "由上一次微信视频号指标响应返回的分页缓冲区。第一页时留空。对于此 POST 接口,请以 application/x-www-form-urlencoded 格式在请求体中发送。",
+      "default": ""
+    }
+  ],
+  "weixin_channels.get_video_comment_v1": [
+    {
+      "name": "objectId",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取一级评论的微信视频号视频对象ID。"
+    },
+    {
+      "name": "objectNonceId",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "可选的微信视频号对象nonce ID。",
+      "default": ""
+    },
+    {
+      "name": "last_buffer",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "由上一次微信视频号一级评论响应返回的分页缓冲区。第一页时留空。对于此 POST 接口,请以 application/x-www-form-urlencoded 格式在请求体中发送。",
+      "default": ""
+    }
+  ],
+  "weixin_channels.get_video_sub_comment_v1": [
+    {
+      "name": "objectId",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "用于获取二级评论回复的微信视频号视频对象ID。"
+    },
+    {
+      "name": "rootCommentId",
+      "in": "body",
+      "type": "string",
+      "required": true,
+      "desc": "微信视频号视频评论接口返回的根一级评论ID。"
+    },
+    {
+      "name": "last_buffer",
+      "in": "body",
+      "type": "string",
+      "required": false,
+      "desc": "微信视频号二级评论回复的分页缓冲区。当存在时,使用一级评论的 last_buffer 作为第一页回复。对于此 POST 接口,请以 application/x-www-form-urlencoded 格式在请求体中发送。",
+      "default": ""
+    }
+  ]
+}

+ 35 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/xianyu.json

@@ -0,0 +1,35 @@
+{
+  "xianyu.search_item_list_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "分页页码。第一页为 1。"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "闲鱼搜索结果的排序方式。\n\n可选值:\n- `active`:优先显示活跃商品。\n- `recent`:优先显示附近或基于位置的最新结果。\n- `credit`:优先显示卖家信用高的商品。\n- `price_asc`:价格从低到高。\n- `price_desc`:价格从高到低。\n- `price_drop`:优先显示降价商品。\n- `newest`:优先显示最新发布的商品。 可选值: active, recent, credit, price_asc, price_desc, price_drop, newest",
+      "default": "active"
+    }
+  ],
+  "xianyu.get_item_detail_v1": [
+    {
+      "name": "itemId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "闲鱼上的唯一商品标识符。"
+    }
+  ]
+}

+ 509 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/xiaohongshu.json

@@ -1435,5 +1435,514 @@
       "default": 1,
       "desc": "结果页码。"
     }
+  ],
+  "xiaohongshu.hot_search_v1": [
+    {
+      "name": "searchWord",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索关键词。",
+      "default": ""
+    },
+    {
+      "name": "pageNum",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    },
+    {
+      "name": "orderBy",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序指标。\n\n可用值:\n- `premium_imp_num`:曝光量\n- `premium_good_read_rate`:阅读率\n- `premium_read_num`:阅读数\n- `premium_engage_num`:互动数\n- `premium_engage_rate`:互动率\n- `premium_like_num`:点赞数\n- `premium_fav_num`:收藏数\n- `premium_cmt_num`:评论数",
+      "default": "premium_imp_num"
+    },
+    {
+      "name": "nd",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "时间范围(天)。\n\n可选值:\n- `DAY_3`:最近3天\n- `DAY_7`:最近7天\n- `DAY_14`:最近14天\n- `DAY_30`:最近30天 可选值: DAY_3, DAY_7, DAY_14, DAY_30",
+      "default": "DAY_7"
+    }
+  ],
+  "xiaohongshu.search_note_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序方式。\n\n可选值:\n- `general`:综合排序\n- `popularity_descending`:热度降序\n- `time_descending`:时间降序\n- `comment_descending`:评论数降序\n- `collect_descending`:收藏数降序 可选值: general, popularity_descending, time_descending, comment_descending, collect_descending",
+      "default": "general"
+    },
+    {
+      "name": "noteType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "笔记类型过滤器。\n\n可用值:\n- `_0`: 通用\n- `_1`: 视频\n- `_2`: 普通",
+      "default": "_0"
+    },
+    {
+      "name": "noteTime",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "笔记发布时间筛选。\n\n可选值:\n- `ONE_DAY`: 一天内\n- `ONE_WEEK`: 一周内\n- `HALF_YEAR`: 半年内 可选值: ONE_DAY, ONE_WEEK, HALF_YEAR"
+    }
+  ],
+  "xiaohongshu.search_note_v2": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序方式。\n\n可选值:\n- `general`:综合排序\n- `popularity_descending`:热度降序\n- `time_descending`:时间降序\n- `comment_descending`:评论数降序\n- `collect_descending`:收藏数降序 可选值: general, popularity_descending, time_descending, comment_descending, collect_descending",
+      "default": "general"
+    },
+    {
+      "name": "noteType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "笔记类型过滤器。\n\n可用值:\n- `_0`: 通用\n- `_1`: 视频\n- `_2`: 普通",
+      "default": "_0"
+    },
+    {
+      "name": "noteTime",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "笔记发布时间筛选。此参数仅供参考,效果不大。\n\n可选值:\n- `ONE_DAY`: 一天内\n- `ONE_WEEK`: 一周内\n- `HALF_YEAR`: 半年内 可选值: ONE_DAY, ONE_WEEK, HALF_YEAR"
+    }
+  ],
+  "xiaohongshu.search_note_v3": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序方式。\n\n可选值:\n- `general`:综合排序\n- `popularity_descending`:热度降序\n- `time_descending`:时间降序\n- `comment_descending`:评论数降序\n- `collect_descending`:收藏数降序 可选值: general, popularity_descending, time_descending, comment_descending, collect_descending",
+      "default": "general"
+    },
+    {
+      "name": "noteType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "笔记类型过滤器。\n\n可用值:\n- `_0`: 通用\n- `_1`: 视频\n- `_2`: 普通",
+      "default": "_0"
+    },
+    {
+      "name": "noteTime",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "笔记发布时间筛选。此参数仅供参考,效果不大。\n\n可选值:\n- `ONE_DAY`: 一天内\n- `ONE_WEEK`: 一周内\n- `HALF_YEAR`: 半年内 可选值: ONE_DAY, ONE_WEEK, HALF_YEAR"
+    }
+  ],
+  "xiaohongshu.search_note_v4": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    },
+    {
+      "name": "searchId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "来自上一个响应数据 api_info.search_id 的搜索会话 ID。",
+      "default": ""
+    },
+    {
+      "name": "sessionId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "来自上一个响应数据 api_info.session_id 的会话 ID。",
+      "default": ""
+    },
+    {
+      "name": "sortType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序方式。\n\n可选值:\n- `general`:综合排序\n- `popularity_descending`:热度降序\n- `time_descending`:时间降序\n- `comment_descending`:评论数降序\n- `collect_descending`:收藏数降序 可选值: general, popularity_descending, time_descending, comment_descending, collect_descending",
+      "default": "general"
+    },
+    {
+      "name": "noteType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "笔记类型筛选。\n\n可选值:\n- `ALL`: 不限\n- `VIDEO_NOTE`: 视频笔记\n- `NORMAL_NOTE`: 图文笔记 可选值: ALL, VIDEO_NOTE, NORMAL_NOTE",
+      "default": "ALL"
+    },
+    {
+      "name": "timeFilter",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "发布时间筛选。\n\n可选值:\n- `ALL`: 不限\n- `ONE_DAY`: 一天内\n- `ONE_WEEK`: 一周内\n- `HALF_YEAR`: 半年内 可选值: ALL, ONE_DAY, ONE_WEEK, HALF_YEAR",
+      "default": "ALL"
+    }
+  ],
+  "xiaohongshu.search_user_v2": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码。",
+      "default": 1
+    }
+  ],
+  "xiaohongshu.get_user_note_list_v1": [
+    {
+      "name": "userId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书用户的唯一标识符。"
+    },
+    {
+      "name": "lastCursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "上一页的分页游标。"
+    }
+  ],
+  "xiaohongshu.get_user_note_list_v2": [
+    {
+      "name": "userId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书用户的唯一标识符。"
+    },
+    {
+      "name": "lastCursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "上一页的分页游标(最后一个笔记的游标值)。"
+    }
+  ],
+  "xiaohongshu.get_user_note_list_v3": [
+    {
+      "name": "userId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书用户的唯一标识符。"
+    },
+    {
+      "name": "lastCursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "上一页的分页游标(最后一个笔记的游标值)。"
+    }
+  ],
+  "xiaohongshu.get_user_note_list_v4": [
+    {
+      "name": "userId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书用户的唯一标识符。"
+    },
+    {
+      "name": "lastCursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "上一页的分页游标(最后一个笔记的游标值)。"
+    }
+  ],
+  "xiaohongshu.get_note_detail_v1": [
+    {
+      "name": "noteId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书笔记唯一标识符。"
+    },
+    {
+      "name": "format",
+      "in": "query",
+      "type": "boolean",
+      "required": false,
+      "desc": "未经管理员确认,请勿使用。",
+      "default": false
+    }
+  ],
+  "xiaohongshu.get_note_detail_v2": [
+    {
+      "name": "noteId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书笔记唯一标识符。"
+    }
+  ],
+  "xiaohongshu.get_note_detail_v3": [
+    {
+      "name": "noteId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书笔记唯一标识符。"
+    }
+  ],
+  "xiaohongshu.get_note_detail_v4": [
+    {
+      "name": "noteId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书笔记唯一标识符。"
+    }
+  ],
+  "xiaohongshu.get_note_detail_v5": [
+    {
+      "name": "noteId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书笔记唯一标识符。"
+    }
+  ],
+  "xiaohongshu.get_note_detail_v7": [
+    {
+      "name": "noteId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书笔记唯一标识符。"
+    }
+  ],
+  "xiaohongshu.get_note_comment_v2": [
+    {
+      "name": "noteId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书笔记唯一标识符。"
+    },
+    {
+      "name": "lastCursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "上一页的分页游标(使用上一次响应返回的游标值)。"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序策略。\n\n可用值:\n- `normal`:普通\n- `latest`:最新\n- `like_count`:点赞数",
+      "default": "latest"
+    }
+  ],
+  "xiaohongshu.get_note_comment_v3": [
+    {
+      "name": "noteId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书笔记唯一标识符。"
+    },
+    {
+      "name": "lastCursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "上一页的分页游标。"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序策略。\n\n可用值:\n- `normal`:普通\n- `latest`:最新\n- `like_count`:点赞数",
+      "default": "latest"
+    }
+  ],
+  "xiaohongshu.get_note_comment_v4": [
+    {
+      "name": "noteId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书笔记唯一标识符。"
+    },
+    {
+      "name": "lastCursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "上一页的分页游标(使用上一次响应返回的游标值)。"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序策略。\n\n可用值:\n- `normal`:普通\n- `latest`:最新\n- `like_count`:点赞数",
+      "default": "latest"
+    }
+  ],
+  "xiaohongshu.get_note_sub_comment_v2": [
+    {
+      "name": "noteId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书笔记唯一标识符。"
+    },
+    {
+      "name": "commentId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书唯一评论标识符。"
+    },
+    {
+      "name": "lastCursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "上一页的分页游标(使用上一次响应返回的游标值)。"
+    }
+  ],
+  "xiaohongshu.get_user_v3": [
+    {
+      "name": "userId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书用户的唯一标识符。"
+    }
+  ],
+  "xiaohongshu.get_user_v4": [
+    {
+      "name": "userId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书用户的唯一标识符。"
+    }
+  ],
+  "xiaohongshu.search_recommend_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    }
+  ],
+  "xiaohongshu.get_topic_note_list_v1": [
+    {
+      "name": "topicId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "小红书上的唯一话题标识符。"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果集的排序方式。\n\n可选值:\n- `time`:最新\n- `hot`:热门 可选值: time, hot",
+      "default": "hot"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "上一页的分页游标。"
+    }
+  ],
+  "xiaohongshu.share_url_transfer_v1": [
+    {
+      "name": "shareUrl",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "待解析的RedNote分享链接URL(短链接或分享URL)。"
+    }
   ]
 }

+ 168 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/xiaohongshu_pgy.json

@@ -0,0 +1,168 @@
+{
+  "xiaohongshu_pgy.get_kol_info_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    }
+  ],
+  "xiaohongshu_pgy.get_kol_note_rate_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "dateType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "日期类型。\n\n可用值:\n- `_1`: 最近30天\n- `_2`: 最近90天",
+      "default": "_1"
+    },
+    {
+      "name": "noteType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "笔记类型。\n\n可用值:\n- `_1`: 图文\n- `_2`: 视频\n- `_3`: 图文和视频",
+      "default": "_3"
+    },
+    {
+      "name": "adSwitch",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "广告过滤。\n\n可用值:\n- `_1`: 全流量(所有笔记)\n- `_0`: 自然流量(自然笔记)",
+      "default": "_1"
+    },
+    {
+      "name": "business",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "业务类型。\n\n可用值:\n- `_0`: 普通笔记\n- `_1`: 合作笔记",
+      "default": "_0"
+    }
+  ],
+  "xiaohongshu_pgy.get_kol_fans_portrait_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    }
+  ],
+  "xiaohongshu_pgy.get_kol_fans_summary_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    }
+  ],
+  "xiaohongshu_pgy.get_kol_fans_trend_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "dateType",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "日期类型。\n\n可用值:\n- `_1`: 最近 30 天\n- `_2`: 最近 60 天"
+    },
+    {
+      "name": "increaseType",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "增长类型。\n\n可用值:\n- `_1`: 总粉丝数\n- `_2`: 新增粉丝数"
+    }
+  ],
+  "xiaohongshu_pgy.get_kol_data_summary_v2": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "business",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "业务类型。\n\n可用值:\n- `_0`: 普通笔记\n- `_1`: 合作笔记"
+    }
+  ],
+  "xiaohongshu_pgy.get_kol_cost_effective_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    }
+  ],
+  "xiaohongshu_pgy.get_note_detail_v1": [
+    {
+      "name": "noteId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "笔记ID。"
+    }
+  ],
+  "xiaohongshu_pgy.get_kol_core_data_v1": [
+    {
+      "name": "kolId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "KOL ID。"
+    },
+    {
+      "name": "business",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "业务类型。\n\n可用值:\n- `_0`: 普通笔记\n- `_1`: 合作笔记",
+      "default": "_0"
+    },
+    {
+      "name": "noteType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "笔记类型。\n\n可用值:\n- `_1`: 图文\n- `_2`: 视频\n- `_3`: 图文和视频",
+      "default": "_3"
+    },
+    {
+      "name": "dateType",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "日期类型。\n\n可用值:\n- `_1`: 最近30天\n- `_2`: 最近90天",
+      "default": "_1"
+    },
+    {
+      "name": "adSwitch",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "广告过滤。\n\n可用值:\n- `_1`: 全流量(所有笔记)\n- `_0`: 自然流量(自然笔记)",
+      "default": "_1"
+    }
+  ]
+}

+ 37 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/youku.json

@@ -0,0 +1,37 @@
+{
+  "youku.search_video_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用于搜索的关键词。"
+    },
+    {
+      "name": "page",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "用于分页的页码,从1开始。",
+      "default": 1
+    }
+  ],
+  "youku.get_video_detail_v1": [
+    {
+      "name": "videoId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "视频的唯一标识符。"
+    }
+  ],
+  "youku.get_user_detail_v1": [
+    {
+      "name": "uid",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "用户的唯一标识符。"
+    }
+  ]
+}

+ 169 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/youtube.json

@@ -1123,5 +1123,174 @@
       "default": true,
       "desc": "是否需要清洗数据,提取关键内容,移除冗余数据/Whether to clean and format the data"
     }
+  ],
+  "youtube.search_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索关键词。首次请求时必填;使用续传令牌时留空。",
+      "default": ""
+    },
+    {
+      "name": "continuationToken",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "上一次响应返回的分页令牌。",
+      "default": ""
+    },
+    {
+      "name": "uploadDate",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "按上传日期筛选结果。\n\n可用值:\n- `last_hour`:最近一小时内上传\n- `today`:今天上传\n- `this_week`:本周上传\n- `this_month`:本月上传\n- `this_year`:今年上传"
+    },
+    {
+      "name": "type",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "按结果类型筛选结果。\n\n可用值:\n- `video`:视频结果\n- `channel`:频道结果\n- `playlist`:播放列表结果\n- `movie`:电影结果"
+    },
+    {
+      "name": "duration",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "按时长筛选视频结果。支持的请求值:short、medium、long。\n\n可用值:\n- `SHORT`:短于4分钟的短视频\n- `MEDIUM`:4到20分钟的中等视频\n- `LONG`:超过20分钟的长视频"
+    },
+    {
+      "name": "features",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "用逗号分隔的功能筛选条件。支持的值:live、4k、hd、subtitles、creative_commons、360、vr180、3d、hdr。 可选值: live, FOUR_K, hd, subtitles, creative_commons, THREE_SIXTY, vr180, THREE_D, hdr"
+    },
+    {
+      "name": "sortBy",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "搜索结果的排序顺序。\n\n可用值:\n- `relevance`:按相关性排序\n- `upload_date`:按上传日期排序\n- `view_count`:按观看次数排序\n- `rating`:按评分排序"
+    }
+  ],
+  "youtube.get_video_detail_v1": [
+    {
+      "name": "videoId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "YouTube视频的唯一标识符。"
+    }
+  ],
+  "youtube.get_channel_videos_v1": [
+    {
+      "name": "channelId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "YouTube频道的唯一标识符。"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "分页游标。"
+    }
+  ],
+  "youtube.get_video_captions_v1": [
+    {
+      "name": "videoId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "YouTube视频的唯一标识符。"
+    },
+    {
+      "name": "languageCode",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "字幕语言代码,例如en、zh-Hans或a.en。留空以检索可用的字幕轨道。",
+      "default": ""
+    },
+    {
+      "name": "format",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "字幕输出格式。\n\n可用值:\n- `srt`:带时间轴提示的SubRip字幕格式\n- `xml`:原始XML字幕格式\n- `json3`:YouTube原始JSON字幕结构\n- `txt`:不带时间轴提示的纯文本",
+      "default": "srt"
+    }
+  ],
+  "youtube.get_video_comment_v1": [
+    {
+      "name": "videoId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "YouTube视频的唯一标识符。"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "由先前响应返回的分页游标。",
+      "default": ""
+    },
+    {
+      "name": "languageCode",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "响应数据的语言偏好。",
+      "default": "zh-CN"
+    },
+    {
+      "name": "countryCode",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "响应数据的地区代码。",
+      "default": "US"
+    },
+    {
+      "name": "sortBy",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "评论列表的排序方式。\n\n可选值:\n- `top`:热门评论\n- `newest`:最新评论 可选值: top, newest",
+      "default": "newest"
+    }
+  ],
+  "youtube.get_video_sub_comment_v1": [
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "来自一级评论响应的回复游标。"
+    },
+    {
+      "name": "languageCode",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "响应数据的语言偏好。",
+      "default": "zh-CN"
+    },
+    {
+      "name": "countryCode",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "响应数据的地区代码。",
+      "default": "US"
+    }
   ]
 }

+ 113 - 0
claude-code/claude-code-voc-intelligence/mcp/catalog/params/zhihu.json

@@ -787,5 +787,118 @@
       "default": "",
       "desc": "会话ID/Session ID"
     }
+  ],
+  "zhihu.get_column_article_detail_v1": [
+    {
+      "name": "id",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "文章ID"
+    }
+  ],
+  "zhihu.get_answer_list_v1": [
+    {
+      "name": "questionId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "问题 ID"
+    },
+    {
+      "name": "cursor",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "上一结果的翻页游标。",
+      "default": ""
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "起始偏移量,从0开始。",
+      "default": 0
+    },
+    {
+      "name": "order",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "答案的排序标准。\n\n可用值:\n- `_default`:默认排序。\n- `_updated`:按更新时间排序。",
+      "default": "_updated"
+    },
+    {
+      "name": "sessionId",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "先前结果中的会话 ID。",
+      "default": ""
+    }
+  ],
+  "zhihu.search_v1": [
+    {
+      "name": "keyword",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "搜索关键词。"
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "起始偏移量,从0开始。",
+      "default": 0
+    },
+    {
+      "name": "showAllTopics",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "是否显示所有话题。\n\n可选值:\n- `FALSE`: 不显示话题。\n- `TRUE`: 显示所有话题。 可选值: FALSE, TRUE",
+      "default": "FALSE"
+    },
+    {
+      "name": "vertical",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "结果类型筛选。\n\n可选值:\n- `answer`: 仅回答。\n- `article`: 仅文章。\n- `zvideo`: 仅视频。 可选值: answer, article, zvideo"
+    },
+    {
+      "name": "sort",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "排序条件。\n\n可选值:\n- `upvoted_count`: 最多点赞。\n- `created_time`: 最新发布。 可选值: upvoted_count, created_time"
+    },
+    {
+      "name": "timeInterval",
+      "in": "query",
+      "type": "string",
+      "required": false,
+      "desc": "发布时间间隔筛选。\n\n可选值:\n- `a_day`: 一天内。\n- `a_week`: 一周内。\n- `a_month`: 一个月内。\n- `three_months`: 三个月内。\n- `half_a_year`: 半年内。\n- `a_year`: 一年内。 可选值: a_day, a_week, a_month, three_months, half_a_year, a_year"
+    }
+  ],
+  "zhihu.get_column_article_list_v1": [
+    {
+      "name": "columnId",
+      "in": "query",
+      "type": "string",
+      "required": true,
+      "desc": "列 ID"
+    },
+    {
+      "name": "offset",
+      "in": "query",
+      "type": "integer",
+      "required": false,
+      "desc": "起始偏移量,从0开始。",
+      "default": 0
+    }
   ]
 }

+ 6971 - 2
claude-code/claude-code-voc-intelligence/mcp/catalog/voc-social-endpoints.json

@@ -1,6 +1,6 @@
 {
-  "version": "1.4.0",
-  "updatedAt": "2026-06-26",
+  "version": "1.6.0",
+  "updatedAt": "2026-06-28",
   "gateway": {
     "social": {
       "baseUrl": "https://server.fmode.cn/api/voc-social",
@@ -17,6 +17,14 @@
       "billing": "每次成功调用按平台规则计费一次;计费优先走 NewAPI(fmode-api)额度,sk- token 鉴权失败时自动回退平台 sessionToken。402=余额不足(引导 fmode-api 充值),401=token 缺失/失效,403=账号禁用/无权限。",
       "note": "创作者数据网关:清单内已登记抖音星图、小红书蒲公英(PGY)的创作者搜索、画像、受众/粉丝分布、内容与评论关键词、笔记/视频绩效与性价比等结构化数据(channel=ecommerce)。这是公开市场层面的创作者经营数据,服务创作者生态理解、竞对达人布局、受众匹配与内容方向验证,不用于替用户做投放采买决策。endpoint 带 channel=\"ecommerce\" 时 voc_api_call 自动选用本网关;清单里没有的接口可直接用 voc_api_call 传 rawPath + method + params + channel=\"ecommerce\" 调用,无需改代码。",
       "rawPathHint": "调用未登记的电商接口时,把 proxyPath 传给 voc_api_call 的 rawPath 并加 channel=\"ecommerce\",例如 douyin-xingtu/gw/api/data_sp/author_cp_info/v1。"
+    },
+    "overseas": {
+      "baseUrl": "https://server.fmode.cn/api/voc-ecom",
+      "auth": "Authorization: Bearer <NewAPI fmode-api token(sk- 开头,优先)或平台 sessionToken(回退)>",
+      "upstream": "公司 voc-ecom 代理,以 /forward 信封式按 path 透传到海外电商数据上游,对外不暴露任何上游供应商名称。",
+      "billing": "每次成功调用按平台规则计费一次(计费优先走 NewAPI/fmode-api 额度,sk- token 鉴权失败时自动回退平台 sessionToken)。402=余额不足,401=token 缺失/失效,403=账号禁用/无权限。",
+      "note": "海外电商选品数据网关:覆盖亚马逊海外站点的类目树/Best Seller、产品详情与销量历史、ABA 关键词、评论采集、数据监控订阅等结构化选品数据(channel=overseas)。endpoint 带 channel=\"overseas\" 时 voc_api_call 自动选用本网关;清单里没有的接口可直接用 voc_api_call 传 rawPath(如 /api/XXX)+ channel=\"overseas\" 调用,无需改代码。多数接口需在 query 传 domain(站点),其余参数走 body。",
+      "rawPathHint": "调用未登记的海外电商接口时,把上游路径填到 voc_api_call 的 rawPath(如 /api/ProductRequest)并加 channel=\"overseas\",domain 放入 params/query,业务参数放入 body。"
     }
   },
   "platforms": [
@@ -143,6 +151,192 @@
       "status": "verified",
       "idField": "userId",
       "detailParam": "userId"
+    },
+    {
+      "key": "overseas-ecom",
+      "label": "亚马逊(海外电商选品)",
+      "status": "verified",
+      "channel": "overseas"
+    },
+    {
+      "key": "search",
+      "label": "跨平台搜索",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "taobao",
+      "label": "淘宝天猫",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "xiaohongshu_pgy",
+      "label": "小红书蒲公英",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "douyin_ec",
+      "label": "抖音电商",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "douyin_xingtu",
+      "label": "抖音星图",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "kuaishou",
+      "label": "快手",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "weixin",
+      "label": "微信公众号",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "weixin_channels",
+      "label": "微信视频号",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "weibo",
+      "label": "微博",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "bilibili",
+      "label": "哔哩哔哩",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "dewu",
+      "label": "得物",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "jd",
+      "label": "京东",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "xianyu",
+      "label": "闲鱼",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "1688",
+      "label": "1688",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "douban",
+      "label": "豆瓣电影",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "tiktok",
+      "label": "TikTok",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "tiktok_shop",
+      "label": "TikTok Shop",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "youku",
+      "label": "优酷",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "instagram",
+      "label": "Instagram",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "youtube",
+      "label": "YouTube",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "reddit",
+      "label": "Reddit",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "toutiao",
+      "label": "今日头条",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "zhihu",
+      "label": "知乎",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "amazon",
+      "label": "亚马逊",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "facebook",
+      "label": "Facebook",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "twitter",
+      "label": "Twitter/X",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "beike",
+      "label": "贝壳",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "imdb",
+      "label": "IMDb",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "web",
+      "label": "网页",
+      "status": "available",
+      "channel": "ecommerce"
+    },
+    {
+      "key": "llm",
+      "label": "LLM",
+      "status": "available",
+      "channel": "ecommerce"
     }
   ],
   "paramStore": "params/<platform>.json(按需取,每个文件以接口 id 为键存完整参数 schema)",
@@ -21408,6 +21602,6781 @@
         "detail"
       ],
       "billing": 1
+    },
+    {
+      "id": "overseas-ecom.category_tree",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "category",
+      "title": "类目树查询",
+      "summary": "获取指定海外站点的亚马逊分类层级结构(类目树),用于按类目自上而下选品与定位 NodeId。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/CategoryTree",
+      "requiredParams": [
+        "domain"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "类目市场",
+        "选品",
+        "amazon",
+        "category"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.category_top100",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "category",
+      "title": "类目 Best Seller Top100 产品查询",
+      "summary": "获取指定类目 NodeId 的 Best Seller Top100 产品及相关数据,支持历史区间回看。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/CategoryRequest",
+      "requiredParams": [
+        "domain",
+        "NodeId"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "类目市场",
+        "选品",
+        "amazon",
+        "category"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.category_products",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "category",
+      "title": "类目下热销产品查询",
+      "summary": "查询类目下更多热销产品(长尾类目最多1000+),返回近7日该类目下更新过的产品。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/CategoryProducts",
+      "requiredParams": [
+        "domain",
+        "NodeId"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "类目市场",
+        "选品",
+        "amazon",
+        "category"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.product_request",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "product",
+      "title": "产品详情查询(Listing)",
+      "summary": "按 ASIN 查询产品 Listing 详情,支持多 ASIN(最多10个,按实际 ASIN 数量计费)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ProductRequest",
+      "requiredParams": [
+        "domain",
+        "ASIN"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "产品",
+        "Listing",
+        "选品",
+        "amazon",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.product_query",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "product",
+      "title": "多维度查产品",
+      "summary": "支持单条件(Query=1,配合 QueryType 1-16 + Pattern)或多条件组合(Query=2)查询产品。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ProductQuery",
+      "requiredParams": [
+        "domain"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "产品",
+        "Listing",
+        "选品",
+        "amazon",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.asin_sales_volume",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "product",
+      "title": "产品子体销量历史",
+      "summary": "查询产品官方公布的子体销量历史数据(不同站点最早从2023年起)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/AsinSalesVolume",
+      "requiredParams": [
+        "domain",
+        "ASIN"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "产品",
+        "Listing",
+        "选品",
+        "amazon",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.product_variation_history",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "product",
+      "title": "Listing 子体变化历史",
+      "summary": "查询 Listing 子体变化历史(暂仅支持近1个月数据)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ProductVariationHistory",
+      "requiredParams": [
+        "domain",
+        "ASIN"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "产品",
+        "Listing",
+        "选品",
+        "amazon",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.product_reviews_collection",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "product",
+      "title": "产品评论实时采集(触发任务)",
+      "summary": "触发产品评论实时采集任务(消耗积分),采集结果通过『产品评论查询』获取;同一产品成功后2小时内不可重复采集。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ProductReviewsCollection",
+      "requiredParams": [
+        "domain",
+        "ASIN"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "产品",
+        "Listing",
+        "选品",
+        "amazon",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.product_reviews_collection_status",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "product",
+      "title": "评论采集任务状态查询",
+      "summary": "查询评论实时采集任务的执行状态。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ProductReviewsCollectionStatusQuery",
+      "requiredParams": [
+        "domain",
+        "ASIN",
+        "Update"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "产品",
+        "Listing",
+        "选品",
+        "amazon",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.product_reviews_query",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "product",
+      "title": "产品评论查询",
+      "summary": "查询产品评论数据(需先通过采集任务采集)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ProductReviewsQuery",
+      "requiredParams": [
+        "domain",
+        "ASIN"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "产品",
+        "Listing",
+        "选品",
+        "amazon",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.similar_product_request",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "product",
+      "title": "图片搜相似产品(触发任务)",
+      "summary": "通过产品图片实时搜索亚马逊相似产品(消耗积分,约5分钟),结果通过『图搜产品结果查询』获取。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/SimilarProductRealtimeRequest",
+      "requiredParams": [
+        "domain",
+        "Image"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "产品",
+        "Listing",
+        "选品",
+        "amazon",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.similar_product_status",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "product",
+      "title": "搜图相似产品任务状态查询",
+      "summary": "查询搜图相似产品任务的执行状态。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/SimilarProductRealtimeRequestStatusQuery",
+      "requiredParams": [
+        "domain",
+        "Update"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "产品",
+        "Listing",
+        "选品",
+        "amazon",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.similar_product_collection",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "product",
+      "title": "图搜产品结果查询",
+      "summary": "查询图搜相似产品任务的结果。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/SimilarProductRealtimeRequestCollection",
+      "requiredParams": [
+        "domain",
+        "TaskId"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "产品",
+        "Listing",
+        "选品",
+        "amazon",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.keyword_query",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "keyword",
+      "title": "ABA 热搜关键词清单查询",
+      "summary": "获取当前 ABA 热搜关键词清单(按搜索排名区间筛选)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/KeywordQuery",
+      "requiredParams": [
+        "domain",
+        "Pattern"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "关键词",
+        "ABA",
+        "amazon",
+        "keyword"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.keyword_search_results",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "keyword",
+      "title": "近15日关键词搜索结果产品",
+      "summary": "获取近15日某 ABA 关键词搜索结果产品。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/KeywordSearchResults",
+      "requiredParams": [
+        "domain",
+        "Keyword"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "关键词",
+        "ABA",
+        "amazon",
+        "keyword"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.keyword_request",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "keyword",
+      "title": "关键词详情查询",
+      "summary": "查询单个关键词的详情数据(搜索量、趋势、转化等)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/KeywordRequest",
+      "requiredParams": [
+        "domain",
+        "Keyword"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "关键词",
+        "ABA",
+        "amazon",
+        "keyword"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.keyword_search_result_trend",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "keyword",
+      "title": "关键词搜索结果前3页产品统计趋势",
+      "summary": "获取某 ABA 关键词搜索结果前3页产品的统计趋势。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/KeywordSearchResultTrend",
+      "requiredParams": [
+        "domain",
+        "Keyword"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "关键词",
+        "ABA",
+        "amazon",
+        "keyword"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.category_request_keyword",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "keyword",
+      "title": "按类目查 ABA 关键词",
+      "summary": "按底层类目 NodeId 查询该类目相关的 ABA 关键词。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/CategoryRequestKeyword",
+      "requiredParams": [
+        "domain",
+        "NodeId"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "关键词",
+        "ABA",
+        "amazon",
+        "keyword"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.asin_request_keyword",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "keyword",
+      "title": "ASIN 近30天热搜关键词曝光",
+      "summary": "查询某 ASIN 近30天在哪些关键词搜索结果前3页曝光。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ASINRequestKeyword",
+      "requiredParams": [
+        "domain",
+        "ASIN"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "关键词",
+        "ABA",
+        "amazon",
+        "keyword"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.keyword_product_ranking",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "keyword",
+      "title": "关键词历史月份搜索结果产品(仅美国站)",
+      "summary": "查询关键词历史月份搜索结果产品(最长近两年,仅支持美国站 ABA 关键词)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/KeywordProductRanking",
+      "requiredParams": [
+        "domain",
+        "Keyword",
+        "Month"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "关键词",
+        "ABA",
+        "amazon",
+        "keyword"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.asin_keyword_ranking",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "keyword",
+      "title": "ASIN 在指定关键词下排名历史(仅美国站)",
+      "summary": "查询某 ASIN 在指定 ABA 关键词下的排名历史(最长近两年,仅美国站)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ASINKeywordRanking",
+      "requiredParams": [
+        "domain",
+        "Keyword",
+        "ASIN"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "关键词",
+        "ABA",
+        "amazon",
+        "keyword"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.keyword_batch_subscription",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "关键词批量监控订阅",
+      "summary": "定时监控关键词搜索排名(消耗积分,结果最多保存30日)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/KeywordBatchSubscription",
+      "requiredParams": [
+        "domain",
+        "Keyword",
+        "Mode",
+        "Area",
+        "Page",
+        "Period"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.keyword_tasks",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "关键词监控任务查询",
+      "summary": "查看全部有效(非删除)的关键词监控任务。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/KeywordTasks",
+      "requiredParams": [
+        "domain"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.keyword_batch_task_update",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "关键词批量监控任务修改",
+      "summary": "修改关键词监控任务配置/状态(暂停、启动、删除等)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/KeywordBatchTaskUpdate",
+      "requiredParams": [
+        "domain",
+        "TaskId",
+        "Update",
+        "Mode",
+        "Area",
+        "Page",
+        "Period"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.keyword_batch_schedule_list",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "关键词监控执行批次查询",
+      "summary": "查询关键词监控的全部执行任务批次。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/KeywordBatchScheduleList",
+      "requiredParams": [
+        "domain",
+        "TaskId"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.keyword_batch_schedule_detail",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "关键词监控搜索结果 ASIN 列表提取",
+      "summary": "提取某次关键词监控搜索结果的全部 ASIN 列表数据。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/KeywordBatchScheduleDetail",
+      "requiredParams": [
+        "domain",
+        "ScheduleId"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.bestseller_subscription",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "畅销榜监控订阅",
+      "summary": "注册畅销榜监控任务(需先关注类目,每天监控1次,结果最多保存30日)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/BestSellerListSubscription",
+      "requiredParams": [
+        "domain",
+        "Nodeid",
+        "Range",
+        "Period",
+        "BestSellerListType"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.bestseller_task",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "畅销榜监控任务查询",
+      "summary": "查看全部畅销榜监控任务。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/BestSellerListTask",
+      "requiredParams": [
+        "domain"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.bestseller_delete",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "畅销榜监控任务删除",
+      "summary": "删除已注册的畅销榜监控任务。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/BestSellerListDelete",
+      "requiredParams": [
+        "domain",
+        "Nodeid",
+        "BestSellerListType"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.bestseller_data_collect",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "畅销榜监控数据查询",
+      "summary": "查询已监控榜单的历史数据(最长2年)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/BestSellerListDataCollect",
+      "requiredParams": [
+        "domain",
+        "Nodeid",
+        "BestSellerListType"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.product_seller_tasks",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "跟卖监控任务查询",
+      "summary": "查看全部有效(非删除)的跟卖监控任务。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ProductSellerTasks",
+      "requiredParams": [
+        "domain"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.product_seller_task_update",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "跟卖监控任务修改",
+      "summary": "修改跟卖监控任务配置/状态(暂停、启动、删除等)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ProductSellerTaskUpdate",
+      "requiredParams": [
+        "domain",
+        "TaskId",
+        "Update",
+        "Period"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.product_seller_schedule_list",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "跟卖监控执行批次查询",
+      "summary": "查询跟卖监控的全部执行任务批次。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ProductSellerTaskScheduleList",
+      "requiredParams": [
+        "domain",
+        "TaskId"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.product_seller_schedule_detail",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "跟卖监控结果数据提取",
+      "summary": "提取某次跟卖监控结果的全部数据。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ProductSellerTaskScheduleDetail",
+      "requiredParams": [
+        "domain",
+        "ScheduleId"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.asin_subscription",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "ASIN 更新订阅",
+      "summary": "订阅 ASIN 更新(消耗积分,单次最多100个 ASIN)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ASINSubscription",
+      "requiredParams": [
+        "domain",
+        "Asins"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.asin_subscription_query",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "已订阅 ASIN 清单查询",
+      "summary": "查看已订阅的 ASIN 清单。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ASINSubscriptionQuery",
+      "requiredParams": [
+        "domain"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "overseas-ecom.asin_subscription_collection",
+      "platform": "overseas-ecom",
+      "channel": "overseas",
+      "wave": "monitor",
+      "title": "订阅 ASIN 产品数据查询",
+      "summary": "查看已订阅 ASIN 的产品数据(仅当前有效订阅 ASIN)。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "/api/ASINSubscriptionCollection",
+      "requiredParams": [
+        "domain",
+        "Asins"
+      ],
+      "tags": [
+        "海外电商",
+        "亚马逊",
+        "数据监控",
+        "订阅",
+        "amazon",
+        "monitor"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "search.search_v1",
+      "platform": "search",
+      "channel": "ecommerce",
+      "title": "跨平台搜索·跨平台搜索",
+      "summary": "获取跨平台社交媒体搜索数据,包括小红书、抖音、快手、微信、哔哩哔哩、微博和知乎结果,用于趋势研究和监测。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "search/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "search",
+        "跨平台搜索",
+        "全平台搜索",
+        "社媒搜索",
+        "社交媒体",
+        "Social Media",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "taobao.get_item_detail_v1",
+      "platform": "taobao",
+      "channel": "ecommerce",
+      "title": "淘宝天猫·商品详情",
+      "summary": "获取淘宝和天猫商品详情数据,包括价格、图片和店铺详情,用于商品研究、目录监控和电商分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "taobao/get-item-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "taobao",
+        "淘宝天猫",
+        "淘宝",
+        "天猫",
+        "tmall",
+        "淘宝和天猫",
+        "Taobao and Tmall",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "taobao.get_item_detail_v2",
+      "platform": "taobao",
+      "channel": "ecommerce",
+      "title": "淘宝天猫·商品详情",
+      "summary": "通过任务驱动的v2流程获取淘宝和天猫商品详情数据。如果数据在短暂等待后仍未就绪,响应将返回待处理任务状态。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "taobao/get-item-detail/v2",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "taobao",
+        "淘宝天猫",
+        "淘宝",
+        "天猫",
+        "tmall",
+        "淘宝和天猫",
+        "Taobao and Tmall",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "taobao.get_item_detail_v4",
+      "platform": "taobao",
+      "channel": "ecommerce",
+      "title": "淘宝天猫·商品详情",
+      "summary": "获取淘宝和天猫商品详情数据,包括价格、图片和店铺详情,用于商品研究、目录监控和电商分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "taobao/get-item-detail/v4",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "taobao",
+        "淘宝天猫",
+        "淘宝",
+        "天猫",
+        "tmall",
+        "淘宝和天猫",
+        "Taobao and Tmall",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "taobao.get_item_detail_v5",
+      "platform": "taobao",
+      "channel": "ecommerce",
+      "title": "淘宝天猫·商品详情",
+      "summary": "获取淘宝和天猫商品详情数据,包括价格、图片和店铺详情,用于商品研究、目录监控和电商分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "taobao/get-item-detail/v5",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "taobao",
+        "淘宝天猫",
+        "淘宝",
+        "天猫",
+        "tmall",
+        "淘宝和天猫",
+        "Taobao and Tmall",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "taobao.get_item_detail_v9",
+      "platform": "taobao",
+      "channel": "ecommerce",
+      "title": "淘宝天猫·商品详情",
+      "summary": "获取淘宝和天猫商品详情数据,包括价格、图片和店铺详情,用于商品研究、目录监控和电商分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "taobao/get-item-detail/v9",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "taobao",
+        "淘宝天猫",
+        "淘宝",
+        "天猫",
+        "tmall",
+        "淘宝和天猫",
+        "Taobao and Tmall",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "taobao.get_item_comment_v3",
+      "platform": "taobao",
+      "channel": "ecommerce",
+      "title": "淘宝天猫·商品评价",
+      "summary": "获取淘宝和天猫商品评价数据,包括评分、时间戳和评论者信号,用于反馈分析和商品研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "taobao/get-item-comment/v3",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "taobao",
+        "淘宝天猫",
+        "淘宝",
+        "天猫",
+        "tmall",
+        "淘宝和天猫",
+        "Taobao and Tmall",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "taobao.get_social_feed_v1",
+      "platform": "taobao",
+      "channel": "ecommerce",
+      "title": "淘宝天猫·商品问答",
+      "summary": "获取淘宝和天猫商品问答数据,包括买家提问及相关社交内容,用于产品研究、客户关注度分析和电商监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "taobao/get-social-feed/v1",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "taobao",
+        "淘宝天猫",
+        "淘宝",
+        "天猫",
+        "tmall",
+        "淘宝和天猫",
+        "Taobao and Tmall",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "taobao.get_shop_item_list_v1",
+      "platform": "taobao",
+      "channel": "ecommerce",
+      "title": "淘宝天猫·店铺商品列表",
+      "summary": "获取淘宝和天猫店铺商品列表数据,包括商品标题、价格和图片,用于卖家研究和目录跟踪。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "taobao/get-shop-item-list/v1",
+      "params": [],
+      "requiredParams": [
+        "userId"
+      ],
+      "tags": [
+        "taobao",
+        "淘宝天猫",
+        "淘宝",
+        "天猫",
+        "tmall",
+        "淘宝和天猫",
+        "Taobao and Tmall",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "taobao.get_shop_item_list_v2",
+      "platform": "taobao",
+      "channel": "ecommerce",
+      "title": "淘宝天猫·店铺商品列表",
+      "summary": "获取淘宝和天猫店铺商品列表数据,包括商品标题、价格和图片,用于卖家研究和目录跟踪。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "taobao/get-shop-item-list/v2",
+      "params": [],
+      "requiredParams": [
+        "userId",
+        "shopId"
+      ],
+      "tags": [
+        "taobao",
+        "淘宝天猫",
+        "淘宝",
+        "天猫",
+        "tmall",
+        "淘宝和天猫",
+        "Taobao and Tmall",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "taobao.get_shop_item_list_v3",
+      "platform": "taobao",
+      "channel": "ecommerce",
+      "title": "淘宝天猫·店铺商品列表",
+      "summary": "获取淘宝和天猫店铺商品列表数据,包括商品标题、价格和图片,用于卖家研究和目录跟踪。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "taobao/get-shop-item-list/v3",
+      "params": [],
+      "requiredParams": [
+        "userId",
+        "shopId"
+      ],
+      "tags": [
+        "taobao",
+        "淘宝天猫",
+        "淘宝",
+        "天猫",
+        "tmall",
+        "淘宝和天猫",
+        "Taobao and Tmall",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "taobao.get_item_sale_v1",
+      "platform": "taobao",
+      "channel": "ecommerce",
+      "title": "淘宝天猫·商品销量",
+      "summary": "获取淘宝和天猫商品销量数据,用于销售追踪、商品研究和电商监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "taobao/get-item-sale/v1",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "taobao",
+        "淘宝天猫",
+        "淘宝",
+        "天猫",
+        "tmall",
+        "淘宝和天猫",
+        "Taobao and Tmall",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "taobao.search_item_list_v1",
+      "platform": "taobao",
+      "channel": "ecommerce",
+      "title": "淘宝天猫·商品搜索",
+      "summary": "获取淘宝和天猫商品搜索数据,包括标题、价格和图片,用于商品发现。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "taobao/search-item-list/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "taobao",
+        "淘宝天猫",
+        "淘宝",
+        "天猫",
+        "tmall",
+        "淘宝和天猫",
+        "Taobao and Tmall",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.hot_search_v1",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·热搜",
+      "summary": "获取小红书热门搜索数据,包括热门笔记和互动指标,用于内容趋势发现。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/hot-search/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.search_note_v1",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·笔记搜索",
+      "summary": "获取小红书笔记搜索数据,包括笔记摘要、作者、媒体、发布时间、互动信号和分页数据,用于话题发现、趋势监测、创作者研究和内容分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/search-note/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.search_note_v2",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·笔记搜索",
+      "summary": "获取小红书(RedNote)笔记搜索数据,包括摘要、作者和媒体,用于话题发现。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/search-note/v2",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.search_note_v3",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·笔记搜索",
+      "summary": "获取小红书(RedNote)笔记搜索数据,包括摘要、作者和媒体,用于话题发现。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/search-note/v3",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.search_note_v4",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·笔记搜索",
+      "summary": "获取小红书(RedNote)笔记搜索数据,包括摘要、作者和媒体,用于话题发现。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/search-note/v4",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.search_user_v2",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·用户搜索",
+      "summary": "获取小红书(RedNote)用户搜索数据,包括资料元数据和公开信号,用于创作者发现和账户研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/search-user/v2",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_user_note_list_v1",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·用户发布笔记",
+      "summary": "获取小红书用户发布笔记数据,包括笔记元数据、封面、发布时间、分页游标和互动信号,用于账号监控、创作者研究和内容分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-user-note-list/v1",
+      "params": [],
+      "requiredParams": [
+        "userId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_user_note_list_v2",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·用户发布笔记",
+      "summary": "获取小红书(RedNote)用户发布笔记数据,包括笔记元数据、封面和发布时间,用于账户监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-user-note-list/v2",
+      "params": [],
+      "requiredParams": [
+        "userId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_user_note_list_v3",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·用户发布笔记",
+      "summary": "获取小红书(RedNote)用户发布笔记数据,包括笔记元数据、封面和发布时间,用于账户监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-user-note-list/v3",
+      "params": [],
+      "requiredParams": [
+        "userId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_user_note_list_v4",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·用户发布笔记",
+      "summary": "获取小红书(RedNote)用户发布笔记数据,包括笔记元数据、封面和发布时间,用于账户监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-user-note-list/v4",
+      "params": [],
+      "requiredParams": [
+        "userId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_note_detail_v1",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·笔记详情",
+      "summary": "获取小红书(RedNote)笔记详情数据,包括媒体和互动指标,用于内容分析、归档和活动研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-note-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "noteId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_note_detail_v2",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·笔记详情",
+      "summary": "获取小红书(RedNote)笔记详情数据,包括媒体和互动指标,用于内容分析、归档和活动研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-note-detail/v2",
+      "params": [],
+      "requiredParams": [
+        "noteId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_note_detail_v3",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·笔记详情",
+      "summary": "获取小红书(RedNote)笔记详情数据,包括媒体和互动指标,用于内容分析、归档和活动研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-note-detail/v3",
+      "params": [],
+      "requiredParams": [
+        "noteId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_note_detail_v4",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·笔记详情",
+      "summary": "获取小红书(RedNote)笔记详情数据,包括媒体和互动指标,用于内容分析、归档和活动研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-note-detail/v4",
+      "params": [],
+      "requiredParams": [
+        "noteId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_note_detail_v5",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·笔记详情",
+      "summary": "获取小红书(RedNote)笔记详情数据,包括媒体和互动指标,用于内容分析、归档和活动研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-note-detail/v5",
+      "params": [],
+      "requiredParams": [
+        "noteId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_note_detail_v7",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·笔记详情",
+      "summary": "获取小红书(RedNote)笔记详情数据,包括媒体和互动指标,用于内容分析、归档和活动研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-note-detail/v7",
+      "params": [],
+      "requiredParams": [
+        "noteId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "xiaohongshu.get_note_comment_v2",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·笔记评论",
+      "summary": "获取小红书(RedNote)笔记评论数据,包括文本、作者和时间戳,用于反馈分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-note-comment/v2",
+      "params": [],
+      "requiredParams": [
+        "noteId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_note_comment_v3",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·笔记评论",
+      "summary": "获取小红书(RedNote)笔记评论数据,包括文本、作者和时间戳,用于反馈分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-note-comment/v3",
+      "params": [],
+      "requiredParams": [
+        "noteId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_note_comment_v4",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·笔记评论",
+      "summary": "获取小红书(RedNote)笔记评论数据,包括文本、作者和时间戳,用于反馈分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-note-comment/v4",
+      "params": [],
+      "requiredParams": [
+        "noteId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_note_sub_comment_v2",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·评论回复",
+      "summary": "获取小红书(RedNote)评论回复数据,包括文本、作者和时间戳,用于线程分析和反馈研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-note-sub-comment/v2",
+      "params": [],
+      "requiredParams": [
+        "noteId",
+        "commentId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_user_v3",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·用户资料",
+      "summary": "获取小红书(RedNote)用户资料数据,包括粉丝数和简介详情,用于创作者研究、账户分析和竞品监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-user/v3",
+      "params": [],
+      "requiredParams": [
+        "userId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_user_v4",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·用户资料",
+      "summary": "获取小红书(RedNote)用户资料数据,包括粉丝数和简介详情,用于创作者研究、账户分析和竞品监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-user/v4",
+      "params": [],
+      "requiredParams": [
+        "userId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.search_recommend_v1",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·关键词建议",
+      "summary": "获取小红书(RedNote)关键词建议数据,包括建议查询、关键词变体和查询元数据,用于扩展内容研究和SEO/PSEO工作流的关键词集,并通过平台推荐术语提高搜索覆盖率。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/search-recommend/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.get_topic_note_list_v1",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·话题笔记列表",
+      "summary": "获取小红书话题笔记列表数据,包括话题下的笔记,用于话题监控和内容发现。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/get-topic-note-list/v1",
+      "params": [],
+      "requiredParams": [
+        "topicId"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu.share_url_transfer_v1",
+      "platform": "xiaohongshu",
+      "channel": "ecommerce",
+      "title": "小红书·分享链接解析",
+      "summary": "获取小红书(RedNote)分享链接解析数据,包括帮助提取笔记ID,用于下游笔记和评论工作流。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu/share-url-transfer/v1",
+      "params": [],
+      "requiredParams": [
+        "shareUrl"
+      ],
+      "tags": [
+        "xiaohongshu",
+        "小红书",
+        "小红薯",
+        "小红暑",
+        "rednote",
+        "red note",
+        "xhs",
+        "little red book",
+        "Xiaohongshu (RedNote)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xiaohongshu_pgy.get_kol_info_v1",
+      "platform": "xiaohongshu_pgy",
+      "channel": "ecommerce",
+      "title": "小红书蒲公英·创作者资料",
+      "summary": "获取小红书蒲公英创作者资料数据,包括受众和定价数据,用于影响者审核、基准分析和活动规划。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu-pgy/get-kol-info/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "xiaohongshu_pgy",
+        "小红书蒲公英",
+        "蒲公英",
+        "pgy",
+        "xiaohongshu pgy",
+        "Xiaohongshu Creator Marketplace (Pugongying)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "xiaohongshu_pgy.get_kol_note_rate_v1",
+      "platform": "xiaohongshu_pgy",
+      "channel": "ecommerce",
+      "title": "小红书蒲公英·笔记表现指标",
+      "summary": "获取小红书蒲公英笔记表现指标数据,包括核心指标、趋势信号和表现指标,用于内容效率分析、创作者基准测试和活动策划。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu-pgy/get-kol-note-rate/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "xiaohongshu_pgy",
+        "小红书蒲公英",
+        "蒲公英",
+        "pgy",
+        "xiaohongshu pgy",
+        "Xiaohongshu Creator Marketplace (Pugongying)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "xiaohongshu_pgy.get_kol_fans_portrait_v1",
+      "platform": "xiaohongshu_pgy",
+      "channel": "ecommerce",
+      "title": "小红书蒲公英·粉丝分布",
+      "summary": "获取小红书蒲公英粉丝分布数据,包括受众人口统计、兴趣和分布指标,用于创作者评估、活动策划和创作者基准测试。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu-pgy/get-kol-fans-portrait/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "xiaohongshu_pgy",
+        "小红书蒲公英",
+        "蒲公英",
+        "pgy",
+        "xiaohongshu pgy",
+        "Xiaohongshu Creator Marketplace (Pugongying)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "xiaohongshu_pgy.get_kol_fans_summary_v1",
+      "platform": "xiaohongshu_pgy",
+      "channel": "ecommerce",
+      "title": "小红书蒲公英·粉丝摘要",
+      "summary": "获取小红书蒲公英粉丝摘要数据,包括核心指标、趋势信号和表现指标,用于创作者评估、活动策划和创作者基准测试。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu-pgy/get-kol-fans-summary/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "xiaohongshu_pgy",
+        "小红书蒲公英",
+        "蒲公英",
+        "pgy",
+        "xiaohongshu pgy",
+        "Xiaohongshu Creator Marketplace (Pugongying)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "xiaohongshu_pgy.get_kol_fans_trend_v1",
+      "platform": "xiaohongshu_pgy",
+      "channel": "ecommerce",
+      "title": "小红书蒲公英·粉丝增长历史",
+      "summary": "获取小红书蒲公英粉丝增长历史数据,包括随时间变化的受众历史变化,用于创作者评估、活动策划和创作者基准测试。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu-pgy/get-kol-fans-trend/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId",
+        "dateType",
+        "increaseType"
+      ],
+      "tags": [
+        "xiaohongshu_pgy",
+        "小红书蒲公英",
+        "蒲公英",
+        "pgy",
+        "xiaohongshu pgy",
+        "Xiaohongshu Creator Marketplace (Pugongying)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "xiaohongshu_pgy.get_kol_data_summary_v2",
+      "platform": "xiaohongshu_pgy",
+      "channel": "ecommerce",
+      "title": "小红书蒲公英·数据摘要",
+      "summary": "获取小红书蒲公英摘要数据,包括活动、互动和受众增长,用于创作者评估、活动策划和创作者基准测试。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu-pgy/get-kol-data-summary/v2",
+      "params": [],
+      "requiredParams": [
+        "kolId",
+        "business"
+      ],
+      "tags": [
+        "xiaohongshu_pgy",
+        "小红书蒲公英",
+        "蒲公英",
+        "pgy",
+        "xiaohongshu pgy",
+        "Xiaohongshu Creator Marketplace (Pugongying)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "xiaohongshu_pgy.get_kol_cost_effective_v1",
+      "platform": "xiaohongshu_pgy",
+      "channel": "ecommerce",
+      "title": "小红书蒲公英·成本效益分析",
+      "summary": "获取小红书蒲公英成本效益分析数据,包括定价、覆盖范围和互动效率指标,用于活动评估。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu-pgy/get-kol-cost-effective/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "xiaohongshu_pgy",
+        "小红书蒲公英",
+        "蒲公英",
+        "pgy",
+        "xiaohongshu pgy",
+        "Xiaohongshu Creator Marketplace (Pugongying)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "xiaohongshu_pgy.get_note_detail_v1",
+      "platform": "xiaohongshu_pgy",
+      "channel": "ecommerce",
+      "title": "小红书蒲公英·笔记详情",
+      "summary": "获取小红书蒲公英笔记详情数据,包括媒体和互动信号,用于内容分析、归档和活动回顾。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu-pgy/get-note-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "noteId"
+      ],
+      "tags": [
+        "xiaohongshu_pgy",
+        "小红书蒲公英",
+        "蒲公英",
+        "pgy",
+        "xiaohongshu pgy",
+        "Xiaohongshu Creator Marketplace (Pugongying)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "xiaohongshu_pgy.get_kol_core_data_v1",
+      "platform": "xiaohongshu_pgy",
+      "channel": "ecommerce",
+      "title": "小红书蒲公英·创作者核心指标",
+      "summary": "获取小红书蒲公英创作者核心指标数据,包括互动和内容指标,用于对标、审核和活动策划。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xiaohongshu-pgy/get-kol-core-data/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "xiaohongshu_pgy",
+        "小红书蒲公英",
+        "蒲公英",
+        "pgy",
+        "xiaohongshu pgy",
+        "Xiaohongshu Creator Marketplace (Pugongying)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin.search_video_v4",
+      "platform": "douyin",
+      "channel": "ecommerce",
+      "title": "抖音·视频搜索",
+      "summary": "获取抖音视频搜索数据,包括元数据和互动信号,用于内容发现、趋势研究和竞争监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin/search-video/v4",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "douyin",
+        "抖音",
+        "tiktok china",
+        "国内版tiktok",
+        "Douyin (TikTok China)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin.hot_search_v1",
+      "platform": "douyin",
+      "channel": "ecommerce",
+      "title": "抖音·热搜",
+      "summary": "获取抖音热门内容搜索数据,包括排名内容项、创作者信号、互动指标、丰富的视频元数据和分页信息,用于趋势发现、内容研究和活动策划。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin/hot-search/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "douyin",
+        "抖音",
+        "tiktok china",
+        "国内版tiktok",
+        "Douyin (TikTok China)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin.search_user_v2",
+      "platform": "douyin",
+      "channel": "ecommerce",
+      "title": "抖音·用户搜索",
+      "summary": "获取抖音用户搜索数据,包括档案元数据和粉丝信号,用于创作者发现和账号研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin/search-user/v2",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "douyin",
+        "抖音",
+        "tiktok china",
+        "国内版tiktok",
+        "Douyin (TikTok China)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin.get_user_video_list_v3",
+      "platform": "douyin",
+      "channel": "ecommerce",
+      "title": "抖音·用户发布视频",
+      "summary": "获取抖音用户发布视频数据,包括字幕、封面和发布时间,用于账号监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin/get-user-video-list/v3",
+      "params": [],
+      "requiredParams": [
+        "secUid"
+      ],
+      "tags": [
+        "douyin",
+        "抖音",
+        "tiktok china",
+        "国内版tiktok",
+        "Douyin (TikTok China)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin.get_video_detail_v2",
+      "platform": "douyin",
+      "channel": "ecommerce",
+      "title": "抖音·视频详情",
+      "summary": "获取抖音视频详情数据,包括作者详情、发布时间和互动计数,用于视频研究、归档和表现分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin/get-video-detail/v2",
+      "params": [],
+      "requiredParams": [
+        "videoId"
+      ],
+      "tags": [
+        "douyin",
+        "抖音",
+        "tiktok china",
+        "国内版tiktok",
+        "Douyin (TikTok China)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin.get_video_comment_v1",
+      "platform": "douyin",
+      "channel": "ecommerce",
+      "title": "抖音·视频评论",
+      "summary": "获取抖音视频评论数据,包括作者、文本和点赞数,用于情感分析和参与度评估。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin/get-video-comment/v1",
+      "params": [],
+      "requiredParams": [
+        "awemeId"
+      ],
+      "tags": [
+        "douyin",
+        "抖音",
+        "tiktok china",
+        "国内版tiktok",
+        "Douyin (TikTok China)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin.get_video_sub_comment_v1",
+      "platform": "douyin",
+      "channel": "ecommerce",
+      "title": "抖音·评论回复",
+      "summary": "获取抖音评论回复数据,包括文本、作者和时间戳,用于线程分析和反馈研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin/get-video-sub-comment/v1",
+      "params": [],
+      "requiredParams": [
+        "commentId"
+      ],
+      "tags": [
+        "douyin",
+        "抖音",
+        "tiktok china",
+        "国内版tiktok",
+        "Douyin (TikTok China)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin.get_user_detail_v3",
+      "platform": "douyin",
+      "channel": "ecommerce",
+      "title": "抖音·用户资料",
+      "summary": "获取抖音用户资料数据,包括粉丝数、认证状态和简介详情,用于创作者研究和账号分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin/get-user-detail/v3",
+      "params": [],
+      "requiredParams": [
+        "secUid"
+      ],
+      "tags": [
+        "douyin",
+        "抖音",
+        "tiktok china",
+        "国内版tiktok",
+        "Douyin (TikTok China)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin.share_url_transfer_v1",
+      "platform": "douyin",
+      "channel": "ecommerce",
+      "title": "抖音·分享链接解析",
+      "summary": "获取抖音分享链接解析数据,包括帮助提取规范ID,用于下游视频和评论工作流。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin/share-url-transfer/v1",
+      "params": [],
+      "requiredParams": [
+        "shareUrl"
+      ],
+      "tags": [
+        "douyin",
+        "抖音",
+        "tiktok china",
+        "国内版tiktok",
+        "Douyin (TikTok China)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin_ec.get_item_detail_v1",
+      "platform": "douyin_ec",
+      "channel": "ecommerce",
+      "title": "抖音电商·商品详情",
+      "summary": "获取抖音电商商品详情,包括价格、标题和库存,用于商品监测和竞争分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-ec/get-item-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "douyin_ec",
+        "抖音电商",
+        "抖音小店",
+        "douyin ec",
+        "douyin ecommerce",
+        "Douyin E-commerce",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_ec.get_item_detail_v2",
+      "platform": "douyin_ec",
+      "channel": "ecommerce",
+      "title": "抖音电商·商品详情",
+      "summary": "获取抖音电商商品详情及销售数据,用于商品监控、竞品分析和电商研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-ec/get-item-detail/v2",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "douyin_ec",
+        "抖音电商",
+        "抖音小店",
+        "douyin ec",
+        "douyin ecommerce",
+        "Douyin E-commerce",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin_ec.get_item_sku_info_v1",
+      "platform": "douyin_ec",
+      "channel": "ecommerce",
+      "title": "抖音电商·商品SKU信息",
+      "summary": "获取抖音电商商品SKU数据,包括SKU选项、价格和库存信号,用于目录检查和商品监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-ec/get-item-sku-info/v1",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "douyin_ec",
+        "抖音电商",
+        "抖音小店",
+        "douyin ec",
+        "douyin ecommerce",
+        "Douyin E-commerce",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin_ec.search_item_list_v1",
+      "platform": "douyin_ec",
+      "channel": "ecommerce",
+      "title": "抖音电商·商品搜索",
+      "summary": "获取抖音电商商品搜索数据,包括匹配的商品和商品元数据,用于商品发现、目录研究和市场监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-ec/search-item-list/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "douyin_ec",
+        "抖音电商",
+        "抖音小店",
+        "douyin ec",
+        "douyin ecommerce",
+        "Douyin E-commerce",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin_ec.get_item_comments_v1",
+      "platform": "douyin_ec",
+      "channel": "ecommerce",
+      "title": "抖音电商·商品评论",
+      "summary": "获取抖音电商商品评论,包括评分、评论内容和评论者信号,用于客户反馈分析和产品研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-ec/get-item-comments/v1",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "douyin_ec",
+        "抖音电商",
+        "抖音小店",
+        "douyin ec",
+        "douyin ecommerce",
+        "Douyin E-commerce",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin_ec.get_shop_item_list_v1",
+      "platform": "douyin_ec",
+      "channel": "ecommerce",
+      "title": "抖音电商·店铺商品列表",
+      "summary": "获取抖音电商店铺商品列表数据,包括商品和分页信号,用于卖家研究和目录跟踪。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-ec/get-shop-item-list/v1",
+      "params": [],
+      "requiredParams": [
+        "shopId"
+      ],
+      "tags": [
+        "douyin_ec",
+        "抖音电商",
+        "抖音小店",
+        "douyin ec",
+        "douyin ecommerce",
+        "Douyin E-commerce",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douyin_xingtu.get_kol_info_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·创作者资料",
+      "summary": "获取抖音巨量星图创作者资料数据,包括受众和定价数据,用于网红审核、基准分析和活动规划。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-info/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_kol_audience_distribution_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·受众分布",
+      "summary": "获取抖音巨量星图受众分布数据,包括人口统计和兴趣基础的受众细分,用于创作者评估、活动规划和市场研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-audience-distribution/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_kol_fans_distribution_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·粉丝分布",
+      "summary": "获取抖音巨量星图粉丝分布数据,包括受众人口统计、兴趣和分布指标,用于创作者评估、活动策划和平台研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-fans-distribution/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_kol_marketing_info_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·营销指标",
+      "summary": "获取抖音巨量星图营销指标数据,包括刊例价详情和商业服务指标,用于创作者评估、活动策划和平台研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-marketing-info/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_kol_spread_info_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·传播指标",
+      "summary": "获取抖音巨量星图传播指标数据,包括受众、内容表现和商业指标,用于快速评估。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-spread-info/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_kol_convert_ability_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·转化分析",
+      "summary": "获取抖音巨量星图转化分析数据,包括转化效率和商业性能指标,用于创作者评估、活动规划和市场研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-convert-ability/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId",
+        "range"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_kol_show_items_v2_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·展示商品",
+      "summary": "获取抖音巨量星图展示商品数据,包括核心指标、趋势信号和表现指标,用于创作者评估、活动策划和市场研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-show-items-v2/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_kol_link_info_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·创作者链接指标",
+      "summary": "获取抖音巨量星图创作者链接指标数据,包括创作者排名、流量结构和相关性能指标,用于创作者评估、活动规划和市场研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-link-info/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_kol_convert_videos_or_products_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·转化资源",
+      "summary": "获取抖音巨量星图转化资源数据,包括与抖音星图创作者转化活动相关的商品,用于商业分析和活动优化。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-convert-videos-or-products/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId",
+        "detailType",
+        "page"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_kol_link_struct_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·创作者链接结构",
+      "summary": "获取抖音巨量星图创作者链接结构数据,包括参与度和转化指标,用于创作者表现分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-link-struct/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_kol_touch_distribution_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·受众触点分布",
+      "summary": "获取抖音巨量星图受众触点分布数据,包括细分群体、受众构成和分布信号,用于流量分析和现有集成兼容性。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-touch-distribution/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_kol_cp_info_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·性价比分析",
+      "summary": "获取抖音巨量星图成本性能分析数据,包括定价、曝光和参与效率指标,用于创作者评估、活动规划和市场研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-cp-info/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_kol_rec_videos_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·推荐视频",
+      "summary": "获取抖音巨量星图推荐视频数据,包括视频表现指标,用于创作者评估、活动策划和市场研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-rec-videos/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_kol_daily_fans_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·粉丝增长趋势",
+      "summary": "获取抖音巨量星图粉丝增长趋势数据,包括历史受众随时间变化,用于创作者评估、活动策划和市场研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-kol-daily-fans/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId",
+        "startDate",
+        "endDate"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_author_hot_comment_tokens_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·评论关键词分析",
+      "summary": "获取抖音巨量星图KOL评论关键词分析数据,包括核心指标、趋势信号和性能指标,用于受众语言分析和评论主题研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-author-hot-comment-tokens/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_author_content_hot_keywords_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·内容关键词分析",
+      "summary": "获取抖音巨量星图KOL内容关键词分析数据,包括核心指标、趋势信号和性能指标,用于内容主题分析和创作者定位研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-author-content-hot-keywords/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_author_commerce_spread_info_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·创作者电商传播信息",
+      "summary": "获取抖音巨量星图作者商业传播信息数据,包括传播指标,用于创作者评估以进行活动策划和媒体购买。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-author-commerce-spread-info/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_author_commerce_seed_base_info_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·商业种草基础信息",
+      "summary": "获取抖音巨量星图作者商业种草基础信息数据,包括基线指标、商业信号和种草指标,用于产品种草分析、创作者审查和活动策划。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-author-commerce-seed-base-info/v1",
+      "params": [],
+      "requiredParams": [
+        "kolId",
+        "range"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "douyin_xingtu.get_video_detail_v1",
+      "platform": "douyin_xingtu",
+      "channel": "ecommerce",
+      "title": "抖音星图·视频详情",
+      "summary": "获取抖音巨量星图视频详情数据,包括来自传统抖音星图接口的性能字段,用于内容审查和集成兼容性。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douyin-xingtu/get-video-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "detailId"
+      ],
+      "tags": [
+        "douyin_xingtu",
+        "抖音星图",
+        "巨量星图",
+        "星图",
+        "douyin xingtu",
+        "xingtu",
+        "抖音巨量星图",
+        "Douyin Creator Marketplace (Xingtu)",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "kuaishou.search_video_v2",
+      "platform": "kuaishou",
+      "channel": "ecommerce",
+      "title": "快手·视频搜索",
+      "summary": "获取快手视频搜索数据,包括视频ID、封面图片和描述,用于竞品分析、市场趋势和关键词监控以及品牌追踪。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "kuaishou/search-video/v2",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "kuaishou",
+        "快手",
+        "kwai",
+        "Kuaishou",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "kuaishou.search_user_v2",
+      "platform": "kuaishou",
+      "channel": "ecommerce",
+      "title": "快手·用户搜索",
+      "summary": "获取快手用户搜索数据,包括资料名称、头像和粉丝数,用于创作者发现和账号研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "kuaishou/search-user/v2",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "kuaishou",
+        "快手",
+        "kwai",
+        "Kuaishou",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "kuaishou.get_user_video_list_v2",
+      "platform": "kuaishou",
+      "channel": "ecommerce",
+      "title": "快手·用户发布视频",
+      "summary": "获取快手用户发布视频数据,包括封面、发布时间和互动指标,用于创作者监控和内容性能分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "kuaishou/get-user-video-list/v2",
+      "params": [],
+      "requiredParams": [
+        "userId"
+      ],
+      "tags": [
+        "kuaishou",
+        "快手",
+        "kwai",
+        "Kuaishou",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "kuaishou.get_video_detail_v2",
+      "platform": "kuaishou",
+      "channel": "ecommerce",
+      "title": "快手·视频详情",
+      "summary": "获取快手视频详情数据,包括视频URL、标题和作者信息,用于深入内容性能分析和建立病毒视频数据库。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "kuaishou/get-video-detail/v2",
+      "params": [],
+      "requiredParams": [
+        "videoId"
+      ],
+      "tags": [
+        "kuaishou",
+        "快手",
+        "kwai",
+        "Kuaishou",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "kuaishou.get_video_comment_v1",
+      "platform": "kuaishou",
+      "channel": "ecommerce",
+      "title": "快手·视频评论",
+      "summary": "获取快手视频的公开评论,包括评论内容、作者信息、点赞数和回复数。\n\n典型应用场景:\n- 情感分析与社区反馈监控\n- 收集特定视频的互动数据",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "kuaishou/get-video-comment/v1",
+      "params": [],
+      "requiredParams": [
+        "videoId"
+      ],
+      "tags": [
+        "kuaishou",
+        "快手",
+        "kwai",
+        "Kuaishou",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "kuaishou.get_user_detail_v1",
+      "platform": "kuaishou",
+      "channel": "ecommerce",
+      "title": "快手·用户资料",
+      "summary": "获取快手用户资料数据,包括账户元数据、受众指标和验证相关字段,用于创作者研究、构建创作者档案、监控受众增长和账户状态。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "kuaishou/get-user-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "userId"
+      ],
+      "tags": [
+        "kuaishou",
+        "快手",
+        "kwai",
+        "Kuaishou",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "kuaishou.share_url_transfer_v1",
+      "platform": "kuaishou",
+      "channel": "ecommerce",
+      "title": "快手·分享链接解析",
+      "summary": "获取快手分享链接解析数据,包括解析后的内容标识符和目标对象数据,用于解析分享链接以实现自动化内容处理。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "kuaishou/share-url-transfer/v1",
+      "params": [],
+      "requiredParams": [
+        "shareUrl"
+      ],
+      "tags": [
+        "kuaishou",
+        "快手",
+        "kwai",
+        "Kuaishou",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_account_today_articles_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·账号今日文章",
+      "summary": "返回微信公众号今日发布的文章。可通过biz id、文章URL、公众号名称或wxid识别公众号,适用于监控公众号当日发布活动。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/get-account-today-articles/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_account_history_articles_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·账户历史文章",
+      "summary": "返回通过biz id、文章URL、公众号名称或wxid识别的微信公众号的分页历史文章。此版本使用页码分页来浏览公众号的文章存档。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin/get-account-history-articles/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_account_history_articles_v2",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·账户历史文章",
+      "summary": "返回通过ghid或文章URL识别的微信公众号的历史文章。此版本使用上游响应返回的PagingInfo.Offset字符串游标,更适合稳定的连续分页。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin/get-account-history-articles/v2",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_article_metrics_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·文章指标",
+      "summary": "通过文章URL返回微信公众号文章的基本互动指标,包括阅读量和点赞量等核心信号。适用于轻量级文章热度检查。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/get-article-metrics/v1",
+      "params": [],
+      "requiredParams": [
+        "articleUrl"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_article_metrics_v2",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·文章指标",
+      "summary": "通过文章URL返回微信公众号文章的扩展互动指标,涵盖更丰富的阅读、点赞及相关互动字段,用于文章表现分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/get-article-metrics/v2",
+      "params": [],
+      "requiredParams": [
+        "articleUrl"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_article_detail_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·文章详情",
+      "summary": "通过文章URL返回微信公众号文章详情。版本1支持模式枚举,可在支持时选择纯文本或富文本内容,适用于获取文章正文内容及基本元数据。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/get-article-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "articleUrl"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_article_detail_v2",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·文章详情",
+      "summary": "通过文章URL返回结构化的微信公众号文章详情。版本2侧重于标题、封面图、作者、发布时间、原文链接及内容HTML片段等字段,便于解析和存储。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/get-article-detail/v2",
+      "params": [],
+      "requiredParams": [
+        "articleUrl"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_article_detail_v3",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·文章详情",
+      "summary": "返回微信公众号文章详情,并在可用时包含额外的视频相关字段。版本3适用于包含视频素材或频道相关媒体引用的文章。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/get-article-detail/v3",
+      "params": [],
+      "requiredParams": [
+        "articleUrl"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_article_detail_v4",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·文章详情",
+      "summary": "返回微信公众号文章的完整HTML文档,包括html、head、body和文章样式。版本4适用于渲染预览、归档存储或页面级保存。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/get-article-detail/v4",
+      "params": [],
+      "requiredParams": [
+        "articleUrl"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_article_detail_v5",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·文章详情",
+      "summary": "通过文章URL返回轻量级的微信公众号文章信息。版本5侧重于基础元数据和状态字段,如标题、封面图、发布时间和账号信息。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/get-article-detail/v5",
+      "params": [],
+      "requiredParams": [
+        "articleUrl"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_article_comment_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·文章评论",
+      "summary": "通过文章URL返回微信公众号文章的顶级评论。响应包含评论数据、总数和用于持续收集评论的分页缓冲区字段。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin/get-article-comment/v1",
+      "params": [],
+      "requiredParams": [
+        "articleUrl"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_article_sub_comment_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·文章评论回复",
+      "summary": "返回微信公众号文章评论的嵌套回复。使用文章URL和顶级评论的contentId收集回复线程,完善文章评论对话链。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/get-article-sub-comment/v1",
+      "params": [],
+      "requiredParams": [
+        "articleUrl",
+        "contentId"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.search_article_hot_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·热门文章搜索",
+      "summary": "在日期范围内搜索热门和病毒式传播的微信公众号文章。支持关键词、发布类型、分类和分页参数,用于发现高表现账号内容。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/search-article-hot/v1",
+      "params": [],
+      "requiredParams": [
+        "startDay",
+        "endDay"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.search_article_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·文章搜索",
+      "summary": "通过微信网页搜索流程搜索微信公众号文章。版本1支持发布时间筛选、排序类型、偏移量和cookies_buffer分页,用于获取最新的网页端文章结果。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin/search-article/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.search_article_v2",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·文章搜索",
+      "summary": "通过分类的微信网页搜索流程搜索微信公众号文章。版本2使用subSearchType聚焦结果类别,并保留offset和cookies_buffer用于连续分页。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin/search-article/v2",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.search_miniprogram_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·小程序搜索",
+      "summary": "通过微信网页搜索流程搜索微信小程序。它通过查找小程序入口点和相关品牌生态系统信号,补充微信公众号分析。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin/search-miniprogram/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.search_wechat_index_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·微信指数搜索",
+      "summary": "返回微信指数关键词搜索结果。与微信公众号文章和账号分析配合使用,观察微信生态系统内的关键词趋势信号。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/search-wechat-index/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.search_suggestions_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·搜索建议",
+      "summary": "返回关键词的微信搜索建议。在微信公众号文章搜索、账号搜索和内容发现工作流中,对自动补全和查询扩展非常有用。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/search-suggestions/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.search_account_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·账号搜索",
+      "summary": "按关键词搜索微信公众号资料。版本1每页返回一个账号结果,服务端固定页面大小,适用于按名称和基本身份信号发现账号。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin/search-account/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.search_account_v2",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·账号搜索",
+      "summary": "通过微信网页搜索流程搜索微信公众号资料。版本2保留offset和cookies_buffer分页状态,用于连续获取更广泛的账号结果集。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin/search-account/v2",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_account_original_count_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·账号原创文章数",
+      "summary": "返回由ghid或文章URL标识的微信公众号的原创文章数量。用于评估账号原创性和长期内容质量。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/get-account-original-count/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_account_principal_info_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·账号主体信息",
+      "summary": "返回微信公众号的主体和注册信息。账号可通过biz id、文章URL或wxid标识,有助于验证所有权和运营实体详情。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/get-account-principal-info/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.get_account_basic_info_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·账户基本信息",
+      "summary": "通过账号名称返回微信公众号的基本资料信息,包括头像和账号类型等字段(如可用)。用于快速丰富账号资料。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/get-account-basic-info/v1",
+      "params": [],
+      "requiredParams": [
+        "name"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin.convert_article_link_v1",
+      "platform": "weixin",
+      "channel": "ecommerce",
+      "title": "微信公众号·文章链接转换",
+      "summary": "将微信公众号文章链接转换为规范的目标URL。用于在文章采集前解析短链接或中间链接。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin/convert-article-link/v1",
+      "params": [],
+      "requiredParams": [
+        "link"
+      ],
+      "tags": [
+        "weixin",
+        "微信公众号",
+        "微信",
+        "公众号",
+        "wechat",
+        "WeChat Official Accounts",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.search_video_v1",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·视频搜索",
+      "summary": "通过实时微信网页搜索流程搜索微信视频号视频。版本1支持发布时间过滤、排序方式、偏移量和cookies_buffer分页,用于查找近期或高互动量的视频号视频。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin-channels/search-video/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.search_video_v2",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·视频搜索",
+      "summary": "通过分类微信网页搜索流程搜索微信视频号视频。版本2专注于视频号视频分类,并保留偏移量和cookies_buffer状态以持续收集结果。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin-channels/search-video/v2",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.search_account_v1",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·账号搜索",
+      "summary": "通过分类微信网页搜索流程搜索微信视频号账号。版本1返回面向账号的搜索卡片和分页元数据,有助于通过关键词发现视频号创作者。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin-channels/search-account/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.search_account_v2",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·账号搜索",
+      "summary": "通过wxvideo关键词接口搜索微信视频号账号及相关加密视频对象。版本2适用于需要从一个关键词获取更广泛的账号和视频对象结果集的情况。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin-channels/search-account/v2",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.search_account_v3",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·账号搜索",
+      "summary": "通过wxvideo账号查询接口按关键词搜索特定微信视频号账号ID。版本3针对将创作者名称解析为v2Name标识符和账号资料字段进行了优化。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin-channels/search-account/v3",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.get_account_videos_v1",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·账号视频",
+      "summary": "通过v2Name返回微信视频号账号中视频、图片和直播内容的实时分页列表。响应中包含last_buffer和continue_flag字段,用于对账号内容进行翻页。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin-channels/get-account-videos/v1",
+      "params": [],
+      "requiredParams": [
+        "v2Name"
+      ],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.get_bound_channel_v1",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·获取绑定频道",
+      "summary": "根据公众号 ghid 或文章 URL 返回绑定的视频号账号。用于将公众号发布数据与其关联的视频号创作者身份连接。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin-channels/get-bound-channel/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.get_video_basic_info_v1",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·视频基本信息",
+      "summary": "将复制的视频号视频链接或短 feed ID 解析为基本视频和账号字段。响应包含 object id、object nonce id、标题、封面、账号 v2Name 以及互动计数(如有)。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin-channels/get-video-basic-info/v1",
+      "params": [],
+      "requiredParams": [
+        "feedInfo"
+      ],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.get_video_title_v1",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·视频标题",
+      "summary": "根据 object id 返回轻量级的视频号视频标题和账号字段。适用于仅需标题、媒体类型和账号身份,无需请求可下载媒体链接的场景。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin-channels/get-video-title/v1",
+      "params": [],
+      "requiredParams": [
+        "objectId"
+      ],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.convert_export_id_v1",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·导出 ID 转换",
+      "summary": "将搜索结果中的加密视频号 exportId 转换为视频 object id 和账号身份字段。在调用需要 objectId 的视频详情、指标或评论接口前使用。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin-channels/convert-export-id/v1",
+      "params": [],
+      "requiredParams": [
+        "exportId"
+      ],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.get_video_download_url_v1",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·视频下载链接",
+      "summary": "通过对象ID返回微信视频号视频的可下载和可播放媒体链接。该接口还会保留视频元数据,如计数、封面图片、发布时间、媒体类型和账号字段(如果可用)。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weixin-channels/get-video-download-url/v1",
+      "params": [],
+      "requiredParams": [
+        "objectId"
+      ],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.get_video_metrics_v1",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·视频指标",
+      "summary": "通过对象ID返回微信视频号视频的互动指标,包括评论、转发、点赞和收藏计数。它还保留上游指标流返回的last_buffer和continuation标志。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin-channels/get-video-metrics/v1",
+      "params": [],
+      "requiredParams": [
+        "objectId"
+      ],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.get_video_comment_v1",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·视频评论",
+      "summary": "通过对象ID返回微信视频号视频的一级评论。响应包括评论ID、作者字段、点赞数、回复信号、last_buffer和用于评论分页的continuation状态。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin-channels/get-video-comment/v1",
+      "params": [],
+      "requiredParams": [
+        "objectId"
+      ],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weixin_channels.get_video_sub_comment_v1",
+      "platform": "weixin_channels",
+      "channel": "ecommerce",
+      "title": "微信视频号·视频子评论",
+      "summary": "返回微信视频号视频评论下的二级回复。提供视频对象ID和来自一级评论接口的根评论ID,并保留last_buffer用于回复分页。",
+      "method": "POST",
+      "paramsIn": "body",
+      "proxyPath": "weixin-channels/get-video-sub-comment/v1",
+      "params": [],
+      "requiredParams": [
+        "objectId",
+        "rootCommentId"
+      ],
+      "tags": [
+        "weixin_channels",
+        "微信视频号",
+        "视频号",
+        "weixin channels",
+        "wechat channels",
+        "WeChat Channels",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weibo.search_all_v2",
+      "platform": "weibo",
+      "channel": "ecommerce",
+      "title": "微博·关键词搜索",
+      "summary": "获取微博关键词搜索数据,包括作者、发布时间和互动信号,用于趋势监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weibo/search-all/v2",
+      "params": [],
+      "requiredParams": [
+        "q",
+        "startDay",
+        "startHour",
+        "endDay",
+        "endHour"
+      ],
+      "tags": [
+        "weibo",
+        "微博",
+        "新浪微博",
+        "Weibo",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weibo.get_weibo_detail_v1",
+      "platform": "weibo",
+      "channel": "ecommerce",
+      "title": "微博·帖子详情",
+      "summary": "获取微博帖子详情数据,包括媒体、作者元数据和互动计数,用于帖子分析、归档和活动监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weibo/get-weibo-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "weibo",
+        "微博",
+        "新浪微博",
+        "Weibo",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weibo.get_user_detail_v3",
+      "platform": "weibo",
+      "channel": "ecommerce",
+      "title": "微博·用户资料",
+      "summary": "获取微博用户资料数据,包括粉丝数、验证状态和简介详情,用于创作者研究和账户分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weibo/get-user-detail/v3",
+      "params": [],
+      "requiredParams": [
+        "uid"
+      ],
+      "tags": [
+        "weibo",
+        "微博",
+        "新浪微博",
+        "Weibo",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weibo.get_fans_v1",
+      "platform": "weibo",
+      "channel": "ecommerce",
+      "title": "微博·用户粉丝",
+      "summary": "获取微博用户粉丝数据,包括资料元数据和验证信号,用于受众分析和网红研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weibo/get-fans/v1",
+      "params": [],
+      "requiredParams": [
+        "uid"
+      ],
+      "tags": [
+        "weibo",
+        "微博",
+        "新浪微博",
+        "Weibo",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weibo.get_followers_v1",
+      "platform": "weibo",
+      "channel": "ecommerce",
+      "title": "微博·用户关注者",
+      "summary": "获取微博用户关注者数据,包括资料元数据和验证信号,用于网络分析和创作者研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weibo/get-followers/v1",
+      "params": [],
+      "requiredParams": [
+        "uid"
+      ],
+      "tags": [
+        "weibo",
+        "微博",
+        "新浪微博",
+        "Weibo",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weibo.get_user_post_v1",
+      "platform": "weibo",
+      "channel": "ecommerce",
+      "title": "微博·用户发布帖子",
+      "summary": "获取微博用户发布帖子数据,包括文本、媒体和发布时间,用于账户监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weibo/get-user-post/v1",
+      "params": [],
+      "requiredParams": [
+        "uid"
+      ],
+      "tags": [
+        "weibo",
+        "微博",
+        "新浪微博",
+        "Weibo",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weibo.get_user_video_list_v1",
+      "platform": "weibo",
+      "channel": "ecommerce",
+      "title": "微博·用户视频列表",
+      "summary": "获取微博用户视频列表数据(瀑布流),包括下一页的分页游标。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weibo/get-user-video-list/v1",
+      "params": [],
+      "requiredParams": [
+        "uid"
+      ],
+      "tags": [
+        "weibo",
+        "微博",
+        "新浪微博",
+        "Weibo",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weibo.tv_component_v1",
+      "platform": "weibo",
+      "channel": "ecommerce",
+      "title": "微博·电视视频详情",
+      "summary": "获取微博TV视频详情数据,包括媒体URL、作者详情和互动计数,用于视频研究、归档和性能分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weibo/tv-component/v1",
+      "params": [],
+      "requiredParams": [
+        "oid"
+      ],
+      "tags": [
+        "weibo",
+        "微博",
+        "新浪微博",
+        "Weibo",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weibo.hot_search_v1",
+      "platform": "weibo",
+      "channel": "ecommerce",
+      "title": "微博·热搜",
+      "summary": "获取微博热搜数据,包括排名数据,用于趋势监控、新闻工作流和话题发现。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weibo/hot-search/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "weibo",
+        "微博",
+        "新浪微博",
+        "Weibo",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weibo.get_post_comments_v1",
+      "platform": "weibo",
+      "channel": "ecommerce",
+      "title": "微博·帖子评论",
+      "summary": "获取微博帖子评论数据,包括文本、作者和时间戳,用于反馈分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weibo/get-post-comments/v1",
+      "params": [],
+      "requiredParams": [
+        "mid"
+      ],
+      "tags": [
+        "weibo",
+        "微博",
+        "新浪微博",
+        "Weibo",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "weibo.search_profile_v1",
+      "platform": "weibo",
+      "channel": "ecommerce",
+      "title": "微博·搜索用户发布帖子",
+      "summary": "获取微博搜索用户发布帖子数据,包括匹配结果、元数据和排名信号,用于作者研究和历史内容发现。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "weibo/search-profile/v1",
+      "params": [],
+      "requiredParams": [
+        "uid",
+        "q"
+      ],
+      "tags": [
+        "weibo",
+        "微博",
+        "新浪微博",
+        "Weibo",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "bilibili.get_video_detail_v2",
+      "platform": "bilibili",
+      "channel": "ecommerce",
+      "title": "哔哩哔哩·视频详情",
+      "summary": "获取哔哩哔哩视频详情数据,包括元数据(标题、标签和发布时间),用于追踪视频性能和互动指标、分析内容元数据和上传者信息。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "bilibili/get-video-detail/v2",
+      "params": [],
+      "requiredParams": [
+        "bvid"
+      ],
+      "tags": [
+        "bilibili",
+        "哔哩哔哩",
+        "b站",
+        "bili",
+        "Bilibili",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "bilibili.get_user_video_list_v2",
+      "platform": "bilibili",
+      "channel": "ecommerce",
+      "title": "哔哩哔哩·用户发布视频",
+      "summary": "获取哔哩哔哩用户发布视频数据,包括标题、封面和发布时间,用于创作者监控和内容性能分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "bilibili/get-user-video-list/v2",
+      "params": [],
+      "requiredParams": [
+        "uid"
+      ],
+      "tags": [
+        "bilibili",
+        "哔哩哔哩",
+        "b站",
+        "bili",
+        "Bilibili",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "bilibili.get_user_detail_v2",
+      "platform": "bilibili",
+      "channel": "ecommerce",
+      "title": "哔哩哔哩·用户资料",
+      "summary": "获取哔哩哔哩用户资料数据,包括账户元数据、受众指标和验证相关字段,用于分析创作者的资料、等级和验证状态,以及验证用户在哔哩哔哩的身份和社交存在。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "bilibili/get-user-detail/v2",
+      "params": [],
+      "requiredParams": [
+        "uid"
+      ],
+      "tags": [
+        "bilibili",
+        "哔哩哔哩",
+        "b站",
+        "bili",
+        "Bilibili",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "bilibili.get_video_danmu_v2",
+      "platform": "bilibili",
+      "channel": "ecommerce",
+      "title": "哔哩哔哩·视频弹幕",
+      "summary": "获取哔哩哔哩视频弹幕数据,包括时间线位置和评论文本,用于受众反应分析和字幕式评论审查。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "bilibili/get-video-danmu/v2",
+      "params": [],
+      "requiredParams": [
+        "aid",
+        "cid"
+      ],
+      "tags": [
+        "bilibili",
+        "哔哩哔哩",
+        "b站",
+        "bili",
+        "Bilibili",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "bilibili.get_video_comment_v2",
+      "platform": "bilibili",
+      "channel": "ecommerce",
+      "title": "哔哩哔哩·视频评论",
+      "summary": "获取哔哩哔哩视频评论数据,包括评论者资料、文本和点赞数,用于情感分析和评论审核工作流。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "bilibili/get-video-comment/v2",
+      "params": [],
+      "requiredParams": [
+        "aid"
+      ],
+      "tags": [
+        "bilibili",
+        "哔哩哔哩",
+        "b站",
+        "bili",
+        "Bilibili",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "bilibili.search_video_v2",
+      "platform": "bilibili",
+      "channel": "ecommerce",
+      "title": "哔哩哔哩·视频搜索",
+      "summary": "获取哔哩哔哩视频搜索数据,包括匹配视频、创作者和互动指标,用于话题研究和内容发现。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "bilibili/search-video/v2",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "bilibili",
+        "哔哩哔哩",
+        "b站",
+        "bili",
+        "Bilibili",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "bilibili.share_url_transfer_v1",
+      "platform": "bilibili",
+      "channel": "ecommerce",
+      "title": "哔哩哔哩·分享链接解析",
+      "summary": "获取哔哩哔哩分享链接解析数据,包括解析后的视频和页面标识符,用于将移动端短链接转换为标准bvid/元数据,以及自动化从社交媒体分享链接中提取内容。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "bilibili/share-url-transfer/v1",
+      "params": [],
+      "requiredParams": [
+        "shareUrl"
+      ],
+      "tags": [
+        "bilibili",
+        "哔哩哔哩",
+        "b站",
+        "bili",
+        "Bilibili",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "bilibili.get_user_relation_stat_v1",
+      "platform": "bilibili",
+      "channel": "ecommerce",
+      "title": "哔哩哔哩·用户关系统计",
+      "summary": "获取哔哩哔哩用户关系统计数据,包括关注数,用于创作者对标和受众增长追踪。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "bilibili/get-user-relation-stat/v1",
+      "params": [],
+      "requiredParams": [
+        "wmid"
+      ],
+      "tags": [
+        "bilibili",
+        "哔哩哔哩",
+        "b站",
+        "bili",
+        "Bilibili",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "bilibili.get_video_caption_v2",
+      "platform": "bilibili",
+      "channel": "ecommerce",
+      "title": "哔哩哔哩·视频字幕",
+      "summary": "获取哔哩哔哩视频字幕数据,包括字幕数据,用于转录提取和多语言内容分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "bilibili/get-video-caption/v2",
+      "params": [],
+      "requiredParams": [
+        "bvid",
+        "aid",
+        "cid"
+      ],
+      "tags": [
+        "bilibili",
+        "哔哩哔哩",
+        "b站",
+        "bili",
+        "Bilibili",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "dewu.search_item_list_v1",
+      "platform": "dewu",
+      "channel": "ecommerce",
+      "title": "得物·商品搜索",
+      "summary": "通过关键词获取得物商品搜索结果,包括匹配商品数据和分页结果,用于商品发现、目录研究、价格监控和电商市场分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "dewu/search-item-list/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "dewu",
+        "得物",
+        "Dewu (Poizon)",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "jd.get_item_detail_v1",
+      "platform": "jd",
+      "channel": "ecommerce",
+      "title": "京东·商品详情",
+      "summary": "获取京东商品详情数据,包括价格、图片和店铺信息,用于目录分析、商品监控和电商研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "jd/get-item-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "jd",
+        "京东",
+        "jingdong",
+        "JD.com",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "jd.get_item_detail_v2",
+      "platform": "jd",
+      "channel": "ecommerce",
+      "title": "京东·商品详情",
+      "summary": "通过任务支持的v2流程获取京东商品详情数据。如果数据在短暂等待后仍未就绪,响应将返回待处理任务状态。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "jd/get-item-detail/v2",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "jd",
+        "京东",
+        "jingdong",
+        "JD.com",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "jd.get_item_price_v1",
+      "platform": "jd",
+      "channel": "ecommerce",
+      "title": "京东·商品价格",
+      "summary": "获取京东商品价格数据,用于价格监控、目录检查、重新定价工作流和电商研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "jd/get-item-price/v1",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "jd",
+        "京东",
+        "jingdong",
+        "JD.com",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "jd.search_item_list_v1",
+      "platform": "jd",
+      "channel": "ecommerce",
+      "title": "京东·商品搜索",
+      "summary": "获取京东商品搜索数据,包括匹配商品和商品元数据,用于商品发现、目录研究和市场监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "jd/search-item-list/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "jd",
+        "京东",
+        "jingdong",
+        "JD.com",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "jd.get_item_comments_v1",
+      "platform": "jd",
+      "channel": "ecommerce",
+      "title": "京东·商品评论",
+      "summary": "获取京东商品评价数据,包括评分、时间戳和评论者信号,用于客户反馈分析和商品研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "jd/get-item-comments/v1",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "jd",
+        "京东",
+        "jingdong",
+        "JD.com",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "jd.get_shop_item_list_v1",
+      "platform": "jd",
+      "channel": "ecommerce",
+      "title": "京东·店铺商品列表",
+      "summary": "获取京东店铺商品列表数据,包括商品标题、价格和图片,用于目录追踪和卖家研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "jd/get-shop-item-list/v1",
+      "params": [],
+      "requiredParams": [
+        "shopId"
+      ],
+      "tags": [
+        "jd",
+        "京东",
+        "jingdong",
+        "JD.com",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xianyu.search_item_list_v1",
+      "platform": "xianyu",
+      "channel": "ecommerce",
+      "title": "闲鱼·商品搜索",
+      "summary": "通过关键词获取闲鱼商品搜索数据,包括匹配的二手交易市场商品、卖家信号、价格、图片、筛选条件和分页元数据,用于二手市场发现、目录研究、价格分析和商品监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xianyu/search-item-list/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "xianyu",
+        "闲鱼",
+        "Xianyu (GooFish)",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "xianyu.get_item_detail_v1",
+      "platform": "xianyu",
+      "channel": "ecommerce",
+      "title": "闲鱼·商品详情",
+      "summary": "通过商品 ID 获取闲鱼商品详情数据,包括商品元数据、卖家信息、图片、商品状态、价格和市场流转数据,用于二手商品查看、转售跟踪和电商研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "xianyu/get-item-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "xianyu",
+        "闲鱼",
+        "Xianyu (GooFish)",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "1688.get_item_detail_v1",
+      "platform": "1688",
+      "channel": "ecommerce",
+      "title": "1688·商品详情",
+      "summary": "获取1688商品详情,包括商品元数据和报价信息,用于货源调研和目录分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "1688/get-item-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "itemId"
+      ],
+      "tags": [
+        "1688",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "1688.search_item_list_v1",
+      "platform": "1688",
+      "channel": "ecommerce",
+      "title": "1688·商品搜索",
+      "summary": "通过关键词获取1688商品搜索结果,用于货源发现、供应商调研和市场监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "1688/search-item-list/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "1688",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douban.get_movie_reviews_v1",
+      "platform": "douban",
+      "channel": "ecommerce",
+      "title": "豆瓣电影·影评",
+      "summary": "获取豆瓣电影评价数据,包括评价标题、评分和摘要,用于受众情感分析和评价研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douban/get-movie-reviews/v1",
+      "params": [],
+      "requiredParams": [
+        "subjectId"
+      ],
+      "tags": [
+        "douban",
+        "豆瓣电影",
+        "豆瓣",
+        "Douban Movie",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douban.get_movie_review_detail_v1",
+      "platform": "douban",
+      "channel": "ecommerce",
+      "title": "豆瓣电影·评价详情",
+      "summary": "获取豆瓣电影评价详情数据,包括元数据、内容字段和互动信号,用于评价归档和详细意见分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douban/get-movie-review-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "reviewId"
+      ],
+      "tags": [
+        "douban",
+        "豆瓣电影",
+        "豆瓣",
+        "Douban Movie",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douban.get_movie_comments_v1",
+      "platform": "douban",
+      "channel": "ecommerce",
+      "title": "豆瓣电影·评论",
+      "summary": "获取豆瓣电影评论数据,包括评分、摘要和互动计数,用于快速情感抽样和评价监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douban/get-movie-comments/v1",
+      "params": [],
+      "requiredParams": [
+        "subjectId"
+      ],
+      "tags": [
+        "douban",
+        "豆瓣电影",
+        "豆瓣",
+        "Douban Movie",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douban.get_subject_detail_v1",
+      "platform": "douban",
+      "channel": "ecommerce",
+      "title": "豆瓣电影·条目详情",
+      "summary": "获取豆瓣主题详情数据,包括标题、评分和演员阵容,用于标题丰富和目录研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douban/get-subject-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "subjectId"
+      ],
+      "tags": [
+        "douban",
+        "豆瓣电影",
+        "豆瓣",
+        "Douban Movie",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douban.get_recent_hot_movie_v1",
+      "platform": "douban",
+      "channel": "ecommerce",
+      "title": "豆瓣电影·近期热门电影",
+      "summary": "获取豆瓣近期热门电影数据,包括评分、海报和主题元数据,用于电影发现和趋势监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douban/get-recent-hot-movie/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "douban",
+        "豆瓣电影",
+        "豆瓣",
+        "Douban Movie",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "douban.get_recent_hot_tv_v1",
+      "platform": "douban",
+      "channel": "ecommerce",
+      "title": "豆瓣电影·近期热门电视剧",
+      "summary": "获取豆瓣近期热门电视剧数据,包括评分、海报和主题元数据,用于剧集发现和趋势监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "douban/get-recent-hot-tv/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "douban",
+        "豆瓣电影",
+        "豆瓣",
+        "Douban Movie",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "tiktok.get_user_post_v1",
+      "platform": "tiktok",
+      "channel": "ecommerce",
+      "title": "TikTok·用户发布帖子",
+      "summary": "获取抖音用户发布帖子数据,包括视频ID、描述和发布时间,用于用户活动分析和发帖频率追踪、影响者表现评估以及特定创作者的内容趋势监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "tiktok/get-user-post/v1",
+      "params": [],
+      "requiredParams": [
+        "secUid"
+      ],
+      "tags": [
+        "tiktok",
+        "TikTok",
+        "海外抖音",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "tiktok.get_post_detail_v1",
+      "platform": "tiktok",
+      "channel": "ecommerce",
+      "title": "TikTok·帖子详情",
+      "summary": "获取抖音帖子详情数据,包括视频ID、作者信息和描述文本,用于内容表现分析和元数据提取以及通过特定帖子指标进行影响者评估。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "tiktok/get-post-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "postId"
+      ],
+      "tags": [
+        "tiktok",
+        "TikTok",
+        "海外抖音",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "tiktok.get_user_detail_v1",
+      "platform": "tiktok",
+      "channel": "ecommerce",
+      "title": "TikTok·用户资料",
+      "summary": "获取抖音用户资料数据,包括昵称、唯一ID和头像,用于影响者画像和受众分析、账号表现追踪和增长监控以及识别认证状态和官方账号。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "tiktok/get-user-detail/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "tiktok",
+        "TikTok",
+        "海外抖音",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "tiktok.get_post_comment_v1",
+      "platform": "tiktok",
+      "channel": "ecommerce",
+      "title": "TikTok·帖子评论",
+      "summary": "获取抖音帖子评论数据,包括评论ID、用户信息和文本内容,用于受众对特定内容反应的情感分析以及通过评论量和质量进行互动测量。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "tiktok/get-post-comment/v1",
+      "params": [],
+      "requiredParams": [
+        "awemeId"
+      ],
+      "tags": [
+        "tiktok",
+        "TikTok",
+        "海外抖音",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "tiktok.get_post_sub_comment_v1",
+      "platform": "tiktok",
+      "channel": "ecommerce",
+      "title": "TikTok·评论回复",
+      "summary": "获取抖音评论回复数据,包括回复ID、用户信息和文本内容,用于了解详细的用户互动和线程讨论,并识别评论区中的影响者或活跃参与者。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "tiktok/get-post-sub-comment/v1",
+      "params": [],
+      "requiredParams": [
+        "awemeId",
+        "commentId"
+      ],
+      "tags": [
+        "tiktok",
+        "TikTok",
+        "海外抖音",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "tiktok.search_user_v1",
+      "platform": "tiktok",
+      "channel": "ecommerce",
+      "title": "TikTok·用户搜索",
+      "summary": "获取抖音用户搜索数据,包括用户ID、昵称和唯一句柄等基本资料信息,用于通过关键词发现特定领域的影响者,并识别目标受众和进行竞争对手研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "tiktok/search-user/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "tiktok",
+        "TikTok",
+        "海外抖音",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "tiktok.search_post_v1",
+      "platform": "tiktok",
+      "channel": "ecommerce",
+      "title": "TikTok·作品搜索",
+      "summary": "获取抖音帖子搜索数据,包括视频ID、描述和作者信息等关键详情,用于趋势监控和内容发现,以及基于关键词的市场分析和情感追踪。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "tiktok/search-post/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "tiktok",
+        "TikTok",
+        "海外抖音",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "tiktok_shop.search_products_v1",
+      "platform": "tiktok_shop",
+      "channel": "ecommerce",
+      "title": "TikTok Shop·商品搜索",
+      "summary": "获取抖音店铺商品搜索数据,包括标题、价格和销量,用于市场研究和趋势分析、竞争对手商品发现,以及监控特定区域的产品受欢迎程度。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "tiktok-shop/search-products/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "tiktok_shop",
+        "TikTok Shop",
+        "tiktok shop",
+        "tiktok商城",
+        "tiktok小店",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "tiktok_shop.get_product_detail_v1",
+      "platform": "tiktok_shop",
+      "channel": "ecommerce",
+      "title": "TikTok Shop·商品详情",
+      "summary": "获取抖音店铺商品详情数据,包括标题、描述和价格,用于构建产品目录、价格和库存监控,以及深入的产品分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "tiktok-shop/get-product-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "productId"
+      ],
+      "tags": [
+        "tiktok_shop",
+        "TikTok Shop",
+        "tiktok shop",
+        "tiktok商城",
+        "tiktok小店",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "tiktok_shop.get_product_detail_v2",
+      "platform": "tiktok_shop",
+      "channel": "ecommerce",
+      "title": "TikTok Shop·商品详情",
+      "summary": "获取抖音店铺商品详情数据,包括标题、描述和价格,用于构建产品目录、价格和库存监控,以及深入的产品分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "tiktok-shop/get-product-detail/v2",
+      "params": [],
+      "requiredParams": [
+        "productId"
+      ],
+      "tags": [
+        "tiktok_shop",
+        "TikTok Shop",
+        "tiktok shop",
+        "tiktok商城",
+        "tiktok小店",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "youku.search_video_v1",
+      "platform": "youku",
+      "channel": "ecommerce",
+      "title": "优酷·视频搜索",
+      "summary": "获取优酷视频搜索数据,包括视频ID、标题和封面图片,用于基于关键词的视频发现、监控优酷上的特定主题或趋势,以及分析搜索结果以进行市场研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "youku/search-video/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "youku",
+        "优酷",
+        "YOUKU",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "youku.get_video_detail_v1",
+      "platform": "youku",
+      "channel": "ecommerce",
+      "title": "优酷·视频详情",
+      "summary": "获取优酷视频详情数据,包括视频ID、标题和描述,用于获取单个视频的全面元数据、追踪播放量和点赞等互动指标,并将详细视频信息集成到第三方仪表板中。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "youku/get-video-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "videoId"
+      ],
+      "tags": [
+        "youku",
+        "优酷",
+        "YOUKU",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "youku.get_user_detail_v1",
+      "platform": "youku",
+      "channel": "ecommerce",
+      "title": "优酷·用户资料",
+      "summary": "获取优酷用户资料数据,包括用户ID、用户名和头像,用于分析创作者影响力和受众规模、监控账户增长和验证状态,以及获取基本用户信息用于社交CRM。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "youku/get-user-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "uid"
+      ],
+      "tags": [
+        "youku",
+        "优酷",
+        "YOUKU",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "instagram.get_user_detail_v1",
+      "platform": "instagram",
+      "channel": "ecommerce",
+      "title": "Instagram·用户资料",
+      "summary": "获取Instagram用户资料数据,包括粉丝数、关注数和帖子数,用于获取影响者审查的基本账户元数据、追踪粉丝增长和受众覆盖随时间的变化,以及将用户句柄映射到特定资料统计信息。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "instagram/get-user-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "username"
+      ],
+      "tags": [
+        "instagram",
+        "Instagram",
+        "ins",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "instagram.get_post_detail_v1",
+      "platform": "instagram",
+      "channel": "ecommerce",
+      "title": "Instagram·帖子详情",
+      "summary": "获取Instagram帖子详情数据,包括帖子标题、媒体内容(图片/视频)和发布时间,用于分析特定帖子的互动指标(点赞/评论),以及归档帖子内容和媒体资产用于内容分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "instagram/get-post-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "code"
+      ],
+      "tags": [
+        "instagram",
+        "Instagram",
+        "ins",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "instagram.get_user_posts_v1",
+      "platform": "instagram",
+      "channel": "ecommerce",
+      "title": "Instagram·用户发布帖子",
+      "summary": "获取Instagram用户发布帖子数据,包括帖子代码、标题和媒体类型,用于监控特定用户的近期发布活动,并构建内容的历史记录用于审计或分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "instagram/get-user-posts/v1",
+      "params": [],
+      "requiredParams": [
+        "username"
+      ],
+      "tags": [
+        "instagram",
+        "Instagram",
+        "ins",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "instagram.search_reels_v1",
+      "platform": "instagram",
+      "channel": "ecommerce",
+      "title": "Instagram·Reels 搜索",
+      "summary": "获取Instagram Reels搜索数据,包括帖子ID、标题和作者资料,用于通过特定关键词或标签追踪趋势和病毒内容,并发现特定领域内高互动的Reels。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "instagram/search-reels/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "instagram",
+        "Instagram",
+        "ins",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "instagram.search_hashtag_posts_v1",
+      "platform": "instagram",
+      "channel": "ecommerce",
+      "title": "Instagram·话题标签帖子搜索",
+      "summary": "获取Instagram标签帖子搜索数据,包括标题、作者资料和发布时间,用于对热门话题和标签进行竞争分析,以及监控社区讨论和特定标签的公众意见。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "instagram/search-hashtag-posts/v1",
+      "params": [],
+      "requiredParams": [
+        "hashtag"
+      ],
+      "tags": [
+        "instagram",
+        "Instagram",
+        "ins",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "instagram.get_post_comments_v1",
+      "platform": "instagram",
+      "channel": "ecommerce",
+      "title": "Instagram·帖子评论列表",
+      "summary": "获取帖子评论、评论者资料、评论内容、点赞数、回复数及分页游标,用于情感分析和互动分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "instagram/get-post-comments/v1",
+      "params": [],
+      "requiredParams": [
+        "code"
+      ],
+      "tags": [
+        "instagram",
+        "Instagram",
+        "ins",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "instagram.get_comment_replies_v1",
+      "platform": "instagram",
+      "channel": "ecommerce",
+      "title": "Instagram·评论回复列表",
+      "summary": "获取父评论下的回复,包括回复内容、作者详情、点赞数、ID 及分页游标,用于线程讨论分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "instagram/get-comment-replies/v1",
+      "params": [],
+      "requiredParams": [
+        "mediaId",
+        "commentId"
+      ],
+      "tags": [
+        "instagram",
+        "Instagram",
+        "ins",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "youtube.search_v1",
+      "platform": "youtube",
+      "channel": "ecommerce",
+      "title": "YouTube·通用搜索",
+      "summary": "通过TIKHUB通用搜索搜索YouTube,返回混合的视频、频道、播放列表和电影结果,包含续传令牌以及上传日期、类型、时长、功能和排序顺序的筛选条件,用于发现和监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "youtube/search/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "youtube",
+        "YouTube",
+        "油管",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "youtube.get_video_detail_v1",
+      "platform": "youtube",
+      "channel": "ecommerce",
+      "title": "YouTube·视频详情",
+      "summary": "获取YouTube视频详情数据,包括其标题、描述和观看次数,用于追踪视频互动和统计数据、提取视频元数据进行内容分析,以及验证视频可用性和状态。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "youtube/get-video-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "videoId"
+      ],
+      "tags": [
+        "youtube",
+        "YouTube",
+        "油管",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "youtube.get_channel_videos_v1",
+      "platform": "youtube",
+      "channel": "ecommerce",
+      "title": "YouTube·频道视频",
+      "summary": "检索特定YouTube频道的视频列表,提供内容表现和上传历史的详细洞察。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "youtube/get-channel-videos/v1",
+      "params": [],
+      "requiredParams": [
+        "channelId"
+      ],
+      "tags": [
+        "youtube",
+        "YouTube",
+        "油管",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "youtube.get_video_captions_v1",
+      "platform": "youtube",
+      "channel": "ecommerce",
+      "title": "YouTube·视频字幕",
+      "summary": "通过TIKHUB获取YouTube视频字幕数据,包括可用的字幕轨道或格式化的内容(SRT、XML、JSON3或纯文本),用于转录、本地化、可访问性审查和内容分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "youtube/get-video-captions/v1",
+      "params": [],
+      "requiredParams": [
+        "videoId"
+      ],
+      "tags": [
+        "youtube",
+        "YouTube",
+        "油管",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "youtube.get_video_comment_v1",
+      "platform": "youtube",
+      "channel": "ecommerce",
+      "title": "YouTube·视频评论列表",
+      "summary": "获取一级视频评论、作者资料、点赞数、回复数及回复游标,用于受众反馈和互动分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "youtube/get-video-comment/v1",
+      "params": [],
+      "requiredParams": [
+        "videoId"
+      ],
+      "tags": [
+        "youtube",
+        "YouTube",
+        "油管",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "youtube.get_video_sub_comment_v1",
+      "platform": "youtube",
+      "channel": "ecommerce",
+      "title": "YouTube·视频子评论列表",
+      "summary": "获取二级视频评论回复、回复作者、点赞数及分页游标,用于线程讨论分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "youtube/get-video-sub-comment/v1",
+      "params": [],
+      "requiredParams": [
+        "cursor"
+      ],
+      "tags": [
+        "youtube",
+        "YouTube",
+        "油管",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "reddit.get_post_detail_v1",
+      "platform": "reddit",
+      "channel": "ecommerce",
+      "title": "Reddit·帖子详情",
+      "summary": "获取Reddit帖子详情数据,包括作者详情、子版块信息和互动计数,用于内容分析、审核研究和监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "reddit/get-post-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "postId"
+      ],
+      "tags": [
+        "reddit",
+        "Reddit",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "reddit.get_post_comments_v1",
+      "platform": "reddit",
+      "channel": "ecommerce",
+      "title": "Reddit·帖子评论",
+      "summary": "获取Reddit帖子评论数据,包括文本、作者和时间戳,用于讨论分析和审核研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "reddit/get-post-comments/v1",
+      "params": [],
+      "requiredParams": [
+        "postId"
+      ],
+      "tags": [
+        "reddit",
+        "Reddit",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "reddit.search_v1",
+      "platform": "reddit",
+      "channel": "ecommerce",
+      "title": "Reddit·关键词搜索",
+      "summary": "获取Reddit关键词搜索数据,包括标题、作者和子版块上下文,用于主题发现和监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "reddit/search/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "reddit",
+        "Reddit",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "toutiao.get_article_detail_v1",
+      "platform": "toutiao",
+      "channel": "ecommerce",
+      "title": "今日头条·文章详情",
+      "summary": "获取今日头条文章详情数据,包括文章ID、标题和作者信息,用于内容性能分析和媒体监控,以及验证文章真实性和元数据检索。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "toutiao/get-article-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "toutiao",
+        "今日头条",
+        "头条",
+        "Toutiao",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "toutiao.get_user_detail_v1",
+      "platform": "toutiao",
+      "channel": "ecommerce",
+      "title": "今日头条·用户资料",
+      "summary": "获取今日头条用户资料数据,包括用户ID、昵称和头像,用于影响者分析和受众分析,以及监控创作者表现和增长。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "toutiao/get-user-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "userId"
+      ],
+      "tags": [
+        "toutiao",
+        "今日头条",
+        "头条",
+        "Toutiao",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "toutiao.search_v1",
+      "platform": "toutiao",
+      "channel": "ecommerce",
+      "title": "今日头条·App关键词搜索",
+      "summary": "获取今日头条 App关键词搜索数据,包括匹配的文章、视频和作者,用于话题发现和监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "toutiao/search/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "toutiao",
+        "今日头条",
+        "头条",
+        "Toutiao",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "toutiao.search_v2",
+      "platform": "toutiao",
+      "channel": "ecommerce",
+      "title": "今日头条·网页关键词搜索",
+      "summary": "获取今日头条网页关键词搜索数据,这是搜索 API 的 PC 版本。请注意,目前仅支持检索第一页结果,用于文章、视频和作者的第一页发现,以进行趋势研究和监控。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "toutiao/search/v2",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "toutiao",
+        "今日头条",
+        "头条",
+        "Toutiao",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "zhihu.get_column_article_detail_v1",
+      "platform": "zhihu",
+      "channel": "ecommerce",
+      "title": "知乎·专栏文章详情",
+      "summary": "获取知乎专栏文章详情数据,包括标题、作者和内容,用于文章归档和内容研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "zhihu/get-column-article-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "zhihu",
+        "知乎",
+        "Zhihu",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "zhihu.get_answer_list_v1",
+      "platform": "zhihu",
+      "channel": "ecommerce",
+      "title": "知乎·回答列表",
+      "summary": "获取知乎回答列表数据,包括回答内容、作者资料和互动指标,用于问题分析和回答研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "zhihu/get-answer-list/v1",
+      "params": [],
+      "requiredParams": [
+        "questionId"
+      ],
+      "tags": [
+        "zhihu",
+        "知乎",
+        "Zhihu",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "zhihu.search_v1",
+      "platform": "zhihu",
+      "channel": "ecommerce",
+      "title": "知乎·关键词搜索",
+      "summary": "获取知乎关键词搜索数据,包括匹配结果、元数据和排名信号,用于话题发现和内容研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "zhihu/search/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "zhihu",
+        "知乎",
+        "Zhihu",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "zhihu.get_column_article_list_v1",
+      "platform": "zhihu",
+      "channel": "ecommerce",
+      "title": "知乎·专栏文章列表",
+      "summary": "获取知乎专栏文章列表数据,包括文章元数据和列表排序,用于专栏监控和内容收集。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "zhihu/get-column-article-list/v1",
+      "params": [],
+      "requiredParams": [
+        "columnId"
+      ],
+      "tags": [
+        "zhihu",
+        "知乎",
+        "Zhihu",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "amazon.search_products_v1",
+      "platform": "amazon",
+      "channel": "ecommerce",
+      "title": "亚马逊·商品搜索",
+      "summary": "通过关键词或ASIN搜索亚马逊商品列表,包括标题、价格、评分、Prime标志、商品图片、配送详情和分页元数据,用于发现、目录丰富、市场研究、价格监控和竞争对手分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "amazon/search-products/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "amazon",
+        "亚马逊",
+        "Amazon",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "amazon.get_product_detail_v1",
+      "platform": "amazon",
+      "channel": "ecommerce",
+      "title": "亚马逊·商品详情",
+      "summary": "获取亚马逊商品详情数据,包括标题、品牌和价格,用于构建商品目录和丰富商品内容(如图像)、价格监控和可用性跟踪,以及电子商务分析和竞争对手跟踪。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "amazon/get-product-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "asin"
+      ],
+      "tags": [
+        "amazon",
+        "亚马逊",
+        "Amazon",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "amazon.get_product_top_reviews_v1",
+      "platform": "amazon",
+      "channel": "ecommerce",
+      "title": "亚马逊·商品热门评论",
+      "summary": "获取亚马逊商品热门评价数据,包括最有帮助的公开评价,用于情感分析和消费者反馈跟踪、产品研究和质量评估,以及监控竞争对手的客户体验。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "amazon/get-product-top-reviews/v1",
+      "params": [],
+      "requiredParams": [
+        "asin"
+      ],
+      "tags": [
+        "amazon",
+        "亚马逊",
+        "Amazon",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "amazon.get_best_sellers_v1",
+      "platform": "amazon",
+      "channel": "ecommerce",
+      "title": "亚马逊·热销商品",
+      "summary": "获取亚马逊畅销商品数据,包括排名位置、商品元数据和定价,用于识别特定类别中的热门商品、市场份额分析和类别研究,以及跟踪销售排名和随时间变化的受欢迎程度。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "amazon/get-best-sellers/v1",
+      "params": [],
+      "requiredParams": [
+        "category"
+      ],
+      "tags": [
+        "amazon",
+        "亚马逊",
+        "Amazon",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "amazon.get_category_products_v1",
+      "platform": "amazon",
+      "channel": "ecommerce",
+      "title": "亚马逊·按类别获取商品",
+      "summary": "获取亚马逊按类别商品数据,包括标题、价格和评分,用于基于类别的商品发现,并返回商品信息,如标题、价格和评分。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "amazon/get-category-products/v1",
+      "params": [],
+      "requiredParams": [
+        "categoryId"
+      ],
+      "tags": [
+        "amazon",
+        "亚马逊",
+        "Amazon",
+        "ecommerce",
+        "电商",
+        "商品",
+        "product"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "facebook.search_post_v1",
+      "platform": "facebook",
+      "channel": "ecommerce",
+      "title": "Facebook·作品搜索",
+      "summary": "获取 Facebook 帖子搜索数据,包括匹配结果、元数据和排名信号,用于发现特定关键词的相关公开帖子,并分析 Facebook 上公开内容的参与度和覆盖范围。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "facebook/search-post/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "facebook",
+        "Facebook",
+        "脸书",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "facebook.get_profile_id_v1",
+      "platform": "facebook",
+      "channel": "ecommerce",
+      "title": "Facebook·获取资料ID",
+      "summary": "从给定的Facebook资料URL中检索唯一的Facebook资料ID。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "facebook/get-profile-id/v1",
+      "params": [],
+      "requiredParams": [
+        "url"
+      ],
+      "tags": [
+        "facebook",
+        "Facebook",
+        "脸书",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "facebook.get_profile_posts_v1",
+      "platform": "facebook",
+      "channel": "ecommerce",
+      "title": "Facebook·获取资料帖子",
+      "summary": "通过Facebook个人资料ID获取指定Facebook个人资料的公开帖子。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "facebook/get-profile-posts/v1",
+      "params": [],
+      "requiredParams": [
+        "profileId"
+      ],
+      "tags": [
+        "facebook",
+        "Facebook",
+        "脸书",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "twitter.search_v1",
+      "platform": "twitter",
+      "channel": "ecommerce",
+      "title": "Twitter/X·搜索时间线",
+      "summary": "通过TIKHUB搜索Twitter时间线数据,包括热门、最新、媒体、人物和列表结果,支持游标分页,用于社交聆听、话题追踪和账号发现。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "twitter/search/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "twitter",
+        "Twitter/X",
+        "x",
+        "推特",
+        "Twitter",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "twitter.get_user_detail_v1",
+      "platform": "twitter",
+      "channel": "ecommerce",
+      "title": "Twitter/X·用户资料",
+      "summary": "获取 Twitter 用户资料数据,包括账户元数据、受众指标和验证相关字段,用于访问用户资料元数据(如描述、位置、验证状态)和收集关注者和关注数。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "twitter/get-user-detail/v1",
+      "params": [],
+      "requiredParams": [
+        "restId"
+      ],
+      "tags": [
+        "twitter",
+        "Twitter/X",
+        "x",
+        "推特",
+        "Twitter",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "twitter.get_user_posts_v1",
+      "platform": "twitter",
+      "channel": "ecommerce",
+      "title": "Twitter/X·用户发布帖子",
+      "summary": "获取 Twitter 用户发布帖子数据,包括帖子内容、时间戳和参与度数据,用于账户监控和内容分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "twitter/get-user-posts/v1",
+      "params": [],
+      "requiredParams": [
+        "restId"
+      ],
+      "tags": [
+        "twitter",
+        "Twitter/X",
+        "x",
+        "推特",
+        "Twitter",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "beike.ershoufang_detail_v1",
+      "platform": "beike",
+      "channel": "ecommerce",
+      "title": "贝壳·二手房详情",
+      "summary": "获取贝壳二手房详情数据,包括 - 定价(总价和单价)、物理属性(面积和布局),用于向用户展示完整的房产资料,并进行特定房源之间的详细价格比较。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "beike/ershoufang/detail/v1",
+      "params": [],
+      "requiredParams": [
+        "cityId",
+        "houseCode"
+      ],
+      "tags": [
+        "beike",
+        "贝壳",
+        "房产",
+        "二手房",
+        "Beike",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "beike.get_ershoufang_list_v1",
+      "platform": "beike",
+      "channel": "ecommerce",
+      "title": "贝壳·二手房列表",
+      "summary": "获取贝壳二手房列表数据,包括 - 支持按城市/地区、价格范围和布局过滤,用于为房产门户构建搜索结果页面,并聚合市场数据以分析区域住房趋势。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "beike/get-ershoufang-list/v1",
+      "params": [],
+      "requiredParams": [
+        "cityId"
+      ],
+      "tags": [
+        "beike",
+        "贝壳",
+        "房产",
+        "二手房",
+        "Beike",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "beike.community_list_v1",
+      "platform": "beike",
+      "channel": "ecommerce",
+      "title": "贝壳·小区列表",
+      "summary": "获取贝壳小区列表数据,包括 - 小区名称和唯一 ID 以及平均挂牌价格和历史价格趋势,用于识别城市中受欢迎的住宅区,并比较不同小区的平均房价。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "beike/community/list/v1",
+      "params": [],
+      "requiredParams": [
+        "cityId"
+      ],
+      "tags": [
+        "beike",
+        "贝壳",
+        "房产",
+        "二手房",
+        "Beike",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1,
+      "deprecated": true
+    },
+    {
+      "id": "imdb.title_release_expectation_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·发行预期",
+      "summary": "获取 IMDb 标题上映预期数据,包括制作状态、上映日期和预期信号,用于上映监控和标题研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-release-expectation-query/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_extended_details_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·扩展详情",
+      "summary": "获取 IMDb 标题扩展详情数据,包括标题信息、图像和类型,用于标题丰富和目录研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-extended-details-query/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_top_cast_and_crew_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·主要演员和工作人员",
+      "summary": "获取 IMDb 标题主要演员和工作人员数据,包括姓名、角色和资料参考,用于人才研究和标题丰富。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-top-cast-and-crew/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_base_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·基本信息",
+      "summary": "获取 IMDb 标题基本信息数据,包括标题文本、上映年份和类型,用于目录丰富和标题查找工作流。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-base-query/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_redux_overview_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·Redux概览",
+      "summary": "获取IMDb标题Redux概览数据,包括关键摘要字段和关联元数据,用于获取电影或电视节目关键属性的简明摘要和概览。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-redux-overview-query/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_did_you_know_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·'你知道吗'洞察",
+      "summary": "获取IMDb标题'你知道吗'洞察数据,包括琐事信息,用于编辑研究和标题洞察丰富。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-did-you-know-query/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_critics_review_summary_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·影评人评论摘要",
+      "summary": "获取IMDb标题影评人评论摘要数据,包括评论亮点,用于评论分析和标题比较。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-critics-review-summary-query/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_awards_summary_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·奖项摘要",
+      "summary": "获取IMDb标题奖项摘要数据,包括提名信息,用于标题基准测试和奖项研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-awards-summary-query/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_user_reviews_summary_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·用户评价摘要",
+      "summary": "获取IMDb标题用户评论摘要数据,包括聚合评论内容和数量,用于观众情感分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-user-reviews-summary-query/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_plot_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·剧情摘要",
+      "summary": "获取IMDb标题剧情摘要数据,包括核心指标、趋势信号和性能指标,用于显示电影或电视节目的详细剧情描述。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-plot-query/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_contribution_questions_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·贡献问题",
+      "summary": "获取IMDb标题贡献问题数据,包括特定IMDb标题,用于数据维护工作流和标题元数据审查。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-contribution-questions/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_details_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·详情",
+      "summary": "获取IMDb标题详情数据,包括元数据、发布信息和演员阵容,用于深度标题研究和目录丰富。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-details-query/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_box_office_summary_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·票房摘要",
+      "summary": "获取IMDb标题票房摘要数据,包括票房收入和相关性能指标,用于收入跟踪和标题比较。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-box-office-summary/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_more_like_this_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·推荐",
+      "summary": "获取IMDb标题推荐数据,包括相关标题和建议元数据,用于内容发现和推荐分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-more-like-this-query/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.main_search_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·关键词搜索",
+      "summary": "获取IMDb关键词搜索数据,包括匹配结果、元数据和排名信号,用于实体发现和娱乐研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/main-search-query/v1",
+      "params": [],
+      "requiredParams": [
+        "searchTerm"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.streaming_picks_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·流媒体精选",
+      "summary": "获取IMDb流媒体精选数据,包括流媒体平台上可用的精选标题,用于内容发现和观看列表研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/streaming-picks-query/v1",
+      "params": [],
+      "requiredParams": [],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.news_by_category_query_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·分类新闻",
+      "summary": "获取IMDb按类别新闻数据,包括标题、摘要和来源元数据,用于媒体监控和新闻研究。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/news-by-category-query/v1",
+      "params": [],
+      "requiredParams": [
+        "category"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_chart_rankings_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·榜单排名",
+      "summary": "获取IMDb标题榜单排名数据,包括在Top 250等榜单和相关图表中的位置,用于排名监控和标题基准测试。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-chart-rankings/v1",
+      "params": [],
+      "requiredParams": [
+        "rankingsChartType"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "imdb.title_countries_of_origin_v1",
+      "platform": "imdb",
+      "channel": "ecommerce",
+      "title": "IMDb·原产国",
+      "summary": "获取IMDb标题原产国数据,包括国家名称和区域元数据,用于目录丰富和区域内容分析。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "imdb/title-countries-of-origin/v1",
+      "params": [],
+      "requiredParams": [
+        "id"
+      ],
+      "tags": [
+        "imdb",
+        "IMDb",
+        "影视",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "web.html_v1",
+      "platform": "web",
+      "channel": "ecommerce",
+      "title": "网页·HTML内容",
+      "summary": "获取网页的HTML内容。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "web/html/v1",
+      "params": [],
+      "requiredParams": [
+        "url"
+      ],
+      "tags": [
+        "web",
+        "网页",
+        "网站",
+        "html",
+        "markdown",
+        "Web Page",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "web.rendered_html_v1",
+      "platform": "web",
+      "channel": "ecommerce",
+      "title": "网页·渲染的HTML内容",
+      "summary": "获取网页的渲染HTML内容。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "web/rendered-html/v1",
+      "params": [],
+      "requiredParams": [
+        "url"
+      ],
+      "tags": [
+        "web",
+        "网页",
+        "网站",
+        "html",
+        "markdown",
+        "Web Page",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "web.markdown_v1",
+      "platform": "web",
+      "channel": "ecommerce",
+      "title": "网页·Markdown内容",
+      "summary": "获取网页的Markdown内容。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "web/markdown/v1",
+      "params": [],
+      "requiredParams": [
+        "url"
+      ],
+      "tags": [
+        "web",
+        "网页",
+        "网站",
+        "html",
+        "markdown",
+        "Web Page",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
+    },
+    {
+      "id": "llm.doubao_answer_v1",
+      "platform": "llm",
+      "channel": "ecommerce",
+      "title": "LLM·豆包回答",
+      "summary": "获取关键词或问题的豆包网页回答,包括可用的提取参考文献。",
+      "method": "GET",
+      "paramsIn": "query",
+      "proxyPath": "llm/doubao-answer/v1",
+      "params": [],
+      "requiredParams": [
+        "keyword"
+      ],
+      "tags": [
+        "llm",
+        "LLM",
+        "大模型",
+        "豆包",
+        "ecommerce",
+        "电商"
+      ],
+      "billing": 1
     }
   ]
 }

+ 104 - 0
claude-code/claude-code-voc-intelligence/mcp/src/core/activation.js

@@ -0,0 +1,104 @@
+'use strict';
+
+// 安装收尾激活检查(仅供外部 AI IDE 渠道的 `workspace --activate` 调用)。
+//
+// 设计要点(与 voc-api-catalog 计费链一致,复用同一套凭证解析,绝不另建路径):
+// - 复用 credentials.js 的 readNewApiToken()(sk- 主链)/ readVocToken()(r: 会话回退)。
+// - 按「是否已有可用 token」这一状态触发,而不是按命令触发:
+//     * 已检测到 token(飞马 UI 已写入,或 Claude Code 已配 sk-)→ 打印「✅ 已激活」,不弹浏览器。
+//     * 完全没有 token(现场新教练)→ 安装收尾立刻打开充值/登录页,避免进入取数流程后才弹、空耗 token。
+// - 不主动发计费请求做探测(探测会真扣费);余额不足留给真实取数时由 catalog 的 402 分支处理。
+// - VOC_OPEN_PAYMENT=0 可强制关闭弹窗(CI / 冒烟 / 无头环境)。
+// - 始终把 URL 打印到终端兜底;并追加 &channel=&src=install 做渠道归因。
+// - token 绝不回显到终端 / 日志。
+
+const { spawn } = require('child_process');
+const { readNewApiToken, readVocToken } = require('./credentials');
+const { buildVocRechargeInfo } = require('./payment-links');
+
+function appendAttribution(rawUrl, channel, src) {
+  try {
+    const url = new URL(rawUrl);
+    if (channel) url.searchParams.set('channel', String(channel));
+    if (src) url.searchParams.set('src', String(src));
+    return url.toString();
+  } catch {
+    return rawUrl;
+  }
+}
+
+function openBrowser(url) {
+  try {
+    let command;
+    let args;
+    if (process.platform === 'win32') {
+      command = 'cmd';
+      // 空字符串是 start 的窗口标题占位,避免带引号的 URL 被当成标题
+      args = ['/d', '/s', '/c', 'start', '', url];
+    } else if (process.platform === 'darwin') {
+      command = 'open';
+      args = [url];
+    } else {
+      command = 'xdg-open';
+      args = [url];
+    }
+    const child = spawn(command, args, { stdio: 'ignore', detached: true });
+    child.on('error', () => {});
+    child.unref();
+    return true;
+  } catch {
+    return false;
+  }
+}
+
+// channel: 渠道名(claude-code / codex / workbuddy),用于付费归因
+// src: 来源标记,默认 install
+async function ensureActivated({ channel = 'external', src = 'install' } = {}) {
+  if (process.env.VOC_OPEN_PAYMENT === '0') {
+    console.log('');
+    console.log('VOC_OPEN_PAYMENT=0:已跳过激活弹窗(CI/无头环境)。');
+    return { status: 'skipped' };
+  }
+
+  const newApiToken = readNewApiToken();
+  const vocToken = readVocToken();
+
+  if (newApiToken || vocToken) {
+    console.log('');
+    console.log('✅ 已激活:检测到 VOC 计费/会话 token,可直接开始取数,无需充值。');
+    console.log('(若取数时返回 402 余额不足,再按工具提示充值即可。)');
+    return { status: 'activated' };
+  }
+
+  // 完全没有 token:现场新用户。打开充值/登录页,引导先付费再进流程。
+  // 无 token 时 buildVocRechargeInfo 不会发起网络请求(resolveVocUserId 对空 token 直接返回)。
+  let recharge;
+  try {
+    recharge = await buildVocRechargeInfo({ token: '' });
+  } catch {
+    recharge = {};
+  }
+  const primaryUrl = appendAttribution(
+    recharge.recommendedPackageUrl || recharge.paymentUrl || 'https://app.fmode.cn/dev/apig-pay/',
+    channel,
+    src
+  );
+
+  console.log('');
+  console.log('⚠️  尚未检测到 VOC token —— 你还没有激活。');
+  console.log('为避免进入取数流程后才发现需要付费、白白消耗 token,请先在浏览器完成登录并充值/开通:');
+  console.log(`  ${primaryUrl}`);
+  if (recharge.paymentUrl) {
+    console.log(`  (充值入口:${appendAttribution(recharge.paymentUrl, channel, src)})`);
+  }
+  console.log('完成付费后,再让 AI 进入取数/报告流程。');
+  console.log('如本机无法自动打开浏览器,请手动复制上面的链接到浏览器打开。');
+
+  const opened = openBrowser(primaryUrl);
+  if (!opened) {
+    console.log('(自动打开浏览器失败,请手动打开上面的链接。)');
+  }
+  return { status: 'needs_activation', url: primaryUrl };
+}
+
+module.exports = { ensureActivated, openBrowser, appendAttribution };

+ 211 - 0
claude-code/claude-code-voc-intelligence/mcp/src/core/version-check.js

@@ -0,0 +1,211 @@
+'use strict';
+
+/**
+ * Self-update detection for the locally-installed VOC skill package.
+ *
+ * Surfaces a one-line "new version available" hint inside tool results so that
+ * a user running the skill in Claude Code is told, while they work, that an
+ * update exists. Network access is best-effort: it is throttled (24h cache),
+ * fail-silent (never throws, never blocks a tool call), and can be disabled.
+ */
+
+const fs = require('fs');
+const path = require('path');
+const os = require('os');
+const https = require('https');
+
+const PKG = '@vocmarket/voc-skill';
+const REGISTRY_URL = `https://registry.npmjs.org/${PKG.replace('/', '%2F')}/latest`;
+const TTL_MS = 24 * 60 * 60 * 1000; // check npm at most once per day
+const FETCH_TIMEOUT_MS = 1500;
+const CACHE_FILE = path.join(os.homedir(), '.claude', 'voc-update-check.json');
+
+let sessionNotified = false; // notify at most once per server process (session)
+let latestInMemory = null; // populated by primeUpdateCheck()
+
+function isDisabled() {
+  return process.env.VOC_SKILL_NO_UPDATE_CHECK === '1';
+}
+
+function getInstalledVersion() {
+  // version-check.js lives at <pkg>/mcp/src/core/, package.json at <pkg>/.
+  const candidates = [
+    path.join(__dirname, '..', '..', '..', 'package.json'),
+    path.join(__dirname, '..', '..', '..', 'skill-package-manifest.json')
+  ];
+  for (const file of candidates) {
+    try {
+      const json = JSON.parse(fs.readFileSync(file, 'utf8'));
+      if (json && typeof json.version === 'string') return json.version;
+    } catch (_) {
+      /* ignore and try next */
+    }
+  }
+  return null;
+}
+
+// Compare two semver strings. Returns 1 if a>b, -1 if a<b, 0 if equal.
+// Handles `major.minor.patch[-prerelease]`; a release outranks its prerelease.
+function compareSemver(a, b) {
+  const parse = v => {
+    const [core, pre] = String(v).trim().replace(/^v/, '').split('-');
+    const nums = core.split('.').map(n => parseInt(n, 10) || 0);
+    return { nums: [nums[0] || 0, nums[1] || 0, nums[2] || 0], pre: pre || '' };
+  };
+  const pa = parse(a);
+  const pb = parse(b);
+  for (let i = 0; i < 3; i += 1) {
+    if (pa.nums[i] > pb.nums[i]) return 1;
+    if (pa.nums[i] < pb.nums[i]) return -1;
+  }
+  if (pa.pre === pb.pre) return 0;
+  if (!pa.pre) return 1; // release > prerelease
+  if (!pb.pre) return -1;
+  return pa.pre > pb.pre ? 1 : -1;
+}
+
+function readCache() {
+  try {
+    const cache = JSON.parse(fs.readFileSync(CACHE_FILE, 'utf8'));
+    if (cache && typeof cache === 'object') return cache;
+  } catch (_) {
+    /* no cache yet / unreadable */
+  }
+  return null;
+}
+
+function writeCache(next) {
+  try {
+    fs.mkdirSync(path.dirname(CACHE_FILE), { recursive: true });
+    const tmp = `${CACHE_FILE}.${process.pid}.tmp`;
+    fs.writeFileSync(tmp, JSON.stringify(next));
+    fs.renameSync(tmp, CACHE_FILE); // atomic swap, survives concurrent writers
+  } catch (_) {
+    /* caching is best-effort */
+  }
+}
+
+function fetchLatest() {
+  return new Promise(resolve => {
+    let done = false;
+    const finish = value => {
+      if (done) return;
+      done = true;
+      resolve(value);
+    };
+    try {
+      const req = https.get(REGISTRY_URL, { timeout: FETCH_TIMEOUT_MS }, res => {
+        if (res.statusCode !== 200) {
+          res.resume();
+          return finish(null);
+        }
+        let body = '';
+        res.on('data', chunk => {
+          body += chunk;
+          if (body.length > 1e6) req.destroy(); // guard against pathological size
+        });
+        res.on('end', () => {
+          try {
+            const v = JSON.parse(body).version;
+            finish(typeof v === 'string' ? v : null);
+          } catch (_) {
+            finish(null);
+          }
+        });
+      });
+      req.on('timeout', () => {
+        req.destroy();
+        finish(null);
+      });
+      req.on('error', () => finish(null));
+    } catch (_) {
+      finish(null);
+    }
+  });
+}
+
+/**
+ * Fire-and-forget at server startup. Refreshes `latestInMemory` from the 24h
+ * cache, or from npm when the cache is stale. Always resolves, never throws.
+ */
+async function primeUpdateCheck() {
+  if (isDisabled()) return;
+  try {
+    const cache = readCache();
+    if (cache && cache.latest && typeof cache.fetchedAt === 'number' && Date.now() - cache.fetchedAt < TTL_MS) {
+      latestInMemory = cache.latest;
+      return;
+    }
+    const latest = await fetchLatest();
+    if (latest) {
+      latestInMemory = latest;
+      writeCache({ ...(cache || {}), latest, fetchedAt: Date.now() });
+    } else if (cache && cache.latest) {
+      latestInMemory = cache.latest; // fall back to a stale-but-known value
+    }
+  } catch (_) {
+    /* never let update detection affect the server */
+  }
+}
+
+/**
+ * Synchronous. Returns a one-line update notice the first time it is called in
+ * a session where a newer version is known, otherwise null. Safe to call from
+ * the hot path of every tool result.
+ */
+function consumeUpdateNotice() {
+  try {
+    if (isDisabled() || sessionNotified) return null;
+
+    let latest = latestInMemory;
+    if (!latest) {
+      const cache = readCache(); // prime may not have finished yet
+      if (cache && cache.latest) latest = cache.latest;
+    }
+    if (!latest) return null;
+
+    const installed = getInstalledVersion();
+    if (!installed) return null;
+    if (compareSemver(latest, installed) <= 0) return null;
+
+    // Don't re-nag across sessions for a version we already announced.
+    const cache = readCache() || {};
+    if (cache.notifiedVersion === latest) {
+      sessionNotified = true;
+      return null;
+    }
+
+    sessionNotified = true;
+    writeCache({ ...cache, notifiedVersion: latest });
+    return (
+      `ℹ️ VOC 技能包有新版本 ${latest}(当前 ${installed})。新版多平台电商/海外选品等接口能力更全。\n` +
+      '更新命令:npx @vocmarket/voc-skill@latest install(或 workspace 模式同理)。'
+    );
+  } catch (_) {
+    return null;
+  }
+}
+
+/** Prepend the update notice (once) to a normalized tool result in place. */
+function applyUpdateNotice(result) {
+  try {
+    if (!result || typeof result.assistantMessage !== 'string') return result;
+    const notice = consumeUpdateNotice();
+    if (notice) {
+      result.assistantMessage = result.assistantMessage
+        ? `${notice}\n\n${result.assistantMessage}`
+        : notice;
+    }
+  } catch (_) {
+    /* never block a tool result */
+  }
+  return result;
+}
+
+module.exports = {
+  primeUpdateCheck,
+  consumeUpdateNotice,
+  applyUpdateNotice,
+  getInstalledVersion,
+  compareSemver
+};

+ 56 - 0
claude-code/claude-code-voc-intelligence/mcp/src/providers/overseas-gateway.js

@@ -0,0 +1,56 @@
+// 海外电商数据中转网关(voc-ecom)。用于亚马逊海外站点的类目市场、产品、关键词(ABA)、
+// 数据监控等结构化选品数据接口。鉴权、计费、错误分类、重试逻辑全部复用社媒网关
+// (voc-gateway)的共享实现;与 social/ecommerce 两套网关不同的是:上游为 /forward
+// 信封式转发(服务端按 {path,method,query,body} 透传到海外电商上游),对外不暴露
+// 任何上游数据供应商名称。
+const {
+  requestJson,
+  classifyApiError,
+  redactSecret,
+  unwrapData
+} = require('./voc-gateway');
+
+const OVERSEAS_GATEWAY_ROOT = 'https://server.fmode.cn/api/voc-ecom';
+
+function resolveOverseasRoot(baseUrl) {
+  return String(
+    baseUrl ||
+      process.env.VOC_ECOM_API_BASE_URL ||
+      process.env.VOC_ECOM_GATEWAY_URL ||
+      OVERSEAS_GATEWAY_ROOT
+  ).replace(/\/$/, '');
+}
+
+// 把 proxyPath/method/query/body 打包成 /forward 信封,统一 POST 到海外电商中转网关。
+// query 会被服务端透传为上游 querystring(如 domain),body 透传为上游 JSON body。
+// 与 callSocialGateway 完全一致的「优先 newapi sk-、鉴权失败回退 sessionToken」逻辑,
+// 402(余额不足)/403(无权限)不回退。
+async function callOverseasGateway({ proxyPath, method = 'POST', query = {}, body, token, fallbackToken, baseUrl, retries = 3 } = {}) {
+  const root = resolveOverseasRoot(baseUrl);
+  const url = `${root}/forward`;
+  const rawPath = String(proxyPath || '').trim();
+  const envelope = {
+    path: rawPath.startsWith('/') ? rawPath : `/${rawPath}`,
+    method: String(method || 'POST').toUpperCase(),
+    query: query || {},
+    body: body || {}
+  };
+  const requestOptions = { method: 'POST', body: envelope, retries };
+  try {
+    return await requestJson(url, token, requestOptions);
+  } catch (error) {
+    const canFallback = fallbackToken && fallbackToken !== token && error && error.kind === 'auth';
+    if (!canFallback) throw error;
+    return requestJson(url, fallbackToken, requestOptions);
+  }
+}
+
+module.exports = {
+  OVERSEAS_GATEWAY_ROOT,
+  resolveOverseasRoot,
+  classifyApiError,
+  redactSecret,
+  unwrapData,
+  requestJson,
+  callOverseasGateway
+};

+ 3 - 0
claude-code/claude-code-voc-intelligence/mcp/src/server.js

@@ -16,6 +16,7 @@ const { runBusinessWorkflow } = require('./tools/voc-business-workflow-run');
 const { analyzeFmodeImage } = require('./tools/fmode-image-analysis');
 const { searchVocApis, getVocApiDoc, callVocApi } = require('./tools/voc-api-catalog-run');
 const { buildVocRechargeInfo, buildMissingTokenMessage, buildMissingNewApiTokenMessage } = require('./core/payment-links');
+const { primeUpdateCheck, applyUpdateNotice } = require('./core/version-check');
 
 function asToolResult(result) {
   const normalized = normalizeToolResult(result);
@@ -55,6 +56,7 @@ function normalizeToolResult(result = {}) {
   if (Object.prototype.hasOwnProperty.call(result, 'errors')) {
     normalized.errors = Array.isArray(result.errors) ? result.errors : [];
   }
+  applyUpdateNotice(normalized);
   return normalized;
 }
 
@@ -774,6 +776,7 @@ function createServer() {
 
 async function main() {
   const server = createServer();
+  primeUpdateCheck(); // fire-and-forget: refresh latest-version knowledge for update hints
   const transport = new StdioServerTransport();
   await server.connect(transport);
 }

+ 10 - 2
claude-code/claude-code-voc-intelligence/mcp/src/tools/voc-api-catalog-run.js

@@ -9,6 +9,7 @@ const {
 } = require('../core/api-catalog');
 const { callSocialGateway, redactSecret } = require('../providers/voc-gateway');
 const { callEcommerceGateway } = require('../providers/ecommerce-gateway');
+const { callOverseasGateway } = require('../providers/overseas-gateway');
 const {
   buildVocRechargeInfo,
   buildMissingTokenMessage,
@@ -45,7 +46,10 @@ async function searchVocApis(input = {}) {
     '',
     `社媒网关:${catalog.gateway?.social?.baseUrl || ''}(小红书/抖音内容、评论等,channel=social,默认)。`,
     catalog.gateway?.ecommerce?.baseUrl
-      ? `创作者数据网关:${catalog.gateway.ecommerce.baseUrl}(抖音星图/小红书蒲公英创作者搜索·画像·受众·绩效等结构化数据,channel=ecommerce)。`
+      ? `电商与创作者数据网关:${catalog.gateway.ecommerce.baseUrl}(京东/淘宝天猫/1688/抖音电商/TikTok Shop/闲鱼/得物 等电商商品搜索·详情·价格·评论·店铺,抖音星图/小红书蒲公英创作者数据,及微信/微博/B站/知乎/头条/IMDb 等内容平台,channel=ecommerce)。`
+      : '',
+    catalog.gateway?.overseas?.baseUrl
+      ? `海外电商选品网关:${catalog.gateway.overseas.baseUrl}(亚马逊海外站点类目树/Best Seller·产品详情与销量·ABA 关键词·评论·数据监控等选品数据,channel=overseas)。`
       : '',
     '通用转发:任意 proxyPath 透传到对应上游,每次调用计费 1 次;通道由接口的 channel 字段决定,未登记接口可传 channel 覆盖。',
     query ? `匹配关键词「${query}」的接口(${results.length} 条):` : `全部已登记接口(${results.length} 条):`,
@@ -226,7 +230,11 @@ async function callVocApi(input = {}) {
   // ecommerce 走创作者数据网关(voc-e-commerce,星图/蒲公英创作者侧结构化数据)。两套网关鉴权、计费、
   // 错误处理完全同源,只是根地址不同。VOC 默认 social;未登记的 rawPath 调用可用 input.channel 覆盖。
   const channel = String((endpoint && endpoint.channel) || input.channel || 'social').toLowerCase();
-  const callGateway = channel === 'ecommerce' ? callEcommerceGateway : callSocialGateway;
+  const callGateway = channel === 'overseas'
+    ? callOverseasGateway
+    : channel === 'ecommerce'
+      ? callEcommerceGateway
+      : callSocialGateway;
 
   try {
     const result = await callGateway({

+ 2 - 2
claude-code/claude-code-voc-intelligence/package-lock.json

@@ -1,12 +1,12 @@
 {
   "name": "@vocmarket/voc-skill",
-  "version": "0.3.24",
+  "version": "0.3.30",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "@vocmarket/voc-skill",
-      "version": "0.3.24",
+      "version": "0.3.30",
       "dependencies": {
         "@modelcontextprotocol/sdk": "^1.29.0",
         "zod": "^4.4.3"

+ 1 - 1
claude-code/claude-code-voc-intelligence/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@vocmarket/voc-skill",
-  "version": "0.3.26",
+  "version": "0.3.30",
   "description": "Claude Code VOC intelligence skills for Xiaohongshu and Douyin trend reports, live social VOC collection, Fmode image analysis, single-issue deep dives, boss/operator action plans, and multi-turn memory.",
   "type": "commonjs",
   "bin": {

+ 58 - 2
claude-code/claude-code-voc-intelligence/skill-package-manifest.json

@@ -1,7 +1,63 @@
 {
   "name": "claude-code-voc-intelligence",
-  "version": "0.3.26",
+  "version": "0.3.30",
+  "capabilities": {
+    "summary": "三类情报源同源接入:①社媒内容 ②国内电商+创作者情报 ③海外选品。统一 search→doc→call、鉴权计费一致。",
+    "channels": [
+      {
+        "key": "social",
+        "label": "社媒内容",
+        "platforms": 18,
+        "apis": 1018,
+        "examples": [
+          "抖音",
+          "小红书",
+          "TikTok",
+          "YouTube",
+          "微博",
+          "哔哩哔哩",
+          "快手",
+          "知乎",
+          "Instagram",
+          "Reddit",
+          "Twitter/X",
+          "微信/视频号"
+        ]
+      },
+      {
+        "key": "ecommerce",
+        "label": "国内电商 + 创作者情报",
+        "platforms": 32,
+        "apis": 285,
+        "examples": [
+          "京东",
+          "淘宝天猫",
+          "1688",
+          "抖音电商",
+          "TikTok Shop",
+          "闲鱼",
+          "得物",
+          "抖音星图",
+          "小红书蒲公英"
+        ]
+      },
+      {
+        "key": "overseas",
+        "label": "海外选品",
+        "platforms": 1,
+        "apis": 37,
+        "examples": [
+          "亚马逊"
+        ]
+      }
+    ],
+    "totals": {
+      "platforms": 51,
+      "apis": 1340
+    }
+  },
   "description": "Claude Code native VOC intelligence package for cross-industry social VOC workflows. Includes Xiaohongshu and Douyin trend intelligence, live token checks, evidence-card reports, single-issue VOC deep dives, boss/operator action plans, and scoped multi-turn memory.",
+  "changelogUrl": "https://www.npmjs.com/package/@vocmarket/voc-skill?activeTab=versions",
   "plugin": "voc-intelligence",
   "skills": [
     "xiaohongshu-trend-intelligence",
@@ -67,4 +123,4 @@
   "workspaceInstallCommand": "npx @vocmarket/voc-skill workspace --smoke",
   "workspaceInstallTarget": ".claude/plugins/voc-intelligence",
   "installHint": "Supports three delivery modes: unzip and run node install.js, install globally into ~/.claude/plugins/voc-intelligence, or install into the current workspace. Workspace mode writes .mcp.json plus .claude/skills/* entries for trend intelligence, issue pool, deep dive, competitor map, content plan, speaking script, VOC business workflow, and Fmode image analysis so VSCode Claude Code can discover the workflows without relying only on --plugin-dir."
-}
+}

+ 7 - 0
claude-code/claude-code-voc-intelligence/skills/douyin-trend-intelligence/SKILL.md

@@ -77,6 +77,13 @@ node "<插件目录>/mcp/src/tools/douyin-trend-run.js" --collection-mode live -
 - 只有真 `402 余额不足` 才充值,入口 `https://app.fmode.cn/dev/studio/?balance=fmodeapi`(NewAPI/fmode-api 计费);`401`=token、`403`=权限,都不充值。`apig-pay/?apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF` 仅限 `r:` 会话 token 余额补充。
 - 实际充值/自救链接以工具返回的 `assistantMessage` / `nextActions` 为准,不要写死。
 
+## 参考资料(按需展开阅读)
+
+- `references/user-workflow.md`:推荐工作流——先判断样例演示 vs 真实采集,再决定调用方式。
+- `references/output-format.md`:第一轮抖音趋势报告的固定段落格式。
+- `references/live-mode.md`:live 模式默认规则(样本量、计费简版口径)。
+- 错误码 / 充值计费的完整权威对照见 voc-api-catalog 技能的 `references/error-codes.md`。
+
 ## 推荐用户启动话术
 
 > 通用模板:把 `{你的行业/品类}` 替换成用户真实所在的行业或品类,不要内置任何特定行业。

+ 11 - 5
claude-code/claude-code-voc-intelligence/skills/voc-api-catalog/SKILL.md

@@ -1,6 +1,6 @@
 ---
 name: voc-api-catalog
-description: 清单驱动的 VOC 数据采集,覆盖类情报源。把所有转发接口做成清单,按需查清单、读参数文档,自己拼参数完成任意行业/任意方向的数据采集。条通道:①社媒内容(channel=social,默认)覆盖抖音、TikTok、小红书、Instagram、YouTube、Twitter/X、LinkedIn、微博、B站、快手、知乎、Reddit、Threads、微信视频号 等 18 个国内外社媒平台的搜索/评论/详情;②创作者侧情报(channel=ecommerce)覆盖抖音星图、小红书蒲公英(PGY)的创作者搜索、画像、受众/粉丝分布、内容与评论关键词、笔记/视频绩效与性价比等结构化数据,用于理解创作者生态、竞对达人布局、受众匹配与内容方向验证。当用户要采集某关键词的社交内容/评论、要做竞对/创作者生态/受众洞察/选题/内容战略相关的分析、要调用某个数据接口、或现有专用工具不覆盖某接口时使用。
+description: 清单驱动的 VOC 数据采集,覆盖类情报源。把所有转发接口做成清单,按需查清单、读参数文档,自己拼参数完成任意行业/任意方向的数据采集。条通道:①社媒内容(channel=social,默认)覆盖抖音、TikTok、小红书、Instagram、YouTube、Twitter/X、LinkedIn、微博、B站、快手、知乎、Reddit、Threads、微信视频号 等 18 个国内外社媒平台的搜索/评论/详情;②国内电商 + 创作者情报(channel=ecommerce)覆盖京东、淘宝/天猫、1688、抖音电商、TikTok Shop、闲鱼、得物 等电商平台的商品搜索·详情·价格·评论·店铺商品,抖音星图、小红书蒲公英(PGY)创作者搜索/画像/受众/绩效,以及微信公众号、视频号、微博、B站、知乎、快手、头条、豆瓣、IMDb 等内容平台的结构化数据;③海外选品(channel=overseas)覆盖亚马逊海外站点的类目树/Best Seller 榜单、产品详情与销量、ABA 关键词、产品评论、数据监控等选品数据。当用户要采集某关键词的社交内容/评论、查电商商品/价格/商品评论/选品(含京东淘宝天猫拼多多类需求与海外亚马逊)、做竞对/创作者生态/受众洞察/选题/内容战略分析、要调用某个数据接口、或现有专用工具不覆盖某接口时使用——优先来这里查清单,不要因为以为「没有这个能力」就退回 WebSearch
 ---
 
 # VOC 接口清单驱动采集
@@ -15,14 +15,18 @@ VOC 后端是一个**通用转发网关**(`https://server.fmode.cn/api/voc-soc
 
 清单里没有的接口,也可以直接用 `voc_api_call` 传 `rawPath` + `method` + `params` 调用,无需改代码。
 
-## 两条通道:社媒内容 vs 创作者侧情报(channel)
+## 三条通道:社媒内容 / 国内电商+创作者 / 海外选品(channel)
 
 清单里每个接口都带 `channel` 字段,`voc_api_call` 据此**自动**选用对应网关,你通常无需关心:
 
 - `channel="social"`(默认):走社媒中转网关 `https://server.fmode.cn/api/voc-social`。抖音/小红书等 18 平台的内容搜索、评论、用户/笔记详情等 VOC 口碑采集走这条。
-- `channel="ecommerce"`:走创作者数据网关 `https://server.fmode.cn/api/voc-e-commerce`。抖音星图、小红书蒲公英(PGY)的**创作者侧结构化数据**(创作者搜索、画像、受众/粉丝分布、内容与评论关键词、笔记/视频绩效、报价与性价比等)走这条。这些是公开市场层面的创作者经营数据,VOC 用它服务**创作者生态理解、竞对达人布局、受众匹配与内容方向验证**,不是用来替用户做投放采买决策。
+- `channel="ecommerce"`:走电商与创作者数据网关 `https://server.fmode.cn/api/voc-e-commerce`,覆盖三块:
+  1. **国内电商商品**:京东、淘宝/天猫、1688、抖音电商、TikTok Shop、闲鱼、得物 等平台的商品搜索、商品详情、价格、商品评论、店铺商品列表等——用户问「京东/淘宝/天猫某商品、某品类选品、商品评论」时就用这里(注意:上游暂无拼多多接口,遇拼多多需求可用京东/淘宝/天猫/1688 替代,并如实说明)。
+  2. **创作者侧情报**:抖音星图、小红书蒲公英(PGY)的创作者搜索、画像、受众/粉丝分布、内容与评论关键词、笔记/视频绩效与性价比等,服务创作者生态理解、竞对达人布局、受众匹配与内容方向验证(不是替用户做投放采买决策)。
+  3. **内容平台**:微信公众号/视频号、微博、B站、知乎、快手、今日头条、豆瓣、IMDb 等的结构化内容数据。
+- `channel="overseas"`:走海外电商选品网关 `https://server.fmode.cn/api/voc-ecom`。亚马逊海外站点的类目树 / Best Seller Top100 榜单、产品详情与子体销量、ABA 关键词与搜索排名、产品评论实时采集、ASIN/榜单/卖家数据监控等选品数据走这条。
 
-两套网关**鉴权、计费、错误处理完全同源**(同一把 `sk-`/`r:` token、同样的 401/402/403 语义、同样的回退逻辑),只是根地址不同。调用清单里**没有**的创作者数据接口时,传 `rawPath` 的同时显式带 `channel="ecommerce"` 即可路由到该网关(社媒接口不传 channel 默认 social)。
+套网关**鉴权、计费、错误处理完全同源**(同一把 `sk-`/`r:` token、同样的 401/402/403 语义、同样的回退逻辑),只是根地址不同。调用清单里**没有**的接口时,传 `rawPath` 的同时显式带对应 `channel`(`ecommerce` / `overseas`)即可路由(社媒接口不传 channel 默认 social)。
 
 ## 工具
 
@@ -62,7 +66,7 @@ VOC 后端是一个**通用转发网关**(`https://server.fmode.cn/api/voc-soc
    - 能力与性价比的客观评估:抖音 `douyin.xingtu.cost_performance_analysis` / `conversion_analysis`;小红书 `xiaohongshu.pgy.cost_effectiveness_analysis`。
 3. 把这些创作者侧事实**喂给下游 VOC 技能**(voc-competitor-map 做竞对达人布局、voc-content-plan / voc-speaking-script 做选题与脚本、voc-issue-pool 补充创作者 / 受众视角),形成洞察结论,而非「该投谁」的采买清单。
 
-> 提示:`voc_api_search` 用「星图 创作者」「蒲公英 画像」「受众分布」「性价比」等词即可定位这些接口;`voc_api_doc` 会在请求行标注「通道 ecommerce」并列出参数。清单已登记抖音星图 32 个 + 小红书蒲公英 16 个创作者数据接口,未登记的可直接用 `voc_api_call` 传 `rawPath` + `channel="ecommerce"` 调用。
+> 提示:`voc_api_search` 用「星图 创作者」「蒲公英 画像」「受众分布」「性价比」等词即可定位创作者接口,用「京东 商品」「淘宝 评论」「1688 搜索」「亚马逊 选品」「ABA 关键词」等词定位电商/选品接口;`voc_api_doc` 会在请求行标注通道(ecommerce / overseas)并列出参数。当前清单 ecommerce 通道已登记约 285 个接口(电商商品 + 创作者 + 内容平台)、overseas 通道 37 个(亚马逊选品),未登记的可直接用 `voc_api_call` 传 `rawPath` + 对应 `channel` 调用。
 
 ## Token(计费已迁移 NewAPI)
 
@@ -87,6 +91,8 @@ VOC 后端是一个**通用转发网关**(`https://server.fmode.cn/api/voc-soc
 - 禁止把**缺 token / token 无效**(`needs_token` / `needs_valid_token`)误报成「这个技能用不了 / 功能不可用」——它是**可恢复**的:SK 就在 `~/.claude/settings.json` 的 `env.ANTHROPIC_AUTH_TOKEN`,取出来用 `FMODE_API_KEY=sk-…` 传入重试即可,别因此放弃或去点充值。
 - 禁止输出「某行业不可用 / 系统只支持某类目」这类结论——**任何行业、任何关键词都能采集**,前提只是 token 类型正确且有额度。
 - 失败时禁止退回 web search / yt-dlp / ffmpeg / 让用户手动传媒体文件来「绕过」采集。
+- **接口第一次调用失败,禁止立刻转 WebSearch / 公开网页搜索来「代替」采集**。正确动作:先按工具返回的 `status` / `assistantMessage` 对照 `references/error-codes.md` 判定错误类型——若是 `upstream_unstable`(5xx / 超时 / fetch failed)**直接重试该接口**(上游抖动重试即恢复,实测重试数次即 200);若是 `needs_input` 用 `voc_api_doc` 核对参数后重试;若是 `needs_token`/`needs_valid_token` 取 `sk-` 重试。只有在确认接口本身不存在该能力、且清单与 `rawPath` 都无法覆盖时,才考虑其它来源,并如实说明原因。
+- **禁止因为「我以为没有这个能力」就跳过清单直接 WebSearch**。京东/淘宝/天猫/1688/抖音电商/闲鱼/得物 的商品与评论、亚马逊海外选品都在 `channel=ecommerce`/`overseas` 里——先 `voc_api_search` 查清单确认,再下结论。
 
 ## 状态码含义(详表见 `references/error-codes.md`)
 

+ 3 - 1
claude-code/claude-code-voc-intelligence/skills/voc-api-catalog/references/error-codes.md

@@ -4,7 +4,9 @@
 > **401 = token 问题**(缺失/失效/类型不对),**403 = 账号禁用/无权限**,都**不是没钱**,不要引导充值。
 > **缺 token / 401 是可恢复的**:NewAPI 计费用的 `sk-` 就是 Claude Code 的 `ANTHROPIC_AUTH_TOKEN`(在 `~/.claude/settings.json` 的 `env` 里),取出来用 `FMODE_API_KEY=sk-…` 传入重试即可,**别当成「这个技能不能用」而放弃或去点充值**。
 
-适用范围:`voc_api_call` / `voc_api_doc`,**两条通道同源**——社媒网关 `https://server.fmode.cn/api/voc-social/<proxyPath>`(`channel=social`,默认)与创作者数据网关 `https://server.fmode.cn/api/voc-e-commerce/<proxyPath>`(`channel=ecommerce`)的鉴权、计费、错误码语义完全一致,下表对两者通用。本速查也是各 trend / 采集技能充值计费口径的**单一权威来源**,技能里只放简版摘要并指回这里。
+适用范围:`voc_api_call` / `voc_api_doc`,**三条通道同源**——社媒网关 `https://server.fmode.cn/api/voc-social/<proxyPath>`(`channel=social`,默认)、电商与创作者数据网关 `https://server.fmode.cn/api/voc-e-commerce/<proxyPath>`(`channel=ecommerce`,含京东/淘宝天猫/1688/抖音电商等电商商品 + 星图/蒲公英创作者 + 内容平台)、海外选品网关 `https://server.fmode.cn/api/voc-ecom/<proxyPath>`(`channel=overseas`,亚马逊海外选品)的鉴权、计费、错误码语义完全一致,下表对三者通用。本速查也是各 trend / 采集技能充值计费口径的**单一权威来源**,技能里只放简版摘要并指回这里。
+
+> **首次失败 ≠ 没有该能力**:接口第一次调用失败时,**先按本表判定错误类型再决定动作,禁止立刻转 WebSearch 绕过**。`upstream_unstable`(5xx / fetch failed / 超时)→ 直接重试该接口(上游抖动,重试数次即恢复);`needs_input` → `voc_api_doc` 核对参数后重试;`needs_token`/`needs_valid_token` → 取 `sk-` 重试。只有确认接口确实不存在该能力、且清单与 rawPath 都覆盖不了时,才考虑其它来源并如实说明。
 
 ## 一、总览表(HTTP 状态 → 含义 → 工具返回 → 给客户的话术 → Agent 动作)
 

+ 7 - 0
claude-code/claude-code-voc-intelligence/skills/xiaohongshu-trend-intelligence/SKILL.md

@@ -60,6 +60,13 @@ node "<插件目录>/mcp/src/tools/xiaohongshu-trend-run.js" --collection-mode l
 - 只有真 `402 余额不足` 才充值,入口 `https://app.fmode.cn/dev/studio/?balance=fmodeapi`(NewAPI/fmode-api 计费);`401`=token、`403`=权限,都不充值。`apig-pay/?apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF` 仅限 `r:` 会话 token 余额补充。
 - 实际充值/自救链接以工具返回的 `assistantMessage` / `nextActions` 为准,不要写死。
 
+## 参考资料(按需展开阅读)
+
+- `references/user-workflow.md`:用户交互流程——第一次使用要问清的三件事、澄清话术、样例 vs 真实采集的判断。
+- `references/output-format.md`:第一轮趋势情报的推荐输出结构与段落格式。
+- `references/live-mode.md`:live 真实采集模式的接入说明与执行细节(先 sample 跑通再 live)。
+- 错误码 / 充值计费的完整权威对照见 voc-api-catalog 技能的 `references/error-codes.md`。
+
 ## 推荐用户启动话术
 
 > 通用模板:把 `{你的行业/品类}` 替换成用户真实所在的行业或品类,不要内置任何特定行业。

+ 101 - 23
claude-code/fmode-listen/skills/fmode-listen/scripts/listen-runner.mjs

@@ -1,9 +1,15 @@
 /**
  * fmode-listen 录音转写网关客户端
  *
- * 通过 Fmode 网关 POST /api/listen/transcribe 调用讯飞「录音文件转写」。
+ * 通过 Fmode 网关调用讯飞「录音文件转写」。
  * 客户端不持有讯飞凭据——凭据仅在服务端。客户端只需携带 fmode token,
- * 服务端鉴权后调用讯飞并按音频时长计费(ceil(分钟) × 单价)。
+ * 服务端鉴权后调用讯飞并按音频真实时长计费(ceil(分钟) × 单价)。
+ *
+ * 默认走「直传」链路(音频不经网关,省服务器带宽/内存):
+ *   1. POST /api/listen/upload-url  → 取 OBS 预签名直传 URL(鉴权 + 余额预检)
+ *   2. PUT <uploadUrl>             → 客户端直传音频到 OBS(无任何密钥)
+ *   3. POST /api/listen/transcribe-url → 服务端用 urlLink 让讯飞自取并转写、按真实时长计费
+ * 若网关尚未部署上述路由(404),自动回退旧的 POST /api/listen/transcribe(整段字节中转)。
  *
  * 导出:
  *   - resolveApiToken()    三级优先级获取 fmode token
@@ -193,6 +199,46 @@ export function probeDurationMs(audioPath) {
 // 转写
 // ============================================================
 
+/**
+ * 上传本地音频文件到网关并转写。
+ *
+ * @param {Object} opts
+ * @param {string} opts.filePath      本地音频文件路径
+ * @param {number} [opts.durationMs]  音频时长(毫秒);缺省自动探测
+ * @param {string} [opts.language]    识别语言,默认 autodialect
+ * @param {boolean} [opts.diarize]    是否说话人分离
+ * @param {number} [opts.speakers]    预期说话人数
+ * @param {string} [opts.gateway]     网关基址,默认 DEFAULT_GATEWAY
+ * @param {string} [opts.token]       手动传入 fmode token,否则自动解析
+ * @returns {Promise<{ text: string, segments: any[], raw: object }>}
+ */
+async function postJsonGateway(url, token, payload) {
+  const res = await fetch(url, {
+    method: 'POST',
+    headers: {
+      'Authorization': `Bearer ${token}`,
+      'Content-Type': 'application/json',
+    },
+    body: JSON.stringify(payload),
+  });
+  const rawText = await res.text();
+  let body;
+  try { body = JSON.parse(rawText); } catch { body = { raw: rawText }; }
+  return { res, body, rawText };
+}
+
+// 把网关错误(含 402 余额不足)转成统一异常。
+function throwForGatewayError(res, body, rawText) {
+  if (res.status === 402 || (body && body.code === 402)) {
+    const link = body && body.rechargeUrl ? `\n充值链接:${body.rechargeUrl}` : '';
+    throw new Error(`余额不足,请充值后重试。${link}`);
+  }
+  if (!res.ok || (body && body.code && body.code >= 400)) {
+    const mess = (body && (body.mess || body.error)) || rawText || `HTTP ${res.status}`;
+    throw new Error(`转写失败 (HTTP ${res.status}): ${mess}`);
+  }
+}
+
 /**
  * 上传本地音频文件到网关并转写。
  *
@@ -217,12 +263,60 @@ export async function transcribeFile(opts) {
   }
 
   const token = opts.token || resolveApiToken().token;
-  const audio = fs.readFileSync(filePath);
   const fileName = path.basename(filePath);
+  const fileSize = fs.statSync(filePath).size;
 
   let durationMs = Number(opts.durationMs || 0);
   if (!durationMs) durationMs = probeDurationMs(filePath);
 
+  const base = gateway.replace(/\/$/, '');
+  const contentType = 'application/octet-stream';
+
+  // 1) 取直传 URL(鉴权 + 余额预检在服务端完成)
+  const up = await postJsonGateway(`${base}/upload-url`, token, {
+    fileName, fileSize, durationMs, contentType,
+  });
+
+  // 旧网关无 /upload-url 路由 → 回退旧的整段字节中转
+  if (up.res.status === 404 || (up.body && up.body.code === 404)) {
+    return transcribeViaLegacy({ filePath, fileName, durationMs, language, diarize, speakers, base, token });
+  }
+  throwForGatewayError(up.res, up.body, up.rawText);
+
+  const issued = (up.body && up.body.data) || {};
+  if (!issued.uploadUrl || !issued.objectKey) {
+    throw new Error('网关未返回直传 URL(uploadUrl/objectKey 缺失)');
+  }
+
+  // 2) 客户端直传音频到 OBS(不经网关)
+  const audio = fs.readFileSync(filePath);
+  const putRes = await fetch(issued.uploadUrl, {
+    method: issued.method || 'PUT',
+    headers: issued.headers || { 'Content-Type': contentType },
+    body: audio,
+  });
+  if (!putRes.ok) {
+    const t = await putRes.text().catch(() => '');
+    throw new Error(`音频直传 OBS 失败 (HTTP ${putRes.status}) ${String(t).slice(0, 200)}`);
+  }
+
+  // 3) 发起转写(服务端用 urlLink 让讯飞自取,按真实时长计费)
+  const tr = await postJsonGateway(`${base}/transcribe-url`, token, {
+    objectKey: issued.objectKey, durationMs, language, diarize, speakers, fileName,
+  });
+  throwForGatewayError(tr.res, tr.body, tr.rawText);
+
+  const data = (tr.body && tr.body.data) || {};
+  return {
+    text: data.text || '',
+    segments: data.segments || [],
+    raw: tr.body,
+  };
+}
+
+// 回退链路:把整段音频字节 POST 到旧 /transcribe(网关未升级时用)。
+async function transcribeViaLegacy({ filePath, fileName, durationMs, language, diarize, speakers, base, token }) {
+  const audio = fs.readFileSync(filePath);
   const params = new URLSearchParams();
   params.set('fileName', fileName);
   if (durationMs) params.set('duration', String(durationMs));
@@ -230,9 +324,7 @@ export async function transcribeFile(opts) {
   if (diarize) params.set('diarize', 'true');
   if (speakers) params.set('speakers', String(speakers));
 
-  const url = `${gateway.replace(/\/$/, '')}/transcribe?${params.toString()}`;
-
-  const res = await fetch(url, {
+  const res = await fetch(`${base}/transcribe?${params.toString()}`, {
     method: 'POST',
     headers: {
       'Authorization': `Bearer ${token}`,
@@ -240,26 +332,12 @@ export async function transcribeFile(opts) {
     },
     body: audio,
   });
-
-  let body;
   const rawText = await res.text();
+  let body;
   try { body = JSON.parse(rawText); } catch { body = { raw: rawText }; }
-
-  if (res.status === 402) {
-    const url = body && body.rechargeUrl ? `\n充值链接:${body.rechargeUrl}` : '';
-    throw new Error(`余额不足,请充值后重试。${url}`);
-  }
-  if (!res.ok || (body && body.code && body.code >= 400)) {
-    const mess = (body && (body.mess || body.error)) || rawText || `HTTP ${res.status}`;
-    throw new Error(`转写失败 (HTTP ${res.status}): ${mess}`);
-  }
-
+  throwForGatewayError(res, body, rawText);
   const data = (body && body.data) || {};
-  return {
-    text: data.text || '',
-    segments: data.segments || [],
-    raw: body,
-  };
+  return { text: data.text || '', segments: data.segments || [], raw: body };
 }
 
 // ============================================================

+ 10 - 6
dist/claude-code-voc-intelligence-suite-manifest.json

@@ -1,9 +1,9 @@
 {
   "name": "claude-code-voc-intelligence",
-  "version": "0.3.16",
-  "generatedAt": "2026-06-21T10:13:42.698Z",
+  "version": "0.3.27",
+  "generatedAt": "2026-06-27T16:33:26.605Z",
   "packageZip": "dist/claude-code-voc-intelligence.zip",
-  "packageZipBytes": 228199,
+  "packageZipBytes": 407142,
   "plugin": "voc-intelligence",
   "skills": [
     "xiaohongshu-trend-intelligence",
@@ -14,7 +14,8 @@
     "voc-speaking-script",
     "voc-competitor-map",
     "voc-business-workflow",
-    "fmode-image-analysis"
+    "fmode-image-analysis",
+    "voc-api-catalog"
   ],
   "mcpTools": [
     "fmode_image_analysis",
@@ -29,7 +30,10 @@
     "voc_xiaohongshu_preference_update",
     "voc_douyin_token_check",
     "voc_douyin_trend_run",
-    "voc_douyin_preference_update"
+    "voc_douyin_preference_update",
+    "voc_api_search",
+    "voc_api_doc",
+    "voc_api_call"
   ],
   "installHint": "Supports three delivery modes: unzip and run node install.js, install globally into ~/.claude/plugins/voc-intelligence, or install into the current workspace. Workspace mode writes .mcp.json plus .claude/skills/* entries for trend intelligence, issue pool, deep dive, competitor map, content plan, speaking script, VOC business workflow, and Fmode image analysis so VSCode Claude Code can discover the workflows without relying only on --plugin-dir.",
   "installCommand": "node install.js",
@@ -40,5 +44,5 @@
   "buildCommand": "node scripts/deploy/claude-code-voc-intelligence-suite.js --validate --build --test-package",
   "uploadCommand": "node scripts/deploy/claude-code-voc-intelligence-suite.js --validate --build --test-package --upload",
   "uploaded": false,
-  "copiedFiles": 90
+  "copiedFiles": 117
 }

BIN
dist/claude-code-voc-intelligence.zip


+ 6 - 6
dist/npm/claude-code-voc-npm-package-manifest.json

@@ -1,11 +1,11 @@
 {
   "name": "@vocmarket/voc-skill",
-  "version": "0.3.26",
-  "generatedAt": "2026-06-27T04:20:38.110Z",
-  "tarball": "dist/npm/vocmarket-voc-skill-0.3.26.tgz",
-  "tarballBytes": 322257,
-  "unpackedBytes": 1887899,
-  "entryCount": 113,
+  "version": "0.3.30",
+  "generatedAt": "2026-06-29T16:42:36.776Z",
+  "tarball": "dist/npm/vocmarket-voc-skill-0.3.30.tgz",
+  "tarballBytes": 576620,
+  "unpackedBytes": 4041253,
+  "entryCount": 139,
   "installCommands": [
     "npm install -g @vocmarket/voc-skill",
     "claude-voc install",

+ 0 - 0
WORKSHOP-SKILL-MAPPING.md → docs/WORKSHOP-SKILL-MAPPING.md


+ 237 - 0
docs/fmode-listen-用户调用文档.md

@@ -0,0 +1,237 @@
+# fmode-listen 录音转写:技能包与接口调用文档(用户版)
+
+> 适用对象:需要把录音/视频音轨转成文字的最终用户与集成开发者。
+> 服务端模块:`fmode-server/modules/fmode-listen-api`(讯飞 LFASR 录音文件转写代理)
+> 客户端技能包:npm 包 `fmode-listen`(Claude Code 技能 + CLI,当前版本 0.1.1)
+
+---
+
+## 1. 一句话说明
+
+把本地音频文件交给 **Fmode 网关** `POST /api/listen/transcribe`,服务端调用讯飞「录音文件转写」(LFASR 异步转写)完成识别并按音频真实时长计费。**讯飞凭据只在服务端**,你手上只需要一把 **fmode token**。
+
+适用场景:
+1. 会议 / 采访 / 课程录音转文字
+2. 视频先抽音轨再转写(配合 `fmode-ffmpeg`)
+3. 中英多语种 / 方言识别(`autodialect`)
+4. 说话人分离的多人对话整理(`--diarize`)
+
+---
+
+## 2. 前置条件
+
+| 条件 | 说明 |
+|------|------|
+| fmode token | 唯一凭据,`sk-` 开头的 newapi token(即 Claude Code / FmodeStudio 里配置的那把)。**不要**在客户端配置讯飞 appId/apiKey/secretKey |
+| Node.js | 使用 `npx fmode-listen` CLI 时需要 |
+| 账户余额 | 服务端按时长扣费,余额不足返回 402 + 充值链接 |
+| (可选)ffmpeg/ffprobe | 自动探测音频时长、以及大文件压缩预处理 |
+
+### Token 自动解析优先级(运行器自动查找,通常无需手动配置)
+
+1. 环境变量 `FMODE_API_TOKEN`
+2. `~/.fmode/config.json` 的 `fmodeApiToken` / `newapiToken`(FmodeStudio 保存后写入)
+3. 项目 `./.fmode/config.json` 同名字段
+4. `~/.claude/settings.json`(含 `settings.local.json` / 项目级 `.claude/`)的 `env.ANTHROPIC_AUTH_TOKEN`——即 Claude Code 的 `sk-` token,自动读取(排除真 Anthropic 的 `sk-ant-`,且 base 须指向 fmode)
+
+> 报「未找到 token」= 缺 token,不是服务不可用;按上面任一来源补上即可,切勿点任何付费弹窗。
+
+---
+
+## 3. 方式一:命令行(最简单)
+
+```bash
+# 基础:转写一个录音文件(自动探测时长用于计费预估)
+npx --yes fmode-listen@latest transcribe -- meeting.mp3
+
+# 指定语言 + 说话人分离 + 写出完整 JSON
+npx --yes fmode-listen@latest transcribe -- meeting.mp3 \
+  --language autodialect --diarize --speakers 3 --out result.json
+
+# 自定义网关(默认 https://server.fmode.cn/api/listen)
+npx --yes fmode-listen@latest transcribe -- meeting.mp3 --gateway https://server.fmode.cn/api/listen
+```
+
+要点:
+- `transcribe` 后**必须**加 `--`,其后参数透传给运行器
+- stdout 输出纯文本转写结果;`--out` 额外落盘网关返回的完整 JSON
+
+### CLI 参数
+
+| 参数 | 含义 | 默认 |
+|------|------|------|
+| `<audioFile>` | 本地音频文件路径(位置参数) | 必填 |
+| `--language` | 识别语言:`autodialect`(中英+方言自动)/ `cn` / `en` | `autodialect` |
+| `--diarize` | 开启说话人分离 | 关 |
+| `--speakers N` | 预期说话人数(配合 `--diarize`) | 自动 |
+| `--duration <ms>` | 音频时长(毫秒),用于计费预估 | 自动 ffprobe 探测 |
+| `--gateway <url>` | 网关基址 | `https://server.fmode.cn/api/listen` |
+| `--out <file>` | 写出完整 JSON 响应 | 不写 |
+
+### 其它 CLI 子命令
+
+| 命令 | 作用 |
+|------|------|
+| `transcribe -- <file> [opts]`(别名 `run`) | 走网关转写音频 |
+| `workspace` | 安装技能到项目:`./.claude/skills/fmode-listen/` |
+| `install` | 安装技能到用户级:`~/.claude/skills/fmode-listen/` |
+| `check` / `smoke` / `path` | 校验安装 / 冒烟测试 / 打印目标路径 |
+
+---
+
+## 4. 方式二:安装为 Claude Code 技能
+
+```bash
+# 项目级 → ./.claude/skills/fmode-listen
+npx --yes fmode-listen@latest workspace
+
+# 用户级 → ~/.claude/skills/fmode-listen
+npx --yes fmode-listen@latest install
+```
+
+安装后直接对 Claude Code 说自然语言即可,例如:
+
+> 把 meeting.mp3 转写成文字,开启说话人分离。
+
+Claude Code 会自动匹配技能并调用运行器,token 从 `~/.claude/settings.json` 自动读取。
+
+---
+
+## 5. 方式三:Node 脚本编程调用
+
+运行器 `listen-runner.mjs` 是**零依赖 ESM**,技能目录被复制进 `.claude/skills/` 后可直接 import:
+
+```js
+import { transcribeFile, probeDurationMs, resolveApiToken }
+  from './.claude/skills/fmode-listen/scripts/listen-runner.mjs';
+
+const { text, segments, raw } = await transcribeFile({
+  filePath: 'meeting.mp3',
+  language: 'autodialect',   // 默认 autodialect(中英自动+方言)
+  diarize: true,             // 说话人分离
+  speakers: 3,               // 预期说话人数(可选)
+  // durationMs: 123000,     // 可选;缺省自动 ffprobe 探测
+  // gateway: 'https://server.fmode.cn/api/listen',
+  // token: '...',           // 可选;缺省按第 2 节优先级自动解析
+});
+console.log(text);
+```
+
+返回值:
+- `text`:整段转写文本
+- `segments`:分段结果 `[{ bg, ed, speaker, text }]`(bg/ed 毫秒时间戳,speaker 在开启分离时有值)
+- `raw`:网关原始 JSON 响应
+
+---
+
+## 6. 方式四:直接调用 HTTP 接口(任意语言集成)
+
+网关基址:`https://server.fmode.cn/api/listen`
+
+### 6.1 探活与健康检查(免鉴权)
+
+```
+GET /api/listen/test     → { "message": "Listen API Router Loaded Successfully v1.0.0" }
+GET /api/listen/health   → { "service": "listen", "timestamp": "..." }
+```
+
+### 6.2 核心接口:POST /api/listen/transcribe(音频经网关中转)
+
+```
+POST /api/listen/transcribe?fileName=meeting.mp3&duration=123000&language=autodialect&diarize=true&speakers=3
+Headers:
+  Authorization: Bearer <fmode token>
+  Content-Type: application/octet-stream
+Body: 原始音频字节
+```
+
+Query 参数:
+
+| 参数 | 必填 | 说明 |
+|------|------|------|
+| `fileName` | 建议 | 文件名(含扩展名,讯飞据此判断格式,默认 `audio.mp3`) |
+| `duration` | 建议 | 音频时长(毫秒),仅用于发起前余额预校验;最终按真实时长扣费 |
+| `language` | 否 | 默认 `autodialect` |
+| `diarize` | 否 | `true`/`1` 开启说话人分离 |
+| `speakers` | 否 | 预期说话人数 |
+
+成功响应:
+
+```json
+{ "code": 200, "data": { "text": "……", "segments": [ { "bg": 0, "ed": 5120, "speaker": "1", "text": "……" } ] } }
+```
+
+curl 示例:
+
+```bash
+curl -X POST "https://server.fmode.cn/api/listen/transcribe?fileName=meeting.mp3&duration=123000&language=autodialect" \
+  -H "Authorization: Bearer $FMODE_API_TOKEN" \
+  -H "Content-Type: application/octet-stream" \
+  --data-binary @meeting.mp3
+```
+
+限制:上传体积上限 **500 MB**;音频时长上限 **5 小时**。
+
+### 6.3 大文件两步接口(直连讯飞,音频不经网关中转)
+
+适合大文件:客户端先把音频直传对象存储(OBS 预签名 URL),再让服务端用 URL 发起转写,音频字节全程不经过网关。
+
+**第 1 步:获取直传 URL**
+
+```
+POST /api/listen/upload-url
+Headers: Authorization: Bearer <fmode token>; Content-Type: application/json
+Body: { "fileName": "meeting.mp3", "durationMs": 123000, "contentType": "application/octet-stream" }
+返回: { "code": 200, "data": { "objectKey", "uploadUrl", "method": "PUT", "headers", "expiresIn" } }
+```
+
+然后用返回的 `uploadUrl` 直接 `PUT` 音频字节(带上返回的 `headers`,URL 有效期 15 分钟)。
+
+**第 2 步:对已上传对象发起转写**
+
+```
+POST /api/listen/transcribe-url
+Headers: Authorization: Bearer <fmode token>; Content-Type: application/json
+Body: { "objectKey": "<第1步返回>", "durationMs": 123000, "language": "autodialect", "diarize": true, "speakers": 3, "fileName": "meeting.mp3" }
+返回: { "code": 200, "data": { "text", "segments", "durationMs" } }
+```
+
+说明:
+- `objectKey` 内嵌上传者身份,**只能转写自己直传的对象**,否则 403
+- 转写完成后服务端自动清理临时对象
+- 对象必须已 PUT 成功,否则 400
+
+### 6.4 错误码
+
+| HTTP | 含义 | 处理 |
+|------|------|------|
+| 400 | 音频为空 / 缺 objectKey / 对象未上传 | 检查请求体与上传步骤 |
+| 401 | 认证失败 / 缺 fmode token | 检查 `Authorization: Bearer <token>` |
+| 402 | 余额不足 | 响应含 `rechargeUrl`,充值后重试 |
+| 403 | 转写他人对象 | 只能使用自己 `upload-url` 返回的 objectKey |
+| 500 | 服务端 / 讯飞异常 | 稍后重试,或联系管理员 |
+
+错误响应统一格式:`{ "code": <http状态>, "mess": "...", ["rechargeUrl": "..."] }`
+
+---
+
+## 7. 计费口径
+
+- 按**音频真实时长**计费:`ceil(音频分钟) × 每分钟单价`,不足 1 分钟按 1 分钟计
+- 客户端传的 `duration` 仅用于发起前余额预校验;转写成功后服务端以讯飞返回的真实时长扣费
+- 计量走与其它 Fmode APIG 模型同一套 newapi 体系,用量在统一后台可查
+- 余额不足:HTTP 402 + `rechargeUrl`
+
+---
+
+## 8. 最佳实践与注意事项
+
+1. **长音频是异步过程**:网关在服务端轮询讯飞直到完成再返回,请求耗时随时长增加,调用方注意把 HTTP 超时调大。
+2. **大文件 / 视频先压缩**:配合 `fmode-ffmpeg` 先转成 16kHz 单声道 wav,省带宽且识别更稳:
+   ```bash
+   npx fmode-ffmpeg exec -- -y -i input.mp4 -vn -ar 16000 -ac 1 out.wav
+   npx fmode-listen@latest transcribe -- out.wav
+   ```
+3. **超大文件走两步接口**(6.3 节),避免经网关中转 500 MB 上限与带宽压力。
+4. **安全红线**:任何示例、代码、配置中都不要出现讯飞 appId/apiKey/secretKey——它们只属于服务端。
+5. 401 → 查 token;402 → 充值;「未找到 token」→ 按第 2 节补 token,不是服务故障。

+ 0 - 0
AI实战营资料清单_实战1-实战2.docx → docs/other/AI实战营资料清单_实战1-实战2.docx


+ 0 - 0
AI实战营资料清单_实战1-实战2.md → docs/other/AI实战营资料清单_实战1-实战2.md


+ 0 - 0
AI实战营资料清单_群内发送版.txt → docs/other/AI实战营资料清单_群内发送版.txt


+ 0 - 0
douyin-speaking-daily-followup-course-scripts.md → docs/other/douyin-speaking-daily-followup-course-scripts.md


+ 0 - 0
douyin-speaking-daily-p0-install-notes.txt → docs/other/douyin-speaking-daily-p0-install-notes.txt


+ 116 - 0
docs/qiwe-api文档/api.md

@@ -0,0 +1,116 @@
+# QiWe开放平台
+
+## Docs
+- [平台介绍](https://doc.qiweapi.com/doc-7331301.md): 
+- [ 快速开始 ⭐](https://doc.qiweapi.com/doc-9079966.md): 
+- Webhook [Webhook事件⭐](https://doc.qiweapi.com/doc-9079960.md): 
+- Webhook [回调结构说明](https://doc.qiweapi.com/doc-7331304.md): 
+- Webhook [调试指南⭐](https://doc.qiweapi.com/doc-9079961.md): 
+- Webhook [常见问题](https://doc.qiweapi.com/doc-8483505.md): 
+- API参考 > 会话与消息 > 消息模块  [引用消息发送说明](https://doc.qiweapi.com/doc-7331310.md): 
+
+## API Docs
+- API参考 > 基础能力 > 登录模块 [创建设备(步骤1)](https://doc.qiweapi.com/api-344613850.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 基础能力 > 登录模块 [二维码-获取(步骤2)](https://doc.qiweapi.com/api-344613848.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 基础能力 > 登录模块 [二维码状态-检测(步骤3)](https://doc.qiweapi.com/api-344613851.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 基础能力 > 登录模块 [二维码-code验证(步骤4)](https://doc.qiweapi.com/api-344613852.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);"><h3 style="margin: 0 0 8px 0; font-size: 18px; font-weight: 600; color: inherit; border: none; padding-bottom: 0;">二维码-code验证</h3><p style="margin: 0; font-size: 14px; color: inherit; line-height: 1.6;">收到 6 位验证码后,调用本接口完成校验。</p></div>
+- API参考 > 基础能力 > 登录模块 [设置回调地址](https://doc.qiweapi.com/api-344613853.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 基础能力 > 登录模块 [用户登录(免扫码登录)](https://doc.qiweapi.com/api-344613854.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 基础能力 > 登录模块 [用户状态](https://doc.qiweapi.com/api-344613856.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 基础能力 > 登录模块 [恢复设备](https://doc.qiweapi.com/api-344613857.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 基础能力 > 登录模块 [停用设备](https://doc.qiweapi.com/api-344613858.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 基础能力 > 登录模块 [账号退出](https://doc.qiweapi.com/api-344613859.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 基础能力 > 个人模块 [生成二维码](https://doc.qiweapi.com/api-344613861.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 基础能力 > 个人模块 [获取个人信息](https://doc.qiweapi.com/api-344613862.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 基础能力 > 个人模块 [更新个人信息](https://doc.qiweapi.com/api-344613863.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 基础能力 > 个人模块 [查询企业信息](https://doc.qiweapi.com/api-344613864.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 基础能力 > 个人模块 [个人收藏-分页](https://doc.qiweapi.com/api-344613865.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 基础能力 > 个人模块 [个人收藏-添加GIF表情](https://doc.qiweapi.com/api-344613866.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 联系人模块 [联系人详情-批量](https://doc.qiweapi.com/api-344613868.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 联系人模块 [联系人详情-By二维码](https://doc.qiweapi.com/api-344613867.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 联系人模块 [外部联系人分页](https://doc.qiweapi.com/api-344613869.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 联系人模块 [内部联系人分页](https://doc.qiweapi.com/api-344613870.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 客户管理 > 联系人模块 [联系人搜索](https://doc.qiweapi.com/api-344613871.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 客户管理 > 联系人模块 [添加个微](https://doc.qiweapi.com/api-344613872.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 客户管理 > 联系人模块 [添加企微](https://doc.qiweapi.com/api-344613873.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 客户管理 > 联系人模块 [添加群成员好友](https://doc.qiweapi.com/api-344613874.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 联系人模块 [添加企微名片](https://doc.qiweapi.com/api-344613875.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 联系人模块 [添加删除联系人](https://doc.qiweapi.com/api-344613876.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 联系人模块 [同意申请](https://doc.qiweapi.com/api-344613877.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 联系人模块 [外部联系人信息-更新](https://doc.qiweapi.com/api-344613878.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 联系人模块 [内部联系人信息-更新](https://doc.qiweapi.com/api-344613879.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 联系人模块 [删除联系人](https://doc.qiweapi.com/api-344613880.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 联系人模块 [Userid转Openid](https://doc.qiweapi.com/api-344613881.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 联系人模块 [Openid转Userid](https://doc.qiweapi.com/api-344613882.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [群分页](https://doc.qiweapi.com/api-344613883.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [群详情-批量](https://doc.qiweapi.com/api-344613884.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [群成员变动查询](https://doc.qiweapi.com/api-344613885.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [创建群](https://doc.qiweapi.com/api-344613886.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [修改群备注](https://doc.qiweapi.com/api-344613888.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [修改群名称](https://doc.qiweapi.com/api-344613887.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [修改群内昵称](https://doc.qiweapi.com/api-344613889.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [开启群改名](https://doc.qiweapi.com/api-344613902.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [禁止群改名](https://doc.qiweapi.com/api-344613903.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [邀请/添加成员](https://doc.qiweapi.com/api-344613890.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [群成员邀请确认(管理员)](https://doc.qiweapi.com/api-344613891.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [禁止群成员互相添加](https://doc.qiweapi.com/api-344613892.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [移除成员](https://doc.qiweapi.com/api-344613893.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [群二维码](https://doc.qiweapi.com/api-344613894.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [修改群公告](https://doc.qiweapi.com/api-344613895.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [添加群管理员](https://doc.qiweapi.com/api-344613896.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [取消群管理员](https://doc.qiweapi.com/api-344613897.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [退群](https://doc.qiweapi.com/api-344613898.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [转让群主](https://doc.qiweapi.com/api-344613900.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [群解散](https://doc.qiweapi.com/api-344613901.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [开启群邀请确认](https://doc.qiweapi.com/api-344613906.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [接受群邀请-By链接](https://doc.qiweapi.com/api-344613907.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [Roomid转OpenID](https://doc.qiweapi.com/api-344613909.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 群模块 [OpenID转Roomid](https://doc.qiweapi.com/api-344613908.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 标签模块 [列表分页](https://doc.qiweapi.com/api-344613910.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 标签模块 [个人标签-增删改](https://doc.qiweapi.com/api-344613911.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 客户管理 > 标签模块 [客户标签-增删](https://doc.qiweapi.com/api-344613912.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [发送纯文本消息](https://doc.qiweapi.com/api-344613913.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 会话与消息 > 消息模块  [发送混合文本消息](https://doc.qiweapi.com/api-344613914.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 会话与消息 > 消息模块  [发送图片消息](https://doc.qiweapi.com/api-344613915.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [发送GIF表情消息](https://doc.qiweapi.com/api-344613916.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [发送视频消息](https://doc.qiweapi.com/api-344613917.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 会话与消息 > 消息模块  [发送文件消息](https://doc.qiweapi.com/api-344613918.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 会话与消息 > 消息模块  [发送语音消息](https://doc.qiweapi.com/api-344613919.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 会话与消息 > 消息模块  [发送链接消息](https://doc.qiweapi.com/api-344613920.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [发送小程序消息](https://doc.qiweapi.com/api-344613921.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [发送名片消息](https://doc.qiweapi.com/api-344613922.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [发送视频号消息](https://doc.qiweapi.com/api-344613923.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [发送定位消息](https://doc.qiweapi.com/api-344613924.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [撤回消息](https://doc.qiweapi.com/api-344613925.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [语音转文字-任务申请](https://doc.qiweapi.com/api-344613926.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [语音转文字-任务查询](https://doc.qiweapi.com/api-344613927.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [修改消息状态](https://doc.qiweapi.com/api-344613928.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [群消息置顶-列表](https://doc.qiweapi.com/api-344613930.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [群消息置顶-添加](https://doc.qiweapi.com/api-344613931.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [群消息置顶-移除](https://doc.qiweapi.com/api-344613932.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [群发助手发送](https://doc.qiweapi.com/api-344613933.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [群发助手-状态查询](https://doc.qiweapi.com/api-344613934.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [群发助手-规则查询](https://doc.qiweapi.com/api-344613936.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 消息模块  [同步历史消息分页](https://doc.qiweapi.com/api-344613937.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 会话模块 [会话分页](https://doc.qiweapi.com/api-344613938.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 会话模块 [会话组-编辑](https://doc.qiweapi.com/api-344613939.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 会话与消息 > 会话模块 [会话组-查询](https://doc.qiweapi.com/api-344613940.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 文件与媒体(下载/上传) [企微文件异步上传](https://doc.qiweapi.com/api-347221662.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 文件与媒体(下载/上传) [企微大文件异步上传](https://doc.qiweapi.com/api-354411522.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 文件与媒体(下载/上传) [企微文件异步下载](https://doc.qiweapi.com/api-361694421.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 文件与媒体(下载/上传) [企微大文件异步下载](https://doc.qiweapi.com/api-389691087.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 文件与媒体(下载/上传) [个微文件异步下载](https://doc.qiweapi.com/api-389695362.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 文件与媒体(下载/上传) [文件上传-SDK云存储](https://doc.qiweapi.com/api-344613899.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 文件与媒体(下载/上传) [文件CDN转URL](https://doc.qiweapi.com/api-395133885.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 文件与媒体(下载/上传) [本地文件上传](https://doc.qiweapi.com/api-344613929.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 文件与媒体(下载/上传) [个微文件下载](https://doc.qiweapi.com/api-410838558.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 文件与媒体(下载/上传) [企微文件下载](https://doc.qiweapi.com/api-399776006.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 文件与媒体(下载/上传) [文件上传-URL](https://doc.qiweapi.com/api-425758709.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 朋友圈模块 [朋友圈列表分页](https://doc.qiweapi.com/api-437674162.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 朋友圈模块 [获取详情-批量](https://doc.qiweapi.com/api-437795951.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 朋友圈模块 [文件上传](https://doc.qiweapi.com/api-478916140.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 朋友圈模块 [发送朋友圈](https://doc.qiweapi.com/api-440146240.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 朋友圈模块 [删除朋友圈](https://doc.qiweapi.com/api-440192990.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 朋友圈模块 [点赞/取消赞](https://doc.qiweapi.com/api-453564016.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">
+- API参考 > 媒体与运营 > 朋友圈模块 [评论/追评](https://doc.qiweapi.com/api-476634299.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08);">
+- API参考 > 媒体与运营 > 朋友圈模块 [评论删除](https://doc.qiweapi.com/api-476671163.md): <div style="background: linear-gradient(135deg, rgba(255, 213, 145, 0.45) 0%, rgba(255, 255, 255, 0.06) 100%); border: 1px solid rgba(255, 236, 202, 0.7); border-radius: 12px; padding: 20px 28px; margin-bottom: 20px; box-shadow: 0 4px 12px rgba(250, 140, 22, 0.08)">

+ 95 - 0
docs/voc-03-design.md

@@ -0,0 +1,95 @@
+# VOC-03 设计方案(重写版):多渠道一键安装 + 安装即弹付费
+
+> 真实场景:教练现场用 VOC 技能做电商数据采集,**不走飞马平台 UI**;现场可能是 Claude Code / Codex / Workbuddy。
+> 关键诉求:**每个渠道一段「一键复制安装提示词」**;**安装一完成就在浏览器弹付费页**——必须在进入工作流、消耗 LLM token 之前弹,避免「跑了半天报告、到取数那步才 402」。
+
+## 0. 现状(基于 Parse `Skill` 表 + voc-api-catalog 代码实读)
+- `Skill` 表(78 行):`name`=`voc-skill`、`type`=`claude`、`category`=`claude-code`(**单值**)、`cdnPrefix`=安装命令、`cdnUrls`={npm,global,install}、`apig`→APIG `Vo3ROWEvDy`。
+- **token 检测逻辑(权威出处:`claude-code/claude-code-voc-intelligence/mcp/src/core/credentials.js`)**:不存在 `~/.openclaw/` 路径。实际有**两条计费链 + 两种 token**:
+  - `readNewApiToken()` → **NewAPI / fmode-api 计费 token(`sk-` 开头),现为主计费链**。取值优先级:入参 → `.env.local`/环境变量 `FMODE_API_KEY`/`NEWAPI_TOKEN` → `~/.claude/voc-credentials.json` `.fmodeApiKey` → `~/.fmode/config.json` → **`~/.claude/settings.json` 的 `env.ANTHROPIC_AUTH_TOKEN`**(经 `pickFmodeAnthropicToken` 门控:必须 `sk-`、非 `sk-ant-`、`ANTHROPIC_BASE_URL` 指向 fmode)。
+  - `readVocToken()` → **平台 apig 会话 token(`r:` 开头),旧链路回退**。取值:入参 → `.env.local` `VOC_TOKEN`/`VOC_SOCIAL_TOKEN` → 环境变量 → `~/.claude/voc-credentials.json` `.vocToken`/`.token`。
+- **两种充值入口不同(`payment-links.js` 权威常量)**:
+  - sk-(NewAPI)余额不足 → `https://app.fmode.cn/dev/studio/?balance=fmodeapi`(自动开余额充值弹窗)
+  - r:(apig 会话)→ `https://app.fmode.cn/dev/apig-pay/?user={objectId}&apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF`(+ workshop 套餐页),`resolveVocUserId()` 调 `/parse/users/me` 拿 objectId
+- **状态分类(代码里已区分)**:缺 NewApi token / 缺 voc token / token 类型错(给了 sk- 但需 r:)/ 真 402 余额不足 / 403 无权限。"缺 token"是**配置/读取**问题,不等于余额不足,**优先自愈读 settings.json 的 sk-,不要直接甩人去充值**。
+
+> 结论修正:付费解析、计费链、状态分类都已在 `voc-api-catalog` 代码里实现且权威。VOC-03 不要重写 token 逻辑,只需:① `Skill` 表支持多渠道话术;② 新增 `--activate` 入口,在 bootstrap 阶段**复用 `credentials.js`/`payment-links.js`** 做激活检查与开页。
+
+## 1. 核心决策:①不动 `--smoke` ②新增专用入口 ③弹窗按 token/余额状态触发
+
+### 1.1 为什么不能改 `--smoke`
+`--smoke` 是健康自检,飞马 UI 用户 / 内部 / CI 都在用——他们**已经有 token**。若把弹付费塞进 `--smoke`,这些人每次都被强弹付费页,打断操作;CI 里弹浏览器更是错误。所以 **`--smoke` 保持原样,绝不加开浏览器**。
+
+### 1.2 新增「其他 AI 编程器专用」入口(带后缀)
+给外部渠道单开一个入口,只有它会触发激活/弹付费。命名建议 `--activate`(也可叫 `--onboard` / `--ide`):
+```
+voc-skill workspace --activate        # 外部 AI IDE 安装话术里用这个
+  1. 安装/拷贝技能文件(含一次轻量 smoke 自检)
+  2. ensureActivated()   ← 仅此入口执行
+  3. 之后才进入任何取数/工作流
+```
+`--smoke`(内部/飞马/CI 用)行为完全不变。
+
+### 1.3 弹窗按「状态」触发,而不是按命令——双保险(复用现有 token 逻辑)
+关键:`ensureActivated()` **必须复用 `credentials.js` 的 `readNewApiToken()`/`readVocToken()`**,不能另建 `~/.openclaw/...`——否则会把已通过 `~/.claude/settings.json` 配好的 Claude Code 用户误判为“缺 token”而误弹(正是你担心的场景)。
+```
+ensureActivated():
+  newApi = readNewApiToken()   # sk-(含 settings.json 的 ANTHROPIC_AUTH_TOKEN 自愈)
+  voc    = readVocToken()      # r: 会话 token
+  if !newApi && !voc:                       # 真「缺 token」(onMissing)
+      开 fmode-api 余额页 studio/?balance=fmodeapi(优先)或登录页,并提示可配 FMODE_API_KEY 自愈
+  else:
+      跳一次轻量探测(catalog 自检/getApig)判状态:
+        ok      → print "✅ 已激活",不开浏览器,放行
+        402     → 按链路选充值页:sk-链→studio/?balance=fmodeapi;r:链→apig-pay/?user=..&apigid=Vo3ROWEvDy&fun_id=HOkkX72PMF
+        401/403 → 不充值,原样转述 assistantMessage
+  开页 URL 追加 &channel={CH}&src=install 归因;始终打印 URL 兜底(headless)
+  跨平台开浏览器: win `cmd /c start ""` / mac `open` / linux `xdg-open`;VOC_OPEN_PAYMENT=0 强制关
+```
+注:本地拿不到“余额数字”,402 以实际探测响应为准;“已激活”= 探测不报 402/401/403。
+这样:现场新教练(无任何 token)→ 装完立刻引导激活/充值;Claude Code 已配 sk-(或飞马已充值)→ 探测 ok,**永不被打扰**。命令隔离 + 状态隔离,双重防误弹。
+
+提示词职责因此变薄:「粘贴→运行 `--activate` 命令→若弹出付费页就先充值/登录,再继续;若提示已激活就直接用」。弹付费稳定发生在烧 token 之前,且只对真正需要的人弹。
+
+## 2. `Skill` 表多渠道改造(最小非破坏性)
+现状 `category` 是单值 `claude-code`。两种做法,推荐 A:
+
+### 方案 A(推荐):给 `Skill` 加一个 Object 字段 `installPrompts`
+一行 skill 承载所有渠道,不改主键、不拆行:
+```json
+installPrompts: {
+  "claude-code": { "prompt": "<一键复制话术>", "command": "npx --yes @vocmarket/voc-skill@latest workspace --activate", "verified": true,  "verifiedAt": "2026-06-29" },
+  "codex":       { "prompt": "...",            "command": "...",                                                     "verified": false, "verifiedAt": null },
+  "workbuddy":   { "prompt": "...",            "command": "...",                                                     "verified": false, "verifiedAt": null }
+}
+```
+再加 `paymentConfig: { apigid, funId }`(按渠道可不同 funId,做分渠道定价/归因)。
+前端按 `installPrompts` 的 key 渲染「渠道 Tab + 一键复制 + 已测试徽标」。
+
+### 方案 B:每渠道一行 Skill
+复用现有 `category` 字段,新增 `category=codex`/`workbuddy` 的行。优点是贴合现有结构,缺点是同一技能多行、话术/版本要同步维护。**仅当前端/计费已强依赖按 category 取单行时才用。**
+
+## 3. 三套一键复制安装提示词(话术模板)
+共同结构(占位 `{CH}`):
+> 「请在当前项目文件夹的终端执行:`npx --yes @vocmarket/voc-skill@latest workspace --activate`。
+> 安装完成后:若显示「✅ 已激活」(你在 Claude Code 配了 fmode 的 `sk-`、或已在飞马充值),直接继续;
+> 若浏览器自动弹出充值页(sk- 链:`studio/?balance=fmodeapi`;r: 会话链:`apig-pay`),说明尚未激活,请先扫码登录/充值;
+> **在付费页完成前,不要进入任何取数/报告流程**(避免空耗 token)。
+> 拿到 token 后写入 `.env.local`(`FMODE_API_KEY=sk-...` 或 `VOC_TOKEN=r:...`)或 `~/.claude/voc-credentials.json`,再继续。
+> 全程以工具实际返回的 assistantMessage 为准。」
+
+渠道差异(仅薄薄一层):
+- **Claude Code**:作为 skill/plugin 安装,附 `.mcp.json` 注册说明
+- **Codex**:在 Codex CLI 终端粘贴运行;说明其 config 注册方式
+- **Workbuddy**:对应其技能/命令注册入口
+
+## 4. 安全(更正我之前的误判)
+- **收回之前的警告**:读 `~/.claude/settings.json` 的 `env.ANTHROPIC_AUTH_TOKEN`(sk-) **是本产品正常的计费 token 解析路径**,已由 `pickFmodeAnthropicToken` 门控(必须 sk-、非 sk-ant-、base 指向 fmode)。那是用户自己的 fmode 计费 key、本地鉴权,不是跨应用抓取——之前是我理解错了,这段不用从话术里删。
+- 代码里已守住的红线:**token 绝不回显**到报告/日志/聊天;不发往第三方。保持这两点即可。
+- 401/403 不走充值,原样转述 assistantMessage;仅「真缺 token」与真 402 引导付费,且缺 token 优先自愈读 sk-。
+
+## 5. 待你确认/我可执行的落地项
+1. 给 `Skill` 表加 `installPrompts`(Object)、`paymentConfig`(Object) 字段,并回填 voc-skill 三渠道话术(用你给的 masterKey 可直接写)。
+2. 改 `@vocmarket/voc-skill` 包:新增 `workspace --activate` + `ensureActivated()`,**复用 `mcp/src/core/credentials.js` 与 `payment-links.js`**(readNewApiToken/readVocToken/buildVocRechargeInfo/buildFmodeApiRechargeUrl),加跨平台开浏览器 + URL 兜底 + `VOC_OPEN_PAYMENT` 开关;`--smoke` 不动。
+3. 产出 Claude Code / Codex / Workbuddy 三套提示词并各自冒烟,回写 `verified/verifiedAt`。
+4. ~~apigid 不一致~~ 已澄清:`payment-links.js` 权威常量 `VOC_SOCIAL_APIG_ID='Vo3ROWEvDy'`、`VOC_RECHARGE_FUN_ID='HOkkX72PMF'`;旧 api-config.json 里的 `7HwdQZk55B` 是另一个/陈旧 apig,`--activate` 以 `payment-links.js` 为准。

BIN
docs/voc-skill-student-course/VOC实战课-FmodeStudio技能项目模板.pptx


Некоторые файлы не были показаны из-за большого количества измененных файлов