第十六章 调用百度 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 工具

查询北京天气
查询61.149.121.66归属地
查询从昌平到天安门的路线

4.2 不使用 MCP 工具(对照)

查询北京天气

如果 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):

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:alixiixcom@163.com