SpringBoot集成MCP實現(xiàn)SSE實時通信功能
上周五,運營同事發(fā)來一句:“這個系統(tǒng)不能讓我直接說句話就創(chuàng)建采購單嗎?GPT 都能聊天了,你這么死板?”
好家伙,我一個智能生產(chǎn)管理系統(tǒng) SPMS(Smart Production Management System),確實就是少了點“嘴和耳朵”嘛。
也正巧前段時間 MCP(Model Context Protocol)在圈里火了起來。它主打的就是讓系統(tǒng)像 GPT 一樣和用戶自然對話,我們當(dāng)然不能落后。
于是,我擼起袖子,決定給 SPMS 搭個「MCP 協(xié)議」的接口,還要支持 SSE 模式 —— 讓系統(tǒng)開口說話、接住請求、智能響應(yīng)!
01
傳統(tǒng)系統(tǒng)沒“嘴” 和****“耳朵”********
傳統(tǒng)的后臺系統(tǒng),通常是 REST API + 前端頁面 + 手動操作:
請求得寫死流程;
交互不能說話;
智能化完全靠拼接流程圖。
現(xiàn)在,AI 能力接進(jìn)系統(tǒng)就像長了嘴和耳朵。但是:
怎么接住用戶的問題?
怎么從系統(tǒng)里調(diào)用邏輯?
怎么把結(jié)果發(fā)回去?
尤其是我們要用 SSE/HTTP 模式的 MCP,不是大家熟悉的 stdio
模式,就更得好好設(shè)計一套交互體系。
02
怎么理解 SSE 模式?
MCP 協(xié)議,全稱是 Model Context Protocol,簡單說,它定義了一個 AI 和系統(tǒng)交互的標(biāo)準(zhǔn)。
我們這次采用的是 MCP 的 SSE(Server-Sent Events)/HTTP 模式,它和我們熟悉的 REST API 很不一樣。
可以理解為:
類比 | 功能 | 解釋 |
---|---|---|
耳朵 | HTTP 接收端口 | 系統(tǒng)聽見了用戶的請求 |
嘴巴 | SSE 推送端口 | 系統(tǒng)開口回答用戶 |
中樞大腦 | MCP 工具注冊與調(diào)用 | 系統(tǒng)知道怎么做事 |
SSE 模式最核心的點是——服務(wù)端主動推送消息給客戶端,而不是等客戶端輪詢。 |
03
支持 SSE 的 SpringBoot 服務(wù)端架構(gòu)
我們用 SpringBoot 搭了一個完整的 SSE 服務(wù)端,結(jié)構(gòu)如下:
┌──────────────┐ │ MCP 客戶端 │ └────┬────┬────┘ │ │ SSE連接 HTTP請求 │ │ ┌────▼────┴────┐ │ MCP 控制器 │ ← 攔截器做權(quán)限校驗 ├──────────────┤ │ /sse/stream ← 建立 SSE 連接 │ /mcp/receive ← 接收 POST 請求 └────┬─────────┘ │ ┌────▼──────┐ │ McpService │ ← 掃描方法 + 執(zhí)行 + 推送 └───────────┘
SSE 端點
我們使用 /sse/stream
建立連接:
@GetMapping("/sse/stream") public SseEmitter connect(@RequestParam String token) { return sseManager.createEmitter(token); }
HTTP 接收端
收到 MCP 客戶端請求,進(jìn)行工具調(diào)用:
@PostMapping("/mcp/receive") public void handle(@RequestBody McpRequest req) { mcpService.invoke(req.getToken(), req.getMethod(), req.getParams()); }
身份校驗和權(quán)限控制
我們設(shè)計了一個 AccessToken -> 用戶權(quán)限 的映射:
Map<String, Set<String>> tokenToTools = new ConcurrentHashMap<>(); tokenToTools.put("u123-token", Set.of("createOrder", "checkInventory"));
當(dāng)客戶端試圖調(diào)用一個未授權(quán)的方法時,返回:
Error: You are not allowed to use tool 'createPurchaseOrder'
每個 token 擁有哪些 MCP 工具,是在服務(wù)初始化時通過注解掃描注冊的。
04
掃描 MCP 工具 + 執(zhí)行調(diào)用 + SSE 推送
工具注冊
我們定義了一個 @McpMethod
注解:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface McpMethod { String name(); // 工具名 String desc(); // 工具描述 }
掃描工具的方法:
@PostConstruct public void scanMcpMethods() { // 反射掃描標(biāo)注了 @McpMethod 的方法并注冊 }
工具調(diào)用
根據(jù) methodName 找到對應(yīng)工具,再反射執(zhí)行:
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 服務(wù)端地址與 AccessToken 即可:
進(jìn)入 CherryStudio 的 MCP 工具配置面板:
輸入服務(wù)端地址,格式如下:
http://your-server-host/mcp/sse/stream
注意 /sse/stream
是 MCP 的 Server-Sent Events 推流接口,必須開放訪問。
獲取 AccessToken:
token 是系統(tǒng)中分配的 AccessToken。
驗證是否連接成功:
成功連接后,你將在 CherryStudio 的 MCP 工具欄中看到你定義的服務(wù)名稱。
點擊工具即可開始自然語言交互。
最后
到此這篇關(guān)于SpringBoot集成MCP實現(xiàn)SSE實時通信功能的文章就介紹到這了,更多相關(guān)SpringBoot MCP實現(xiàn)SSE通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java應(yīng)用服務(wù)器之tomcat部署的詳細(xì)教程
這篇文章主要介紹了Java應(yīng)用服務(wù)器之tomcat部署,本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07利用Springboot+Caffeine實現(xiàn)本地緩存實例代碼
Caffeine是一個基于Java8開發(fā)的提供了近乎最佳命中率的高性能的緩存庫,下面這篇文章主要給大家介紹了關(guān)于利用Springboot+Caffeine實現(xiàn)本地緩存的相關(guān)資料,需要的朋友可以參考下2023-01-01SpringMVC中利用@InitBinder來對頁面數(shù)據(jù)進(jìn)行解析綁定的方法
本篇文章主要介紹了SpringMVC中利用@InitBinder來對頁面數(shù)據(jù)進(jìn)行解析綁定的方法,非常具有實用價值,需要的朋友可以參考下2018-03-03Spring?Boot?快速使用?HikariCP?連接池配置詳解
Spring Boot 2.x 將其作為默認(rèn)的連接池組件,項目中添加 spring-boot-starter-jdbc 或 spring-boot-starter-data-jpa 模塊后,HikariCP 依賴會被自動引入,這篇文章主要介紹了Spring?Boot使用HikariCP連接池配置詳解,需要的朋友可以參考下2023-06-06