Skip to main content
最终版标准轨道
此 SEP 已达到最终状态,并作为已接受设计的历史记录予以保留。最终确定后对协议所做的更改不会反映在此处。有关权威要求,请参阅当前规范及其变更日志。

摘要

本 SEP 提议改进 MCP 中的枚举模式定义,弃用非标准的 enumNames 属性,转而采用符合 JSON 模式的模式,并除了单选模式外,引入对多选枚举模式的额外支持。新模式已针对 JSON 规范进行了验证。 模式变更: https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1148 Typescript SDK 变更:https://github.com/modelcontextprotocol/typescript-sdk/pull/1077 Python SDK 变更:https://github.com/modelcontextprotocol/python-sdk/pull/1246 客户端实现: https://github.com/evalstate/fast-agent/pull/324/files 工作演示: https://asciinema.org/a/anBvJdqEmTjw0JkKYOooQa5Ta

动机

现有的枚举模式使用一种非标准的方法为枚举值添加标题。此外,它还将枚举在引导(Elicitation)中的使用(以及未来任何应采用 EnumSchema 的模式对象)限制为仅支持单选模型。要求用户选择多个项目是一种常见模式。在 UI 术语中,这对应于复选框和单选按钮之间的区别。 基于这些原因,我们提议对 EnumSchema 进行以下不破坏兼容性的轻微改进,以提升用户和开发者体验。
  • 保留现有的 EnumSchema,并将其视为“旧版”
    • 它使用一种非标准的方法为枚举值添加标题
    • 将其标记为旧版,但目前继续支持
    • 根据 @dsp-ant 的说法,待我们制定适当的弃用策略后,会将其标记为已弃用
  • 引入无标题枚举和有标题枚举之间的区别
    • 如果枚举值本身足够清晰,则无需为每个值指定单独的标题
    • 如果枚举值不适合直接展示,则可以为每个值指定标题
  • 引入单选枚举和多选枚举之间的区别
    • 如果只能选择一个值,则可以使用单选模式
    • 如果可以选择多个值,则可以使用多选模式
  • 在 ElicitResponse 中,将数组添加为 additionalProperty 类型
    • 允许将多个枚举值的选择返回给服务器

规范

1. 将带有非标准 enumNames 属性的当前 EnumSchema 标记为“遗留”

当前的 MCP 规范使用非标准的 enumNames 属性来提供枚举值的显示名称。我们提议将 enumNames 属性标记为遗留,建议使用 TitledSingleSelectEnum,这是我们在下面定义的一种符合标准的枚举类型。

2. 定义单选枚举(带标题和不带标题的变体)

枚举可能需要标题,也可能不需要标题。枚举值可能具有可读性,适合直接显示。在这种情况下,使用 JSON 模式关键字 enum 的不带标题实现更为简单。添加标题时,需要使用 const 和 title 将 enum 数组替换为对象数组。

3. 引入多选枚举(带标题和不带标题的变体)

虽然询问不支持数组和对象等任意 JSON 类型,以便客户端能够轻松显示选择项,但实现多选枚举仍然很简单。

4. 将所有变体组合为 EnumSchema

最终的 EnumSchema 将遗留、多选和单选模式汇总为一个,定义如下:

5. 扩展 ElicitResult

当前的询问结果模式仅允许返回原始类型。我们扩展此内容,以包含用于 MultiSelectEnums 的字符串数组:

实例模式示例

不带标题的单选(无变更)

带标题的遗留单选

带标题的单选

不带标题的多选

带标题的多选

理由

  1. 标准合规性:与官方 JSON 模式规范保持一致。标准模式可与现有的 JSON 模式验证器一起工作
  2. 灵活性:支持普通枚举和带有显示名称的枚举,适用于单选和多选枚举。
  3. 客户端实现: 表明实现一组复选框与单个复选框的额外开销是最小的:https://github.com/evalstate/fast-agent/pull/324/files。

向后兼容性

LegacyEnumSchema 类型在迁移期间保持向后兼容。使用 enumNames 的现有实现将继续工作,直到实施协议范围的弃用策略,并且此模式被移除。

参考实现

模式变更: https://github.com/modelcontextprotocol/modelcontextprotocol/pull/1148 Typescript SDK 变更:https://github.com/modelcontextprotocol/typescript-sdk/pull/1077 Python SDK 变更:https://github.com/modelcontextprotocol/python-sdk/pull/1246 客户端实现: https://github.com/evalstate/fast-agent/pull/324/files 工作演示: https://asciinema.org/a/anBvJdqEmTjw0JkKYOooQa5Ta

安全考虑

未发现安全隐患。此变更纯粹是关于模式结构和标准合规性。

附录

验证

使用存储在 https://www.jsonschemavalidator.net/ 的 JSON Schema Validator 中的验证,我们验证:
  • 本文档中的所有示例实例模式针对下一节中提出的 JSON 元模式 EnumSchema 进行验证。
  • 针对本文档中的示例实例模式验证有效和无效的值。

遗留单选

单选

多选

JSON 元模式

这是我们提出的用于替换规范中 schema.json 内当前 EnumSchema 的方案。