SpringAI开发SSE传输协议的MCP Server

SpringAI   访问地址:Spring AI

‌        Spring AI‌是一个面向人工智能工程的应用框架,由Spring团队推出,旨在将AI能力集成到Java应用中。Spring AI的核心是解决AI集成的根本挑战,即将企业数据和API与AI模型连接起来‌。

MCP(Model Context Protocol,MCP)

        模型上下文协议(即 Model Context Protocol,MCP)是一个开放协议,它规范了应用程序如何向大型语言模型(LLM)提供上下文。MCP 提供了一种统一的方式将 AI 模型连接到不同的数据源和工具,它定义了统一的集成方式。在开发智能体(Agent)的过程中,我们经常需要将将智能体与数据和工具集成,MCP 以标准的方式规范了智能体与数据及工具的集成方式,可以帮助您在 LLM 之上构建智能体(Agent)和复杂的工作流。目前已经有大量的服务接入并提供了 MCP server 实现,当前这个生态正在以非常快的速度不断的丰富中。给Java开发人员深度拥抱AI提供了可能。

传输协议

1、STDIO传输协议

STDIO方式是基于进程间通信,MCP Client和MCP Server运行在同一主机,主要用于本地集成、命令行工具等场景。

优点:简单可靠,无需网络配置;适合本地部署场景;进程隔离,安全性好。

缺点:仅支持单机部署;不支持跨网络访问;每个客户端需要独立启动服务器进程。

2、SSE传输协议

SSE(Server-Sent Events)传输层是基于HTTP的单向通信机制,专门用于服务器向客户端推送数据。MCP Client远程调用MCP Server提供的SSE服务。实现客户端和服务端远程通信。

优点:支持分布式部署;可跨网络访问;支持多客户端连接;轻量级,使用标准HTTP协议。

缺点:需要额外的网络配置;相比stdio实现略微复杂;需要考虑网络安全性。

开发案例实现

本例演示创建SSE通信协议的MCP Server。

1、环境配置要求

  • JDK 17
  • SpringBoot  3.4.2

2、创建SpringBoot项目配置pom.xml

<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 http://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.2</version><relativePath/></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><spring-ai.version>1.0.0-M6</spring-ai.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</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></dependencies>

3、创建Tool类

本例演示创建SSE通信协议的MCP Server。

以下参考网络资料分别创建MathTool、WeatherTool两个工具类,分别提供两个Long数值的加法和算法功能,提供城市天气查询功能。

MathTool.java

@Slf4j
@Service
public class MathTool {@Tool(name = "add", description = "两个Long数值执行加法运算")public Long add(@ToolParam Long a, @ToolParam Long b){log.info("{},执行{} + {}操作。", new Date().toLocaleString(), a, b);return a + b;}@Tool(name = "multiply", description = "两个Long数值执行乘法运算")public Long multiply(@ToolParam Long a, @ToolParam Long b){log.info("{},执行{} * {}操作。", new Date().toLocaleString(), a, b);return a * b;}
}

WeatherTool.java

@Slf4j
@Service
public class WeatherTool {@Tool(name = "getWeatherByCityName",description = "根据城市名称获取天气预报")public String getWeatherByCityName(String city) {log.info("getWeatherByCity方法被调用, 查询的城市为:{}",city);Map<String, String> mockData = Map.of("西安", "天气炎热","北京", "晴空万里","上海", "阴雨绵绵","郑州", "多云转晴");log.info("{},天气如何: {}", mockData.getOrDefault(city, "抱歉:未查询到您关注的城市天气!"));return mockData.getOrDefault(city, "抱歉:未查询到您关注的城市!");}
}

4、注册MCP工具

注册mathTool(数学工具),weatherTool(天气工具)

