首页 / 文章

OpenAPI作为MCP服务器的权威数据源:契约、模式、审核。

如何将OpenAPI视为MCP服务器背后的契约:关键字段、描述、模式、身份验证传递、验证、所有权与版本控制。

发布者:REACTAPP.TOP阅读约 10 分钟2314 词

来源: OpenAPI as the Source of Truth for AI-Ready MCP Tools

合同优先

MCP服务器的清晰度与可靠性取决于其所依据的API合同。许多团队将OpenAPI文件视为供人类开发者参考的资料,或作为代码生成器的原始输入。当使用者是AI客户端时,该文件的作用更为重要——它详细规定了MCP层必须准确呈现的操作、输入、输出、认证方案以及运行环境。

一个实用的准则是:OpenAPI文档仍是定义API功能的权威依据,而MCP配置则是为AI客户端精心筛选后的该文档呈现形式。这种呈现形式可以选择要展示哪些操作,并优化其展示方式,但绝不能凭空创造底层API所没有的字段、权限或业务逻辑。

使用端点的人可以查看几个示例,然后就某个令人困惑的参数向同事询问。而人工智能客户端只能获取工具和架构文档所提供的信息。源文档中的缺失内容会直接体现在面向人工智能的接口上,这些缺失通常表现为以下几种常见形式:

  • 工具名称却无法说明其具体功能
  • 实际为必填项,但看起来却是可选的
  • 枚举类型中没有列出允许的值
  • 响应结果没有可用的结构
  • 认证信息有误
  • 测试服务器看起来与生产环境并无区别

服务器依然可以启动,该工具也会在发现功能中显示出来。但客户端可能会选择错误的操作、发送无效输入或误读结果。因此,仅仅因为某个API的OpenAPI文件能够被解析,并不意味着它已经具备AI应用的条件。只有当该接口的规范包含足够详细的信息,让其他系统能够正确使用该API时,它才算准备就绪。

各层由谁负责

