Skip to main content
最终版标准轨道

摘要

本 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 的不带标题实现更为简单。添加标题时,需要使用 consttitleenum 数组替换为对象数组。

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 的方案。