SKILL 35 / FRONTIER · DEEP DIVE

Agent Plugins 1.0.0

skill 与 MCP server 终于有了一个厂商中立的打包格式——以及它故意不管的那一半

2026-10-06 · BigCat

写好的一套 skill + MCP server,过去要为每个客户端各包一遍。Agent Plugins 把「包」这一层统一了:一个 plugin.json、一个 skills/、一个 mcp.json。下面点名规范本体、官方市场、五个首发客户端的装法,以及它和 Claude Code 自家格式差在哪。

Skill 6 官方 authoring 精读 · Skill 8 AGENTS.md 与可移植性 · Skill 12 接 MCP 的安全边界 · Skill 30 装别人的 Skill 有多危险

// WHY THIS MATTERS

Agent Skills 统一了「一个 skill 长什么样」,MCP 统一了「一个工具服务怎么接」,但把它们装进一个可安装的包,此前每家各有一套:Claude Code 是 .claude-plugin/plugin.json,Cursor 是 .cursor-plugin/plugin.json,Kiro 叫 power。据 GitHub Changelog(2026-08-12),Agent Plugins 1.0 于 2026-08-06 发布,创始方为 AWS、Anysphere(Cursor)、Microsoft、OpenAI、Vercel。规范仓库的 MAINTAINERS 文件列出的五位核心维护者也正好来自这五家。

// 01

它替你干掉什么 · 装法 · 第一条能跑的用法

论断:它干掉的是「同一套工具为每个客户端各打一次包」;最小的合规插件只需要两个文件。

① 规范本体 agentplugins/agent-plugins-spec(据 GitHub 仓库页,2026-10 读取约 1.4k 星)——spec/1.0.0.md 是规范正文,schemas/1.0.0/ 是两份 JSON Schema;1.1.0 仍是工作草案。最小插件:

hello-plugin/
├── plugin.json
└── skills/greet/SKILL.md

# plugin.json —— 只有 $schema 与 name 是必填
{ "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
  "name": "hello-plugin" }

首发客户端的装法(均据各家官方文档,2026-10 检索):

别装的时候:Claude Code 不在首发名单里,官方 plugins 文档(2026-10 读取)也没有提到这份规范——它读的仍是 .claude-plugin/plugin.json 与 .mcp.json。只用 Claude Code 的人,今天没有理由改格式。
// 02

机制:它凭什么能跨客户端

论断:靠「少」——只标准化两种已有共识的组件,其余一律划进各家的命名空间。

① 固定位置,不做配置

skill 只在 skills/ 的直接子目录里找 SKILL.md,规范明文禁止递归往下找;skill 本身照 Agent Skills 规范写,不合规的那一个被跳过,插件其余部分照常加载。MCP 只读根目录的 mcp.json,不认写在 plugin.json 里的。

② MCP 配置是一个封闭联合

每个 server 必须显式写 type:stdio / streamable-http / sse(旧版),多一个字段就判该条无效。理由写在规范的 Design Decisions 里:各家现有 MCP 配置形状互不兼容、推断传输的方式也不同。客户端只需支持 stdio 或 streamable-http 中的一种,不支持的条目跳过。

{ "$schema": "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json",
  "mcpServers": {
    "lint": { "type": "stdio", "command": "./bin/lint-server",
              "args": ["--cache", "${PLUGIN_DATA}/cache"] } } }

只认两个占位符:${PLUGIN_ROOT}(插件根)与 ${PLUGIN_DATA}(客户端管理、升级后仍保留的可写目录);所有路径必须 ./ 开头且不能解析到插件根之外。

③ 各家私货放进反向域名目录

hooks、commands、agents、rules、LSP 被规范明确排除在 v1 之外——「太依赖具体客户端」。它们放进 com.github.copilot/ 这类目录,或 plugin.json 的 extensions 字段;不认识的命名空间,客户端必须忽略、不得校验。

// 03

真实用法与边界:同一个文件夹喂 Claude Code 和其他五家

论断:skills/ 两边天然共用;MCP 与清单各写一份——这是按两边官方文档推出来的做法,规范本身不保证 Claude Code 兼容。
my-tools/
├── plugin.json                # Agent Plugins:$schema + name
├── .claude-plugin/plugin.json # Claude Code 自家清单(可选)
├── skills/review/SKILL.md     # 两边共用,只写一份
├── mcp.json                   # 显式 type + ${PLUGIN_ROOT}
├── .mcp.json                  # Claude Code 版 + ${CLAUDE_PLUGIN_ROOT}
└── com.github.copilot/hooks/  # 某家专属的东西放这里

