项目: 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的结构如下:
@Tool(description = "工具的描述,需要给LLM看")
public List<String> yourFunction(String arg1) {
//一些功能
return Collections.singletonList("预期响应,转换为单一元素数组,也可以正常地用数组返回");
}
其中@Tool部分对工具作出了描述,这个描述会作为LLM选择、使用工具的依据,建议包含功能的描述、入参和预期输出,让LLM作出更好的选择。
代码结构
接下来需要在主类相同目录下新建一个server文件夹,按照阿里云教程的写法,需要新建一个类,用于储存Tools,此处使用ToolGateway.java。以我的项目为例,其中的内容如下:
@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内容如下:
@Configuration
@EnableWebMvc
public class McpServerConfig implements WebMvcConfigurer {
@Bean
public ToolCallbackProvider openLibraryTools(ToolServer toolServer) {
return MethodToolCallbackProvider.builder().toolObjects(toolServer).build();
}
}
同时,在resources文件夹中新建application.yml用于保存配置文件。
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服务器就开发部署完成了。