10分钟让你用SpringAI接入百度地图MCP服务

一、前言

在之前的文章中SpringAI MCP技术初探 我介绍了使用SpringAI 1.0.0-M6 自建Mcp-Client和Mcp-Server的案例,本文带着各位读者在前文的基础上10分钟完成百度地图MCP服务对接,让自己的大模型具备地理位置分析和算路能力。最终实现效果如下(请忽略丑陋的界面设计,毕竟这个界面也是大模型生成的HTML代码)

二、光速对接百度地图服务

2.1 了解百度地图MCP-Server对接手段

我们查看 lbs.baidu.com/faq/api?tit... 中的文档,按照步骤先启动百度地图的MCP-Server服务端,百度地图的MCP服务端目前提供了python和NodeJS两种实现。笔者这次使用的是Python版本的代码实现,一步步按照官方教程进行设置即可。

最终执行下述命令:

java 复制代码
uv run --with mcp[cli] mcp run map.py

像上图这样无任何异常出现则说明百度地图mcp-server正常运行(本文在末尾会简单分析下map.py的代码内容),然后你需要去lbsyun.baidu.com/apiconsole/... 申请一个AK,这在后面我们编写MCP-client程序的时候会用到。

2.2 引入SpringAI+SpringAI Alibaba

依赖清单可以直接参考SpringAI MCP技术初探 文中提到的github地址中的pom文件,重点依赖有两个

xml 复制代码
<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId>
  <version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
  <groupId>com.alibaba.cloud.ai</groupId>
  <artifactId>spring-ai-alibaba-starter</artifactId>
</dependency>

如果依赖下载有问题可以参考SpringAI 官方demo 设置好repository 地址。

然后直接修改项目中的 mcp-server.json 如下所示(请按照你的实际路径配置,mac系统无需填写绝对路径)

json 复制代码
{
  "mcpServers": {
    "baidu-map": {
      "command": "D:\\Program Files\\python3.12.3\\Scripts\\uv.exe",
      "args": [
        "run",
        "--with",
        "mcp[cli]",
        "mcp",
        "run",
        "D:\\work-space-python\\python-baidu-map\\baidu_map_mcp_server\\map.py"
      ],
      "env": {
        "BAIDU_MAPS_API_KEY": "填写百度地图的AK"
      }
    }
  }
}

用过Claude或者cursor对这样的配置肯定不陌生,只不过不同的是我们这次是自己写代码,用qwen大模型来和这些mcp-server对接。然后打开工程中的application.yaml 文件修改如下,利用SpringAI 的自动装配能力吗,为我们自动注入McpClient

json 复制代码
server:
  port: 9999
spring:
  ai:
    mcp:
      client:
        enabled: true
        name: call-mcp-server
        stdio:
          servers-configuration: classpath:mcp-server.json
    dashscope:
      api-key: 通义千问的APIKEY

2.3 配置ChatClient

java 复制代码
private final ChatClient chatClient;
private final ChatMemory chatMemory = new InMemoryChatMemory();


public ChatController(ChatClient.Builder chatClientBuilder, 
                      List<McpSyncClient> mcpSyncClients, 
                      ToolCallbackProvider tools) {
    this.chatClient = chatClientBuilder
    // 关键在这里,断点调试处
    .defaultTools(tools)
    .defaultOptions(DashScopeChatOptions.builder().withTopP(0.7).build())
    .build();
}



@RequestMapping(value = "/generate_stream", method = RequestMethod.GET)
public Flux<ChatResponse> generateStream(HttpServletResponse response, @RequestParam("id") String id, @RequestParam("prompt") String prompt) {
    response.setCharacterEncoding("UTF-8");
    var messageChatMemoryAdvisor = new MessageChatMemoryAdvisor(chatMemory, id, 10);
    return this.chatClient.prompt(prompt)
    .advisors(messageChatMemoryAdvisor)
    .stream()
    .chatResponse();
}

读过笔者上一篇文章的对这些代码应该不陌生,几乎无任何改动。

2.4 启动应用测试效果

直接启动应用,笔者代码里面存在一个index.html,借助SpringBoot的thymeleaf实现了一个简单的界面,启动之后直接提问地图问题:

返回的格式是markdown的格式,观察对话响应内容可以发现其使用到了百度地图的MCP服务

三、部分细节研讨

1、大模型是怎么知道百度地图的mcp服务能提供哪些能力呢?

我们在ChatClient创建的位置打上断点即可发现:

这里定义了8个工具,如果读者细心看下百度地图map.py的代码内容的话,你就会发现其正好使用了8个@mcp.tool() 注解,使用的是Python的 FastMCP 技术方案,代码的大致内容还是去调用百度地图提供的http web服务API。

2、"黑盒"一般的大模型

仔细体验发现目前我们虽然可以做到和任何McpServer对接但是还有几个不容忽视的问题:

  • 无法追溯工具链调用细节,上面的案例中我们无法得知大模型和MCP-Server的沟通细节,无明显的数据交互日志,熟悉langChain开发的都知道,在python开发领域观察函数式调用有一个平台叫做langfuse(langfuse.com/docs) 目前SpringAI 暂时还不能很直观的获取大模型与McpServer的沟通细节,也不能获取大模型的调用细节,这点还得等待相关工具完善
  • 我们无法去评估大模型生成内容的准确性,简单来说我们不好评估大模型生成效果,评估大模型的生成效果是一门技术,目前SpringAI提供了Evaluator 它的思路是用另一个大模型来评估目标模型的生成效果。
相关推荐
llwszx2 分钟前
Spring中DelayQueue深度解析:从原理到实战(附结构图解析)
java·后端·spring·delayqueue·延迟任务
牛客企业服务14 分钟前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
YongGit16 分钟前
探索 AI + MCP 渲染前端 UI
前端·后端·node.js
77qqqiqi35 分钟前
正则表达式
java·后端·正则表达式
视觉语言导航1 小时前
RAL-2025 | 清华大学数字孪生驱动的机器人视觉导航!VR-Robo:面向视觉机器人导航与运动的现实-模拟-现实框架
人工智能·深度学习·机器人·具身智能
**梯度已爆炸**1 小时前
自然语言处理入门
人工智能·自然语言处理
ctrlworks1 小时前
楼宇自控核心功能:实时监控设备运行,快速诊断故障,赋能设备寿命延长
人工智能·ba系统厂商·楼宇自控系统厂家·ibms系统厂家·建筑管理系统厂家·能耗监测系统厂家
@大迁世界1 小时前
AR 如何改变我们构建网站的方式
后端·ar·restful
RainbowSea1 小时前
问题:后端由于字符内容过长,前端展示精度丢失修复
java·spring boot·后端
风象南2 小时前
SpringBoot 控制器的动态注册与卸载
java·spring boot·后端