掘金 人工智能 05月31日 21:03
原生Java SDK实现MCP Server(基于WebFlux的SSE通信方式)
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了如何在Spring WebFlux项目中快速接入MCP(Model Context Protocol)服务。通过引入MCP Spring WebFlux SDK,并配置SSE通信方式和McpSyncServer对象,可以方便地将MCP服务集成到响应式Web应用中。文章详细说明了环境要求、依赖引入、业务代码编写以及MCP Server配置步骤,并提供了使用Cherry Studio进行测试的示例,帮助开发者验证MCP Server是否成功启动并提供服务。

🛠️ 环境搭建:集成MCP服务需要JDK17或以上、SpringBoot3.0或以上、Tomcat10或以上以及Maven3.8.3+(推荐3.9.x)的环境。

📦 依赖引入:通过Maven引入mcp-bom和mcp-spring-webflux依赖,并确保使用spring-boot-starter-webflux替代spring-boot-starter-web,同时开启@EnableWebFlux。

⚙️ MCP配置:配置SSE通信方式,创建WebFluxSseServerTransportProvider,并通过RouterFunction将/sse和/mcp/message请求交给它处理。同时,配置McpSyncServer对象,传入WebFluxSseServerTransportProvider。

🧩 工具集成:定义MCP工具,例如“getOrderDetail”,描述其功能(通过订单号获取订单详情信息)和参数(订单号),并绑定相应的业务逻辑(从OrderService获取订单详情)。

✅ 测试验证:使用Cherry Studio作为MCP Client进行测试,配置相关参数,验证MCP Server是否启动成功,并能正常提供服务,同时检查工具栏是否显示暴露的接口。

前言

MCP官方除了为Spring mvc定制sdk,另外还为响应式编程的WebFlux定制了对应的sdk,以便使用Spring WebFlux的项目也能很方便地接入MCP服务。下面我们就快速开始,看看如何在Spring WebFlux项目中接入MCP Server吧。

环境要求

工具版本
JDK17或以上
SpringBoot3.0或以上
Tomcat10或以上
Maven3.8.3+,最好是3.9.x

引入依赖

我们依然还是先创建一个最基本的SpringBoot项目,然后在此基础上新增以下依赖。注意版本,截止2025-04-30,MCP Java SDK最新版本为0.9.0:

<dependencyManagement>      <dependencies>          <dependency>              <groupId>io.modelcontextprotocol.sdk</groupId>              <artifactId>mcp-bom</artifactId>          <version>0.9.0</version>          <type>pom</type>          <scope>import</scope>      </dependency>      </dependencies>  </dependencyManagement><dependencies>    <dependency>      <groupId>io.modelcontextprotocol.sdk</groupId>  <artifactId>mcp-spring-webflux</artifactId>  </dependency></dependencies>

注意:如果依赖中有spring-boot-starter-web依赖,需要更换成spring-boot-starter-webflux:

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

另外就是需要把@EnableWebMvc去掉,开启@EnableWebFlux,避免服务启动后产生404错误;

业务代码

目前在这几个demo当中,我们使用的业务代码都是同一套,通过订单号获取订单详情:

import org.springframework.stereotype.Service;@Servicepublic class OrderService {public OrderDetail getOrderDetail(String orderId) {  OrderDetail orderDetail = new OrderDetail();  orderDetail.setOrderId(orderId);orderDetail.setDetail("订单详情");return orderDetail;  }public static class OrderDetail {  private String orderId;    private String detail;    public void setOrderId(String orderId) {  this.orderId = orderId;  }    public String getOrderId() {  return this.orderId;  }    public void setDetail(String detail) {  this.detail = detail;  }    public String getDetail() {  return this.detail;  }  @Override  public String toString() {  return "{\"orderId\":\"" + this.orderId + "\",\"detail\":\"" + this.detail+ "\"}";  }}}

编写MCP Server配置

1、首先我们依然是配置SSE的通信方式,这个取决于TransportProvider,WebFlux的实现类是WebFluxSseServerTransportProvider,并且通过新增RouterFunction把/sse、/mcp/message请求交给WebFluxSseServerTransportProvider处理:

import com.fasterxml.jackson.databind.ObjectMapper;import io.modelcontextprotocol.server.transport.WebFluxSseServerTransportProvider;import org.springframework.context.annotation.Bean;  import org.springframework.context.annotation.Configuration;  import org.springframework.web.reactive.config.EnableWebFlux;  import org.springframework.web.reactive.function.server.RouterFunction;@EnableWebFlux  @Configuration  class McpConfig {  @Bean  WebFluxSseServerTransportProvider webFluxSseServerTransportProvider(ObjectMapper mapper) {  return new WebFluxSseServerTransportProvider(mapper, "/mcp/message");  }    @Bean  RouterFunction<?> mcpRouterFunction(WebFluxSseServerTransportProvider transportProvider) {  return transportProvider.getRouterFunction();  }}

2、接下来依然还是配置McpSyncServer对象,这次传入的TransportProvider对象是WebFluxSseServerTransportProvider:

@Bean(destroyMethod = "close")  public McpSyncServer mcpSyncServer(WebFluxSseServerTransportProvider transportProvider,  OrderService orderService) {  McpSyncServer mcpSyncServer = McpServer.sync(transportProvider)  .serverInfo("my-server", "1.0.0")  .capabilities(McpSchema.ServerCapabilities.builder() .tools(true).build())  .build();    String jsonSchema = """  {  "type":"object",  "properties":{  "orderId" : {  "type": "string",  "description": "订单号"  }  },  "required":[  "orderId"  ],  "additionalProperties":false  }  """;  // 方法的描述  McpSchema.Tool tool = new McpSchema.Tool("getOrderDetail", "通过订单号获取订单详情信息", jsonSchema);  // 方法描述对应的执行逻辑  BiFunction<McpSyncServerExchange, Map<String, Object>, McpSchema.CallToolResult> call = (exchange, arguments) -> {  OrderService.OrderDetail result = orderService.getOrderDetail(String.valueOf(arguments.get("orderId")));  return new McpSchema.CallToolResult(result.toString(), false);  };  // 绑定描述和执行逻辑  McpServerFeatures.SyncToolSpecification toolHandler = new McpServerFeatures.SyncToolSpecification(tool, call);    // 添加到工具集中  mcpSyncServer.addTool(toolHandler);    return mcpSyncServer;  }

测试

现在我们所有的代码都编写完毕,接下来依然通过cherry studio作为MCP Client验证,可按照以下图示进行配置:

如果按照上述图示配置没有异常,那么说明MCP Server启动成功,且能正常提供服务,并且可在工具栏看到我们暴露出来的接口:

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Spring WebFlux MCP 响应式编程 SSE 微服务
相关文章