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的结构如下:

@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服务器就开发部署完成了。

无标签