← 返回主报告: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-overlay由drive9 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.jsonmanifest;多数还带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 frontmatter | kimi.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 URL | 无 | https://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 | 传输 | 凭证 |
|---|---|---|---|
| github | https://api.githubcopilot.com/mcp/ | 默认(HTTP) | OAuth,宿主侧完成;scope 自动过滤工具 |
| cloudflare | https://mcp.cloudflare.com/mcp | 默认 | OAuth,首次连接跳转授权 |
| baidu-pan | https://mcp-pan.baidu.com/sse | sse | 用户自带 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/ 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/coding;kimi_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-usageskill(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/mcp,enabledTools: ["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.json,sk-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 MCP | https://api.githubcopilot.com/mcp/ | OAuth 在沙箱外 |
| cloudflare MCP | https://mcp.cloudflare.com/mcp | OAuth 在沙箱外 |
| baidu-pan MCP | https://mcp-pan.baidu.com/sse | 用户自带 token |
| lark-cli | open.feishu.cn,扫码 OAuth | token 位置未确认 |
| 插件图标/CDN | avatar.moonshot.cn/avatar/plugin/*、cdn.kimi.com | 公网 |
| plugin catalog | catalog.msh.team / catalog.deva.msh.team(schema & homepage) | Moonshot 内部 |
6. 对 Hermes 可移植的结论
- “薄插件 + 运行时 describe”模式:datasource 插件本体只有一个统一 CLI 壳(describe/call 两命令),API 文档运行时从网关拉,插件永不过期。Hermes 的 kimi-datasource 已是此模式,可推广到一切外部数据/媒体能力。
- kimi.plugin.json manifest 设计:
skillInstructions(触发说明直注系统提示)+sessionStart.skill+mcpServers+interface.mcpOverrides四件套,把”skill 提示词”和”MCP 工具”统一到一个包格式里,且加载方与执行环境解耦(manifest 云端解析、脚本沙箱执行)。 - 凭证与执行环境隔离:API key 只放 root 的
~/.kimi/agent-gw.json(或运行时注入 env),模型运行用户读不到;MCP OAuth 完全在沙箱外。沙箱内不落任何第三方 token。 - Code Mode(cloudflare):3 个元工具(docs/search/execute)+ 代码沙箱执行替代 N 个工具的 schema 灌入,省 3 个数量级上下文——Hermes 接大 API 面服务时值得照搬。
- lark-cli 模式:把重型集成做成”CLI + 按业务域拆分的 skills + 共享认证 skill”,并明确”阻塞命令必须后台跑、授权链接转二维码”这类 agent 友好设计细节。