10 — Plugins 体系完整分析

← 返回主报告:Kimi Agent(云端沙箱)技术报告GitHub 原文

合规与风险声明:本报告为安全研究与互操作学习目的的逆向分析,全程只读采集,未对目标系统做任何修改;文中所有密钥、token、账号级标识(chat_id / project_id / tenant_id 等)均已脱敏;沙箱内发现的默认弱口令(VNC/SSH)属平台侧配置,仅作安全发现披露,请勿用于访问任何不属于自己的系统。docx/pdf/xlsx/kimi-slides 等引擎二进制为 Moonshot 专有许可(禁再分发/逆向),本文仅作行为级描述。报告基于单次分析窗口(约 50 分钟生命周期),软件版本与技能库存随镜像更新可能变化。

采集时间:2026-08-18。访问方式:SSH(kimi 用户,只读)+ 本机 curl http://127.0.0.1:18080(root 文件服务兜底)。 范围:/app/.agents/plugins/ 下全部 18 个 plugin;plugin 与 skill 的区别;加载/注册机制;凭证与外部服务。

1. 总体布局与投递机制

  • /app/.agents/plugins 是一个 symlink → /mnt/portal-overlay/.agents/plugins/mnt/portal-overlaydrive9 mount --mode=fuse ... :/projects/<uuid> /mnt/agents 同体系的 portal 存储下发;/mnt/portal-overlay/.agents/只有 plugins 一个目录
  • 对比:/app/.agents/skills/ 是容器镜像内置的真实目录(owner kimi),共 269 个 skill;plugins 是按会话/账号从云端 portal 动态下发的,不进镜像。
  • 证据:
  lrwxrwxrwx 1 root root 35 Aug 18 08:43 plugins -> /mnt/portal-overlay/.agents/plugins
  drwxr-xr-x 1 kimi kimi 43 Aug 11 15:28 skills
  • 每个 plugin 目录核心是 kimi.plugin.json manifest;多数还带 bundle.zip(catalog 发布产物,内容与解压目录一致,如 ifind 的 bundle.zip 仅 4 个文件:README.md、kimi.plugin.json、scripts/ifind_tool.py、skills/ifind/SKILL.md)。interactive-research-report-en 留有 bundle.zip.bak-20260722-132724(11.6MB),说明 bundle 是云端构建后整体替换下发的。

2. Plugin vs Skill 的区别

维度Skill(/app/.agents/skills/)Plugin(/app/.agents/plugins/)
清单文件无独立 manifest,只有 SKILL.md 的 YAML frontmatterkimi.plugin.json(JSON,有 $schema
frontmatter 字段name/description/compatibility/license/allowed-tools/metadata.openclaw.requires.bins/install(带自动安装规则,源自 openclaw 生态)插件内 skill 的 frontmatter 更简单(name/description/version/metadata.requires.bins)
额外能力仅提示词+脚本资源可声明 mcpServers(远程 MCP)、sessionStart.skill(会话开始自动加载)、skillInstructions(直接注入系统提示的触发/约束说明)、interface(展示元数据/分类/图标/mcpOverrides)
分发镜像内置 269 个portal 按会话下发,bundle.zip 整体替换
schema URLhttps://catalog.msh.team/schemas/kimi.plugin.schema.json / catalog.deva.msh.team/... / kimi.com/schemas/... / catalog.msh.team/misc/... —— 说明存在 plugin catalog 构建管线(msh.team = Moonshot 内部域)

manifest 完整字段(以 audio_generation 为例):$schema, name, version, description, keywords[], author, homepage, license, skills: "./skills/", skillInstructions, interface{displayName, shortDescription, longDescription, developerName, websiteURL, iconUrl, category, mcpOverrides?, hostKind?}, sessionStart{skill}?, mcpServers?

加载方不在沙箱内:在沙箱 /usr/local/lib/python3.12/site-packages/ 全量 grep kimi.plugin.json 零命中。manifest 由沙箱外的云端 agent 运行时解析:skillInstructions 进系统提示、sessionStart.skill 会话启动加载、mcpServers 由宿主建立 MCP 连接;沙箱只负责提供 skills/scripts 文件供模型 Read/Bash 执行。

3. 三种 Plugin 类型

3.1 远程 MCP 型(manifest 带 mcpServers,共 3 个)

插件MCP endpoint传输凭证
githubhttps://api.githubcopilot.com/mcp/默认(HTTP)OAuth,宿主侧完成;scope 自动过滤工具
cloudflarehttps://mcp.cloudflare.com/mcp默认OAuth,首次连接跳转授权
baidu-panhttps://mcp-pan.baidu.com/ssesse用户自带 access_token 拼 URL query(需百度企业开发者)

共同点:interface.mcpOverrides 给 MCP server 覆盖显示名/图标。沙箱内找不到任何 MCP client 配置或 token~/.config 只有 chromium/matplotlib,全盘 find ~ -iname "mcp" 无结果)——MCP 连接建立在沙箱外的宿主侧,沙箱内不落凭证。

