SpringBoot集成MCP实现SSE实时通信功能

 更新时间:2025年05月13日 10:23:24   作者:架构师沉默  
本文详细介绍了如何在智能生产管理系统SPMS中集成MCP协议,并支持SSE模式,以实现系统与用户的自然对话和智能响应,通过使用SpringBoot搭建SSE服务端,实现了服务端主动推送消息给客户端的功能,需要的朋友可以参考下

上周五,运营同事发来一句:“这个系统不能让我直接说句话就创建采购单吗?GPT 都能聊天了,你这么死板?”

好家伙,我一个智能生产管理系统 SPMS(Smart Production Management System),确实就是少了点“嘴和耳朵”嘛。

也正巧前段时间 MCP(Model Context Protocol)在圈里火了起来。它主打的就是让系统像 GPT 一样和用户自然对话,我们当然不能落后。

于是,我撸起袖子,决定给 SPMS 搭个「MCP 协议」的接口,还要支持 SSE 模式 —— 让系统开口说话、接住请求、智能响应!

01

传统系统没“嘴” 和****“耳朵”********

传统的后台系统,通常是 REST API + 前端页面 + 手动操作:

  • 请求得写死流程;

  • 交互不能说话;

  • 智能化完全靠拼接流程图。

现在,AI 能力接进系统就像长了嘴和耳朵。但是:

  • 怎么接住用户的问题?

  • 怎么从系统里调用逻辑?

  • 怎么把结果发回去?

尤其是我们要用 SSE/HTTP 模式的 MCP,不是大家熟悉的 stdio 模式,就更得好好设计一套交互体系。

02

怎么理解 SSE 模式?

MCP 协议,全称是 Model Context Protocol,简单说,它定义了一个 AI 和系统交互的标准。

我们这次采用的是 MCP 的 SSE(Server-Sent Events)/HTTP 模式,它和我们熟悉的 REST API 很不一样。

可以理解为:

类比功能解释
耳朵HTTP 接收端口系统听见了用户的请求
嘴巴SSE 推送端口系统开口回答用户
中枢大脑MCP 工具注册与调用系统知道怎么做事
SSE 模式最核心的点是——服务端主动推送消息给客户端,而不是等客户端轮询。

03

支持 SSE 的 SpringBoot 服务端架构

我们用 SpringBoot 搭了一个完整的 SSE 服务端,结构如下:

┌──────────────┐
│ MCP 客户端   │
└────┬────┬────┘
     │    │
SSE连接 HTTP请求
     │    │
┌────▼────┴────┐
│ MCP 控制器   │ ← 拦截器做权限校验
├──────────────┤
│ /sse/stream   ← 建立 SSE 连接
│ /mcp/receive  ← 接收 POST 请求
└────┬─────────┘
     │
┌────▼──────┐
│ McpService │ ← 扫描方法 + 执行 + 推送
└───────────┘

SSE 端点

我们使用 /sse/stream 建立连接:

@GetMapping("/sse/stream")
public SseEmitter connect(@RequestParam String token) {
    return sseManager.createEmitter(token);
}

HTTP 接收端

收到 MCP 客户端请求,进行工具调用:

@PostMapping("/mcp/receive")
public void handle(@RequestBody McpRequest req) {
    mcpService.invoke(req.getToken(), req.getMethod(), req.getParams());
}

身份校验和权限控制

我们设计了一个 AccessToken -> 用户权限 的映射:

Map<String, Set<String>> tokenToTools = new ConcurrentHashMap<>();
tokenToTools.put("u123-token", Set.of("createOrder", "checkInventory"));

当客户端试图调用一个未授权的方法时,返回:

Error: You are not allowed to use tool 'createPurchaseOrder'

每个 token 拥有哪些 MCP 工具,是在服务初始化时通过注解扫描注册的。

04

扫描 MCP 工具 + 执行调用 + SSE 推送

工具注册

我们定义了一个 @McpMethod 注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface McpMethod {
    String name(); // 工具名
    String desc(); // 工具描述
}

扫描工具的方法:

@PostConstruct
public void scanMcpMethods() {
    // 反射扫描标注了 @McpMethod 的方法并注册
}

