Spring Boot构建、部署MCP SSE服务器
项目: https://github.com/AgathaNetwork/MCPGateway
参考: https://developer.aliyun.com/article/1661843
关于MCP SSE
Server-Sent Events(SSE)是一种基于HTTP协议的服务器向客户端单向实时通信技术。其核心机制是:客户端通过EventSource接口与服务器建立持久化连接,服务器随后通过该通道主动推送数据流至客户端,实现毫秒级响应。
SSE具备两大特性:采用标准HTTP协议栈;支持自动重连与断点续传,连接中断时自动携带最后事件ID恢复传输。
在大模型MCP中,SSE是一种广泛使用的对接标准,而一个SSE服务端的本质是监听HTTP服务,并具备SSE的特征。本文由此搭建一个基于Spring Boot的SSE服务端。
环境准备
我们首先需要一个Spring Boot项目,这里使用IDEA创建,配置如下:

在Dependencies中需要选择用到的功能:

这样我们就得到了一个白板Spring Boot项目框架。
Spring AI的使用
在Spring AI中我们有org.springframework.ai.tool.annotation.Tool这个库,它为LLM的Tool进行了简化定义,方便开发者直接使用。
一个Tool的结构如下:
1 2 3 4 5
| @Tool(description = "工具的描述,需要给LLM看") public List<String> yourFunction(String arg1) { return Collections.singletonList("预期响应,转换为单一元素数组,也可以正常地用数组返回"); }
|
其中@Tool部分对工具作出了描述,这个描述会作为LLM选择、使用工具的依据,建议包含功能的描述、入参和预期输出,让LLM作出更好的选择。
代码结构
接下来需要在主类相同目录下新建一个server文件夹,按照阿里云教程的写法,需要新建一个类,用于储存Tools,此处使用ToolGateway.java。以我的项目为例,其中的内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| @Service public class ToolGateway {
@Autowired private DatabaseConnectionManager databaseConnectionManager;
@Tool(description = "获取玩家信息,包括注册时间、上次登录时间、在线状态等,玩家名不区分大小写") public List<String> fetchPlayerInfo(String name) { Map<String, Object> playerInfo = databaseConnectionManager.queryAuthMeByPlayerName(name); if (!playerInfo.isEmpty()) { String realname = (String) playerInfo.get("realname"); long regdate = (long) playerInfo.get("regdate"); long lastlogin = (long) playerInfo.get("lastlogin"); int isLogged = (int) playerInfo.get("isLogged");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); String formattedRegdate = sdf.format(new Timestamp(regdate)); String formattedLastlogin = sdf.format(new Timestamp(lastlogin));
String onlineStatus = isLogged == 1 ? "在线" : "不在线";
String info = String.format( "该用户注册于 %s,上次登录是在 %s,当前 %s", formattedRegdate, formattedLastlogin, onlineStatus );
return Collections.singletonList(info); } return Collections.singletonList("找不到这个玩家"); }
}
|
之后还需要对服务器进行配置,再新建一个config文件夹,其中McpServerConfig.java内容如下:
1 2 3 4 5 6 7 8
| @Configuration @EnableWebMvc public class McpServerConfig implements WebMvcConfigurer { @Bean public ToolCallbackProvider openLibraryTools(ToolServer toolServer) { return MethodToolCallbackProvider.builder().toolObjects(toolServer).build(); } }
|
同时,在resources文件夹中新建application.yml用于保存配置文件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| server: port: 3901 spring: application: name: MCPGateway ai: mcp: server: name: mcpgateway version: 1.0.0 type: SYNC sse-message-endpoint: /mcp/messages
|
也可以在此处添加SQL服务器的配置、其他密钥等。这个文件在运行后可以被jar目录下的 application.yml 或config目录下的 application.yml 覆盖,作为封装jar后的动态配置文件。
部署
通过 mvn clean package 进行打包,生成的jar文件在服务器中运行。
部署的主要内容是将LLM与MCP服务连接。此处选择的是阿里云百炼,百炼提供MCP接入服务。

安装方式选择SSE,MCP服务配置如图,其中默认的amap-amap-sse可以随意填写,而其中的url就需要更改为自己的,一般是 https://xxx.com/sse ,以sse为路径。
部署完成后,在自定义MCP服务中可以看到各个Tool:

其中可以模拟LLM调用。

之后,可以将MCP添加到应用中。

这样,在调用LLM应用时,模型会自主选择相应的功能辅助推理:

到此,一个基于Spring Boot的MCP SSE服务器就开发部署完成了。