Spring AI MCP 协议详解:工具调用的下一代“USB 标准“ Spring AI MCP 协议详解工具调用的下一代USB 标准本文是《Spring AI 实战》系列第 10 章。第 9 章讲了 Function Calling——让 AI 能调用你定义的 Java 方法。但有个痛点每个应用都要自己定义工具、自己注册。如果你的 10 个应用都需要查天气功能就要写 10 遍。MCPModel Context Protocol就是为了解决这个问题——它是 Anthropic 推动的开放协议让工具像 USB 设备一样即插即用。本章详解 MCP 概念、与 Function Calling 对比、Spring AI 的 MCP 支持以及 MCP Server 和 Client 的搭建配置。一、开篇Function Calling 的痛点第 9 章的 Function Calling 很强大但它有一个扩展性问题工具是绑定在应用代码里的。想象这个场景你的公司有 5 个 AI 应用——客服系统、数据分析助手、内部知识库、运维机器人、HR 助手。它们都需要查员工信息这个能力。用 Function Calling 的方式你需要在每个应用里都写一个Tool方法来查员工信息每个应用都要连接同一个 HR 数据库。如果 HR 系统的接口变了你要改 5 个应用。这就像 USB 出现之前的时代——每个外设都要自己写驱动程序。MCPModel Context Protocol就是 AI 工具世界的 USB 标准。它把工具的定义和实现从应用中抽离出来变成一个独立的工具服务。任何 AI 应用只要遵循 MCP 协议就能直接连接这些工具服务不需要自己写代码。本章详解 MCP 的概念、原理以及 Spring AI 2.0.0 中的完整支持。二、MCP 概念详解2.1 MCP 是什么MCPModel Context Protocol是 Anthropic 在 2024 年底推出的开放协议用于标准化 AI 应用和工具服务之间的通信。它的目标是一次开发工具服务到处使用。核心思想把工具从 AI 应用中解耦变成独立部署的服务。AI 应用通过标准化协议与工具服务通信。2.2 USB 类比——深入理解 MCP这个类比能帮助你快速理解 MCP 的设计哲学维度USB硬件世界MCPAI 工具世界解决的问题每个外设都要自己写驱动每个应用都要自己定义工具标准化的是什么物理接口 通信协议工具描述格式 调用协议核心角色USB Host电脑USB DeviceU盘、鼠标USB Driver翻译层MCP HostAI 应用MCP Server工具服务MCP Client协议翻译层“即插即用”插上 U盘就能用配置 MCP Server 地址就能用跨平台Windows/Mac/Linux 都能用任何支持 MCP 的 AI 框架都能用好处设备厂商不用为每个操作系统写驱动工具开发者不用为每个 AI 框架写适配2.3 三个核心角色MCP 架构中有三个角色------------------ MCP协议 ------------------ | MCP Host | ---------------- | MCP Server | | (AI 应用) | | (工具服务) | | | | | | - ChatGPT | 1. 发现工具列表 | - 提供天气查询 | | - Claude | 2. 调用工具 | - 提供数据库查询 | | - 你的Spring应用 | 3. 获取结果 | - 提供文件操作 | ------------------ ------------------ | | | 内置 | 独立进程 ------------------ ------------------ | MCP Client | | 实际能力: | | (协议客户端) | | - REST API | | | | - 数据库 | | - 解析MCP协议 | | - 文件系统 | | - 翻译调用请求 | | - Shell命令 | ------------------ ------------------Host宿主发起工具调用的 AI 应用。比如你的 Spring Boot 服务、ChatGPT、Claude Desktop。Client客户端Host 内部的 MCP 协议客户端负责和 Server 通信。在 Spring AI 中这是框架内置的你不需要自己实现。Server服务端提供工具的独立进程。它通过 MCP 协议暴露自己的能力列表接收调用请求并返回结果。2.4 三种传输方式MCP 定义了三种 Host 和 Server 之间的通信方式传输方式说明适用场景通信协议stdio标准输入输出Host 启动 Server 进程通过 stdin/stdout 通信本地开发、同一台机器上的工具进程间通信SSEServer-Sent EventsServer 作为 HTTP 服务运行Client 通过 SSE 连接远程工具、跨机器部署HTTP SSEStreamable HTTP基于 HTTP 的双向流式通信MCP 最新推荐生产环境、需要高可靠性的场景HTTP/2 流stdio 模式最简单适合本地开发。Host 直接启动 Server 子进程通过标准输入输出通信。缺点是 Server 必须和 Host 在同一台机器上。SSE 模式适合远程部署。Server 作为独立的 HTTP 服务运行多个 Client 可以同时连接。缺点是 SSE 是单向流Server 到 ClientClient 发请求需要额外的 HTTP POST。Streamable HTTP是 MCP 协议的最新演进基于 HTTP/2 的双向流式通信同时支持请求-响应模式和流式推送是生产环境的首选。三、MCP vs Function Calling 对比3.1 六维度对比表维度Function CallingMCP工具定义位置写在应用代码里Tool 注解独立的 MCP Server复用性每个应用重新定义代码重复一次开发多处使用通信协议各框架自定义无标准标准化开放协议JSON-RPC运行方式同进程Java 方法直接调用跨进程HTTP/stdio 通信部署工具随应用一起部署工具独立部署可单独升级技术栈必须和应用同语言Java工具可以用任何语言Python/Node/Go…生态有限各框架自建快速增长已有数百个开源 MCP Server调试难度低直接断点调试较高跨进程通信性能高方法直接调用无网络开销中有进程间/网络通信开销适合场景简单工具、快速原型、工具数量少复杂工具、多应用共享、团队协作3.2 各自适用场景用 Function Calling 的场景工具逻辑简单只是查数据库或调一个 HTTP 接口只有一个应用需要这个工具快速原型验证不想引入额外组件对延迟敏感不能接受网络通信开销用 MCP 的场景多个应用需要共享同一套工具工具由专门的团队维护和应用团队不同工具用 Python/Node.js 实现但应用是 Java 的想直接使用开源社区已有的 MCP Server如 GitHub、数据库、Slack实际项目中两者可以混合使用。你的应用可以同时注册 Tool 本地工具和 MCP 远程工具Spring AI 会把它们合并到一起。四、Spring AI 的 MCP 支持4.1 依赖说明Spring AI 2.0.0 内置了 MCP Client 支持。添加以下依赖!-- Spring AI MCP Client支持 stdio 和 SSE 两种模式 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-client/artifactId/dependency!-- 如果需要搭建 MCP Server可选 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-server/artifactId/dependency4.2 Spring AI MCP 的工作原理Spring Boot 应用启动 | v MCP Client 根据 application.yml 配置 | --- stdio 模式启动 Server 子进程通过 stdin/stdout 通信 | --- SSE 模式连接远程 Server 的 HTTP 端点 | v MCP Client 从 Server 获取工具列表名称、描述、参数 Schema | v Spring AI 将 MCP 工具 Tool 本地工具 合并注册到 ChatClient | v AI 调用工具时Spring AI 自动判断 - 是 Tool 本地工具 - 直接调用 Java 方法 - 是 MCP 远程工具 - 通过 MCP Client 发送请求到 Server从使用者的角度看MCP 工具和 Tool 工具没有任何区别。你在 ChatClient 中统一使用Spring AI 在底层自动路由。五、MCP Server 搭建5.1 概念说明MCP Server 是提供工具的独立服务。你可以使用现成的开源 MCP Server推荐入门用 Spring AI 搭建自己的 MCP Server开源 MCP Server 举例modelcontextprotocol/server-filesystem文件系统操作modelcontextprotocol/server-githubGitHub API 操作modelcontextprotocol/server-postgresPostgreSQL 数据库操作modelcontextprotocol/server-slackSlack 消息操作5.2 用 Spring AI 搭建 MCP Serverpackagecom.example.mcpserver;importorg.springframework.ai.tool.annotation.Tool;importorg.springframework.ai.tool.annotation.ToolParam;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.stereotype.Component;/** * MCP Server 应用 * * 通过 spring-ai-starter-mcp-server 自动暴露为 MCP Server。 * 这里定义的工具会被所有连接的 MCP Client 使用。 */SpringBootApplicationpublicclassMcpServerApplication{publicstaticvoidmain(String[]args){SpringApplication.run(McpServerApplication.class,args);}}/** * 员工信息工具 * * 这些 Tool 方法会自动通过 MCP 协议暴露给外部应用。 * 注意MCP Server 中的 Tool 定义方式和 Function Calling 完全一样 */ComponentpublicclassEmployeeTools{privatefinalEmployeeServiceemployeeService;publicEmployeeTools(EmployeeServiceemployeeService){this.employeeServiceemployeeService;}/** * 查询员工基本信息 */Tool(description根据员工ID查询员工基本信息包括姓名、部门、职位、邮箱。当需要查询某个员工的信息时调用。)publicStringgetEmployee(ToolParam(description员工ID如 EMP-001)StringemployeeId){returnemployeeService.getEmployeeInfo(employeeId);}/** * 查询部门的员工列表 */Tool(description查询指定部门的所有员工列表。当需要了解某个部门有哪些人时调用。)publicStringlistDepartmentStaff(ToolParam(description部门名称如技术部、市场部)Stringdepartment){returnemployeeService.listByDepartment(department);}/** * 查询员工剩余假期 */Tool(description查询员工的年假和调休剩余天数。当员工询问自己还有多少假期时调用。)publicStringgetLeaveBalance(ToolParam(description员工ID)StringemployeeId){returnemployeeService.getLeaveBalance(employeeId);}}5.3 MCP Server 配置# application.ymlMCP Server 端spring:application:name:employee-mcp-serverai:mcp:server:name:employee-tools# Server 名称Client 连接时使用version:1.0.0# stdio 模式配置stdio:enabled:true# 启用 stdio 传输# SSE 模式配置可选和 stdio 二选一或同时启用sse:enabled:true# 启用 SSE 传输port:8081# SSE 端口搭建 MCP Server 的关键发现工具定义方式和 Function Calling 完全一样。你不需要学习新的 API只需要把 Tool 标注的工具类放到一个独立的 Spring Boot 应用中加上 MCP Server 依赖和配置即可。六、MCP Client 配置6.1 stdio 模式本地开发推荐stdio 模式下Spring AI 会自动启动 MCP Server 子进程通过标准输入输出通信# application.ymlMCP Client 端spring:ai:mcp:client:stdio:servers-configuration:classpath:mcp-servers.json# 或者直接在 yml 中配置servers:# 连接文件系统 MCP ServerNode.js 实现filesystem:command:npxargs:--y-modelcontextprotocol/server-filesystem-/path/to/allowed/files# 可选环境变量env:NODE_OPTIONS:--max-old-space-size4096# 连接我们自己的员工信息 MCP ServerJava 实现employee:command:javaargs:--jar-employee-mcp-server.jar# 可选工作目录# working-directory: /path/to/server6.2 SSE 模式远程部署推荐SSE 模式下MCP Server 作为独立 HTTP 服务运行Client 通过 HTTP 连接# application.ymlMCP Client 端 - SSE 模式spring:ai:mcp:client:sse:servers:# 连接远程员工信息 MCP Serveremployee:url:http://localhost:8081/sse# 可选连接超时毫秒connect-timeout:5000# 可选读取超时毫秒read-timeout:30000# 连接 GitHub MCP Servergithub:url:http://localhost:8082/sse6.3 MCP 工具 Tool 工具混合使用MCP 工具和 Tool 本地工具可以同时使用。Spring AI 会自动合并ConfigurationpublicclassHybridChatConfig{BeanpublicChatClientchatClient(ChatClient.Builderbuilder,// Tool 本地工具OrderToolsorderTools,WeatherToolsweatherTools){returnbuilder.defaultSystem( 你是一个企业智能助手。 你可以查询订单、天气、员工信息等。 回答要简洁准确。 )// 注册 Tool 本地工具.defaultTools(orderTools,weatherTools)// MCP 工具由框架自动注册基于 application.yml 配置// 你不需要写任何额外代码.build();}}核心优势从 ChatClient 的角度看MCP 工具和 Tool 工具完全透明。AI 会根据用户问题和工具描述自动选择最合适的工具不管它是本地的还是远程的。七、MCP 生态7.1 已有的 MCP ServerMCP 生态正在快速增长。以下是一些常用的开源 MCP ServerMCP Server功能安装方式filesystem文件和目录操作读、写、搜索npx modelcontextprotocol/server-filesystemgithubGitHub 仓库、Issue、PR 操作npx modelcontextprotocol/server-githubpostgresPostgreSQL 数据库查询npx modelcontextprotocol/server-postgressqliteSQLite 数据库操作npx modelcontextprotocol/server-sqliteslackSlack 消息、频道操作npx modelcontextprotocol/server-slackpuppeteer浏览器自动化截图、爬取网页npx modelcontextprotocol/server-puppeteerbrave-searchBrave 搜索引擎npx modelcontextprotocol/server-brave-searchmemory持久化知识图谱记忆npx modelcontextprotocol/server-memoryfetchHTTP 请求工具抓取网页内容npx modelcontextprotocol/server-fetchsequential-thinking动态思维链工具npx modelcontextprotocol/server-sequential-thinking7.2 在 Spring AI 中使用开源 MCP Server只需在 application.yml 中添加配置不需要写任何 Java 代码spring:ai:mcp:client:stdio:servers:# 文件系统工具filesystem:command:npxargs:[-y,modelcontextprotocol/server-filesystem,/data/docs]# 网页抓取工具fetch:command:npxargs:[-y,modelcontextprotocol/server-fetch]配置完成后这些 MCP Server 提供的工具自动注册到 ChatClient。你的 AI 应用瞬间获得了文件操作和网页抓取能力——零 Java 代码。7.3 MCP 的未来趋势MCP 协议仍在快速演进中。几个值得关注的方向认证与授权MCP 协议正在增加 OAuth 2.0 支持让工具调用更安全工具市场类似 App Store 的 MCP Server 市场搜索、评价、安装一条龙企业级 MCP Server大厂将推出官方 MCP ServerAWS、Azure、阿里云等调试工具MCP Inspector 等调试工具让开发调试更方便多模态支持从纯文本工具扩展到支持图片、音频等多模态输入输出小结本章讲解了 MCP 协议的完整图景MCP 是什么AI 工具世界的 USB 标准由 Anthropic 推动。一次开发工具服务到处使用三个角色HostAI 应用、Client协议翻译、Server工具服务三种传输方式stdio本地、SSE远程 HTTP、Streamable HTTP生产推荐vs Function CallingMCP 优势是复用和跨语言Function Calling 优势是简单和低延迟。两者可以混合使用Spring AI 支持内置 MCP Client配置即可使用也能搭建自己的 MCP ServerMCP 生态已有数十个开源 MCP Server零代码就能获得文件操作、网页抓取等能力下一章我们将把前面学过的所有能力——ChatClient、RAG、Function Calling——串联起来做一个真正的全功能 AI 助手。Spring AI 实战 – 第10章完整内容与源码