java springboot实现MCP Server SSE

参考:

https://juejin.cn/post/7491881721278529570

SpringAI 实现 SSE MCP Server项目 - Auler - 博客园

springboot-MCPserver-JUnit: 使用springboot支持mcp项目搭建,同时有着便捷的单元测试来进行敏捷开发对话即服务:Spring Boot+MCP让你的CRUD系统秒变AI助手 - 雨梦山人 - 博客园

java的jdk使用17,可参考:Java 17 Windows 安装教程--保姆级安装_java17-CSDN博客

java的mcp-server依赖使用1.0.0-M8,可参考:

MCP Server Boot Starter :: Spring AI Reference

Spring AI版本1.0.0-M6和M8效果比较-CSDN博客

本文使用了两种mcp client:cherry studio和cursor

源代码参考:我的/springboot-mcpserver-demo

代码片段

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.4.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>top.dreamcenter</groupId>
    <artifactId>mcp</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <name>mcp</name>
    <description>Template project for SpringBoot + MCP</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        <!-- <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-mcp-server-webmvc-spring-boot-starter</artifactId>
            <version>1.0.0-M6</version>
        </dependency> -->
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
            <version>1.0.0-M8</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>top.dreamcenter.mcp.McpApplication</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

McpApplication.java

package top.dreamcenter.mcp;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class McpApplication {

    public static void main(String[] args) {
        SpringApplication.run(McpApplication.class, args);
    }

}

NumService.java

package top.dreamcenter.mcp.service;

import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Service;

@Service
public class NumService {

    @Tool(description = "判断是否是双数")
    public String judgeIfOddJava(@ToolParam(description = "待判断的数") Integer num) {
        return num + (num%2 == 0 ? "是双数" : "不是双数");
    }

}

ToolCallbackProviderRegister.java

package top.dreamcenter.mcp.config;

import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.ai.tool.method.MethodToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import top.dreamcenter.mcp.service.NumService;

@Configuration
public class ToolCallbackProviderRegister {

    @Bean
    public ToolCallbackProvider numTools(NumService numService) {
        return MethodToolCallbackProvider.builder().toolObjects(numService).build();
    }

}

NumController.java

package top.dreamcenter.mcp.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import top.dreamcenter.mcp.service.NumService;

@RestController
@RequestMapping("/api/num")
public class NumController {

    @Autowired
    private NumService numService;

    @GetMapping("/judge/{num}")
    public String judgeIfOddJava(@PathVariable Integer num) {
        return numService.judgeIfOddJava(num);
    }
    
} 

cherry studio效果

cursor效果

单独通过url请求http://localhost:8000/sse端口的响应内容如下

MCP工具接口和RESTful接口

我们可以在同一个应用程序中同时提供MCP工具接口和RESTful接口。

MCP工具接口 - 通过@Tool注解在Service层提供AI工具能力

RESTful API接口 - 通过Controller层提供常规Web API访问

这样设计的优势:

对于AI应用(如Claude这样的大模型),可以通过MCP接口直接调用您的服务功能

对于传统Web应用,可以通过RESTful API接口访问相同的功能

共享相同的业务逻辑层(Service层),减少代码重复

### Java实现和使用 Server-Sent Events (SSE) Server-Sent Events 是一种允许服务器向浏览器推送实时更新的技术。通过 SSE 可以实现实时数据流传输,而不需要客户端不断轮询服务器。 在 Java 应用程序中实现 SSE 主要涉及以下几个方面: #### 使用标准 API 实现 SSE Java EE 和 Jakarta EE 提供了内置的支持来处理 SSE 请求。可以利用 `javax.servlet` 或者更现代的 `jakarta.servlet` 包中的类来进行操作[^1]。 ```java import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; @WebServlet("/events") public class SseServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/event-stream"); PrintWriter writer = resp.getWriter(); while (!req.isAsyncStarted() && !resp.isCommitted()) { writer.println("data: Hello World\n"); writer.flush(); Thread.sleep(5000); // Simulate delay between events. } } } ``` 对于更加复杂的场景或者想要更好的性能表现,则推荐采用第三方库如 Atmosphere Framework 来简化开发过程并提供额外的功能支持[^2]。 #### 结合 Managed Cloud Platform (MCP) 当涉及到托管云平台上的部署时,确保所选的服务提供商能够良好地支持 Web Socket 协议以及 HTTP 长连接特性是非常重要的。这通常意味着选择那些已经优化过其网络栈和服务架构的产品,以便于高效处理大量的并发连接请求[^3]。 例如,在某些 MCP 上可能需要配置特定的安全组规则或负载均衡器设置才能使 SSE 正常工作。此外还需要考虑如何有效地监控这些服务的状态变化情况,并及时响应可能出现的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值