【SpringAIAlibaba新手村系列】(16)调用百度 MCP 服务

简介: 本章展示如何在客户端接入第三方百度 MCP 服务。通过 spring-ai-starter-mcp-client、application.yml 与 mcp-server.json5 完成 stdio 方式连接,自动发现并注册远端工具到 ChatClient,实现天气、IP 归属地、路线规划等能力调用。

第十六章 调用百度 MCP 服务

版本标注

  • Spring AI: 1.1.2
  • Spring AI Alibaba: 1.1.2.0

章节定位

  • 前两章已经完成本地 MCP Server 与 MCP Client 的联调。
  • 这一章切换到第三方服务接入:不再自己写 MCP Server,而是直接接入百度 MCP 服务。

s01 > s02 > s03 > s04 > s05 > s06 > s07 > s08 > s09 > s10 > s11 > s12 > s13 > s14 > s15 > [ s16 ] s17 > s18


一、本章要解决的问题

上一章的重点是“连接本地 MCP 服务”。这一章更进一步:连接第三方 MCP 服务,并把第三方工具能力接入到当前 ChatClient

这一章的核心不是再造一个工具服务,而是理解两件事:

  1. 如何通过 MCP 客户端配置接入外部服务。
  2. 为什么只配好 application.yml,模型就可以调用第三方工具。

二、项目代码(最终可运行版)

2.1 pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-starter-dashscope</artifactId>
    <version>1.1.2.0</version>
</dependency>

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-client</artifactId>
</dependency>

这里最关键的是 spring-ai-starter-mcp-client。它提供 MCP Client 的自动配置能力,包括:

  • 按配置创建 MCP Client
  • 初始化连接
  • 发现远端工具
  • 把远端工具整合为 ToolCallbackProvider

2.2 application.yml

server:
  port: 8015

spring:
  application:
    name: Saa15

  ai:
    dashscope:
      api-key: ${
   DASHSCOPE_API_KEY}

    mcp:
      client:
        request-timeout: 20s
        toolcallback:
          enabled: true
        stdio:
          servers-configuration: classpath:/mcp-server.json5

这个配置表达的是:

  1. 当前应用启用 MCP Client。
  2. MCP Client 通过 stdio 模式加载外部服务清单。
  3. 外部服务清单来自 classpath:/mcp-server.json5

2.3 mcp-server.json5

{
  "mcpServers": {
    "baidu-map": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "@baidumap/mcp-server-baidu-map"],
      "env": { "BAIDU_MAP_API_KEY": "${BAIDU_MAP_API_KEY}" }
    }
  }
}

这份文件的作用是“告诉客户端如何启动第三方 MCP Server 进程”。

其中:

  1. command + args
    在 Windows 下通过 cmd /c npx ... 启动百度 MCP Server。

  2. env
    为该进程注入运行时环境变量,例如百度地图 AK。

建议把 AK 改成环境变量占位符,不要在文件中写明文密钥。

2.4 SaaLLMConfig

package cn.edu.nnu.opengms.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;

@Configuration
public class SaaLLMConfig {
   
    @Bean
    public ChatClient chatClient(ChatModel chatModel, ToolCallbackProvider tools)
    {
   
        return ChatClient.builder(chatModel)
                .defaultToolCallbacks(tools.getToolCallbacks())
                .build();
    }
}

这段配置的意义是:把 MCP Client 发现到的第三方工具回调注册给 ChatClient。之后模型在对话中就能调用这些工具。

2.5 Controller

package cn.edu.nnu.opengms.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.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@RestController
public class McpClientCallBaiDuMcpController {
   
    @Resource
    private ChatClient chatClient;

    @Resource
    private ChatModel chatModel;

    @GetMapping("/mcp/chat")
    public Flux<String> chat(@RequestParam(name = "msg") String msg)
    {
   
        return chatClient.prompt(msg).stream().content();
    }

    @RequestMapping("/mcp/chat2")
    public Flux<String> chat2(@RequestParam(name = "msg") String msg)
    {
   
        return chatModel.stream(msg);
    }
}

