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 {@Beanpublic 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 {@Autowiredprivate 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層),減少代碼重復

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/81650.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/81650.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/81650.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode 熱題 100 48. 旋轉圖像

LeetCode 熱題 100 | 48. 旋轉圖像 大家好&#xff0c;今天我們來解決一道經典的算法題——旋轉圖像。這道題在LeetCode上被標記為中等難度&#xff0c;要求我們將一個 n n 的二維矩陣&#xff08;圖像&#xff09;順時針旋轉90度&#xff0c;并且必須原地修改矩陣&#xff0…

嵌入式按鍵原理、中斷過程與中斷程序設計(鍵盤掃描程序)

按鍵去抖動 ? 通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時&#xff0c;電壓信號波型如下圖。由于機械觸點的彈性作用&#xff0c;一個按鍵開關在閉合時不會馬上穩定地接通&#xff0c;在斷開時也不會一下子斷開。因而在閉合及斷開的瞬間均伴隨有一連串的抖動。…

數據結構之哈夫曼樹

8.哈夫曼樹 8.1 哈夫曼編碼 哈夫曼編碼&#xff08;Huffman Coding&#xff09;&#xff0c;又稱霍夫曼編碼&#xff0c;是一種可變字長編碼&#xff08;VLC&#xff09;方式 這種編碼方法完全依據字符出現的概率來構造異字頭的平均長度最短的碼字&#xff0c; 因此有時也被…

機器學習實操 第一部分 機器學習基礎 第5章 支持向量機(SVM)

機器學習實操 第一部分 機器學習基礎 第5章 支持向量機&#xff08;SVM&#xff09; 內容概要 第5章深入介紹了支持向量機&#xff08;SVM&#xff09;&#xff0c;這是一種功能強大且應用廣泛的機器學習模型。SVM適用于線性或非線性分類、回歸以及 novelty detection。本章詳…

Webug4.0靶場通關筆記14- 第18關 文件上傳之Nginx解析缺陷

目錄 第18關 滲透實戰 1.打開靶場 2.構造php腳本 3.源碼分析 &#xff08;1&#xff09;客戶端源碼 &#xff08;2&#xff09;服務的源碼 4.Nginx解析法滲透 &#xff08;1&#xff09;缺陷原因 &#xff08;2&#xff09;缺陷條件 &#xff08;3&#xff09;構造腳…

【QT】QT中的網絡編程(TCP 和 UDP通信)

QT中的網絡編程&#xff08;TCP 和 UDP通信&#xff09; 1.tcp1.1 tcp通信1.1.1 相比linux中tcp通信:1.1.2 QT中的tcp通信: 1.2 tcp通信流程1.2.1 服務器流程&#xff1a;1.2.1.1 示例代碼1.2.1.2 現象 1.2.2 客戶端流程&#xff1a;1.2.2.1 示例代碼1.2.2.2 現象&#xff1a; …

架構思維:使用懶加載架構實現高性能讀服務

文章目錄 一、引言二、讀服務的功能性需求三、兩大基本設計原則1. 架構盡量不要分層2. 代碼盡可能簡單 四、實戰方案&#xff1a;懶加載架構及其四大挑戰五、改進思路六、總結與思考題 一、引言 在任何后臺系統設計中&#xff0c;「讀多寫少」的業務場景占據主流&#xff1a;瀏…

永磁同步電機控制算法--基于PI的位置伺服控制

一、原理介紹 永磁同步伺服系統是包含了電流環、速度環和位置環的三環控制系統。 伺服系統通過電流檢測電路和光電編碼器檢測電動機三相繞組電流和轉子位置θ&#xff0c;通過坐標變換&#xff0c;計算出轉矩電流分量iq和勵磁電流分量id。 位置信號指令與實際轉子位置信號的差…

linux系統線程實現原理淺析

背景 對進程和線程的理解&#xff0c;之前一直都是憑一些零碎不完整的信息在理解&#xff1b; linux的進程和線程基本上一樣&#xff0c;線程是輕量級進程&#xff0c;彼此有關聯又獨立。 得虧內核支持的好&#xff0c;寫用戶態程序可以不依賴于實現的理解&#xff0c;只需要…

MySQL連接報錯處理:1130-host ... is not allowed to connect to this MySql server

在MySQL安裝完成后&#xff0c;很多開發者會遇到這樣一個問題&#xff1a; 錯誤代碼 1130&#xff1a;host xxx.xxx.xxx.xxx is not allowed to connect to this MySql server 這個錯誤通常出現在你嘗試通過遠程工具&#xff08;如 Navicat、DBeaver 等&#xff09;連接 MySQL …

Linux系統之----進程控制

1.進程創建 進程創建部分由于就是fork函數&#xff0c;還有寫時拷貝&#xff0c;在上一篇已經講述過了&#xff0c;這里不在進行贅述&#xff0c;有疑問的讀者可以前往上一篇博文《Linux系統--程序地址空間》中閱讀&#xff01; 這里在多說一嘴寫時拷貝吧 我們可以對比一下寫…

Spring框架的設計目標,設計理念,和核心是什么 ?

Spring框架是一個為簡化企業級應用開發而設計的開源框架&#xff0c;它提供了全面的基礎設施支持&#xff0c;使得Java應用開發更加簡單、快速和可維護。下面我將詳細解釋Spring框架的設計目標、設計理念以及核心組件。 設計目標 簡化Java企業級應用開發&#xff1a;通過提供…

Red Hat6.4環境下搭建DNS服務器

DNS服務器&#xff08;Domain Name System Server&#xff09;是互聯網中用于將域名&#xff08;如 www.example.com&#xff09;解析為IP地址&#xff08;如 192.0.2.1&#xff09;的服務器。它是互聯網基礎設施的重要組成部分&#xff0c;幫助用戶通過易于記憶的域名訪問網站…

Nginx核心功能 02

目錄 Nginx代理技術核心概念 &#xff08;一&#xff09;正向代理&#xff08;Forward Proxy&#xff09; 1. 基本定義 2. 技術原理 3. 應用場景 &#xff08;二&#xff09;反向代理&#xff08;Reverse Proxy&#xff09; 1. 基本定義 2. 技術原理 3. 應用場景 一、…

關于Python:3. Python標準庫和常用模塊

1. os 和 sys&#xff08;系統編程基礎&#xff09; 這兩個模塊是進行系統層面操作&#xff08;如文件管理、路徑處理、環境變量訪問等&#xff09;必不可少的工具。 os 模塊 os 主要是用于與操作系統交互的&#xff0c;比如&#xff1a; 文件和目錄操作 獲取系統信息 運行…

Java基于SaaS模式多租戶ERP系統源碼

目錄 一、系統概述 二、開發環境 三、系統功能介紹 一、系統概述 ERP&#xff0c;全稱 Enterprise Resource Planning 即企業資源計劃。是一種集成化的管理軟件系統&#xff0c;它通過信息技術手段&#xff0c;將企業的各個業務流程和資源管理進行整合&#xff0c;以提高企業…

個人健康中樞的多元化AI網絡革新與精準健康路徑探析

引言 隨著數字化轉型的深入推進,個人健康中樞作為集成化健康管理系統,正在從傳統的單一功能向多元化的AI驅動方向快速發展。在這一背景下,新興網絡硬件技術,特別是DPU(數據處理單元)和全光網絡的出現,為個人健康中樞的革新提供了前所未有的機遇。本研究將深入探討這些技…

AI跑得快,MCP來加速——模型計算平臺在訓練與推理中的硬核作用

AI跑得快,MCP來加速——模型計算平臺在訓練與推理中的硬核作用 一、引言:AI是“鐵人三項”,但訓練+推理常常“掉鏈子” 如今的人工智能系統越來越強,像ChatGPT、Stable Diffusion、Segment Anything等模型不斷刷新技術天花板。但你是否也注意到: 明明模型設計得挺好,訓練…

《MATLAB實戰訓練營:從入門到工業級應用》工程實用篇-自動駕駛初體驗:車道線檢測算法實戰(MATLAB2016b版)

《MATLAB實戰訓練營&#xff1a;從入門到工業級應用》工程實用篇-&#x1f697; 自動駕駛初體驗&#xff1a;車道線檢測算法實戰&#xff08;MATLAB2016b版&#xff09; 大家好&#xff01;今天我要帶大家一起探索自動駕駛中一個非常基礎但又至關重要的技術——車道線檢測。我…

模型部署——cuda編程入門

CUDA中的線程與線程束 kernel是在device上線程中并行執行的函數&#xff0c;核函數用__global__符號聲明&#xff0c;在調用時需要用<<<grid_size, block_size>>>來指定kernel要執行的線程數量。在CUDA中&#xff0c;每一個線程都要執行核函數&#xff0c;并…