一文吃透 Spring AI Alibaba + MCP:服务端搭建 + 客户端调用全流程

简介: 掌握 Spring AI Alibaba 与 MCP 协议实战教程!本文详解 MCP 服务端搭建、客户端配置,教你封装本地工具为 MCP 服务,实现大模型安全调用外部接口,附完整代码与测试步骤,快速打通 AI 工具调用链路!

一、MCP概念介绍

MCP(Model Context Protocol,模型上下文协议)是 Anthropic 于 2024 年推出的AI 领域统一连接协议,被称为 “AI 的 USB-C 接口”,核心是让大模型(LLM)通过标准化方式安全、灵活地调用外部工具、数据库、API 与文件系统,打破数据孤岛。

从架构来看,MCP基于C/S(客户端-服务端)模式实现,因此要完成MCP调用,需分别搭建MCP服务端(暴露工具方法)和MCP客户端(调用服务端方法)。

本文将基于Spring Ai Alibaba生态,完整实现“本地方法封装为MCP服务 + 客户端调用MCP服务”的全流程,步骤清晰、可直接落地。

二、Spring AI MCP的介绍

Spring AI MCP 为模型上下文协议提供 Java 和 Spring 框架集成。它使 Spring AI 应用程序能够通过标准化的接口与不同的数据源和工具进行交互,支持同步和异步通信模式。整体架构如下:

mcp-local.png

三、搭建本地MCP服务端

1. 添加依赖

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

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-starter-mcp-server-webflux</artifactId>
  <version>1.1.2</version>
</dependency>

注意:

此处未使用常规的spring-boot-starter-web(内置Tomcat),因为spring-ai-starter-mcp-server-webflux与Tomcat存在冲突。使用spring-boot-starter会默认通过Netty启动服务,适配MCP服务端要求。

2. 配置服务端application.yml

server:
  port: 8088  # 服务端口,可自定义
  servlet:
    encoding:
      enabled: true
      force: true
      charset: UTF-8  # 避免中文乱码
spring:
  application:
    name: local-mcp-server # 服务端应用名称
  ai:
    mcp:
      server:  
        type: async  # 异步模式,提升调用性能
        name: local-mcp-server  # MCP服务名称
        version: 1.0.0  # 服务版本

3. 添加工具方法

创建工具类,将需要对外暴露的方法用@Tool注解标记,并将该类交给Spring容器管理:

@Service
public class WeatherService {
   

      /**
     * 根据城市名称获取天气信息
     * @param city 城市名称
     * @return 天气描述
     */
    @Tool(description = "根据城市名称获取天气信息")
    public String getWeatherByCity(String city) {
   
        return city + " 今天天气很好!";
    }
}

4. 添加MCP服务配置(McpServerConfig)

创建配置类,通过ToolCallbackProvider将工具类(WeatherService)封装为MCP服务:

@Configuration
public class McpServerConfig {
   

    @Bean
    public ToolCallbackProvider weatherTools(WeatherService weatherService) {
   
        return MethodToolCallbackProvider.builder()
                .toolObjects(weatherService)
                .build();
    }
}

5. 启动mcp-server 服务

启动Spring Boot应用,查看控制台输出,确认服务启动成功(重点关注Netty启动信息):