/mcp/chat 走的是带 MCP 工具能力的 ChatClient/mcp/chat2 走的是普通 ChatModel,两条接口可以直接对比效果。


三、为什么只配 yml 就能调用 MCP 服务

这是这一章最容易被忽略,但最关键的一点。

根本原因在于:你引入的是 spring-ai-starter-mcp-client,它会触发 Spring Boot 自动配置机制。

自动配置生效后,框架会按配置完成以下流程:

  1. 读取 spring.ai.mcp.client.stdio.servers-configuration
  2. 加载 mcp-server.json5
  3. command/args/env 启动第三方 MCP Server 进程
  4. 初始化 MCP Client 与该进程的会话
  5. 拉取远端工具列表
  6. 把工具封装成 ToolCallbackProvider
  7. 在你定义的 ChatClient Bean 中,通过 defaultToolCallbacks(...) 完成接入

因此,业务代码看起来只写了一个 application.yml + 一个 ChatClient 配置方法,但底层已经完成了“启动服务、建立连接、发现工具、注册回调”这整条链路。

这也是为什么本章里不需要手写“百度地图工具调用代码”,模型依然可以在对话中调用百度 MCP 的能力。


四、请求示例

4.1 使用 MCP 工具

http://localhost:8015/mcp/chat?msg=查询北京天气
http://localhost:8015/mcp/chat?msg=查询61.149.121.66归属地
http://localhost:8015/mcp/chat?msg=查询从昌平到天安门的路线

4.2 不使用 MCP 工具(对照)

http://localhost:8015/mcp/chat2?msg=查询北京天气

如果 MCP 接入生效,/mcp/chat 的回答会明显依赖百度工具返回结果;/mcp/chat2 则更容易出现模型自答或泛化建议。


五、本章小结

这一章的核心是把“本地联调”扩展到了“第三方 MCP 服务接入”。

关键点有三个:

  1. 使用 spring-ai-starter-mcp-client 触发 MCP Client 自动配置。
  2. 通过 application.yml + mcp-server.json5 声明第三方服务连接方式。
  3. 通过 ToolCallbackProvider 把远端工具无缝接到 ChatClient

完成这一步后,客户端应用已经具备调用外部 MCP 生态工具的能力,后续接入更多第三方服务时可以复用同一套模式。


本章重点

  1. 理解第三方 MCP 服务接入的配置路径。
  2. 理解 mcp-server.json5 在 stdio 场景中的作用。
  3. 理解 Spring Boot 自动配置如何把 yml 配置转成可调用工具。

下章剧透(s17):

在工具接入之外,下一章进入知识库与检索增强场景,关注模型如何在业务知识范围内给出更稳定答案。


📝 编辑者:Flittly
📅 更新时间:2026年4月
🔗 相关资源Spring AI MCP Client 文档 | MCP 官方文档