OpenAPI用于描述HTTP API,而MCP则为兼容MCP的AI应用提供功能接口。二者虽能协同工作,但并非可以互相替代,各自负责不同的部分:

  • 在操作方面,OpenAPI定义了路由和动作,而MCP则将选定的操作呈现为客户端可发现的资源。
  • 在输入方面,OpenAPI定义了参数、请求体及其类型,而MCP则将这些内容转换为客户端可使用的输入结构。
  • 在结果方面,OpenAPI文档定义了成功与错误的响应格式,而MCP则以客户端能够理解的形式返回结果。
  • 在安全性方面,OpenAPI规定了加密方案与相关要求,MCP运行时则将凭证转发给原始API。
  • 在环境配置方面,OpenAPI指定服务器名称与API版本,MCP层则负责托管并暴露已配置的端点。
  • 在历史记录方面,OpenAPI记录契约的演变过程,MCP配置则记录所选功能集及其版本信息。
  • 这种分离避免了常见的错误:在MCP控制台中重命名工具后就认为API契约也随之改变了。界面相关的修改应放在MCP配置中,而功能或架构的变更则应体现在原始API定义中。

    最重要的OpenAPI字段

    对于 AI 客户端而言,并非所有字段都同等重要。只有少数字段会直接决定最终工具的界面设计。

    operationId 为每个操作赋予唯一的标识,同时也是工具名称的生成起点。重复或含义不明的 ID 会增加工具选择的难度。summary 和 description 字段是客户端用来判断某工具是否适用的内容,因此描述过于简略会导致相似操作难以区分。路径与 HTTP 方法用于标识工具背后的操作,一旦出现错误,就会使功能指向错误的路径。

    路径和查询参数用于指定输入字段,这些字段可能是必填的也可能是可选的。如果缺少、名称错误或输入有误,就会导致调用失败。requestBody及其架构描述了用于创建和更新操作的结构化输入,而不完整的架构会导致客户端发送错误的有效载荷。响应架构则说明了返回的内容,如果定义不充分,客户端将无法理解这些响应。

    securitySchemes及相关配置描述了运行时的身份验证机制,若这些信息有误,那些看似正常的工具在传递凭证后就会失效。servers条目或主机配置指明了接收请求的环境,因此不准确的URL可能会导致测试流量或生产流量被发送到错误的位置。最后,info.version及变更历史为审查人员提供了参考基准,缺乏这些信息的话,问题往往要等到工具出故障后才会显现。所有这些字段的质量决定了在团队选择并发布功能之前需要进行多少审查。

    作为稳定标识的操作ID

    operationId的作用远不止于生成SDK。它为每个操作赋予一个身份标识,这个标识不会因API描述或展示方式的变化而改变。优秀的ID在整个文档中都是唯一的,能够准确反映用户所看到的操作内容,风格统一,便于日后审查时识别。像list_projects、get_invoice或create_ticket这样的名称,比request1、endpointA或那些没有实际业务意义的随机字符串要容易理解得多。

    稳定性也有助于维护工作。当有人编辑描述、添加响应字段或修改参数时,团队可以明确知道是哪个MCP功能被改动,而无需将整个工具列表视为一堆未知的端点。

    描述作为决策支持

    工具描述并非装饰性内容。AI客户端会依据它来决定执行何种操作,因此必须说明该操作的功能、使用时机、影响的资源、所需的输入条件、存在的限制,以及是读取数据还是修改状态。

    以项目更新操作为例,弱版本的描述仅为“更新项目”。而强版本则会说明该操作会更改现有项目的名称、描述或状态,适用于用户已选定某个项目并明确希望修改其保存的详细信息的情况,同时明确指出不可用于创建新项目。第二种描述清晰地区分了更新与创建操作,让审核人员能够直观了解其修改状态的功能。

    源 OpenAPI 文件应在可能的地方添加有意义的摘要和描述。许多平台允许团队在导入后编辑功能名称和描述,这有助于面向 AI 的展示。不过,参数和行为必须固定在原始 API 定义中。

    客户端可使用的架构

    仅参数名称是不够的,因为客户端需要一个可供操作的架构。输入架构应明确说明哪些字段是必填的以及各自的类型,值是枚举类型还是自由文本,日期、ID和金额的格式要求,适用的上下限,以及嵌套对象和数组的结构。输出架构则应展示所有能让客户端进入下一步的内容。例如,如果某个接口返回包含ID、状态、所有者及时间戳的项目,就需要对这些信息进行精确建模,以避免它们在非结构化数据中丢失。

    准确性既关乎成功也关乎失败。那些被标记为可选但API实际上要求必填的字段,可能会使客户端陷入无效请求的循环;而那些被标记为必填但API已不再接受的字段,则可能阻碍正常的业务流程。引用也必须能够正常解析。可重用组件是OpenAPI的优势,但损坏的$ref或未完成的内嵌定义,可能会导致生成的接口缺乏足够信息来验证输入。

    安全性有文档说明,但无法保证

    OpenAPI能够描述API密钥、Bearer令牌、OAuth流程以及每项操作所需满足的条件,从而告知MCP层请求应如何进行身份验证。不过这并非完整的安全保障。在运行时,团队仍需确认四点:用于身份验证的凭证确实来自MCP客户端、该凭证在传输过程中未被篡改、API能够正确实施租户和用户权限控制,以及过期或无效的凭证会产生安全且易于诊断的结果。

    一种常见的设计是凭证直传。客户端提供 API 密钥、Bearer 令牌或 OAuth 令牌,MCP 运行时会在每次请求中将其转发给原始 API,而不会保存客户的凭证。在这种模式下,API 本身仍需负责业务授权、租户边界以及记录级别的访问控制。安全要求需要准确的文档记录,且认证测试应使用与真实凭证相似的测试凭证。

    选择要公开的内容

    一个 OpenAPI 文件可以描述整个产品的 API,但 MCP 服务器应仅暴露那些能够支持实用且安全的人工智能工作流的子集。源代码契约说明了存在哪些操作以及它们的工作方式。另一项独立的功能评估则决定人工智能客户端应看到哪些功能。该评估会考虑客户价值、数据敏感度、状态变更风险、操作之间的依赖顺序、每项描述的清晰度、授权范围以及展示给客户的功能总数。

    相关工具可以自动化处理那些机械性的工作,比如导入受支持的 Swagger 或 OpenAPI 定义、列出检测到的操作,以及创建或更新工具、资源与提示语。不过最终还是由团队来决定哪些功能最能体现其产品的优势。

    生产前的验证

    在定义成为正式的 MCP 接口之前,首先要进行结构层面的验证。需确认所支持的 OpenAPI 或 Swagger 版本,路径与方法是否有效,以及操作标识是否重复。同时要确保每个 $ref 都能正确解析,请求和响应的架构完整,服务器 URL 与基础路径准确,且安全机制已应用于相应的操作。

    接下来是语义层面的审查。描述内容是否真实反映了实际行为?那些被标记为必填的字段确实有必要吗?需检查示例是否安全且具有时效性,已废弃的操作是否已被明确标注,响应是否包含了人工智能工作流所需的字段,以及只读操作是否与会改变状态的操作分开处理。

    从验证中获得的早期反馈很有价值,因为这两种发现的重要性不同。缺少描述的警告表明存在设计问题,而未解决的架构引用则可能导致运行时故障。

    两种工件,两位负责人

    任何AI客户端能够依赖的集成背后都有两种关联的工件:API契约以及用于选择和呈现功能的MCP配置。这两者都需要有明确指定的负责人。

    API定义的范畴包括路由、方法、请求与响应字段,以及这些字段背后的类型、格式和约束条件、认证机制、版本信息,还有服务实际实现的各类功能。MCP配置则负责管理已公开的操作列表、工具、资源及提示词的选择项、面向AI的名称与描述、包含托管域名的MCP名称,以及保存的配置版本。

    如果API架构发生变动,应从原始定义入手。之后检查受其影响的MCP配置,测试新增的功能,并发布一个可在需要时回滚的版本。优秀的平台会支持保存配置版本、进行变更审核、恢复到早期版本,还能在不重新构建且不更改URL的情况下更新托管服务器。

    保持权威信息的最新状态

    只有保持最新状态时,权威数据源才有用。当添加或删除必需参数、枚举值发生变化、某个操作被废弃、接口返回格式改变、认证要求变动或授权规则变得更加严格时,面向 AI 的接口都可能受到影响。虽然普通应用请求仍可正常发送,但 MCP 工具却可能逐渐变得具有误导性,因此 OpenAPI 的更新应当与代码及 API 发布遵循相同的审查流程。

    一个实用的维护流程包含七个步骤:

    1. 更新 OpenAPI 定义以反映变更内容。
    2. 验证文档并清除其中的警告信息。
    3. 确定哪些 MCP 功能受到了影响。
    4. 审查名称、描述、架构以及安全要求。
    5. 测试典型的成功与失败调用场景。
    6. 发布新的 MCP 配置版本。
  • 在发布后监控错误、延迟以及工具使用情况。
  • 上线后,交互式测试环境有助于检查功能、调用工具、测试资源与提示语、验证身份认证,并查看各自的使用日志。

    从 API 到托管 MCP 的管理路径

    一种方法的核心理念是,SaaS团队无需重写API即可通过MCP提供特定功能。流程首先是从导入受支持的API定义或Postman集合开始,识别其中可用的操作。接着检查验证错误和警告,然后筛选出适合面向AI的接口的操作,进而创建或更新工具、资源及提示语。对于展示效果需要优化的部分,会对其进行名称和描述的修改;运行时认证则通过原始API配置完成;在真实用户接入之前,还需对托管服务器进行测试。之后,这些配置版本会被发布并逐步进行管理。

    在该模型中,生成的服务器通过 Streamable HTTP 托管,由该平台负责运行托管基础设施,不支持本地 stdio 服务器。API 依然是处理业务逻辑和授权的依据。该平台则负责提供转换功能、托管端点、配置控制以及围绕 MCP 接口的操作界面。

    核心要点

    OpenAPI 不仅仅是一个导入文件,它实际上是一份契约,用于向 MCP 集成说明各项操作的含义、所需输入、认证方式以及 AI 客户端应获得的返回结果。有了准确的契约,MCP 层就能精准地筛选合适的功能、清晰地呈现它们并安全地执行。而如果契约模糊或过时,代码生成只会更快地加剧这种不确定性。

    将 OpenAPI 视为事实来源,MCP 视为面向 AI 的接口,并通过验证、测试、可观测性及版本控制将两者之间的变更相互关联。这样就能将现有的 API 转变为可维护的基石,用于构建适合 AI 使用的工具。

    相关阅读

  • 实用笔记:面向研究实验室的 MCP:工具、数据及——针对“实用笔记:面向研究实验室的 MCP:工具、数据及”内容的操作指南:为采用该模式的团队提供的合同模板、校验规则以及可直接插入的代码片段。