添加钉钉群获取更多Spring AI Alibaba一手更新。
微信扫码
添加专属顾问
Java开发者的MCP入门指南,带你掌握Spring AI Alibaba框架下的MCP服务。核心内容: 1. MCP基础与快速体验 2. 发布与调用MCP Server的步骤 3. 使用Spring AI Alibaba实现MCP服务
摘要
本文以原理与示例结合的形式讲解 Java 开发者如何基于 Spring AI Alibaba 框架玩转 MCP,主要包含以下内容。
1. 一些 MCP 基础与快速体验(熟悉的读者可以跳过此部分)
2. 如何将自己开发的 Spring 应用发布为 MCP Server,验证使用 Claude 或 Spring 应用作为客户端接入自己发布的 Java MCP Server。
发布 stdio 模式的 MCP Server
发布 SSE 模式的 MCP Server
开发另一个 Spring 应用作为 MCP Client 调用 MCP Server 服务
使用 Claude 桌面应用接入我们的 Java MCP Server
3. 如何使用自己开发的 Spring 应用调用 MCP Server,包括调用自己发布的 Java MCP Server,也包括市面上其他通用 MCP Server。
配置并调用 stdio 模式的 MCP Server
配置并调用 SSE 模式的 MCP Server
4. 如何在 Spring AI Alibaba OpemManus 实现中使用 MCP 服务。
5. 关于存量应用如何一行代码不动就可以被当作 MCP 服务被智能体调用,请关注后续文章解决方案。
模型上下文协议
(Model Context Protocol)入门
2024 年 11 月,Anthropic 公司搞了个挺有意思的新玩意 - Model Context Protocol(模型上下文协议)简称为 MCP 协议。简单来说,它就是给 AI 和各类工具数据之间搭了个标准化的”桥梁”,让开发者不用再为对接问题头疼了。
大模型应用可以使用别人分享的 MCP 服务来完成各种各样的工作内容,你可以从这些地方获取 MCP 服务:
awesome-mcp-servers
mcp.so
MCP 协议在实际的应用场景上非常广泛,列举一些比较常见的应用场景:
使用百度/高德地图分析旅线计算时间
接 Puppeteer 自动操作网页
使用 Github/Gitlab 让大模型接管代码仓库
使用数据库组件完成对 Mysql、ES、Redis 等数据库的操作
使用搜索组件扩展大模型的数据搜索能力
1.1 在 Claude Desktop 中体验 MCP
接下来我们使用 Claude 快速接入 Github 服务(提前申请 token),编辑一下 Claude Desktop 的配置文件:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
APPDATA%\Claude\claude_desktop_config.json添加如下内容,注意把<YOUR_TOKEN>替换成你自己申请的 token:
{"mcpServers": {"github": {"command": "npx","args": ["-y","@modelcontextprotocol/server-github"],"env": {"GITHUB_PERSONAL_ACCESS_TOKEN": "`"}}}
重启 Claude 之后,可以看到已经加载了 MCP 对应的工具:
点开之后可以看到具体的工具内容:
此时我们就可以享受 Github 服务提供的操作仓库的能力:
从图上可以看到,通过创建仓库 test-mcp 这样的提示词,Claude 的大模型自行判断需要使用 mcp 中提供的 create_repository 能力,从而完成了仓库的创建,接下来我们打开 Github 也确实发现了这个已经创建的仓库。
通过这种方式,大模型就可以利用 MCP 接入各式各样的能力,完成各种更为复杂的工作。
1.2 MCP 的架构
MCP 主要分为 MCP 服务和 MCP 客户端:
客户端:一般指的是大模型应用,比如 Claude、通过 Spring AI Alibaba、Langchain 等框架开发的 AI 应用
服务端:连接各种数据源的服务和工具
整体架构如下:
整体的工作流程是这样的:AI 应用中集成 MCP 客户端,通过 MCP 协议向 MCP 服务端发起请求,MCP 服务端可以连接本地/远程的数据源,或者通过 API 访问其他服务,从而完成数据的获取,返回给 AI 应用去使用。
在 Spring AI 中使用 Mcp Server
2.1 Spring AI MCP 的介绍
Spring AI MCP 为模型上下文协议提供 Java 和 Spring 框架集成。它使 Spring AI 应用程序能够通过标准化的接口与不同的数据源和工具进行交互,支持同步和异步通信模式。整体架构如下:
Spring AI MCP 采用模块化架构,包括以下组件:
Spring AI 应用程序:使用 Spring AI 框架构建想要通过 MCP 访问数据的生成式 AI 应用程序
Spring MCP 客户端:MCP 协议的 Spring AI 实现,与服务器保持 1:1 连接
通过 Spring AI MCP,可以快速搭建 MCP 客户端和服务端程序。
2.2 使用 Spring AI MCP 快速搭建 MCP Server
Spring AI 提供了两种机制快速搭建 MCP Server,通过这两种方式开发者可以快速向 AI 应用开放自身的能力,这两种机制如下:
基于 stdio 的进程间通信传输,以独立的进程运行在 AI 应用本地,适用于比较轻量级的工具。
基于 SSE(Server-Sent Events) 进行远程服务访问,需要将服务单独部署,客户端通过服务端的 URL 进行远程访问,适用于比较重量级的工具。
接下来逐一介绍一下这两种方式的实现,示例代码可以通过如下链接获取:
https://github.com/springaialibaba/spring-ai-alibaba-examples/tree/main/spring-ai-alibaba-mcp-example/starter-example/server
基于 stdio 的 MCP 服务端通过标准输入输出流与客户端通信,适用于作为子进程被客户端启动和管理的场景。
首先,在项目中添加 Spring AI MCP Server Starter 依赖:
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId></dependency>
在 application.yml 中配置 MCP 服务端,这次要实现的是一个天气服务:
spring:main:web-application-type: none # 必须禁用web应用类型banner-mode: off # 禁用bannerai:mcp:server:stdio: true # 启用stdio模式name: my-weather-server # 服务器名称version: 0.0.1 # 服务器版本
使用@Tool 注解标记方法,使其可以被 MCP 客户端发现和调用,通过@ToolParameter 注解工具的具体参数:
publicclassOpenMeteoService {privatefinal WebClient webClient;publicOpenMeteoService(WebClient.Builder webClientBuilder){this.webClient = webClientBuilder.baseUrl("https://api.open-meteo.com/v1").build();}(description = "根据经纬度获取天气预报")public String getWeatherForecastByLocation((description = "纬度,例如:39.9042") String latitude,(description = "经度,例如:116.4074") String longitude) {try {String response = webClient.get().uri(uriBuilder -> uriBuilder.path("/forecast").queryParam("latitude", latitude).queryParam("longitude", longitude).queryParam("current", "temperature_2m,wind_speed_10m").queryParam("timezone", "auto").build()).retrieve().bodyToMono(String.class).block();// 解析响应并返回格式化的天气信息// 这里简化处理,实际应用中应该解析JSONreturn"当前位置(纬度:" + latitude + ",经度:" + longitude + ")的天气信息:\n" + response;} catch (Exception e) {return"获取天气信息失败:" + e.getMessage();}}(description = "根据经纬度获取空气质量信息")public String getAirQuality((description = "纬度,例如:39.9042") String latitude,(description = "经度,例如:116.4074") String longitude) {// 模拟数据,实际应用中应调用真实APIreturn"当前位置(纬度:" + latitude + ",经度:" + longitude + ")的空气质量:\n" +"- PM2.5: 15 μg/m³ (优)\n" +"- PM10: 28 μg/m³ (良)\n" +"- 空气质量指数(AQI): 42 (优)\n" +"- 主要污染物: 无";}}
这里使用了 OpenMeteo, OpenMeteo 是一个开源的天气 API,为非商业用途提供免费访问,无需 API 密钥。
在应用程序入口类中注册工具:
publicclassMcpServerApplication {publicstaticvoidmain(String[] args){SpringApplication.run(McpServerApplication.class, args);}public ToolCallbackProvider weatherTools(OpenMeteoService openMeteoService){return MethodToolCallbackProvider.builder().toolObjects(openMeteoService).build();}}
在控制台中执行如下命令,编译并打包应用:
Terminal window
mvn clean package -DskipTests基于 SSE 的 MCP 服务端通过 HTTP 协议与客户端通信,适用于作为独立服务部署的场景,可以被多个客户端远程调用,具体做法与 stdio 非常类似。
首先,在您的项目中添加依赖:
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-server-webflux-spring-boot-starter</artifactId></dependency>
在 application.yml 中配置 MCP 服务端:
server:port: 8080 # 服务器端口配置spring:ai:mcp:server:name: my-weather-server # MCP服务器名称version: 0.0.1 # 服务器版本号
与基于 stdio 的实现完全相同:
publicclassOpenMeteoService {privatefinal WebClient webClient;publicOpenMeteoService(WebClient.Builder webClientBuilder){this.webClient = webClientBuilder.baseUrl("https://api.open-meteo.com/v1").build();}(description = "根据经纬度获取天气预报")public String getWeatherForecastByLocation((description = "纬度,例如:39.9042") String latitude,(description = "经度,例如:116.4074") String longitude) {try {String response = webClient.get().uri(uriBuilder -> uriBuilder.path("/forecast").queryParam("latitude", latitude).queryParam("longitude", longitude).queryParam("current", "temperature_2m,wind_speed_10m").queryParam("timezone", "auto").build()).retrieve().bodyToMono(String.class).block();// 解析响应并返回格式化的天气信息return"当前位置(纬度:" + latitude + ",经度:" + longitude + ")的天气信息:\n" + response;} catch (Exception e) {return"获取天气信息失败:" + e.getMessage();}}(description = "根据经纬度获取空气质量信息")public String getAirQuality((description = "纬度,例如:39.9042") String latitude,(description = "经度,例如:116.4074") String longitude) {// 模拟数据,实际应用中应调用真实APIreturn"当前位置(纬度:" + latitude + ",经度:" + longitude + ")的空气质量:\n" +"- PM2.5: 15 μg/m³ (优)\n" +"- PM10: 28 μg/m³ (良)\n" +"- 空气质量指数(AQI): 42 (优)\n" +"- 主要污染物: 无";}}
在应用程序入口类中注册工具:
publicclassMcpServerApplication {publicstaticvoidmain(String[] args){SpringApplication.run(McpServerApplication.class, args);}public ToolCallbackProvider weatherTools(OpenMeteoService openMeteoService){return MethodToolCallbackProvider.builder().toolObjects(openMeteoService).build();}public WebClient.Builder webClientBuilder(){return WebClient.builder();}}
在控制台中输入命令,运行服务端:
Terminal window
mvn spring-boot:run服务端将在 http://localhost:8080 启动。
2.3 在 Claude 中测试 mcp 服务
在上一小节中我们编写完了 MCP 服务,这些服务到底是否能正常运行呢?在 Claude Desktop 中可以测试一下。
修改配置文件,添加 weather 的配置,一定要注意 jar 包的路径必须是全路径:
{"mcpServers": {"github": {"command": "npx","args": ["-y","@modelcontextprotocol/server-github"],"env": {"GITHUB_PERSONAL_ACCESS_TOKEN": your token}},"weather": {"command": "java","args": ["-Dspring.ai.mcp.server.stdio=true","-Dspring.main.web-application-type=none","-Dlogging.pattern.console=","-jar","<修改为stdio编译之后的jar包全路径>"],"env": {}}}}
重启 Claude 之后看到,我们编写的两个 Tool 已经被加载进来了:
输入提示词,查询今天北京的空气质量:
Claude 触发了我们自己编写的天气服务,展示了完整的数据:
上面使用了 stdio 的方式在 Claude Desktop 中使用我们自己编写的 MCP 服务,但是很可惜 Claude Desktop 不支持直接通过 SSE 模式访问,必须使用 mcp-proxy 作为中介,所以这里我们不再演示 Claude Desktop 接入 SSE 模式的 MCP 服务。
在 Spring AI Alibaba
中集成 Mcp Client
对于客户端,Spring AI 同样提供了 stdio 和 SSE 两种机制快速集成 MCP Server,分别对应到 MCP Server 的 stdio 和 SSE 两种模式,参考代码如下:
https://github.com/springaialibaba/spring-ai-alibaba-examples/tree/main/spring-ai-alibaba-mcp-example/starter-example/client
3.1 基于 stdio 的 MCP 客户端实现
基于 stdio 的实现是最常见的 MCP 客户端实现方式,它通过标准输入输出流与 MCP 服务器进行通信。这种方式适用于使用了 stdio 方式本地部署的 MCP 服务器,可以直接在同一台机器上启动 MCP 服务器进程。
首先,在项目中添加 Spring AI MCP starter 依赖:
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId></dependency><!-- 添加Spring AI MCP starter依赖 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId></dependency>
在 application.yml 中配置 MCP 服务器:
spring:ai:dashscope:# 配置通义千问API密钥api-key: ${DASH_SCOPE_API_KEY}mcp:client:stdio:# 指定MCP服务器配置文件路径(推荐)servers-configuration: classpath:/mcp-servers-config.json# 直接配置示例,和上边的配制二选一# connections:# server1:# command: java# args:# - -jar# - /path/to/your/mcp-server.jar
这个配置文件设置了 MCP 客户端的基本配置,包括 API 密钥和服务器配置文件的位置。你也可以选择直接在配置文件中定义服务器配置,但是还是建议使用 json 文件管理 mcp 配置。在 resources 目录下创建 mcp-servers-config.json 配置文件:
{"mcpServers": {// 定义名为"weather"的MCP服务器"weather": {// 指定启动命令为java"command": "java",// 定义启动参数"args": ["-Dspring.ai.mcp.server.stdio=true","-Dspring.main.web-application-type=none","-jar","<修改为stdio编译之后的jar包全路径>"],// 环境变量配置(可选)"env": {}}}}
这个 JSON 配置文件定义了 MCP 服务器的详细配置,包括如何启动服务器进程、需要传递的参数以及环境变量设置,还是要注意引用的 jar 包必须是全路径的。
```javapublicclassApplication {publicstaticvoidmain(String[] args){// 启动Spring Boot应用SpringApplication.run(Application.class, args);}public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder,ToolCallbackProvider tools,ConfigurableApplicationContext context) {return args -> {// 构建ChatClient并注入MCP工具var chatClient = chatClientBuilder.defaultTools(tools).build();// 定义用户输入String userInput = "北京的天气如何?";// 打印问题System.out.println("\n>>> QUESTION: " + userInput);// 调用LLM并打印响应System.out.println("\n>>> ASSISTANT: " +chatClient.prompt(userInput).call().content());// 关闭应用上下文context.close();};}}```
这段代码展示了如何在 Spring Boot 应用中使用 MCP 客户端。它创建了一个命令行运行器,构建了 ChatClient 并注入了 MCP 工具,然后使用这个客户端发送查询并获取响应。在 Spring AI Alibaba 中使用 Mcp 工具非常简单,只需要把 ToolCallbackProvider 放到 chatClientBuilder 的 defaultTools 方法中,就可以自动的适配。
通过命令启动程序进行测试:
Terminal window
mvn spring-boot:run启动之后显示结果为,从日志可以看到我们自己编写的 mcp server 被调用了,返回了数据:
>>> QUESTION: 北京的天气如何?2025-03-31T17:56:17.931+08:00 DEBUG 23455 --- [mcp] [pool-1-thread-1] io.modelcontextprotocol.spec.McpSchema : Received JSON message: {"jsonrpc":"2.0","id":"60209de5-3","result":{"content":[{"type":"text","text":"\"当前天气:\\n温度: 18.6°C (体感温度: 15.1°C)\\n天气: 多云\\n风向: 南风 (4.7 km/h)\\n湿度: 18%\\n降水量: 0.0 毫米\\n\\n未来天气预报:\\n2025-03-31 (周一):\\n温度: 2.4°C ~ 19.5°C\\n天气: 多云\\n风向: 南风 (8.4 km/h)\\n降水量: 0.0 毫米\\n\\n2025-04-01 (周二):\\n温度: 7.6°C ~ 20.6°C\\n天气: 多云\\n风向: 西北风 (19.1 km/h)\\n降水量: 0.0 毫米\\n\\n2025-04-02 (周三):\\n温度: 6.9°C ~ 18.4°C\\n天气: 晴朗\\n风向: 西北风 (12.8 km/h)\\n降水量: 0.0 毫米\\n\\n2025-04-03 (周四):\\n温度: 7.0°C ~ 19.8°C\\n天气: 多云\\n风向: 南风 (16.3 km/h)\\n降水量: 0.0 毫米\\n\\n2025-04-04 (周五):\\n温度: 7.5°C ~ 21.6°C\\n天气: 多云\\n风向: 西北风 (19.6 km/h)\\n降水量: 0.0 毫米\\n\\n2025-04-05 (周六):\\n温度: 5.6°C ~ 20.7°C\\n天气: 多云\\n风向: 西风 (16.5 km/h)\\n降水量: 0.0 毫米\\n\\n2025-04-06 (周日):\\n温度: 8.4°C ~ 22.3°C\\n天气: 晴朗\\n风向: 南风 (9.4 km/h)\\n降水量: 0.0 毫米\\n\\n\""}],"isError":false}}2025-03-31T17:56:17.932+08:00 DEBUG 23455 --- [mcp] [pool-1-thread-1] i.m.spec.McpClientSession : Received Response: JSONRPCResponse[jsonrpc=2.0, id=60209de5-3, result={content=[{type=text, text="当前天气:\n温度: 18.6°C (体感温度: 15.1°C)\n天气: 多云\n风向: 南风 (4.7 km/h)\n湿度: 18%\n降水量: 0.0 毫米\n\n未来天气预报:\n2025-03-31 (周一):\n温度: 2.4°C ~ 19.5°C\n天气: 多云\n风向: 南风 (8.4 km/h)\n降水量: 0.0 毫米\n\n2025-04-01 (周二):\n温度: 7.6°C ~ 20.6°C\n天气: 多云\n风向: 西北风 (19.1 km/h)\n降水量: 0.0 毫米\n\n2025-04-02 (周三):\n温度: 6.9°C ~ 18.4°C\n天气: 晴朗\n风向: 西北风 (12.8 km/h)\n降水量: 0.0 毫米\n\n2025-04-03 (周四):\n温度: 7.0°C ~ 19.8°C\n天气: 多云\n风向: 南风 (16.3 km/h)\n降水量: 0.0 毫米\n\n2025-04-04 (周五):\n温度: 7.5°C ~ 21.6°C\n天气: 多云\n风向: 西北风 (19.6 km/h)\n降水量: 0.0 毫米\n\n2025-04-05 (周六):\n温度: 5.6°C ~ 20.7°C\n天气: 多云\n风向: 西风 (16.5 km/h)\n降水量: 0.0 毫米\n\n2025-04-06 (周日):\n温度: 8.4°C ~ 22.3°C\n天气: 晴朗\n风向: 南风 (9.4 km/h)\n降水量: 0.0 毫米\n\n"}], isError=false}, error=null]
3.2 基于 SSE 的 MCP 客户端实现
除了基于 stdio 的实现外,Spring AI Alibaba 还提供了基于 Server-Sent Events (SSE)的 MCP 客户端实现。这种方式适用于远程部署的 MCP 服务器,可以通过 HTTP 协议与 MCP 服务器进行通信。
首先,在您的项目中添加 Spring AI MCP starter 依赖:
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-webflux-spring-boot-starter</artifactId></dependency>
在 application.yml 中配置 MCP 服务器,这里需要指定 SSE 启动的服务地址,之前我们在 8080 端口上启动了对应的服务:
spring:ai:dashscope:api-key: ${DASH_SCOPE_API_KEY}mcp:client:sse:connections:server1:url: http://localhost:8080 #服务地址
使用方式与基于 stdio 的实现相同,只需注入 ToolCallbackProvider 和 ChatClient.Builder:
publicclassApplication {publicstaticvoidmain(String[] args){SpringApplication.run(Application.class, args);}public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder,ToolCallbackProvider tools,ConfigurableApplicationContext context) {return args -> {// 构建ChatClient并注入MCP工具var chatClient = chatClientBuilder.defaultTools(tools).build();// 使用ChatClient与LLM交互String userInput = "北京的天气如何?";System.out.println("\n>>> QUESTION: " + userInput);System.out.println("\n>>> ASSISTANT: " + chatClient.prompt(userInput).call().content());context.close();};}}
通过命令启动程序进行测试:
Terminal window
mvn spring-boot:run启动之后会有报错:
Caused by: java.lang.IllegalStateException: Multiple tools with the same name(spring-ai-mcp-client-getWeatherForecastByLocation, spring-ai-mcp-client-getAirQuality)at org.springframework.ai.mcp.SyncMcpToolCallbackProvider.validateToolCallbacks(SyncMcpToolCallbackProvider.java:126) ~[spring-ai-mcp-1.0.0-20250325.064812-147.jar:1.0.0-SNAPSHOT]at org.springframework.ai.mcp.SyncMcpToolCallbackProvider.getToolCallbacks(SyncMcpToolCallbackProvider.java:110) ~[spring-ai-mcp-1.0.0-20250325.064812-147.jar:1.0.0-SNAPSHOT]at org.springframework.ai.autoconfigure.mcp.client.McpClientAutoConfiguration.toolCallbacksDeprecated(McpClientAutoConfiguration.java:196) ~[spring-ai-mcp-client-spring-boot-autoconfigure-1.0.0-M6.jar:1.0.0-M6]at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]at org.springframework.beans.factory.support.SimpleInstantiationStrategy.lambda$instantiate$0(SimpleInstantiationStrategy.java:171) ~[spring-beans-6.2.0.jar:6.2.0]... 23 common frames omitted
从日志上分析,是因为注册了相同的服务名 spring-ai-mcp-client-getWeatherForecastByLocation 和 spring-ai-mcp-client-getAirQuality,但是从代码上分析,这两个服务我们都只注册了一次,那为什么会报错呢?
其实这是 Spring AI 目前的一个 BUG,Spring AI 提供了两个自动配置类去生成客户端工具处理 MCP 服务中 Tool 的获取,分别是 SseHttpClientTransportAutoConfiguration 和 SseWebFluxTransportAutoConfiguration。这两个自动配置类提供了同步和异步两种方式,本身应该是互斥的,但是 Spring AI 对于互斥的处理上出了问题,导致两个自动配置类都会加载。
SseWebFluxTransportAutoConfiguration 的加载:
SseHttpClientTransportAutoConfiguration 的加载:
两个自动配置类加载之后,就会向提供 SSE 服务的 MCP 服务申请 Tool,这样就导致同样的 Tool 被申请了两次,自然就会重复了。解决方案也非常简单,在启动类上排除 SseHttpClientTransportAutoConfiguration 实现就可以了。
org.springframework.ai.autoconfigure.mcp.client.SseHttpClientTransportAutoConfiguration.class})publicclassApplication {...
再次通过命令启动程序进行测试:
Terminal window
mvn spring-boot:run这一次就输出了正确的结果:
在 Spring AI Alibaba 的
Open Manus 中体验 MCP
Spring AI Alibaba 中提供了 Open Manus 的实现,整体架构如下:
在执行阶段,会调用各种 Tool 来完成任务,如果我们能使用 MCP 增加 Tool 的能力,那势必能 Open Manus 如虎添翼,接下来我们就来看一下 Open Manus 中是如何去使用 MCP 的。
源代码如下:https://github.com/alibaba/spring-ai-alibaba/tree/main/community/openmanus
首先,在项目中添加 Spring AI MCP starter 依赖:
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId><version>${spring-ai.version}</version></dependency>
在 application.yml 中已经配置了 MCP 服务器,设置客户端请求服务端的超时时间为 1 分钟:
添加 mcp-servers-config.json,在 json 中配置了百度地图。百度地图核心 API 现已全面兼容 MCP 协议,是国内首家兼容 MCP 协议的地图服务商。百度地图已经完成了 8 个核心 API 接口和 MCP 协议的对接, 涵盖逆地理编码、地点检索、路线规划等。
使用百度地图的 MCP,需要申请 ak:https://lbsyun.baidu.com/apiconsole/key。
{"mcpServers": {"baidu-map": {"command": "npx","args": ["-y","@baidumap/mcp-server-baidu-map"],"env": {"BAIDU_MAP_API_KEY": "your_baidu_AK"}}}}
将其中 BAIDU_MAP_API_KEY 修改为申请的 ak。
修改 LlmService 的构造方法源码,在构造时直接通过 Spring 容器获取 ToolCallbackProvider 并加入到 ChatClient.builder 中:
public LlmService(ChatModel chatModel, ToolCallbackProvider toolCallbackProvider) {this.chatModel = chatModel;this.planningChatClient = ChatClient.builder(chatModel).defaultSystem(PLANNING_SYSTEM_PROMPT).defaultAdvisors(new MessageChatMemoryAdvisor(planningMemory)).defaultAdvisors(new SimpleLoggerAdvisor()).defaultTools(ToolBuilder.getPlanningAgentToolCallbacks()).defaultTools(toolCallbackProvider).build();this.chatClient = ChatClient.builder(chatModel).defaultSystem(MANUS_SYSTEM_PROMPT).defaultAdvisors(new MessageChatMemoryAdvisor(memory)).defaultAdvisors(new SimpleLoggerAdvisor()).defaultTools(ToolBuilder.getManusAgentToolCalls()).defaultTools(toolCallbackProvider).defaultOptions(OpenAiChatOptions.builder().internalToolExecutionEnabled(false).build()).build();this.finalizeChatClient = ChatClient.builder(chatModel).defaultSystem(FINALIZE_SYSTEM_PROMPT).defaultAdvisors(new MessageChatMemoryAdvisor(finalizeMemory)).defaultAdvisors(new SimpleLoggerAdvisor()).build();}
通过 defaultTools 将 mcp 服务提供的 tool 交给 ChatClient 处理。
启动 OpenManus,执行提示词:规划下从上海到北京的路线。但是如果这样写,可能会触发 google search,我们可以优化下提示词主动选择百度地图。
使用百度地图规划从北京市到上海市的路线
执行程序之后可以看到规划之后的计划:
Steps:0. [ ] [MANUS] 使用百度地图的地理编码服务获取北京市和上海市的经纬度坐标1. [ ] [MANUS] 使用百度地图的路线规划服务计算从北京市到上海市的驾车路线2. [ ] [MANUS] 分析并提供最终的路线信息,包括距离、预计耗时等
很显然,这一次 OpenManus 选择了我们集成的百度地图 mcp server,我们来看一下结果。
获取到了北京市和上海市的经纬度坐标:
Here is a summary of what we accomplished in this step:- For Beijing, we received the coordinates: Longitude (lng): 116.4133836971231, Latitude (lat): 39.910924547299565.- For Shanghai, we received the coordinates: Longitude (lng): 121.48053886017651, Latitude (lat): 31.235929042252014.
计算从北京市到上海市的驾车路线:
Distance: The total distance of the route is 1,223,200 meters (approximately 1,223 kilometers).Duration: The estimated travel time is 50,592 seconds (approximately 14 hours and3 minutes).
结果:
总距离:约 1223 公里
预计耗时:约 12 小时 45 分钟
主要途径:京沪高速公路(G2)
总结
作为 AI 开发领域的革命性突破,Model Context Protocol(MCP)重新定义了智能体与工具生态的交互范式。通过标准化协议打通地图服务、代码仓库、数据库等核心工具链,MCP 不仅解决了传统 AI 开发中跨平台对接的碎片化难题,更以”开箱即用”的轻量化集成模式,让开发者能够快速构建具备多模态能力的智能应用。
未来,随着更多工具接入 MCP 生态,开发者只需专注于业务逻辑创新,而复杂的工具链整合将真正成为”看不见的底层能力”——这或许正是 AI 普惠化进程中,最具实际意义的技术跃迁。
Spring AI 中的 MCP 支持可以让 Java 开发者轻松的将自己的应用发布为 MCP Server 或者是作为消费者去集成任意的 MCP Server 实现。
添加钉钉群获取更多Spring AI Alibaba一手更新。
Spring AI Alibaba 社区 3 群(钉钉群),群号:61290041831
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-06-19
从 BERT 标注到 Agent Skill:短文本标签体系的四次“工业革命”
2026-05-14
多轮 Agent 场景下,滴滴的 EAGLE-3 训推加速实践
2026-05-06
谁说 Mac 只能写代码?Google 官宣:M 芯片本地微调 Gemma 4 时代开启!
2026-04-20
用 Unsloth 微调 Embedding 模型,让你的 RAG 检索不再答非所问
2026-04-15
ComfyUI v0.19.0 更新:大量新节点、新模型、新修复与性能优化全面落地,工作流与训练能力再升级
2026-04-13
Agent 持续学习落地路径:先做 Traces,再做 Context,最后才微调模型 | Jinqiu Select
2026-03-23
养死四只龙虾的小白有感
2026-03-22
Mistral Forge 的真正意义:企业AI从“租用”走向“拥有”
2026-04-15
2026-04-13
2026-04-20
2026-05-06
2026-05-14
2026-06-19
2026-01-02
2025-11-19
2025-09-25
2025-06-20
2025-06-17
2025-05-21
2025-05-17
2025-05-14
欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。
在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。
一、 定义
本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。
会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。
知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。
二、 账号注册与登录
登录方式:本网站支持以下登录方式,您可根据实际情况选择:
微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。
手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。
账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。
实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。
未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。
三、 服务内容与规范
知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。
服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。
禁止行为:您在使用服务时不得实施以下行为:
利用技术手段批量爬取、下载、转存知识库内容;
将知识库内容用于商业目的或未经授权地向第三方传播;
干扰本网站正常运行或侵犯其他用户合法权益;
发布违法违规信息或从事违反公序良俗的活动。
四、 知识产权声明
权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。
有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。
侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。
五、 个人信息保护
我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。
您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。
您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。
六、 免责声明
内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。
不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。
第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。
七、 违约责任
如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。
如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。
八、 法律适用与争议解决
本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。
因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。
九、 其他
本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。
本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。
我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。