找回密码
 立即注册
首页 业界区 业界 一文吃透 Spring AI Alibaba + MCP:服务端搭建 + 客户 ...

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

禄磊 7 小时前
一、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 应用程序能够通过标准化的接口与不同的数据源和工具进行交互,支持同步和异步通信模式。整体架构如下:
1.png

三、搭建本地MCP服务端

1. 添加依赖
  1. <dependency>
  2.   <groupId>org.springframework.boot</groupId>
  3.   spring-boot-starter</artifactId>
  4. </dependency>
  5. <dependency>
  6.   <groupId>org.springframework.ai</groupId>
  7.   spring-ai-starter-mcp-server-webflux</artifactId>
  8.   <version>1.1.2</version>
  9. </dependency>
复制代码
注意:
此处未使用常规的spring-boot-starter-web(内置Tomcat),因为spring-ai-starter-mcp-server-webflux与Tomcat存在冲突。使用spring-boot-starter会默认通过Netty启动服务,适配MCP服务端要求。
2. 配置服务端application.yml
  1. server:
  2.   port: 8088  # 服务端口,可自定义
  3.   servlet:
  4.     encoding:
  5.       enabled: true
  6.       force: true
  7.       charset: UTF-8  # 避免中文乱码
  8. spring:
  9.   application:
  10.     name: local-mcp-server # 服务端应用名称
  11.   ai:
  12.     mcp:
  13.       server:  
  14.         type: async  # 异步模式,提升调用性能
  15.         name: local-mcp-server  # MCP服务名称
  16.         version: 1.0.0  # 服务版本
复制代码
3. 添加工具方法

创建工具类,将需要对外暴露的方法用@Tool注解标记,并将该类交给Spring容器管理:
  1. @Service
  2. public class WeatherService {
  3.           /**
  4.      * 根据城市名称获取天气信息
  5.      * @param city 城市名称
  6.      * @return 天气描述
  7.      */
  8.     @Tool(description = "根据城市名称获取天气信息")
  9.     public String getWeatherByCity(String city) {
  10.         return city + " 今天天气很好!";
  11.     }
  12. }
复制代码
4. 添加MCP服务配置(McpServerConfig)

创建配置类,通过ToolCallbackProvider将工具类(WeatherService)封装为MCP服务:
  1. @Configuration
  2. public class McpServerConfig {
  3.     @Bean
  4.     public ToolCallbackProvider weatherTools(WeatherService weatherService) {
  5.         return MethodToolCallbackProvider.builder()
  6.                 .toolObjects(weatherService)
  7.                 .build();
  8.     }
  9. }
复制代码
5. 启动mcp-server 服务

启动Spring Boot应用,查看控制台输出,确认服务启动成功(重点关注Netty启动信息):
  1. 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)
  2. 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启动服务。
  1. <dependency>
  2.     <groupId>org.springframework.boot</groupId>
  3.     spring-boot-starter-web</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>com.alibaba.cloud.ai</groupId>
  7.     spring-ai-alibaba-agent-framework</artifactId>
  8.     <version>1.1.2.0</version>
  9. </dependency>
  10. <dependency>
  11.     <groupId>com.alibaba.cloud.ai</groupId>
  12.     spring-ai-alibaba-starter-dashscope</artifactId>
  13.     <version>1.1.2.0</version>
  14. </dependency>
  15. <dependency>
  16.     <groupId>org.springframework.ai</groupId>
  17.     spring-ai-starter-mcp-client</artifactId>
  18.     <version>1.1.2</version>
  19. </dependency>
复制代码
2. 配置客户端application.yml
  1. spring:
  2.   application:
  3.     name: spring-ai-alibaba-agent # 客户端应用名称
  4.   ai:
  5.     dashscope:
  6.       api-key: ${AliQwen_API}  # 通义千问API密钥,建议通过环境变量配置,避免硬编码
  7.     mcp:
  8.       client:
  9.         type: async  # 与服务端一致,异步调用
  10.         request-timeout: 60s # 调用超时时间,可根据实际调整
  11.         toolcallback:
  12.           enabled: true # 启用工具回调,用于接收服务端响应
  13.         sse: # mcp类型
  14.           connections:
  15.             local-mcp-server: # 这里表示mcp服务名称
  16.               url: http://localhost:8088 # MCP服务端地址(对应服务端ip端口)
复制代码
3. 编写测试接口
  1. @RestController
  2. public class McpClientController {
  3.     @Resource
  4.     private ToolCallbackProvider toolCallbackProvider;
  5.           /**
  6.      * 测试MCP服务调用:查询指定城市天气
  7.      * 访问地址:http://localhost:8080/mcpTest(客户端端口默认8080,可自定义)
  8.      */
  9.     @GetMapping("mcpTest")
  10.     private void mcpTest() throws GraphRunnerException {
  11.               // 1. 初始化DashScope聊天模型(可替换为其他LLM模型)
  12.         ChatModel chatModel = getChatModel();
  13.               // 2. 获取MCP服务端暴露的工具方法
  14.         ToolCallback[] toolCallbacks = toolCallbackProvider.getToolCallbacks();
  15.         System.out.printf("""
  16.                         =====Find the tools from spring ToolCallbackProvider=====
  17.                         %s
  18.                         """,
  19.                 JSON.toJSONString(toolCallbacks));
  20.         // 3. 构建智能体并绑定mcp服务
  21.         ReactAgent agent = ReactAgent.builder()
  22.                 .name("ip_search")
  23.                 .model(chatModel)
  24.                 .description("你是一个天气查询助手")
  25.                 .saver(new MemorySaver())
  26.                 .toolCallbackProviders(toolCallbackProvider)
  27.                         .build();
  28.         // 4. 配置运行参数
  29.         RunnableConfig config = RunnableConfig.builder()
  30.                 .threadId("session")
  31.                 .build();
  32.         // 5. 流式调用agent
  33.         Flux<NodeOutput> stream = agent.stream("上海天气怎么样", config);
  34.         StringBuffer answerString = new StringBuffer();
  35.         stream.doOnNext(output -> {
  36.                     if (output.node().equals("_AGENT_MODEL_")) {
  37.                         answerString.append(((StreamingOutput<?>) output).message().getText());
  38.                     }
  39.                     else if (output.node().equals("_AGENT_TOOL_")) {
  40.                         answerString.append("\nTool Call:").append(((ToolResponseMessage) ((StreamingOutput<?>) output).message()).getResponses().get(0)).append("\n");
  41.                     }
  42.                 })
  43.                 .doOnComplete(() -> System.out.println(answerString))
  44.                 .doOnError(e -> System.err.println("Stream Processing Error: " + e.getMessage()))
  45.                 .blockLast();
  46.     }
  47.           /**
  48.      * 初始化DashScope聊天模型(通义千问)
  49.      * @return ChatModel 聊天模型实例
  50.      */
  51.     private static  ChatModel getChatModel() {
  52.         DashScopeApi dashScopeApi = DashScopeApi.builder()
  53.                 .apiKey(System.getenv("AliQwen_API"))
  54.                 .build();
  55.         return DashScopeChatModel.builder()
  56.                 .dashScopeApi(dashScopeApi)
  57.                 .build();
  58.     }
  59. }
复制代码
4. 运行测试,查看结果


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

本文通过Spring Ai Alibaba,实现了MCP协议的本地服务落地,服务端获取天气逻辑后续可以替换为真实调用api接口。
欢迎大家关注我,下一篇文章我将介绍一下如何调用MCP市场上的公开服务,敬请期待~

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册