前言
目前MCP官方已经使用五种编程语言实现了MCP协议,其中就包括java。为了能够更深入地了解MCP,我们接下来就将使用最原生的方式在我们的应用程序中实现MCP Server。
环境要求
工具 | 版本 |
---|---|
JDK | 17或以上 |
SpringBoot | 3.0或以上 |
Tomcat | 10或以上 |
Maven | 3.8.3+,最好是3.9.x |
引入依赖
首先我们先创建一个最基本的springBoot项目,不需要其他复杂的依赖,然后新增下面的MCP Java SDK(截止2025-04-29,MCP Java SDK最高版本是0.9.0):
xml
<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</artifactId>
</dependency>
</dependencies>
新增依赖后记得reload maven project,避免依赖未导入;
编写MCP Server业务代码
因为我们本小节最重要的不是业务代码怎么写,所以我们就写一个相对简单的,就以通过订单号获取订单详情为例:
java
import org.springframework.stereotype.Service;
@Service
public 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配置
这一部分是本小节最重要的部分,我们需要做两件事情:
- 配置SSE请求入口
java
import com.fasterxml.jackson.databind.ObjectMapper;
import io.modelcontextprotocol.server.transport.HttpServletSseServerTransportProvider;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@EnableWebMvc
public class McpServerConfig implements WebMvcConfigurer {
@Bean
public HttpServletSseServerTransportProvider servletSseServerTransportProvider() {
return new HttpServletSseServerTransportProvider(new ObjectMapper(), "/mcp/message");
}
@Bean
public ServletRegistrationBean customServletBean(HttpServletSseServerTransportProvider transportProvider) {
return new ServletRegistrationBean(transportProvider, "/mcp/message", "/sse");
}
}
首先我们通过注入HttpServletSseServerTransportProvider对象开启SSE的通信方式,并通过ServletRegistrationBean把/sse、/mcp/message请求接管到HttpServletSseServerTransportProvider来处理;
注意: 此处有一点细节需要说明一下,如果按照官方文档中直接创建ServletRegistrationBean对象,不配置urlMappings,那么项目中的所有请求都将被HttpServletSseServerTransportProvider接管,这可能会导致项目中已有的restful api访问报404错误;
- 配置业务代码为Tools
java
@Bean(destroyMethod = "close")
public McpSyncServer mcpSyncServer(HttpServletSseServerTransportProvider transportProvider,
OrderService orderService) {
McpSyncServer mcpSyncServer = McpServer.sync(transportProvider)
.serverInfo("my-server", "1.0.0")
.capabilities(McpSchema.ServerCapabilities.builder()
.tools(true)
.logging()
.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;
}
我们需要把需要暴露的业务方法通过上面的配置暴露给MCP Client。上面的代码看上去挺多,但是仔细看一下,其实可以拆解成两部分: 1、首先是创建一个McpSyncServer Bean对象,并配置一些基本属性,包括Server的名称等; 2、其次就是把我们需要暴露的业务方法整理成JsonSchema,并添加到McpSyncServer对象的工具集中;
测试
上面的工作都做完后,我们可以启动项目,为了能够测试我们的MCP Server是否可用,我们可以下载安装cherry studio用来作为MCP Client。可按照以下图示进行配置:

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