Spring AI MCP‑Client 入门:对接外部 MCP‑Server

Spring AI MCP‑Client 入门:对接外部 MCP‑Server 随着 MCPModel Context Protocol协议逐步成为大模型与外部工具交互的标准Spring AI 也快速跟进推出了 spring-ai-starter-mcp-client 模块使得 Java 应用能够以轻量级、标准化的方式接入各类 MCP Server从而扩展大模型的能力边界。本文将以百度地图 MCP Server 为例演示如何使用 Spring AI MCP Client 通过标准输入输出stdio与 Node.js 子进程通信让通义千问大模型能够实时查询天气、IP 归属地、路线规划等地图服务并梳理其底层运行原理。前言MCPModel Context Protocol模型上下文协议是一套大模型外部工具调用标准协议。核心特点1. Client‑Server架构进程间通过stdio标准输入输出通信2. 底层传输报文基于JSON‑RPC 2.03. 语言无关MCP‑Server 可以是 Node、Python、Java 任意语言编写4. 大模型不需要直接对接各个第三方API统一通过MCP协议调用能力。百度地图推出国内首个地图MCP服务我们可以通过Spring‑AI MCP‑Client直接接入让大模型原生具备地址解析、IP归属地查询、路线规划等地图能力无需手写复杂工具调用逻辑。整体架构图MCP‑ClientJava SpringAI进程 ↔ stdioJSON‑RPC2.0 ↔ MCP‑Servernpx启动的Node百度地图服务 ↔ 百度地图开放平台API。MCP‑Client会启动子进程运行百度地图的MCP‑Server通过标准输入输出完成JSON‑RPC通信Server内部封装百度地图API把地图能力包装成MCP工具提供给大模型。一、环境依赖Maven引入Spring‑AI openai兼容模型starter mcp‑client客户端starter。这里使用阿里云通义千问DashScope兼容OpenAI接口协议作为大模型。!-- 兼容OpenAI协议大模型对接阿里云通义千问 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-model-openai/artifactId/dependency!-- MCP Client核心依赖 --dependencygroupIdorg.springframework.ai/groupIdartifactIdspring-ai-starter-mcp-client/artifactId/dependency二、application.yml 配置文件server:port: 6016servlet:encoding:enabled: trueforce: truecharset: UTF-8spring:application:name: springAI-16chat-mcpclient-call-baidumcp# LLM 配置阿里云通义千问 dashscope 兼容openai接口ai:openai:api-key: ${aliQwen-api}base-url: https://dashscope.aliyuncs.com/compatible-modechat:options:model: qwen-plus# MCP‑Client配置mcp:client:toolcallback:enabled: true# 指定MCP服务配置json文件放在resources类路径下stdio:servers-configuration: classpath:/mcp-server.json三、mcp‑server.json MCP服务定义文件在src/main/resources下新建mcp-server.json定义百度地图MCP Server启动参数。Windows环境说明-command: cmd调用windows命令解释器-/c执行完命令后关闭cmd窗口-npxNode.js工具直接执行npm包不需要全局安装--y自动确认所有交互提示-baidumap/mcp-server-baidu‑map百度地图官方MCP服务npm包-env环境变量注入百度地图开放平台AK密钥{mcpServers: {baidu-map: {command: cmd,args: [/c, npx, -y, baidumap/mcp-server-baidu‑map],env: {BAIDU_MAP_API_KEY: 你的百度地图开放平台AK}}}}⚠️注意运行本机必须安装Node.js环境npx命令依赖NodeLinux/Mac环境command改为npxargs去掉cmd相关参数。参数释义cmdWindows命令行解释器/c执行后续命令执行完毕关闭进程npxnpm execute package执行npm包内可执行程序-y自动yes确认跳过交互输入baidumap/mcp‑server‑baidu‑map百度地图MCP服务包BAIDU_MAP_API_KEY百度地图开放平台申请访问密钥AK。四、Spring配置类 SaaLLMConfig把MCP提供的ToolCallbackProvider注入ChatClient只有经过defaultToolCallbacks装配后ChatClient才具备MCP工具调用能力。关键点Spring‑AI会自动读取mcp‑server.json配置启动子进程创建MCP连接自动收集MCP‑Server暴露的全部工具封装为ToolCallback。package com.atguigu.study.config;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;/*** auther zzyybs126.com* create 2025-07-31 20:47* Description MCP‑Client装配ChatClient注入MCP工具回调*/Configurationpublic class SaaLLMConfig{Beanpublic ChatClient chatClient(ChatModel chatModel, ToolCallbackProvider tools){return ChatClient.builder(chatModel)// 将MCP服务提供的全部工具回调赋能给ChatClient对象.defaultToolCallbacks(tools.getToolCallbacks()).build();}}五、Controller接口对比有无MCP能力效果提供两组接口做对照实验/mcp/chat使用装配MCP工具的ChatClient对象大模型可以自动调用百度地图MCP工具/mcp/chat2直接使用原生ChatModel没有MCP工具能力只会纯文本回答无法调用地图API。package com.zzyy.study.controller;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.RequestMapping;import org.springframework.web.bind.annotation.RestController;import reactor.core.publisher.Flux;/*** auther zzyy* create 2025-07-19 18:55*/RestControllerpublic class McpClientCallBaiDuMcpController{Resourceprivate ChatClient chatClient; //✅已经注入MCP工具调用能力Resourceprivate ChatModel chatModel; //❌原生对象没有MCP工具/*** 具备MCP调用能力大模型会自动调用百度地图MCP工具* http://localhost:6016/mcp/chat?msg查询昌平到天安门路线规划* http://localhost:6016/mcp/chat?msg查询61.149.121.66归属地*/GetMapping(/mcp/chat)public FluxString chat(String msg){return chatClient.prompt(msg).stream().content();}/*** 无MCP能力仅大模型幻觉回答不会调用地图API* http://localhost:6016/mcp/chat2?msg查询北京天气*/RequestMapping(/mcp/chat2)public FluxString chat2(String msg){return chatModel.stream(msg);}}六、调用测试测试1带MCP能力接口访问http://localhost:6016/mcp/chat?msg查询昌平到天安门路线规划现象SpringAI内部会通过stdio唤起npx启动百度地图MCP‑ServerJSON‑RPC交互大模型识别意图自动调用MCP工具拿到百度地图真实路线数据整理成自然语言返回。支持能力IP地址解析、地址转坐标、路线规划、地点检索等百度地图开放API能力。测试2不带MCP能力接口http://localhost:6016/mcp/chat2?msg查询昌平到天安门路线规划现象大模型只能依靠训练数据做推测没有真实地图数据属于幻觉输出。七、底层原理梳理MCP‑ClientJava SpringAI读取mcp‑server.json配置通过ProcessBuilder启动子进程执行cmd/npx命令Java进程与MCP‑Server(Node子进程)之间使用标准输入输出stdio做进程间通信通信报文格式遵循JSON‑RPC 2.0协议MCP‑Server内部封装百度地图API把地图能力对外暴露为MCP工具列表Spring‑AI自动把MCP工具转换为Spring‑AI的ToolCallback注册到ChatClient用户提问大模型判断需要地图能力自动下发工具调用指令MCP Client转发JSON‑RPC请求给子进程Server拿到结果返回大模型整理输出。八、踩坑与注意事项本机必须安装Node.jsnpx命令依赖Node环境否则无法拉起百度地图MCP‑Server子进程操作系统差异Windows用cmd /cLinux/Mac直接command写npxAK密钥保护不要硬编码密钥建议环境变量注入ToolCallbackProvider必须装配进ChatClient直接用ChatModel不会生效MCP工具MCP是子进程通信程序关闭MCP‑Server子进程会随之销毁。总结MCP协议统一了大模型调用外部工具的标准业务代码几乎不用手写工具定义、参数解析、http请求第三方服务商只需要提供MCP‑ServerSpring‑AI MCP‑Client就可以开箱即用接入各种外部能力。百度地图作为国内首家支持MCP协议地图服务商借助Spring‑AI可以快速给大应用增加地理信息能力。扩展思考除了百度地图还可以对接文件操作、数据库查询等各类MCP‑Server一套MCP Client复用所有外部能力。