3.2 agent-gw 网关型(skills + scripts,共 13 个)

datasource 类(10):ifind、imf、scholar、sec_edgar、sp_data、tianyancha、world_bank_open_data、yahoo_finance、yuandian_law、china_standards。 media/生成类(3):audio_generation、image_generation、musepool。

统一模式:每个插件带 scripts/_tool.py CLI,内部调 agent_gw Python SDK(已装 0.2.6,/usr/local/lib/python3.12/site-packages/agent_gw/,专有许可):

  • 统一 CLI 约定(SKILL.md 与 skillInstructions 明确要求模型按此两步走):
  python3 scripts/_tool.py describe          # → client.tools.get_data_source_desc({"name": ...})
  python3 scripts/_tool.py call --api-name  --params-json '{...}'   # → client.tools.call_data_source_tool(...)

API 文档(参数、枚举值、约束)由 describe运行时从网关拉取,不固化在插件里 —— 插件本体只含极薄的一层调用壳。

  • media 类走 SDK 的 client.tools.generate_speech / generate_sound_effects / generate_image,返回 {"media": {"url", "mime_type"}},脚本 curl 下载到本地 mp3/图片;image_generation 还有 image-to-url 子命令,用 client.upload_storage() 把本地参考图换成签名 URL 再作为 reference_image_urls 传入。
  • 凭证解析链(SDK client.py):显式参数 > 环境变量 KIMI_API_KEY / KIMI_BASE_URL / KIMI_CHAT_ID > ~/.kimi/agent-gw.json > 默认。SDK 内置 DEFAULT_BASE_URL = "https://agent-gw-dev.dev.kimi.team/coding"(dev 网关)。脚本自身”不碰凭证也不碰端点”(muse_tool.py 注释原话),全部交给 SDK。
  • SDK 自举安装:pip install "$(curl -s https://cdn.kimi.com/agentgw/pysdk/manifest.json | ... latest.url)",要求 ≥ 0.2.6。

实际凭证(脱敏记录):root 用户存在 /root/.kimi/agent-gw.json(通过 18080 文件服务确认):

{"api_key":"sk-kimi-8OQEd910...(64位hex风格,sk-kimi- 前缀,已脱敏)",
 "base_url":"https://agent-gw.kimi.com/coding",
 "kimi_chat_id":"1a014098-****-...(会话 UUID,已脱敏)"}

kimi 用户家目录没有 ~/.kimi/;模型以 kimi 身份跑脚本时凭证应来自宿主注入的环境变量(SSH 会话 env 中看不到,属运行时注入)。生产网关:https://agent-gw.kimi.com/codingkimi_chat_id 会以 X-Kimi-Chat-Id 头发送,用于按会话归属计费/审计。

3.3 纯 Skill 型(2+1 个)

  • interactive-research-report-en:纯 skill 插件(hostKind: "hosted"),bundle 5.7MB,含 assets/templates/gallery,产出交互式研究报告静态站点;作者 zhanhaobing(个人作者,license MIT-0),说明 catalog 支持第三方投稿。
  • musepool:设计灵感库,但其 scripts/muse_tool.py 也走 agent-gw(musepool_recall/musepool_fetch,输出 YAML),介于 2/3 类之间。
  • cloudflare 虽是 MCP 型,也附带 cloudflare-mcp-usage skill(sessionStart 自动加载)教模型正确用法——混合形态。

4. 重点通用插件实现细节

4.1 github(v0.1.9)

  • 目录里只有 kimi.plugin.json + README.md,零代码——全部能力在 GitHub 官方远程 MCP(api.githubcopilot.com/mcp/)。
  • skillInstructions 即全部”实现”:声明能力面(issues/PR/代码搜索/Projects/Copilot agent 调度 assign_copilot_to_issue·create_pull_request_with_copilot·get_copilot_job_status/github_support_docs_search),并写入行为规范:写操作先确认、OAuth scope 不够就重新授权不要绕过、私有仓内容只回摘要+路径+行号、X-MCP-Insiders: true 开实验功能。
  • 没有 enabledTools 白名单(cloudflare 有),靠 MCP server 侧按 token scope 过滤。

