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.mzph.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;并…