Agent 武器库-集成百炼MCP
MCP
MCP(Model Context Protocol,模型上下文协议)是一种标准化协议,规定了 AI 模型与外部工具通信交互的规范。
目前关于 MCP 的概念介绍有很多,这里快速介绍核心概念。
针对开发人员来说,MCP 主要包括 Client 和 Server 端。
- Client 端则是我们基于 Spring AI Alibaba 实现的 Agent,与 Server 端建立连接之后,即可调用 Server 端的工具。
- Server 端提供了需要使用的工具,比如 Web 搜索、高德地图等。
基于 MCP 协议,我们可以为 Agent 引入不同的外部工具,作为武器库,增强 Agent 的能力。
MCP 架构
Java MCP 的实现遵循三层架构,分别为 Client/Server 层、Session 层、Transport 层。
主要介绍一下 Transport 层,该层包括了 Stdio、SSE 等多种通信机制:
- Stdio(Standard Input /Output) :标准输入输出,是操作系统层面的本地进程通信机制,不依赖网络,直接通过操作系统提供的管道机制传递字节流。
- **适用场景:**Stdio 适用于本地通信场景,Server 和 Client 需在同一台机器上,才能实现进程间通信。
- SSE(Server-Sent Events) :基于 HTTP 协议的单向服务器推送机制,允许服务器在一个持续的 HTTP 连接上,不断向客户端推送事件流。
- **适用场景:**基于 HTTP 协议,可以本地机器访问远程服务器的 MCP Server。

Spring AI 依赖
使用 MCP 需要引入 spring-ai-starter-mcp-client-webflux 依赖,如下:
XML
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-mcp-client-webflux</artifactId>
</dependency>
该依赖同时支持 Stdio 和 SSE 两种传输机制,Spring AI 官方建议生产环境选择 SSE 连接和 spring-ai-starter-mcp-client-webflux 作为 MCP 客户端的依赖。
基础-本地 MCP Client/Server 实现
代码位置:
- MCP Local Client:github.com/1020325258/...
- MCP Local Server:github.com/1020325258/...
接下来在本地定义一个简单的 MCP Server 和 MCP Client,基于 SSE 方式进行调用。
Server 实现
MCP Server 的实现主要包括两个部分:
- Tool 工具的定义。
- ToolCallbackProvider 的定义。
(一)Tool 工具定义
Tool 工具需要指定描述来让 MCP Client 准确调用,定义如下:
Java
@Tool(description = "获取指定城市的天气")
public String getWeather(String cityName) {
if (cityName.equals("北京")) {
return "下雨了";
} else {
return "其他城市未知";
}
}
之后,定义 ToolCallbackProvider:
Java
@Bean
public ToolCallbackProvider weatherTools(WeatherService weatherService) {
return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
}
Client 的实现
MCP Client 的实现主要包括两个部分:
- application.yml 定义服务端 SSE 地址。
- 定义 MCP 工具回调 ToolCallbackProvider。
(一)定义服务端 SSE 地址
基于 Spring AI 的 MCP 能力,通过指定服务端 SSE 地址即可自动连接:
YAML
spring:
ai:
mcp:
client:
sse:
connections:
server1:
url: http://localhost:8080
(二)定义 MCP 工具回调
使用 MCP 工具时,只需要注入 ToolCallbackProvider 并放入 ChatClient 中,如下:
Java
@Bean
public CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools,
ConfigurableApplicationContext context) {
return args -> {
// 定义 ChatClient 并添加 MCP 工具回调
var chatClient = chatClientBuilder
.defaultToolCallbacks(tools)
.build();
System.out.println("\n>>> QUESTION: " + userInput1);
System.out.println("\n>>> ASSISTANT: " + chatClient.prompt(userInput1).call().content());
context.close();
};
}
本处不展示完整实现,运行 Application 即可得到 MCP 工具调用结果:

进阶-集成百炼 MCP 工具
项目完整代码 :github.com/1020325258/...
集成百炼 MCP 仍然采用 SSE 方式,与本地实现方式不同点在于百炼的 MCP 调用需要在 Header 中添加 Token 鉴权,但是 Spring AI MCP 没有实现鉴权,需要我们手动进行改造。
鉴权涉及的改造点主要包括 2 个类,这 2 个类位于 Spring AI 的 jar 包中,需要在当前项目中定义相同的路径,用于覆盖 Spring AI 中的这两个类:
- McpSseClientProperties:McpSseClientProperties 对应 application.yml 中 MCP 的配置类,需要在该类中增加 headers 属性。
- SseWebFluxTransportAutoConfiguration:该类会定义 WebClient 与 MCP Server 进行通信,需要取出 headers 属性放入到 WebClient,在请求时携带 header 用于鉴权。
项目结构如下图:

