04-Agent 武器库-集成百炼MCP(Spring AI Alibaba)

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 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 中的这两个类:

  1. McpSseClientProperties:McpSseClientProperties 对应 application.yml 中 MCP 的配置类,需要在该类中增加 headers 属性。
  2. 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 只需要三个步骤:

  1. 定义 McpClientTransport,指定 MCP Server 的连接地址、鉴权方式等。
  2. 创建 McpClient,并初始化连接。
  3. 基于 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 进行工具调用,主要包括了三个方面:

  1. 本地实现 MCP Client/Server 进行调用。
  2. 集成百炼平台的 MCP Server,并且改造 Spring AI 源码实现了鉴权方式。
  3. 原生 MCP Client 实现。

除此之外,还介绍了 MCP 的两种通信方式,Stdio 和 SSE,其中 Stdio 是进程级别的通信,因此只能在本地运行,如果要调用远程 MCP Server,则需要使用 SSE 方式。

相关推荐
TeamDev4 小时前
使用 Shadcn UI 构建 C# 桌面应用
前端·后端·.net
uhakadotcom4 小时前
如何从阿里云的sls日志中清洗出有价值的信息?
后端·面试·github
李昊哲小课4 小时前
spring 中 HttpStatus 与 ResponseEntity
spring boot·后端·spring·http·spring cloud·restful
间彧5 小时前
Java 堆、栈、方法区详解与项目实战
后端
间彧5 小时前
Java内存区域详解与项目实战
后端
SimonKing5 小时前
【开发者必备】Spring Boot 2.7.x:WebMvcConfigurer配置手册来了(三)!
java·后端·程序员
ArabySide5 小时前
【Spring Boot】深入浅出Spring Boot中的控制反转与依赖注入
java·spring boot·后端
shepherd1115 小时前
破局延时任务(上):为什么选择Spring Boot + DelayQueue来自研分布式延时队列组件?
java·spring boot·后端
非凡ghost5 小时前
EaseUS Fixo(易我视频照片修复)
前端·javascript·后端