一、系列回顾与本篇定位1.1 系列回顾第一篇至第十篇我们完整掌握了 Spring AI 的核心能力 —— 从基础集成、ChatClient、多模型共存、Prompt 工程、结构化输出、Tool Calling、Chat Memory、多模态能力、RAG 实战到上一篇的 MCP 基础集成本地工具暴露与 SSE 连接远程 Server。上一篇核心我们实现了将本地 Spring 服务暴露为 MCP Server并通过 SSE 方式连接远程 MCP Server。1.2 本篇定位上一篇我们提到MCP 有两种主要的连接方式SSE (Server-Sent Events)通过 HTTP 连接远程 MCP Server适合跨网络、跨服务的场景。stdio (Standard Input/Output)通过标准输入输出流启动并连接本地 MCP Server 进程适合接入社区丰富的 Node.js/Python 编写的 MCP 工具。而社区中绝大多数现成的 MCP Server如文件系统、浏览器、地图、数据库等都是通过npm/pip分发通过stdio方式启动的。本篇是系列生态接入实战篇我们将深度实战 Spring AI 通过 stdio 方式接入第三方 MCP 生态从核心原理出发理解 MCP stdio 与 SSE 的区别与适用场景。基于百度地图 MCP Server完整实现 Spring AI 通过 stdio 连接第三方 MCP Server。覆盖 Node.js 环境准备、MCP 配置、API Key 安全管理、功能测试全流程。补充生产环境最佳实践与高频踩坑避坑指南。二、核心概念MCP stdio vs SSE在开始实战之前我们先明确 MCP 的两种主要连接方式的区别对比维度MCP stdio (标准输入输出)MCP SSE (Server-Sent Events)连接方式通过标准输入 (stdin) 和标准输出 (stdout) 与本地进程通信通过 HTTP SSE 协议与远程服务通信典型场景接入本地运行的第三方 MCP Server如 npm/pip 安装的工具连接远程部署的 MCP Server如自己开发的 Spring 服务部署依赖需要本地安装对应运行时如 Node.js、Python仅需网络连接性能本地进程通信延迟极低网络通信延迟受网络影响Spring AI 支持1.0 版本原生支持1.0 版本原生支持简单来说如果你想接入社区现成的 MCP 工具如百度地图、文件系统、浏览器用stdio。如果你想连接自己开发的远程 MCP 服务用SSE。三、实战落地Spring AI 接入百度地图 MCP Server我们将以百度地图 MCP Server为例完整实现 Spring AI 通过 stdio 方式接入第三方 MCP 生态实现天气查询、IP 归属地查询、路线规划等功能。3.1 环境前提JDK 17、Spring Boot 3.2.xNode.js 18用于运行 npm 安装的 MCP Server百度地图 MCP Server 是 Node.js 编写的阿里云百炼 API Key配置到环境变量DASHSCOPE_API_KEY百度地图API Key百度地图3.2 第一步引入依赖在pom.xml中引入 Spring AI Alibaba Starter 与 MCP Client 依赖!-- Spring AI Alibaba Starter -- dependency groupIdcom.alibaba.cloud.ai/groupId artifactIdspring-ai-alibaba-starter-dashscope/artifactId version1.0.0.2/version /dependency !-- Spring AI MCP Client -- dependency groupIdorg.springframework.ai/groupId artifactIdspring-ai-mcp-client/artifactId /dependency3.3 第二步准备 Node.js 环境百度地图 MCP Server 是通过 npm 分发的需要先安装 Node.js下载并安装 Node.js 18验证安装在终端执行node -v和npm -v确保版本正常。3.4 第三步配置 MCP Client (stdio 方式)在src/main/resources目录下创建mcp-server.json5配置文件用于配置 stdio 方式的 MCP Server{ mcpServers: { baidu-map: { command: nodejs/bin/npx.cmd, args: [-y, baidumap/mcp-server-baidu-map], env: { BAIDU_MAP_API_KEY: 你的百度地图API Key } } } }关键配置说明commandNode.js 的 npx 命令路径注意Windows 和 Mac/Linux 路径不同Windows通常是C:\\Program Files\\nodejs\\npx.cmdMac/Linux通过which npx查看路径例如/usr/local/bin/npxargsnpx 的参数-y表示自动确认baidumap/mcp-server-baidu-map是百度地图 MCP Server 的 npm 包名env环境变量这里需要配置百度地图 API Key3.5 第四步配置 application.properties在application.properties中配置服务端口、Spring AI 和 MCP Clientserver.port8001 # 编码格式配置 server.servlet.encoding.enabledtrue server.servlet.encoding.forcetrue server.servlet.encoding.charsetUTF-8 spring.application.nameBaiduMcpServer # Spring AI Alibaba 配置 spring.ai.dashscope.api-key${DASHSCOPE_API_KEY} # MCP Client 配置 (stdio方式) spring.ai.mcp.client.request-timeout20s spring.ai.mcp.client.toolcallback.enabledtrue # 指定MCP Server配置文件路径 spring.ai.mcp.client.stdio.servers-configurationclasspath:/mcp-server.json53.6 第五步配置 ChatClient 集成 MCP 工具修改SaaLLMConfig将 MCP 工具集成到ChatClient中import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * ChatModelChatClientMCP集成配置类 */ Configuration public class LLMConfig { /** * 配置带MCP工具支持的ChatClient * ToolCallbackProvider会自动从mcp-server.json5中加载配置的MCP Server工具 */ Bean public ChatClient chatClient(ChatModel chatModel, ToolCallbackProvider tools) { return ChatClient.builder(chatModel) // 核心将MCP工具包括stdio连接的百度地图工具注册到ChatClient .defaultToolCallbacks(tools.getToolCallbacks()) .build(); } }3.7 第六步编写测试接口创建McpClientCallBaiDuMcpController测试百度地图 MCP Server 的功能import jakarta.annotation.Resource; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.model.ChatModel; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; /** * 百度地图MCP Server测试接口 */ RestController public class McpClientCallBaiDuMcpController { // 带MCP工具支持的ChatClient包括百度地图工具 Resource private ChatClient chatClient; // 普通ChatModel无MCP工具支持用于对比 Resource private ChatModel chatModel; /** * 带MCP支持的对话接口 * 测试示例3http://localhost:8001/mcp/chat?msg查询昌平到天安门的路线规划 */ GetMapping(/mcp/chat) public FluxString chat(RequestParam(name msg) String msg) { System.out.println(✅ 使用了MCP工具支持百度地图); return chatClient.prompt(msg).stream().content(); } /** * 普通对话接口无MCP支持用于对比 * 测试示例http://localhost:8001/mcp/chat2?msg查询昌平到天安门的路线规划 */ GetMapping(/mcp/chat2) public FluxString chat2(RequestParam(name msg) String msg) { System.out.println(❌ 未使用MCP工具支持); return chatModel.stream(msg); } }八、本篇总结本篇我们深度实战了 Spring AI 通过 stdio 方式接入第三方 MCP 生态从核心原理出发理解了 MCP stdio 与 SSE 的区别与适用场景。基于百度地图 MCP Server完整实现了 Spring AI 通过 stdio 连接第三方 MCP Server。覆盖了 Node.js 环境准备、MCP 配置、API Key 安全管理、功能测试全流程。补充了生产环境最佳实践与高频踩坑避坑指南。通过 stdio 方式我们可以接入社区丰富的 MCP 生态无需自行开发工具大幅提升开发效率。