工具调用

根据 methodName 找到对应工具,再反射执行:

public Object invoke(String token, String method, Map<String, Object> params) {
    if (!hasPermission(token, method)) {
        throw new UnauthorizedException();
    }
    Method tool = toolRegistry.get(method);
    Object result = tool.invoke(...);
    sseManager.pushToClient(token, result);
    return result;
}

SSE 推送消息

我们封装了一个 SseManager 工具类,用来管理连接与推送:

public void pushToClient(String token, Object msg) {
    SseEmitter emitter = emitterMap.get(token);
    emitter.send(SseEmitter.event().data(msg));
}

客户端接入(以 CherryStudio 为例)

配置 MCP 服务端地址与 AccessToken 即可:

进入 CherryStudio 的 MCP 工具配置面板:

输入服务端地址,格式如下:

http://your-server-host/mcp/sse/stream

注意 /sse/stream 是 MCP 的 Server-Sent Events 推流接口,必须开放访问。

获取 AccessToken

token 是系统中分配的 AccessToken。

验证是否连接成功

成功连接后,你将在 CherryStudio 的 MCP 工具栏中看到你定义的服务名称。

点击工具即可开始自然语言交互。

最后

到此这篇关于SpringBoot集成MCP实现SSE实时通信功能的文章就介绍到这了,更多相关SpringBoot MCP实现SSE通信内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java MyBatis之Mapper代理详解

    Java MyBatis之Mapper代理详解

    这篇文章主要介绍了Java web中MyBatis的mapper代理,文中有详细的代码示例,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2023-04-04
  • 解析mybatis-plus中的resultMap简单使用

    解析mybatis-plus中的resultMap简单使用

    mybatis-plus也只是听过,可是终究没有使用过。于是自己花几天晚上的时间研究mybatis-plus的使用。这篇文章主要介绍了mybatis-plus的resultMap简单使用,需要的朋友可以参考下
    2021-11-11
  • SpringBoot详解如何进行整合Druid数据源

    SpringBoot详解如何进行整合Druid数据源

    Druid是阿里开发的一款开源的数据源,被很多人认为是Java语言中最好的数据库连接池,本文主要介绍了SpringBoot整合Druid数据源的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Java前后端的JSON传输方式(前后端JSON格式转换)

    Java前后端的JSON传输方式(前后端JSON格式转换)

    这篇文章主要介绍了Java前后端的JSON传输方式(前后端JSON格式转换),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • macOS中搭建Java8开发环境(基于Intel x86 64-bit)

    macOS中搭建Java8开发环境(基于Intel x86 64-bit)

    这篇文章主要介绍了macOS中搭建Java8开发环境(基于Intel x86 64-bit) 的相关资料,需要的朋友可以参考下
    2022-12-12
  • Spring Boot中使用Spring-data-jpa的配置方法详解

    Spring Boot中使用Spring-data-jpa的配置方法详解

    今天小编就为大家分享一篇关于Spring Boot中使用Spring-data-jpa的配置方法详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • SpringBoot利用EasyExcel实现导出数据

    SpringBoot利用EasyExcel实现导出数据

    EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具,它能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能看,本文就将介绍如何利用EasyExcel实现导出数据,需要的朋友可以参考下
    2023-07-07
  • Java如何提供给第三方使用接口方法详解

    Java如何提供给第三方使用接口方法详解

    最近在做一个项目,因一些机制问题,需要我用java代码调用第三方接口,下面这篇文章主要给大家介绍了关于Java如何提供给第三方使用接口方法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • java实现SVG图创建全过程

    java实现SVG图创建全过程

    本文介绍了如何在Java中操作和生成SVG矢量图,包括SVG的基本概念、图形和面板类的设计、SVG DOM的创建与元素添加,以及如何将SVG保存为文件,最后指出实际应用中还有更多复杂操作可实现
    2025-10-10
  • Java实现画线、矩形、椭圆、字符串功能

    Java实现画线、矩形、椭圆、字符串功能

    本篇文章主要介绍了Java实现画线、矩形、椭圆、字符串功能的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论