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