目录
相关文章
|
1月前
|
人工智能 JSON 编解码
【SpringAIAlibaba新手村系列】(15)MCP Client 调用本地服务
本章从 MCP Client 视角说明如何连接上一章提供的本地服务,并把远端工具接入 ChatClient。重点讲解 Streamable-HTTP 配置、ToolCallbackProvider 的注入方式,以及模型如何通过 JSON-RPC 消息完成工具调用与结果回传。
415 21
|
1月前
|
人工智能 Java 定位技术
【SpringAIAlibaba新手村系列】(14)MCP 本地服务与工具集成
本章从 MCP Server 视角出发,说明如何将本地天气查询能力整理并暴露为标准化工具服务。内容涵盖 @Tool、ToolCallbackProvider、MethodToolCallbackProvider 的作用,以及 Streamable-HTTP 协议下服务端的能力注册与对外提供逻辑。
445 13
|
2月前
|
人工智能 前端开发 Java
【SpringAIAlibaba新手村系列】(4)流式输出与响应式编程
本文围绕 Spring AI 中的流式输出与响应式编程展开,重点解释了传统一次性响应与流式返回的差异,以及 Flux 在异步数据流中的核心作用。文章结合 ChatModel.stream() 与 ChatClient 的多种代码示例,说明如何实现 AI 内容的边生成边返回,并帮助读者理解流式调用在用户体验、性能和长文本场景中的实际价值。
906 4
【SpringAIAlibaba新手村系列】(4)流式输出与响应式编程
|
1月前
|
人工智能 Java API
【SpringAIAlibaba新手村系列】(13)Tool Calling 函数工具调用技术
本文详细解析 Spring AI 的 Tool Calling 技术,阐明其如何弥补大模型“会说不会做”的局限。通过 @Tool 注解,开发者可轻松将 Java 方法暴露为 AI 工具。文中深入讲解了 ToolCallbacks.from() 注册工具的原理,以及工具方法在当前 Spring Boot 进程内通过反射动态执行的底层逻辑,强调了模型决策与框架执行的协同过程,为理解 AI 赋能实际操作奠定基础。
704 0
|
1月前
|
人工智能 Java API
【SpringAIAlibaba新手村系列】(18)Agent 智能体与今日菜单应用
本章以 ReactAgent 为入口,将本地菜单工具与 MCP 外部工具合并注册,统一通过 /eatAgent 执行任务,展示 Agent 在多工具协同下的意图理解、工具调用与结果整合能力。
373 3
|
1月前
|
人工智能 JSON Java
Spring AI Alibaba + MCP:调用MCP市场公开服务实操
本文详细讲解Spring Ai Alibaba调用MCP市场公开服务的全流程,以高德地图MCP服务为例,包含API-Key申请、客户端配置、代码实操,助力开发者快速掌握Spring Ai Alibaba与MCP服务对接技巧。
534 7
Spring AI Alibaba + MCP:调用MCP市场公开服务实操
|
1月前
|
人工智能 Java API
【SpringAIAlibaba新手村系列】(17)百炼 RAG 知识库应用
本章基于 Spring AI Alibaba 落地百炼 RAG,完成 DashScopeApi、ChatModel、ChatClient 配置,并通过检索器与 DocumentRetrievalAdvisor 组装检索增强问答链路,实现可运行的知识库问答接口。
476 1
|
1月前
|
人工智能 运维 Java
【SpringAIAlibaba新手村系列】(12)RAG 检索增强生成技术
本文深入探讨 RAG 技术在 AiOps 场景中的应用,以基于 ops.txt 构建运维知识库为例,讲解了如何通过将文本切分、向量化并存入向量数据库,实现 AI 故障查询。内容涵盖 EmbeddingModel、VectorStore 的基本概念,以及利用 Redis 的 SETNX 机制防止知识库重复导入的工程实践。核心在于让 AI 结合外部知识库,更准确地回答运维问题。
459 0
|
人工智能 JavaScript Java
【SpringAIAlibaba新手村系列】(1)初识 Spring AI Alibaba 框架
本文介绍了SpringAIAlibaba框架的基本概念和使用方法。作为Spring官方AI框架的阿里云实现版本,它简化了Java开发者调用AI模型的过程。文章详细讲解了核心概念如ChatModel、ChatClient,以及阿里云百炼平台的功能。通过HelloWorld项目示例,展示了如何配置APIKey、编写控制层代码,实现普通调用和流式输出两种AI交互方式。重点阐述了SpringAI与SpringAIAlibaba的关系,以及自动配置机制的工作原理,帮助开发者快速上手这一框架。
4021 5
|
1月前
|
NoSQL Java 数据库
【SpringAIAlibaba新手村系列】(11)Embedding 向量化与向量数据库
本文围绕 Embedding 与向量数据库展开,讲解了文本向量化、相似度检索和 VectorStore 的基本用法,并结合 SimpleVectorStore 示例说明了 Spring 中自动装配与手动注册 Bean 的区别,为后续学习 RAG 打下基础。
640 5
【SpringAIAlibaba新手村系列】(11)Embedding 向量化与向量数据库

热门文章

最新文章