2026-03-19T14:33:17.730+08:00  INFO 35517 --- [local-mcp-server] [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port 8088 (http)
2026-03-19T14:33:17.734+08:00  INFO 35517 --- [local-mcp-server] [           main] com.jcq.server.McpServerApplication      : Started McpServerApplication in 1.198 seconds

可以看到服务使用netty成功启动,端口是8088

四、搭建MCP客户端

1. 添加依赖

client端正常配置spring-boot-starter-web,使用tomcat启动服务。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring AI Alibaba Agent Framework -->
<dependency>
    <groupId>com.alibaba.cloud.ai</groupId>
    <artifactId>spring-ai-alibaba-agent-framework</artifactId>
    <version>1.1.2.0</version>
</dependency>

<!-- DashScope ChatModel 支持(如果使用其他模型,请跳转 Spring AI 文档选择对应的 starter) -->
<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>
    <version>1.1.2</version>
</dependency>

2. 配置客户端application.yml

spring:
  application:
    name: spring-ai-alibaba-agent # 客户端应用名称
  ai:
    dashscope:
      api-key: ${
   AliQwen_API}  # 通义千问API密钥,建议通过环境变量配置,避免硬编码
    mcp:
      client:
        type: async  # 与服务端一致,异步调用
        request-timeout: 60s # 调用超时时间,可根据实际调整
        toolcallback:
          enabled: true # 启用工具回调,用于接收服务端响应
        sse: # mcp类型
          connections:
            local-mcp-server: # 这里表示mcp服务名称
              url: http://localhost:8088 # MCP服务端地址(对应服务端ip端口)

3. 编写测试接口

@RestController
public class McpClientController {
   

    @Resource
    private ToolCallbackProvider toolCallbackProvider;

      /**
     * 测试MCP服务调用:查询指定城市天气
     * 访问地址:http://localhost:8080/mcpTest(客户端端口默认8080,可自定义)
     */
    @GetMapping("mcpTest")
    private void mcpTest() throws GraphRunnerException {
   

          // 1. 初始化DashScope聊天模型(可替换为其他LLM模型)
        ChatModel chatModel = getChatModel();

          // 2. 获取MCP服务端暴露的工具方法
        ToolCallback[] toolCallbacks = toolCallbackProvider.getToolCallbacks();

        System.out.printf("""
                        =====Find the tools from spring ToolCallbackProvider=====
                        %s
                        """,
                JSON.toJSONString(toolCallbacks));

        // 3. 构建智能体并绑定mcp服务
        ReactAgent agent = ReactAgent.builder()
                .name("ip_search")
                .model(chatModel)
                .description("你是一个天气查询助手")
                .saver(new MemorySaver())
                .toolCallbackProviders(toolCallbackProvider)
                        .build();

        // 4. 配置运行参数
        RunnableConfig config = RunnableConfig.builder()
                .threadId("session")
                .build();

        // 5. 流式调用agent
        Flux<NodeOutput> stream = agent.stream("上海天气怎么样", config);
        StringBuffer answerString = new StringBuffer();
        stream.doOnNext(output -> {
   
                    if (output.node().equals("_AGENT_MODEL_")) {
   
                        answerString.append(((StreamingOutput<?>) output).message().getText());
                    }
                    else if (output.node().equals("_AGENT_TOOL_")) {
   
                        answerString.append("\nTool Call:").append(((ToolResponseMessage) ((StreamingOutput<?>) output).message()).getResponses().get(0)).append("\n");
                    }
                })
                .doOnComplete(() -> System.out.println(answerString))
                .doOnError(e -> System.err.println("Stream Processing Error: " + e.getMessage()))
                .blockLast();
    }

      /**
     * 初始化DashScope聊天模型(通义千问)
     * @return ChatModel 聊天模型实例
     */
    private static  ChatModel getChatModel() {
   
        DashScopeApi dashScopeApi = DashScopeApi.builder()
                .apiKey(System.getenv("AliQwen_API"))
                .build();

        return DashScopeChatModel.builder()
                .dashScopeApi(dashScopeApi)
                .build();
    }

}

4. 运行测试,查看结果

  1. 确保MCP服务端(8088端口)已启动;
  2. 启动MCP客户端,访问接口:http://localhost:8080/mcpTest
  3. 查看客户端控制台输出,若出现以下内容,说明MCP服务调用成功:
Tool Call:ToolResponse[id=call_b8f00f883a784fc1b35603, name=getWeatherByCity, responseData=[{
   "text":"\"上海 今天天气很好!\""}]]

五、总结

本文通过Spring Ai Alibaba,实现了MCP协议的本地服务落地,服务端获取天气逻辑后续可以替换为真实调用api接口。

欢迎大家关注我,下一篇文章我将介绍一下如何调用MCP市场上的公开服务,敬请期待~

目录
相关文章
|
12天前
|
人工智能 JSON Java
Spring AI Alibaba + MCP:调用MCP市场公开服务实操
本文详细讲解Spring Ai Alibaba调用MCP市场公开服务的全流程,以高德地图MCP服务为例,包含API-Key申请、客户端配置、代码实操,助力开发者快速掌握Spring Ai Alibaba与MCP服务对接技巧。
268 6
Spring AI Alibaba + MCP:调用MCP市场公开服务实操
|
20天前
|
人工智能 前端开发 Java
【SpringAIAlibaba新手村系列】(4)流式输出与响应式编程
本文围绕 Spring AI 中的流式输出与响应式编程展开,重点解释了传统一次性响应与流式返回的差异,以及 Flux 在异步数据流中的核心作用。文章结合 ChatModel.stream() 与 ChatClient 的多种代码示例,说明如何实现 AI 内容的边生成边返回,并帮助读者理解流式调用在用户体验、性能和长文本场景中的实际价值。
414 4
【SpringAIAlibaba新手村系列】(4)流式输出与响应式编程
|
20天前
|
存储 人工智能 Java
吃透 Spring AI Alibaba 多智能体|四大协同模式+完整代码
本文详细讲解 Spring AI Alibaba Multi-Agent 多智能体架构,包含顺序执行、并行执行、LLM 路由、监督者四大协同模式,搭配可运行代码示例与真实业务场景,从零带你上手多智能体开发。
704 3
|
10天前
|
人工智能 Java 定位技术
【SpringAIAlibaba新手村系列】(16)调用百度 MCP 服务
本章展示如何在客户端接入第三方百度 MCP 服务。通过 spring-ai-starter-mcp-client、application.yml 与 mcp-server.json5 完成 stdio 方式连接,自动发现并注册远端工具到 ChatClient,实现天气、IP 归属地、路线规划等能力调用。
204 9
|
13天前
|
存储 人工智能 Java
告别 AI 对话 “失忆”!Spring AI 聊天记忆底层原理与全场景落地实战
Spring AI提供优雅的聊天记忆解决方案,彻底解决大模型“失忆”痛点。其分层架构支持内存/MySQL等多存储,通过ChatMemory、ChatMemoryRepository和ChatMemoryAdvisor三大组件,实现会话隔离、消息有序、窗口可控,开箱即用,低侵入、高扩展。
301 13
告别 AI 对话 “失忆”!Spring AI 聊天记忆底层原理与全场景落地实战
|
11天前
|
人工智能 JSON 编解码
【SpringAIAlibaba新手村系列】(15)MCP Client 调用本地服务
本章从 MCP Client 视角说明如何连接上一章提供的本地服务,并把远端工具接入 ChatClient。重点讲解 Streamable-HTTP 配置、ToolCallbackProvider 的注入方式,以及模型如何通过 JSON-RPC 消息完成工具调用与结果回传。
188 21
|
人工智能 JavaScript Java
【SpringAIAlibaba新手村系列】(1)初识 Spring AI Alibaba 框架
本文介绍了SpringAIAlibaba框架的基本概念和使用方法。作为Spring官方AI框架的阿里云实现版本,它简化了Java开发者调用AI模型的过程。文章详细讲解了核心概念如ChatModel、ChatClient,以及阿里云百炼平台的功能。通过HelloWorld项目示例,展示了如何配置APIKey、编写控制层代码,实现普通调用和流式输出两种AI交互方式。重点阐述了SpringAI与SpringAIAlibaba的关系,以及自动配置机制的工作原理,帮助开发者快速上手这一框架。
1467 4
|
20天前
|
存储 人工智能 前端开发
使用Spring AI Alibaba构建智能体Agent
本文详解使用Spring AI Alibaba框架,结合DashScope和React Agent,通过两个实战案例(基础测试+生产级应用),教你快速构建Java AI智能体
798 7

热门文章

最新文章

下一篇
开通oss服务