当前位置: 首页 > news >正文

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.xdnf.cn/news/571033.html

相关文章:

  • 安卓开发用到的设计模式(1)创建型模式
  • OpenCv高阶(十四)——LBPH人脸识别
  • 如何用 Qwen1.5-7B-Chat 模型打造高效轻量的 Python 智能助手(详细实操指南)
  • Windows在PowerShell或CMD运行 curl 命令报错 解决办法 (zx)
  • 如何支持Enhanced RTMP H.265(HEVC)
  • 蓝耘Ubantu服务器测试最新 PP-StructureV3 教程
  • linux 查看java的安装路径
  • Java面试问题基础篇
  • Wireshark 抓包工具使用
  • Visual Studio Code插件离线安装指南:从市场获取并手动部署
  • Android Framework学习八:SystemServer及startService原理
  • 鸿蒙开发——9.wrapBuilder与@BuilderParam对比解析
  • Oracle 11g post PSU Oct18 设置ssl连接(使用jks)
  • 拉普拉斯高斯(LoG)滤波器掩模的注意事项
  • 计及可再生能源不确定性的经济优化调度方法
  • AI与IT从业者的关系更似“进化催化剂“而非“职业终结者“
  • 太阳能电池IV测试设备AAA型AMG1.5太阳光模拟器
  • 道可云人工智能每日资讯|浙江省人民政府印发《关于支持人工智能创新发展的若干措施》
  • [特殊字符] 遇见Flask
  • 【HTML-4】HTML段落标签:构建内容结构的基础
  • 递归+反射+注解(动态拼接建表语句)
  • 机动车授权签字人有哪些权利和义务?
  • 【Element UI排序】JavaScript 的表格排序sortable=“custom“和 @sort-change
  • 欢乐熊大话蓝牙知识7:如何用蓝牙芯片实现一个 BLE 传感器节点?
  • SAR ADC 是选择先置位再比较,还是先比较再置位
  • 【聚合MQ管理 第一章】一个项目管理多种MQ 之 ActiveMq
  • Mac安装redis
  • epoll_wait未触发的小Bug
  • adb抓包
  • 元宇宙数字人设计大赛:往届获奖作品赏析