最终版标准轨道
| 字段 | 值 |
|---|---|
| SEP | 1613 |
| 标题 | 确立 JSON Schema 2020-12 为 MCP 默认方言 |
| 状态 | 最终版 |
| 类型 | 标准轨道 |
| 创建日期 | 2025-10-06 |
| 作者 | Ola Hungerford |
| 赞助者 | 无 |
| PR | #1613 |
摘要
本 SEP 确立 JSON Schema 2020-12 为 MCP 消息中嵌入式模式(工具inputSchema/outputSchema 和需求收集 requestedSchema 字段)的默认方言。模式可以通过 $schema 字段显式声明替代方言。这解决了导致实现之间兼容性问题的歧义。
动机
MCP 规范未明确说明嵌入式模式应使用哪个 JSON Schema 版本。这导致了:- 客户端和服务器假设不同版本之间的验证失败
- SDK 生态系统之间的实现分歧
- 开发者不确定性,需要进行任意版本选择
规范
1. 默认方言
当不存在$schema 字段时,MCP 消息中的嵌入式 JSON 模式必须符合 JSON Schema 2020-12。
2. 显式方言声明
模式可以包含显式的$schema 字段以声明不同的方言:
3. 模式验证要求
- 模式必须根据其声明或默认方言有效
inputSchema字段不得为null
true- 接受任何输入(最宽松){}- 等同于true,接受任何输入{ "type": "object" }- 接受具有任何属性的任何对象{ "type": "object", "additionalProperties": false }- 仅接受空对象{}
4. 适用范围
本规范适用于:tools/list响应:inputSchema和outputSchemaprompts/elicit请求:requestedSchema- 未来嵌入 JSON Schema 定义的 MCP 功能
5. 实现要求
服务器必须:- 默认生成符合 2020-12 的模式
- 使用非默认方言时包含显式的
$schema
- 根据声明或默认方言验证模式
- 至少支持 JSON Schema 2020-12
理由
为什么选择 2020-12?
- 生态系统对齐:Python SDK(通过 Pydantic)和 Go SDK 实现偏好/使用 2020-12
- 现代特性:更好的验证能力和组合支持
- 社区偏好:PR #655 讨论中的多位维护者和社区成员倡导使用 2020-12 而非 draft-07
- 当前标准:截至 2025 年,2020-12 是稳定版本
为什么允许显式声明?
- 支持现有模式的迁移路径
- 提供灵活性而无需协议变更
- 遵循 JSON Schema 最佳实践
考虑的替代方案
- Draft-07 作为默认值:社区反馈后被拒绝;版本较旧,功能较少
- 无默认值:被拒绝,因为不必要的冗长;增加样板代码
- 多个同等版本:被拒绝;造成不可预测性和碎片化
向后兼容性
这在技术上是一个澄清,而非破坏性变更:- 没有
$schema的现有模式默认为 2020-12 - 服务器可以在过渡期间添加显式的
$schema - 基本模式(type, properties, required)跨版本工作
- 使用
dependencies的模式(→dependentSchemas+dependentRequired) - 位置数组验证(→
prefixItems)
$schema: "http://json-schema.org/draft-07/schema#",然后更新为 2020-12 特性。
参考实现
SDK 实现
Python SDK - 已兼容:- 使用 Pydantic 生成模式
- Pydantic 通过
.model_json_schema()默认为 2020-12
- 显式 2020-12 实现已完成
- 由 @samthanawalla 在 PR #655 讨论中确认
- 可能需要更新,但基于其他示例,应该有简单或开箱即用的选项来支持此功能。我可以在此添加更多示例,或者我们可以在接受后创建问题进行跟进。
安全影响
未发现将 2020-12 确立为默认方言有任何特定的安全影响。该澄清减少了可能导致实现之间验证不匹配的歧义,这是通过增加可预测性带来的轻微安全改进。 与任何依赖项一样,实现应使用维护良好的 JSON Schema 验证器库并保持更新。相关工作
SEP-1330: 需求收集枚举模式改进
SEP-1330 提议弃用非标准的enumNames 属性,转而使用符合 JSON Schema 2020-12 的模式。这项工作直接由确立 2020-12 为默认方言启用。
实现考虑:正如 SEP-1330 讨论中所指出的,对于高级 JSON Schema 特性(如
oneOf 和 anyOf)的解析复杂性存在一些担忧。然而,这些特性是 JSON Schema 标准的一部分,并由成熟的验证器库良好支持。实现可以通过使用经过良好测试的 JSON Schema 验证库来平衡标准合规性与它们的解析需求。
SEP-834: 完整 JSON Schema 2020-12 支持
本 SEP 奠定了基础(默认方言),而 SEP-834 解决了对 2020-12 特性的全面支持。未决问题
规范本身的模式引用了draft-07,而我们用于生成它的 typescript-json-schema 包仅支持 draft-07。
选项:
- 更新模式生成脚本,在生成后修补为 2020-12(这是我在当前 PR 中所做的)
- 切换到支持 2020-12 的不同模式生成器
- 保持原样,因为它实际上不与规范冲突?