@Configuration
public class ToolsPublisher {@BeanToolCallbackProvider tools(MathTool mathTool, WeatherTool weatherTool) {// mathTool     数学工具// weatherTool  天气工具return MethodToolCallbackProvider.builder().toolObjects(mathTool,weatherTool).build();}
}

5、配置application.yml

server:port: 8080
spring:application:name: mcp-server-sseai:mcp:server:name: mcp-server-sseversion: 1.0.0type: ASYNCstdio: falsesse-message-endpoint: /mcp/messagessse-endpoint: /sse

5、测试MCP Server

下载Cherry Studio工具,使用工具测试本地开发的MCP Server

左侧选择MCP Server,按照上图顺序依次完成第一步、第二步、第三部,成功连上MCP Server后端,底部就会出现我们定义的工具反方。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/81897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA动态生成类

在java的加载过程一般都是要预先定义java类,然后通过经过加载->连接->初始化三步。连接过程又可分为三步:验证->准备->解析。初始化的类是不允许修改。但是在日常的工作中有时候需要动态生成类,那第这种情况怎么办呢? 可以这么处理: 1、先定义一个空的类,仅…

深入解析Java微服务架构:Spring Boot与Spring Cloud的整合实践

深入解析Java微服务架构&#xff1a;Spring Boot与Spring Cloud的整合实践 引言 随着云计算和分布式系统的快速发展&#xff0c;微服务架构已成为现代软件开发的主流模式。Java作为企业级应用开发的核心语言&#xff0c;结合Spring Boot和Spring Cloud&#xff0c;为开发者提…

03_基础篇-NumPy(下):深度学习中的常用操作

03_基础篇-NumPy&#xff08;下&#xff09;&#xff1a;深度学习中的常用操作 通过上节课的学习&#xff0c;我们已经对NumPy数组有了一定的了解&#xff0c;正所谓实践出真知&#xff0c;今天我们就以一个图像分类的项目为例&#xff0c;看看NumPy的在实际项目中都有哪些重要…

时钟识别项目报告(深度学习、计算机视觉)

深度学习方式 一、模型架构 本模型采用双任务学习框架&#xff0c;基于经典残差网络实现时钟图像的小时和分钟同步识别。 主干网络 使用预训练的ResNet18作为特征提取器&#xff0c;移除原分类层&#xff08;fc层&#xff09;&#xff0c;保留全局平均池化后的512维特征向量。…

openai-whisper-asr-webservice接入dify

openai-whisper-asr-webservice提供的asr的api其实并不兼容openai的api&#xff0c;所以在dify中是不能直接添加到语音转文字的模型中&#xff0c;对比了下两个api的传参情况&#xff0c;其实只要改动一处&#xff0c;就能支持&#xff1a; openai兼容的asr调用中formdata中音频…

解锁MySQL性能调优:高级SQL技巧实战指南

高级SQL技巧&#xff1a;解锁MySQL性能调优的终极指南 开篇 当前&#xff0c;随着业务系统的复杂化和数据量的爆炸式增长&#xff0c;数据库性能调优成为了技术人员面临的核心挑战之一。尤其是在高并发、大数据量的场景下&#xff0c;SQL 查询的性能直接影响到整个系统的响应…

JavaScript 性能优化实战指南

JavaScript 性能优化实战指南 前言 随着前端应用复杂度提升&#xff0c;JavaScript 性能瓶颈日益突出。高效的性能优化不仅能提升用户体验&#xff0c;还能增强系统稳定性和可维护性。本文系统梳理了 JavaScript 性能优化的核心思路、常见场景和实战案例&#xff0c;结合代码…

服务器磁盘按阵列划分为哪几类

以下是服务器磁盘阵列&#xff08;RAID&#xff09;的详细分类及技术解析&#xff0c;基于现行行业标准与实践应用&#xff1a; 一、主流RAID级别分类 1. ‌RAID 0&#xff08;条带化&#xff09;‌ ‌技术原理‌&#xff1a;数据分块后并行写入多块磁盘&#xff0c;无…

鸿蒙 Location Kit(位置服务)

移动终端设备已经深入人们日常生活的方方面面&#xff0c;如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动&#xff0c;都离不开定位用户终端设备的位置。 Location Kit 使用多种定位技术提供服务&#xff0c;可以准确地确定设备在室外/室…

二叉树深搜:在算法森林中寻找路径

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、搜索算法 二、回溯算法 三、例题讲解 3.1. 计算布尔二叉树的值 3.2. 求根节点到叶节点数字之和 3.3. 二叉树剪枝 3.4. 验证二叉搜索树 3.5. 二叉搜索树中第 K 小的元素 3.6. 二叉树的所有路径 …

企业级AI搜索解决方案:阿里云AI搜索开放平台

随着信息技术的飞速发展&#xff0c;搜索引擎作为信息获取的重要工具&#xff0c;扮演着不可或缺的角色。阿里云 AI 搜索开放平台以其强大的技术支持和灵活的开放性&#xff0c;持续为用户提供高效的搜索解决方案。 一、阿里云 AI 搜索开放平台 一站式的 AI 搜索开放平台作为…

自动驾驶中的预测控制算法:用 Python 让无人车更智能

自动驾驶中的预测控制算法:用 Python 让无人车更智能 自动驾驶技术近年来取得了令人惊叹的进步,AI 与边缘计算的结合让车辆能够实时感知环境、规划路径并执行驾驶决策。其中,预测控制(Model Predictive Control,MPC) 作为一种先进的控制算法,凭借其对未来驾驶行为的优化…

量子计算机超越超级计算机——它们解决了哪些问题?

“ 南加州大学的研究人员取得了重大突破&#xff0c;证明量子计算机在解决某些复杂问题时甚至可以胜过最快的超级计算机。” 量子退火最终显示出扩展优势&#xff0c;得益于错误抑制的量子处理&#xff0c;它比传统超级计算机提供更快、接近最优的解决方案。 南加州大学的研究人…

Java虚拟机 -方法调用

方法调用 方法调用静态链接动态链接案例虚方法与非虚方法虚方法&#xff08;Virtual Method&#xff09;非虚方法&#xff08;Non-Virtual Method&#xff09; 方法返回地址 方法调用 我们编写Java程序的时候&#xff0c;我们自己写的类通常不仅仅是调用自己本类的方法。调用别…

【 开源:跨平台网络数据传输的万能工具libcurl】

在当今这个互联互通的世界中&#xff0c;数据在各种设备和平台之间自由流动&#xff0c;而 libcurl&#xff0c;就像一把跨平台的万能工具&#xff0c;为开发者提供了处理各种网络数据传输任务所需的强大功能。它不仅是一个库&#xff0c;更是一种通用的解决方案&#xff0c;可…

ElasticSearch 8.x 快速上手并了解核心概念

目录 核心概念概念总结 常见操作索引的常见操作常见的数据类型指定索引库字段类型mapping查看索引库的字段类型最高频使用的数据类型 核心概念 在新版Elasticsearch中&#xff0c;文档document就是一行记录(json)&#xff0c;而这些记录存在于索引库(index)中, 索引名称必须是…

优化 CRM 架构,解锁企业竞争力密码

引言 “在所有企业面临的挑战中&#xff0c;客户关系管理无疑是最为关键的一环。” —— 彼得德鲁克 在数字化浪潮席卷的当下&#xff0c;企业面临着前所未有的机遇与挑战。客户关系管理&#xff08;CRM&#xff09;作为企业运营的核心环节&#xff0c;其架构的优劣直接影响着…

深入理解Docker和K8S

深入理解Docker和K8S Docker 是大型架构的必备技能&#xff0c;也是云原生核心。Docker 容器化作为一种轻量级的虚拟化技术&#xff0c;其核心思想&#xff1a;将应用程序及其所有依赖项打包在一起&#xff0c;形成一个可移植的单元。 容器的本质是进程&#xff1a; 容器是在…

list.forEach(s -> countService.refreshArticleStatisticInfo(s.getId())); 讲解一下语法

这段代码使用了Java中的forEach方法结合Lambda表达式来遍历一个列表&#xff0c;并对列表中的每个元素执行特定操作。具体来说&#xff0c;它会遍历列表中的每一个元素&#xff0c;并调用countService.refreshArticleStatisticInfo(s.getId())方法来刷新每个文章的统计信息。下…

AI开发者的算力革命:GpuGeek平台全景实战指南(大模型训练/推理/微调全解析)

目录 背景一、AI工业化时代的算力困局与破局之道1.1 中小企业AI落地的三大障碍1.2 GpuGeek的破局创新1.3 核心价值 二、GpuGeek技术全景剖析2.1 核心架构设计 三、核心优势详解‌3.1 优势1&#xff1a;工业级显卡舰队‌‌‌3.2 优势2&#xff1a;开箱即用生态‌3.2.1 预置镜像库…