4.2 cloudflare(v0.1.5)

  • mcpServers.cloudflare.url = https://mcp.cloudflare.com/mcpenabledTools: ["search","execute","docs"]——只放 3 个工具:Code Mode 架构,模型写 JavaScript 调 Cloudflare 全部 2500+ API 端点,代码跑在 Cloudflare 侧隔离 Dynamic Worker sandbox,上下文消耗 ~1000 token(对比”每端点一工具”的 1M+ token)。
  • 附带 skill cloudflare-mcp-usage/SKILL.md(sessionStart 加载),核心规则:绝不凭记忆猜 API 路径/参数,固定 docs → search → execute 顺序;GraphQL 可能 HTTP 200 但带 errors;写操作需用户确认。
  • account_id 等路径参数由 server 自动解析;GraphQL Analytics 端点自动识别。

4.3 lark(v0.1.1)

  • 26 个 skills,全部围绕 lark-cli(npm 包 @larksuite/cli@1.0.50,沙箱内已装:/usr/local/bin/lark-cli,另在 ~/.cli-tools/lark-cli/ 有一份 node_modules 安装;~/.cli-tools/ 下还有 dws-cli)。
  • 业务域拆分:lark-im / doc / base / sheets / drive / calendar / mail / task / approval / okr / vc / vc-agent / minutes / wiki / whiteboard / contact / attendance / apps / event / slides / markdown / openapi-explorer / skill-maker + workflow-meeting-summary / workflow-standup-report,加共享件 lark-shared(sessionStart 加载)。
  • 认证设计(lark-shared):lark-cli config init 必须后台运行(前台会阻塞卡死整轮对话),从输出文件提取授权链接,再强制调 lark-cli auth qrcode 生成 PNG 二维码给用户扫码;URL 视为 opaque string 不得修改;--as 切换 user/bot 身份;JSON 输出含 _notice 字段时按 lark-shared 处理。
  • 凭证:扫码 OAuth,token 由 lark-cli 自行保管(沙箱 ~/.config 下无 lark 目录,具体落盘位置未确认——调查期间 SSH 隧道中断,未能进一步核实;怀疑在 ~/.cli-tools/lark-cli/ 内或尚未初始化)。
  • skill frontmatter 带 metadata.requires.bins: ["lark-cli"]cliHelp 字段;每个域 skill 的 references/ 目录含逐 API 的 md 文档(如 lark-base 有 15+ 篇)。

4.4 baidu-pan(v0.1.8)

  • 纯 manifest MCP 型,SSE 传输。特殊点:认证不是 OAuth 跳转,而是用户手动把 ?access_token=... 拼到 server URL 后;SSE 模式不含上传;skillInstructions 里写了详尽的删除前确认、token 不外泄等约束。

5. 凭证与外部服务汇总(全部脱敏)

项目位置/形式状态
agent-gw API key/root/.kimi/agent-gw.jsonsk-kimi-8OQEd910...存在,root 可读,kimi 用户不可读
agent-gw 生产网关https://agent-gw.kimi.com/coding配置于上述 JSON
agent-gw dev 网关(SDK 默认)https://agent-gw-dev.dev.kimi.team/coding硬编码于 SDK
SDK 分发https://cdn.kimi.com/agentgw/pysdk/manifest.json公网
github MCPhttps://api.githubcopilot.com/mcp/OAuth 在沙箱外
cloudflare MCPhttps://mcp.cloudflare.com/mcpOAuth 在沙箱外
baidu-pan MCPhttps://mcp-pan.baidu.com/sse用户自带 token
lark-cliopen.feishu.cn,扫码 OAuthtoken 位置未确认
插件图标/CDNavatar.moonshot.cn/avatar/plugin/*cdn.kimi.com公网
plugin catalogcatalog.msh.team / catalog.deva.msh.team(schema & homepage)Moonshot 内部

6. 对 Hermes 可移植的结论

  1. “薄插件 + 运行时 describe”模式:datasource 插件本体只有一个统一 CLI 壳(describe/call 两命令),API 文档运行时从网关拉,插件永不过期。Hermes 的 kimi-datasource 已是此模式,可推广到一切外部数据/媒体能力。
  2. kimi.plugin.json manifest 设计skillInstructions(触发说明直注系统提示)+ sessionStart.skill + mcpServers + interface.mcpOverrides 四件套,把”skill 提示词”和”MCP 工具”统一到一个包格式里,且加载方与执行环境解耦(manifest 云端解析、脚本沙箱执行)。
  3. 凭证与执行环境隔离:API key 只放 root 的 ~/.kimi/agent-gw.json(或运行时注入 env),模型运行用户读不到;MCP OAuth 完全在沙箱外。沙箱内不落任何第三方 token。
  4. Code Mode(cloudflare):3 个元工具(docs/search/execute)+ 代码沙箱执行替代 N 个工具的 schema 灌入,省 3 个数量级上下文——Hermes 接大 API 面服务时值得照搬。
  5. lark-cli 模式:把重型集成做成”CLI + 按业务域拆分的 skills + 共享认证 skill”,并明确”阻塞命令必须后台跑、授权链接转二维码”这类 agent 友好设计细节。