SpringBoot 集成 MCP 实现 SSE 实时通信
未来我们还打算把「日志分析」「库存校验」「报表生成」这些操作都做成 MCP 工具,用一句话就能调起流程,真正让系统“开口说话,听懂你话”。你是否也想试试?热门文章一套能保命的高并发实战指南架构师必备:用 AI 快速生成架构图05-粉丝福利我这里创建一个程序员成长&副业交流群,和一群志同道合的小伙伴,一起聚焦自身发展,技术成长与职业规划,分享路线图、面试经验和效率工具,探讨多种副业变现路径,从写作课
沉默是金,总会发光
大家好,我是沉默
上周五,运营妹子发来一句:“这个系统不能让我直接说句话就创建采购单吗?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(); // 工具描述}
扫描工具的方法:
@PostConstructpublic 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 工具栏中看到你定义的服务名称。
点击工具即可开始自然语言交互。

最后
未来我们还打算把「日志分析」「库存校验」「报表生成」这些操作都做成 MCP 工具,用一句话就能调起流程,真正让系统“开口说话,听懂你话”。
你是否也想试试?
热门文章
-05-
粉丝福利
我这里创建一个程序员成长&副业交流群,
和一群志同道合的小伙伴,一起聚焦自身发展,
可以聊:
技术成长与职业规划,分享路线图、面试经验和效率工具,
探讨多种副业变现路径,从写作课程到私活接单,
主题活动、打卡挑战和项目组队,让志同道合的伙伴互帮互助、共同进步。
如果你对这个特别的群,感兴趣的,
可以加一下,微信通过后会拉你入群,
但是任何人在群里打任何广告,都会被我T掉。

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)