- 状态(Status): Final
- 类型(Type): Standards Track
- 创建(Created): 2025-01-21
- 作者(Author(s)): Peter Alexander (@pja-ant)
- 担保人(Sponsor): None (seeking sponsor)
- PR: https://github.com/modelcontextprotocol/modelcontextprotocol/pull/2133
摘要
本 SEP 为通过可选、可组合的扩展来扩展模型上下文协议确立一个轻量级框架。该提案为扩展定义了一套治理模型和呈现结构,使 MCP 生态能够在保持核心协议稳定的同时演进。扩展使得在不强制所有实现采用的情况下实验新能力成为可能,为社区提出、评审和采纳增强功能提供了清晰的扩展点。 本 SEP 定义了官方扩展(由 MCP 维护者维护)和实验性扩展(工作组和兴趣组在正式接受之前,用于对扩展想法进行原型验证和协作的孵化路径)。外部维护的扩展可能会在更晚的阶段出现。动机
MCP 目前缺乏任何关于扩展应如何提出或采纳的指引。没有流程,就不清楚这些扩展如何被治理、围绕实现有什么预期、它们应如何在规范中被引用,等等。规范
定义
MCP 扩展是对规范的可选补充,用于定义超出核心协议范围的能力。扩展所支持的功能可以是模块化的(例如认证等相对独立的特性)、专门化的(例如特定行业的逻辑),或实验性的(例如正在孵化、有可能被纳入核心的特性)。 扩展通过一个唯一的**扩展标识符(extension identifier)**来标识,格式为:{vendor-prefix}/{extension-name},例如 io.modelcontextprotocol/oauth-client-credentials 或 com.example/websocket-transport。这些名称遵循与 _meta 键相同的规则,但前缀是强制的。
为防止标识符冲突,供应商前缀**应当(SHOULD)**是扩展作者拥有或控制的反转域名(类似于 Java 包命名约定)。例如,拥有 example.com 的公司会使用 com.example/ 作为其前缀。
破坏性变更**必须(MUST)**使用新的标识符,例如 io.modelcontextprotocol/oauth-client-credentials-v2。破坏性变更是指任何会导致既有合规实现失败或行为异常的修改,包括:移除或重命名字段、更改字段类型、改变现有行为的语义,或添加新的必填字段。
扩展可以有在客户端/服务器消息中发送、用于细粒度配置的设置。
本 SEP 定义了官方扩展和实验性扩展。实验性扩展作为孵化路径在 MCP 组织内维护,但尚未被正式接受。非官方扩展不被 MCP 治理承认,可以由 MCP 组织之外的开发者引入和治理。
官方扩展
官方扩展位于 MCP GitHub 组织 https://github.com/modelcontextprotocol/ 内,由 MCP 维护者官方开发和推荐。官方扩展在其扩展标识符中使用io.modelcontextprotocol 供应商前缀。
扩展仓库是官方 modelcontextprotocol GitHub 组织内带有 ext- 前缀的仓库,例如 https://github.com/modelcontextprotocol/ext-auth。
- 扩展仓库由核心维护者酌情创建,目的是将某一特定领域(例如 auth、transport、金融服务)的扩展分组。
- 一个仓库有一组维护者(由 MAINTAINERS.md 标识),由核心维护者任命,负责该仓库及其中的扩展(例如 ext-auth MAINTAINERS.md、ext-apps MAINTAINERS.md)。
- 扩展**应当(SHOULD)**有一个关联的工作组或兴趣组来指导其开发并收集社区意见。
实验性扩展
实验性扩展为工作组(WG)和兴趣组(IG)提供了一条孵化路径,以便在正式提交 SEP 之前促进发现、对想法进行原型验证,并就扩展概念展开协作。实验性扩展允许在中立治理下进行跨公司协作,并具有清晰的反垄断保护和 IP 明确性。 实验性扩展仓库是官方 modelcontextprotocol GitHub 组织内带有experimental-ext- 前缀的仓库,例如 https://github.com/modelcontextprotocol/experimental-ext-interceptors。
- 任何维护者**可以(MAY)**在关联 SEP 仍处于草案状态时(或在 SEP 提交之前)创建一个实验性扩展仓库。
- 实验性扩展**必须(MUST)**与某个工作组或兴趣组关联,其维护者负责该仓库的日常治理。
- 实验性扩展仓库**必须(MUST)**清晰地标明其实验性/非官方状态(例如在 README 中),以避免与官方扩展混淆。
- 来自实验性扩展的任何已发布软件包**必须(MUST)**使用清晰表明其实验性状态的命名。
- 核心维护者保留对实验性扩展仓库的监管权,包括归档或移除它们的能力。
生命周期
创建
扩展**可以(MAY)**选择性地作为实验性扩展开始(见实验性扩展一节),以便在正式提交之前促进原型验证和协作。此孵化期受到鼓励,但不是必需的。 要成为官方扩展,扩展通过主 MCP 仓库中的一个 SEP 创建,使用标准 SEP 指南,但带有一个新类型:Extensions Track。此类型遵循与 Standards Track SEP 相同的评审和接受流程,但清晰地表明该提案针对的是扩展而非核心协议增补。SEP 必须指明将负责该扩展的工作组和扩展维护者。维护者如何任命见 SEP-2148。 扩展 SEP:- **应当(SHOULD)**在提交前于相关工作组中讨论和迭代。
- 在评审前**必须(MUST)**在某个官方 SDK 中有至少一个参考实现,以确保该扩展实用且可实现。
- **可以(MAY)**引用既有的实验性扩展仓库和孵化期间开发的实现。
- 将由核心维护者评审,他们对将其纳入为官方扩展拥有最终权威。
迭代
一经接受,扩展可以在无需核心维护者进一步评审的情况下迭代。扩展仓库维护者负责对扩展变更的评审和接受,并**应当(SHOULD)通过相关工作组协调变更。由于扩展独立于核心协议,扩展可以随时更新和部署,但变更必须(MUST)**确保在其设计中考虑到向后兼容性。晋升到核心协议(可选)
最终,一些扩展**可以(MAY)转变为核心协议特性。这应当(SHOULD)**作为带有单独核心维护者评审的 Standards Track SEP 处理。请注意,并非所有扩展都适合纳入核心协议(例如那些特定于某行业的),它们可能无限期保持为扩展。规范推荐
扩展将从 MCP 网站上一个新页面 modelcontextprotocol.io/extensions(待创建)被引用,并附带指向其规范的链接。 在适当情况下,指向相关扩展的链接也**可以(MAY)被添加到核心规范中(例如 https://modelcontextprotocol.io/specification/draft/basic/authorization 可以链接到 ext-auth 扩展),但它们必须(MUST)被清晰地公告为可选扩展,且应当(SHOULD)**仅为链接(而非规范文本的副本)。SDK 实现
SDK **可以(MAY)实现扩展。在实现处,扩展必须(MUST)默认禁用并要求显式选择加入。SDK 文档应当(SHOULD)**列出所支持的扩展。 SDK 维护者对其 SDK 中的扩展支持拥有完全自主权:- 维护者独自负责其选择支持的任何扩展的实现和维护。
- 维护者没有义务实现任何扩展或接受贡献的实现。扩展支持对于 100% 协议合规或即将到来的 SDK 合规等级而言不是必需的。
- 本 SEP 不规定 SDK 应如何组织或打包扩展。维护者可以提供扩展点、插件系统或他们认为合适的任何其他机制。
演进
所有扩展独立于核心协议演进,即扩展的新版本**可以(MAY)**在未经核心维护者评审的情况下发布。对扩展的次要更新、缺陷修复和非破坏性增强不需要新的 SEP;这些变更由扩展仓库维护者管理。 扩展**应当(SHOULD)**进行版本控制,但确切的版本控制方式在此不作规定。协商
客户端和服务器分别在 ClientCapabilities 和 ServerCapabilities 字段中,以及在 Server Card(当前进行中)中公告其对扩展的支持。 将向每个引入一个新的 “extensions” 字段,它是从扩展标识符到逐扩展设置对象的映射。每个扩展指定其设置对象的 schema;空对象表示没有设置。客户端能力
客户端在initialize 请求中公告扩展支持:
服务器能力
服务器在initialize 响应中公告扩展支持:
服务器端能力检查
服务器**应当(SHOULD)**在提供扩展特定特性之前检查客户端能力:优雅降级
如果一方支持某个扩展而另一方不支持,则支持的一方**必须(MUST)要么回退到核心协议行为,要么在该扩展为强制性时以适当的错误拒绝该请求。扩展应当(SHOULD)记录其预期的回退行为。例如,提供 UI 增强工具的服务器,对于不支持 UI 扩展的客户端仍应返回有意义的文本内容,而要求特定认证扩展的服务器可以(MAY)**拒绝来自不支持它的客户端的连接。法律要求
商标政策
- 在扩展标识符中使用 MCP 商标不授予商标权利。第三方不得以暗示背书或关联的方式使用 ‘MCP’、‘Model Context Protocol’ 或令人混淆的相似标识。
- MCP 不对扩展中所用术语的商标有效性作出判断。
反垄断
- 扩展开发者承认,他们可能与其他参与者竞争、没有义务实现任何扩展、可自由开发相互竞争的扩展和协议,并可将其技术许可给第三方(包括用于竞争性解决方案)。
- 官方扩展的地位不创设排他关系。
- 扩展仓库维护者以个人身份行事,运用最佳技术判断。
许可
官方扩展**必须(MUST)**在 Apache 2.0 许可证下提供。贡献者许可授予
通过向官方 MCP 扩展仓库提交贡献,你声明:- 你拥有授予本协议中权利的法律权限
- 你的贡献是你的原创作品,或你拥有足够的权利提交它
- 你向 Linux Foundation 和规范的接收者授予永久、全球、非排他、免费、免版税、不可撤销的许可,以:
- 复制、准备衍生作品、公开展示、公开表演、再许可和分发该贡献
- 制造、委托制造、使用、许诺销售、销售、进口以及以其他方式转让实现
无其他权利
除本节明确规定外,本协议下不授予任何其他专利、商标、版权或其他知识产权,包括通过默示、放弃或禁止反言。未作规定的部分
本 SEP 并未规定扩展系统的所有方面。以下是本 SEP 未处理内容的一个不完整列表:- Schema:我们未规定扩展公告其如何修改 schema 的机制。
- 依赖:我们未规定扩展是否/如何依赖特定的核心协议版本,或与其他扩展(或扩展版本)的相互依赖。
- 配置文件(Profiles):我们未规定分组扩展的方式。
理由
这一扩展设计运用以下原则:- 从简开始:意图是拥有一个相对简单的机制,让人们能以结构化的方式开始构建和提出扩展。
- 清晰治理:目前,焦点在于清晰的治理,而非实现细节。
- 日后完善:随着时间推移,一旦我们对扩展有更多经验,就可以适当调整方式。
- 为何用扩展仓库而非单个/独立扩展? 仓库提供了一个自然的分组和治理结构,允许仓库维护者对扩展强制执行结构和一致性。它避免了某领域不同扩展以不兼容方式工作的失败情形。同时提供了一种委派大部分治理工作的方式。
- 为何不要求核心维护者评审官方扩展? 委派评审允许扩展自主演进,而不被核心维护者评审这个已经(往往长达数月)的漫长流程所卡住。
- 为何单独版本控制? 扩展是对规范的补充且可选,因此无需将版本绑定在一起。单独的版本允许更快速的迭代。