业务接口如何封装成 MCP 工具,入参出参和兼容性如何设计?

考查重点:业务动作契约与版本兼容。给业务动作定义用途、Schema 和错误契约,Server 适配原接口;新增字段保持兼容,破坏性变化用新版本

本题目录

参考答案

核心回答

业务接口封装成MCP工具,我会先定义一个模型能理解、业务能校验的稳定契约,再在Server里适配原接口:

  1. 明确工具用途:名称、适用场景、前置条件和副作用,避免一个工具承接所有业务操作。
  2. 设计入参:用 inputSchema 描述字段、类型、必填、枚举和单位;身份、凭证及内部地址由可信程序处理。
  3. 设计出参:保留业务结果、状态、时间和来源等必要信息。需要结构化校验时提供 outputSchema,返回相应的 structuredContent。
  4. 实现执行适配:校验参数和资源权限,转换为原接口请求,再规范化结果、错误、超时及重试行为。
  5. 分层处理兼容:分别管理工具业务版本、底层API版本、SDK版本和MCP协议revision,用实际Client验证发现、调用及异常路径。

Host通过Client发现工具并适配给模型,模型提出调用后,Server才执行实际业务。MCP统一连接方式,不会自动解决字段语义、授权和业务副作用。

展开说明

1. 先封装业务能力,再决定怎样暴露

工具应围绕任务命名,例如查询某项指标、查订单或取得文档,而不是只暴露一个缺少边界的“执行任意接口”。描述要让模型知道何时使用、缺少什么信息时不能调用,以及结果能支持什么判断。

Server可以复用原有服务层或HTTP客户端,不必复制一套业务规则。它负责MCP请求到业务接口的转换;Host负责把发现的工具定义适配到所用模型的工具格式。接入框架后,也要知道工具定义来自哪里、调用最终路由到哪个Server。

2. 入参要保留业务含义,不能只写几个string

日期要说明格式和时区,数量要说明单位,编号要说明类型与来源,枚举要描述含义。缺参时应反馈缺什么,含糊的自然语言不能直接当作已确认业务值。可选字段和默认值也要写清,尤其不能用默认值悄悄扩大查询范围。

Schema约束数据形状,Server仍要检查跨字段条件、资源归属和当前业务状态。用户身份和访问凭证来自可信调用环境,不让模型填一个 user_id 就决定查谁的数据;若业务确需目标用户字段,也要另行校验调用者是否有权访问。

上游字段变化可在适配层转换,但不能改变公开字段的既定含义。例如同名金额字段从元改成分,或状态码含义变化,都属于语义兼容问题。新增可选字段也需检查旧客户端能否容忍,不能仅凭“没删字段”就判断完全兼容。

3. 结果要区分成功、空数据、部分结果和失败

业务返回宜保留关键字段、单位、数据时间、范围和必要来源。列表结果较大时提供分页、总量及是否完整,避免模型把前一页误当成全部。

当前规范的 outputSchema 是可选项;提供后,Server返回的结构化结果须符合它,Client也应校验。structuredContent 是Server产生的数据,与模型的结构化生成是不同机制。为兼容使用文本结果的Client,可以同时返回序列化JSON文本或必要说明,具体按目标Client验证。

协议级错误与工具执行错误也要分开。未知工具或畸形请求通过JSON-RPC错误表达;业务API失败、参数语义不合法等执行错误,可用 isError: true 给出可处理的反馈。合法空列表不必一律视为异常。HTTP成功也不等于业务已成功,要检查业务回执;错误信息应保留可定位标识,去掉凭证和内部堆栈。

4. 兼容性不能只靠固定一个工具名

工具契约可以按版本演进,破坏性修改通过新版本或新工具名发布,并保留必要迁移期。缓存工具定义时关联版本和访问范围,避免模型按旧Schema生成参数,Server却按新语义执行。

协议版本与SDK版本分别确认。2026-07-28规范采用每个请求声明协议版本和客户端能力的方式,HTTP还涉及相应协议头;2025-11-25及更早版本使用初始化握手。当前Server须支持 server/discover,Client可以先发现,也可以按规范处理不支持版本的响应。兼容旧Client需要实现相应旧流程,不能只把请求里的版本字符串改成新日期。

教程固定依赖是官方Python SDK mcp>=1.26,<2,天气示例使用1.x的FastMCP和兼容SSE写法。理解它时按该版本看;新实现则对照选定SDK与目标revision,不能把旧代码的启动、握手和返回格式拼成当前实现。

