神龙快打
91.05M · 2026-04-10
s01 > s02 > s03 > s04 > s05 > s06 > s07 > s08 > s09 > s10 > s11 > s12 > s13 > s14 > s15 > [ s16 ] s17 > s18
上一章的重点是“连接本地 MCP 服务”。这一章更进一步:连接第三方 MCP 服务,并把第三方工具能力接入到当前 ChatClient。
这一章的核心不是再造一个工具服务,而是理解两件事:
application.yml,模型就可以调用第三方工具。<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 的自动配置能力,包括:
ToolCallbackProviderserver:
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
这个配置表达的是:
stdio 模式加载外部服务清单。classpath:/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 进程”。
其中:
command + args
在 Windows 下通过 cmd /c npx ... 启动百度 MCP Server。
env
为该进程注入运行时环境变量,例如百度地图 AK。
建议把 AK 改成环境变量占位符,不要在文件中写明文密钥。
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。之后模型在对话中就能调用这些工具。
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,两条接口可以直接对比效果。
这是这一章最容易被忽略,但最关键的一点。
根本原因在于:你引入的是 spring-ai-starter-mcp-client,它会触发 Spring Boot 自动配置机制。
自动配置生效后,框架会按配置完成以下流程:
spring.ai.mcp.client.stdio.servers-configurationmcp-server.json5command/args/env 启动第三方 MCP Server 进程ToolCallbackProviderChatClient Bean 中,通过 defaultToolCallbacks(...) 完成接入因此,业务代码看起来只写了一个 application.yml + 一个 ChatClient 配置方法,但底层已经完成了“启动服务、建立连接、发现工具、注册回调”这整条链路。
这也是为什么本章里不需要手写“百度地图工具调用代码”,模型依然可以在对话中调用百度 MCP 的能力。
查询北京天气
查询61.149.121.66归属地
查询从昌平到天安门的路线
查询北京天气
如果 MCP 接入生效,/mcp/chat 的回答会明显依赖百度工具返回结果;/mcp/chat2 则更容易出现模型自答或泛化建议。
这一章的核心是把“本地联调”扩展到了“第三方 MCP 服务接入”。
关键点有三个:
spring-ai-starter-mcp-client 触发 MCP Client 自动配置。application.yml + mcp-server.json5 声明第三方服务连接方式。ToolCallbackProvider 把远端工具无缝接到 ChatClient。完成这一步后,客户端应用已经具备调用外部 MCP 生态工具的能力,后续接入更多第三方服务时可以复用同一套模式。
本章重点:
mcp-server.json5 在 stdio 场景中的作用。下章剧透(s17):