验货两条命令:Claude Code 这边 claude --plugin-dir ./my-tools 直接加载、claude plugin validate ./my-tools 校验清单;skill 那层用 agentskills/agentskills 的 skills-ref validate。规范自己的 FUTURE_CONSIDERATIONS 承认还没有官方校验工具,Agent Plugins 那一侧只能靠两份 JSON Schema 和各客户端的报错。

判据:什么时候该打成 Agent Plugin

// 04

代价与替代品

论断:它统一了「包」,没统一「信任」——装之前的审查一步都省不了。

① 信任边界留给了客户端

规范明确不定义安装、权限与信任模型、分发与市场、注册表、OAuth 与凭据。FUTURE_CONSIDERATIONS 列出的待办包括:清单里声明权限、签名与来源验证、密钥注入、企业白名单——这些在 1.0 里都还没有。一个 stdio 类型的 MCP server 就是一个会在你机器上跑的程序,审查照 Skill 30 与 Skill 12 的清单来。

② 「跨客户端」不等于「同样好用」

规范只规定客户端在哪找组件,不规定「怎么把 skill 暴露给用户或模型」。同一个 skill 在不同客户端的触发方式、命名空间、上下文开销都可能不同,跨端发布前每家至少跑一遍。

③ 双份配置要同步

为了兼顾 Claude Code 写两份 MCP 配置,就多了一个会漂移的地方。没有依赖声明(同样在待办里),插件之间也不能互相引用。

替代品,按成本从低到高:一份 SKILL.md 直接放进各客户端的 skills 目录 → vercel-labs/skills 的 npx skills 用符号链接把一份 skill 分发给多个 agent → 各家原生插件格式 → Agent Plugins。
来源:Agent Plugins Specification 1.0.0(组件发现、MCP 封闭联合、占位符、Design Decisions) · FUTURE_CONSIDERATIONS · Claude Code plugins reference(均 2026-10 读取)

// 一页选购卡

先看这三个:① spec/1.0.0.md 的 Design Decisions 节——十分钟读完就知道它管什么、不管什么。② github/awesome-copilot——在 VS Code 或 Copilot CLI 里装一个现成的规范插件,看真实目录长什么样。③ 你主力客户端的本地加载路径:Cursor 的 ~/.cursor/plugins/local/、Claude Code 的 --plugin-dir、Kiro 的 Import power from GitHub。

按需再加:skills-ref validate(打包前校验每个 skill) · claude plugin validate(兼顾 Claude Code 时校验那份清单) · codex plugin marketplace add(团队有人用 Codex)。

明确别做:为一个 skill 建一整个插件 · 把 hooks 写在根目录指望各家都认 · 把「装得上」当成「审过了」 · 在 mcp.json 的 env 里自己设 PLUGIN_ROOT(规范禁止)。

// 术语表

manifest(清单)
插件根目录的 plugin.json,声明规范版本与插件名。
$schema
写在 JSON 里的规范地址,客户端据此判断按哪个版本解析;规定不得在加载时联网拉取。
closed union(封闭联合)
只允许几种固定形状、多一个字段就判无效的配置格式。
extension namespace(扩展命名空间)
形如 com.github.copilot 的反向域名,给某个客户端放专属数据或目录,免撞名。
stdio / streamable-http
MCP 的两种传输:前者在本机起进程、走标准输入输出;后者连远端 HTTP 服务。

// 三个想不通的地方

Anthropic 不在名单里,这个规范会不会只是「Claude Code 之外的联盟」?
就仓库看,MAINTAINERS 列的五位来自 Amazon、Cursor、Microsoft、OpenAI、Vercel,没有 Anthropic;它组装的两块地基——Agent Skills 与 MCP——却都源自 Anthropic。治理章程写明「任何单一厂商不得占核心维护者多数」。Claude Code 会不会读根目录 plugin.json,目前没有官方说法,在那之前按 03 节双清单处理最稳。
为什么连 hooks 都不标准化?hooks 明明很常用。
规范的回答是「太依赖具体客户端」:每家的生命周期事件名、输入输出、能不能拦截都不同,硬定一个公约数只会谁都不好用。所以 v1 只收已有独立规范、跨端已被采用的两样东西。代价是插件里最「确定性」的那部分,恰恰最不可移植。
仓库的提交历史里最早叫 Open Plugin Specification,这说明什么?
据仓库提交记录,2026-04-02 首次提交名为「Open Plugin Specification v1.0.0」,07-19 才统一改名 Agent Plugins,07-10 还删掉了一份 marketplace 附录。也就是说「分发与市场」曾在草案里、后来被主动拿掉——不管信任是刻意的取舍,不是疏忽,这一点决定了你该在客户端那边找安全保障,而不是在包格式里找。

// 延伸阅读