业务执行还要独立处理超时、取消和幂等。查询可有限重试;写操作超时且结果未知时,应先查回执,不能因更换协议或重连就重复提交。

5. 用教程天气工具说明具体映射

教程中的参考实现是 get_weather(city):用城市调用天气HTTP接口,把摄氏单位和语言参数放在Server端,再把返回数据序列化成字符串。这展示了业务API被包装成MCP工具的基本位置。

若把它进一步做成稳定业务工具,可以明确城市标识及歧义处理,把结果整理成城市、温度、单位、天气描述和观测时间,检查上游HTTP状态及业务错误,再按约定结果结构返回。原API增加无关字段时,上层契约不必跟着变化;含义变更时则更新映射和版本。

验证时先用固定的上游成功、无数据、参数错误、超时及异常结构回放,再用目标Client检查工具发现、调用关联和结果解析。涉及写操作的工具还需覆盖重复请求与断线后的状态核对。只有Server能启动,不代表契约和兼容性已经成立。

常见追问

是不是把原HTTP接口原样转成Tool就行?

简单接口可以薄封装,但仍需补清用途、参数语义、权限和错误处理。原接口的内部参数、冗余字段或不稳定状态码未必适合直接交给模型,应在适配层保持稳定业务契约。

MCP返回JSON,模型就一定会正确理解吗?

不会。结构化结果提高可解析性,字段说明、单位、时间和范围仍要清楚;Host也要把必要内容实际提供给模型。关键计算、状态判断和授权不要只交给模型从一段JSON中猜。

不同版本的Client都要支持吗?

按实际服务对象确定兼容范围,明确支持哪些revision、传输和结果类型,做对应组合测试。无共同支持版本时应给出可诊断错误,不能默默换成不兼容语义继续执行。

对应教程

  • MCP模型上下文协议:结合Host、Client、Server及天气案例理解业务能力怎样接入;具体SDK示例按教程固定的1.x依赖阅读,协议细节对照目标revision。

参考资料

  • 国内:JavaGuide:MCP调用边界与版本:依据 Server 业务实现、Host 适配与协议 revision 的分工,区分正文中的业务封装和协议兼容问题。
  • 国内:ranxi2001:MCP与框架适配:借鉴工具定义适配到框架目录、调用路由及错误归一的过程,说明正文中 MCP 接入层的职责;初始化与会话说明按相应旧版规范理解。
  • 国内:WeThinkIn:工具Schema与结果契约:依据用途边界、参数语义、稳定结果与错误类别的设计,说明正文中业务接口如何封装为可选择、可处理失败的工具。
  • 国外:MCP:Tools,2026-07-28:依据输入输出 Schema、结构化结果、文本兼容与错误机制,说明正文中参数和结果如何按 MCP 协议表达。
  • 国外:MCP:Versioning and Compatibility:依据当前请求元数据、版本选择与旧初始化流程的差异,说明正文中 SDK 版本和协议版本分别影响的兼容边界。

相关面经

7 篇

水滴

AI全栈
校招一面
查看原面经 →
如何通过 MCP 查询业务订单、任务进度以及任务成功或失败状态?

字节跳动

Agent 开发
校招秋招一面、二面、三面
查看原面经 →
同一项能力支持多种接入方式时怎样选择?自己的业务能力如何开放给 Agent?(50:34)

阿里巴巴

全栈开发工程师
二面
查看原面经 →
自己有去搭建过 MCP Server 吗?

要务科技

AI 应用开发工程师
暑期实习一面
查看原面经 →
追问
有没有自己写过 MCP Server(只配过 Agent 插件)?

哔哩哔哩(B站)

Agent 开发
社招二面
查看原面经 →
MCP 服务端怎么实现?你用过 fastMCP 吗?
展开剩余 2 篇面经

阿里巴巴

Agent 应用开发工程师
一面
查看原面经 →
Choice接口封装成MCP工具的时候,标准化接口怎么设计的,有没有遇到兼容性问题。还让我现场举了一个项目里的例子,说清楚入参出参怎么定义的。

MiniMax

前端开发工程师(AI 训练调度与评测)
实习一面
查看原面经 →
做的MCP具体干了什么?

收录题集

2 个来源,共2 份题集

Agent与工具调用

阿东玩 AI · AgentGuide · 1 条原题

查看题集 →

MCP 与工具调用

沉默王二 · 王二讲 Agent · 1 条原题

查看题集 →

相关题目

4 题