具体的代码不在文档中展示,接下来演示如何集成百炼的 MCP 工具。
(一)百炼平台开通 MCP 工具
在百炼平台先开通 MCP 服务,地址:bailian.console.aliyun.com/?tab=mcp#/m...
点击立即开通,之后前往智谱平台申请 API key 填入之后,即可开通:

(二)查看百炼 MCP 连接方式
在文档中,需要关注两个信息:
- SSE Endpoint:用于连接百炼的 MCP Server。
- 鉴权:查看鉴权方式。
如下图:

(三)实现 MCP Client
改造后,就可以在 application.yml 定义需要的鉴权 header 了,如下:
YAML
spring:
ai:
mcp:
client:
sse:
connections:
server1:
url: https://dashscope.aliyuncs.com/
sse-endpoint: /api/v1/mcps/zhipu-websearch/sse
# 百炼平台的鉴权 header
headers:
Authorization: Bearer ${AI_DASHSCOPE_API_KEY}
其余的步骤与之前完全一致,将注入的 ToolCallbackProvider 加入到 ChatClient 中,就可以根据问题调用 MCP 工具了。
通过日志打印可以观察到返回了 MCP 工具调用的结果:

Spring AI MCP 调用
上边演示了借助于 Spring AI 封装的 MCP 快速集成百炼的 MCP 工具,但是由于封装的内容太多,对于内部如何调用 MCP 工具我们可能并不清楚。
因此,介绍一下 Spring AI 中 MCP 调用的原理,帮助你在实践层面更好地理解 MCP。
MCP Java SDK
Spring AI 中的 MCP 是基于 MCP Java SDK 实现的,Github 仓库:github.com/modelcontex...
只需要了解 MCP Java SDK 如何调用 MCP 工具,就掌握了 Spring AI MCP 的原理。
MCP Java SDK 中,客户端涉及的核心组件为:
- McpClientTransport :传输通道,有 SSE 和 Stdio 两种传输方式。
- WebFluxSseClientTransport:McpClientTransport 接口的实现类,基于 WebFlux 与 MCP Server 建立 SSE 连接,接收入站消息并处理。
- McpClient :MCP 客户端的接口,有同步和异步两种实现(McpSyncClient、McpAsyncClient)。
- McpSyncClient:同步方式的客户端,提供了初始化连接、查询 Tool、调用 Tool 等功能,内部基于 McpClientTransport 与 MCP Server 通信。
MCP Client 原生实现
代码位于:github.com/1020325258/...
基于 MCP Java SDK 实现 MCP Client 只需要三个步骤:
- 定义 McpClientTransport,指定 MCP Server 的连接地址、鉴权方式等。
- 创建 McpClient,并初始化连接。
- 基于 McpClient 调用对应的 Tool 工具。
接下来介绍代码实现。
(一) McpClientTransport 定义
以 WebFluxSseClientTransport 为例,创建与百炼平台 MCP Server 的连接通道,如下:
Java
public class ClientSse {
public static void main(String[] args) {
// 定义 Transport
var transport = new WebFluxSseClientTransport(WebClient.builder().defaultHeader("Authorization", "Bearer " + System.getenv("AI_DASHSCOPE_API_KEY")).baseUrl("https://dashscope.aliyuncs.com"), new ObjectMapper(), "/api/v1/mcps/zhipu-websearch/sse");
// 创建 McpClient
new SampleClient(transport).run();
}
}
(二)McpClient 实现
在自定义的 SampleClient 内部创建 McpClient,基于 McpClient 可以查询有哪些可用的 Tool,并且通过 call() 调用对应的 Tool:
Java
public class SampleClient {
// 省略构造方法 ...
public void run() {
// 创建 McpClient
var client = McpClient.sync(transport).build();
// 初始化与 MCP Server 的连接
client.initialize();
client.ping();
// 列出并展示可用的工具
ListToolsResult toolsList = client.listTools();
System.out.println("可用工具 = " + toolsList);
// 调用 Tool
CallToolResult weatherForecastResult = client.callTool(new CallToolRequest("webSearchSogou",
Map.of("search_query", "mysql的面试题有哪些?")));
System.out.println("搜索结果: " + weatherForecastResult);
client.closeGracefully();
}
}
总结
本节介绍了基于 Spring AI MCP 进行工具调用,主要包括了三个方面:
- 本地实现 MCP Client/Server 进行调用。
- 集成百炼平台的 MCP Server,并且改造 Spring AI 源码实现了鉴权方式。
- 原生 MCP Client 实现。
除此之外,还介绍了 MCP 的两种通信方式,Stdio 和 SSE,其中 Stdio 是进程级别的通信,因此只能在本地运行,如果要调用远程 MCP Server,则需要使用 SSE 方式。