手搓生产级 AI Agent 系统(28):MCP三层架构解析与集成选型

说明:本文基于公开搜索资料与社区实践整理,涉及具体SDK版本、接口名、传输方式等产品事实,均建议读者以MCP官方文档和对应框架官方仓库为准进行核验。

当Agent需要接入外部工具与数据源时,Function Calling的碎片化问题会迅速暴露:每个LLM厂商的调用格式不同,每个工具都要单独适配。MCP(Model Context Protocol)作为开放协议,正是为解决这一层接入成本而生。本篇作为系列第28篇,聚焦MCP的Host/Client/Server三层架构,结合公开资料中提到的Java SDK与Spring AI实践,梳理生产集成中的选型逻辑。

三层组件如何协作

从公开社区资料描述的全流程实战视角看,一次完整的工具调用通常涉及三个角色:

MCP Host是面向用户的宿主应用,负责承载LLM与对话界面。以社区提到的ChatMCP为例,Host需要配置支持function calling的LLM,并将MCP Client接入其中。Host的核心职责通常包括:管理对话上下文、决定何时调用工具、将工具结果回填给LLM。

MCP Client是Host与Server之间的协议适配层。按社区资料的描述,它负责与MCP Server建立连接、发送工具调用请求、接收执行结果。有资料提到使用Java SDK开发Client时涉及McpClient相关接口,其异步实现依赖底层传输层完成消息收发。需要说明的是,MCP官方SDK支持范围与具体版本能力,应以官方仓库说明为准,本文不将其作为已确认事实。

MCP Server是工具与数据源的实际提供方。社区教程中常提到Server对外暴露工具调用能力,并通过某种传输方式与Client通信。Server的实现质量直接决定Agent能否正确使用工具,其中description字段的编写尤为关键——LLM依赖它理解工具用途和参数含义,描述模糊会导致调用失败或参数错误。

关于三层之间的通信方式,社区资料中常见stdio与SSE两种说法的讨论。stdio通常被认为适用于本地进程间通信,SSE适用于实时数据更新和远程服务场景。但具体协议规范中定义了哪些传输方式、默认行为如何,应以MCP官方协议文档为准。

开发模式对比:Java SDK、Spring AI与Python SDK

从公开资料和社区实践看,三种技术栈的定位差异明显。以下对比属于工程分析,具体能力需以各项目官方文档为准。

Java SDK:社区资料显示其提供较底层的协议控制。开发者可能需要直接操作Client相关接口,管理连接生命周期、处理异步回调。优势是灵活可控,适合需要深度定制传输层或集成到已有Java服务体系的场景。代价是样板代码较多,调试链路较长。

Spring AI MCP:社区资料提到它在Java SDK之上做了框架级封装,并通过Spring生态的依赖注入和配置管理简化Client接入。有教程称其示例覆盖了第三方服务、单MCP、多MCP以及Playwright自动化等场景,适合已使用Spring技术栈的团队快速验证。其配套的调试工具可以降低联调成本。这些具体能力建议以Spring AI官方文档和项目README为准。

Python SDK:社区实践普遍认为它在快速原型和脚本化工具封装上更轻量。对于数据科学团队或需要快速接入Python生态工具的场景,Python SDK的启动成本最低。

选型时需权衡:如果Agent主体是Java服务且需要精细控制协议行为,Java SDK更合适;如果团队已深度使用Spring生态且追求开发效率,Spring AI MCP是自然选择;如果工具侧以Python生态为主,Python SDK可减少跨语言胶水代码。

生产集成的关键考量

调试依赖:社区教程中提到MCP Server的本地调试可能依赖特定版本的Node环境,这是全流程实战中容易被忽视的前置条件。生产环境应确保构建镜像中包含正确的运行时依赖,避免因环境差异导致Server启动失败。具体依赖要求请以对应工具官方说明为准。

description字段:这不是可选的注释,而是LLM理解工具的重要入口。生产级Server应将description视为API契约的一部分,明确参数类型、取值范围和返回结构。

LLM选型:Host通常需要配置支持function calling的LLM。不同LLM对工具调用的支持程度不同,选型时需验证其与MCP Client的兼容性,以及多工具并发调用时的稳定性。

通信方式选择:若采用stdio,适合本地工具进程;若采用SSE,适合远程服务和实时推送。生产环境若涉及跨网络调用,需评估连接的重连机制和超时策略。具体传输方式的支持情况应以官方协议文档为准。

从Function Calling向MCP迁移的选型Checklist

MCP的目标是通过统一协议降低接入成本。迁移前建议逐项确认:

  1. 现有Function Calling工具是否已稳定运行?若工具数量少且LLM厂商固定,迁移收益有限。
  2. 是否需要接入多个LLM或频繁更换模型?若是,MCP的协议抽象价值显著。
  3. 工具是否涉及敏感数据或需要独立进程隔离?stdio模式可提供进程级边界。
  4. 团队是否具备维护MCP Server的能力?Server的description质量和错误处理直接影响Agent可靠性。
  5. 是否需要实时数据更新?SSE模式可能比轮询式Function Calling更高效。
  6. 现有Java服务能否直接复用?Java SDK和Spring AI MCP可减少重写成本。
  7. 调试链路是否可观测?MCP Inspector等工具应纳入开发流程。

MCP不是Function Calling的替代品,而是当工具生态复杂到一定程度后的架构升级。对于生产级Agent系统,三层组件的清晰边界和协议标准化,是控制集成成本的关键。下一篇将继续深入MCP Server的生产化实现细节。