三、使用Spring AI实现基于stdio协议的MCP Server

news/2025/11/27 15:20:59/文章来源:https://www.cnblogs.com/laoluo2025/p/19276622

三、使用Spring AI实现基于stdio协议的MCP Server

==================================================================================

==================================================================================

参考资料:

==================================================================================

同第一篇《一、MCP和Spring AI MCP》参考资料

==================================================================================

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

优点:

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

缺点:

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

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

优点:

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

缺点:

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

基于stdio的MCP服务端通过标准输入输出流与客户端通信,适用于作为子进程被客户端启动和管理的场景,非常适合嵌入式应用。

1、创建SpringBoot工程

484e8b78-149e-415c-96dd-c211d16abca1

4bdd7566-8a17-47b2-896a-c000e9b83669

1.1、application.yml

spring:ai:mcp:server:name: springai_mcp_stdio_server  # MCP服务器名称version: 1.0.0  # 服务器版本号

1.2、pom.xml

MCP Server有三个常用依赖:

spring-ai-starter-mcp-server:支持STDIO(标准流)传输的核心服务器
spring-ai-starter-mcp-server-webmvc:基于Spring MVC的SSE传输实现
spring-ai-starter-mcp-server-webflux:基于Spring WebFlux的SSE传输实现

这里我们选择基于Spring WebFlux的SSE传输实现实现方式。

<?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.5.8</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.youzhuo</groupId><artifactId>springai_mcp_stdio_server</artifactId><version>0.0.1-SNAPSHOT</version><name>springai_mcp_stdio_server</name><description>springai_mcp_stdio_server</description><url/><licenses><license/></licenses><developers><developer/></developers><scm><connection/><developerConnection/><tag/><url/></scm><properties><java.version>17</java.version><spring-ai.version>1.1.0</spring-ai.version></properties><dependencies><dependency><groupId>org.springframework.ai</groupId>
<!--            <artifactId>spring-ai-starter-mcp-server</artifactId>--><artifactId>spring-ai-starter-mcp-server-webflux</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>${spring-ai.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

2、配置log日志

在resources目录下,新建一个log日志配置文件logback-spring.xml,目的是记录MCP Server端的接口是否被调用。

<configuration><!-- 定义日志文件存储的路径,可以使用Spring的属性占位符 --><property name="LOGS_PATH" value="${user.dir}/logs"/><appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOGS_PATH}/springai_mcp_stdio_server.log</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOGS_PATH}/springai_mcp_stdio_server.%d{yyyy-MM-dd}.%i.log</fileNamePattern><maxFileSize>10MB</maxFileSize><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><root level="INFO"><appender-ref ref="FILE" /></root>
</configuration>

3、新建计算器工具服务类

创建一个MathTools类,模拟计算器服务,通过@Tool注解把方法标注为MCP服务接口。

@Service
public class MathTools {private static final Logger log = LoggerFactory.getLogger(MathTools.class);@Tool(description = "将两个数相加")public double add(double x, double y) {log.info("CalculatorTools的add被调用了: x={}, y={}", x, y);return x + y;}@Tool(description = "将两个数相减")public double subtract(double x, double y) {log.info("CalculatorTools的subtract被调用了: x={}, y={}", x, y);return x - y;}@Tool(description = "将两个数相乘")public double multiply(double x, double y) {log.info("CalculatorTools的multiply被调用了: x={}, y={}", x, y);return x * y;}@Tool(description = "将两个数相除")public double divide(double x, double y) {if (y == 0) {throw new IllegalArgumentException("除数不能为零");}log.info("CalculatorTools的divide被调用了: x={}, y={}", x, y);return x / y;}@Tool(description = "计算平方根")public double sqrt(double x) {if (x < 0) {throw new IllegalArgumentException("不能对负数开平方根");}log.info("CalculatorTools的sqrt被调用了: x={}", x);return Math.sqrt(x);}
}

4、注册为MCP工具

将 MathTools封装为工具回调提供者(ToolCallbackProvider),便于被MCP Client端发现和调用。

@SpringBootApplication
public class SpringaiMcpStdioServerApplication {private static final Logger log = LoggerFactory.getLogger(SpringaiMcpStdioServerApplication.class);public static void main(String[] args) {SpringApplication.run(SpringaiMcpStdioServerApplication.class, args);log.info("=============================================");log.info("SpringaiMcpStdioServerApplication服务启动成功");log.info("=============================================");}@Beanpublic ToolCallbackProvider calculatorTools(MathTools mathTools) {return MethodToolCallbackProvider.builder().toolObjects(mathTools).build();}
}

通过Spring AI创建的MCP Stdio Server完成了。

stdio方式是server和client通过进程通信,所以需要把server打包成jar,以便client命令启动执行。

通过maven工具打包即可,打包后路径为:{项目工程目录}\target\springai_mcp_stdio_server-0.0.1-SNAPSHOT.jar。

5、测试Mcp Stdio服务是否发布成功

启动项目,测试服务是否启动成功

启动项目,验证服务是否启动成功。
e8f013a4-6fd2-4211-bcf6-aa9cb390894f
在日志文件中可以看出工具注册成功,服务也启动成功
d1546d40-24f8-4ccd-a99f-dee82baa0733

6、使用bat启动jar,方便MCP Client调用

在{项目工程目录}下新建run_mcp_stdio_server.bat

java -Dspring.ai.mcp.server.stdio=true -Dspring.main.web-application-type=none -Dspring.main.banner-mode=off -Dfile.encoding=UTF-8 -jar target/springai_mcp_stdio_server-0.0.1-SNAPSHOT.jar
pause

启动bat文件,验证服务是否启动成功。

至此,我们通过spring ai框架开发完成了2个MCP Server服务,一个通过sse协议发布,另一个通过stdio协议发布,接下来,开发一个MCP Client端,调用这两个MCP Server服务。

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

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

相关文章

DB2数据库关闭归档模式

db2 connect to micsoccdb2 update db cfg using LOGARCHMETH1 offdb2 terminatedb2stop forcedb2start

家长必看!2025-2026申请季A-Level全日制机构排名(6 家头部详解+三大梯队)

2025年A-Level考试正迎来重大变革。继CAIE考试局宣布在中国考区对数学、进阶数学等六大学科启用独立命题后,爱德思考试局也在6月数学P1-P4单元推出专属"区域卷"。两大考试局虽强调此举旨在提升考试安全与公…

国标GB28181算力算法平台EasyGBS视频监控系统在多领域创新应用

在视频监控与物联网高速发展的今天,海量设备接入、视频数据汇聚与智能分析成为了行业数字化的核心挑战。作为遵循国标GB28181协议的核心平台之一,国标GB28181算法算力平台EasyGBS视频智能服务平台早已超越了传统视频…

南昌滑雪场推荐!七星岭国际滑雪场:解锁冬日限定速度与激情

冬天的仪式感,总少不了一场与雪的亲密邂逅。不想远赴东北,又想在银装素裹中尽情撒欢?南昌周边藏着一处宝藏滑雪地 ——七星岭国际滑雪场,驱车2小时就能抵达,无需长途跋涉,就能解锁冬日限定的速度与激情。 一、2小…

体育赛事赋能创新 亚运奥运多维突破

2025-11-27 17:13:57 体育赛事赋能创新 亚运奥运多维突破|@dOd.HrBfUdOnG.cN@||@dOe.hRbFuDoNg.Cn@||@dOf.HrBfUdOnG.cN@||@dOg.hRbFuDoNg.Cn@||@dOh.HrBfUdOnG.cN@||@dOi.hRbFuDoNg.Cn@||@dUl.ShEnGYuAnRaCkS.cOm@||@…

2025 年 11 月铁盒厂家推荐排行榜,食品铁盒/保健品铁盒/化妆品铁盒/茶叶铁盒/磁吸铁盒/异形铁盒,精选耐用设计与定制工艺之选

2025 年 11 月铁盒厂家推荐排行榜,食品铁盒/保健品铁盒/化妆品铁盒/茶叶铁盒/磁吸铁盒/异形铁盒,精选耐用设计与定制工艺之选 在当今包装产业中,铁盒凭借其出色的密封性、耐用性和环保特性,已成为食品、保健品、化…

2025年下半年冷再生机租赁/水泥板破碎机出租公司前五推荐

随着2025年下半年基建行业的持续发展,冷再生机租赁市场呈现蓬勃态势。本文基于行业调研数据,为工程承包商和施工企业提供五家值得考虑的冷再生机租赁服务商推荐榜单。排名不分先后,仅作参考选择,其中江苏环硕建设有…

详细介绍:【Linux权限 (二)】Linux权限机制深度解析:umask如何决定默认权限与粘滞位的妙用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

SAT提分哪家强?2025杭州/上海6大顶尖机构测评,锁定名校offer

2025年美本、加本及新加坡本科申请季已进入关键冲刺阶段,一份具有竞争力的SAT成绩单,正是杭州、上海学子在万级申请者中脱颖而出的核心筹码。作为长三角留学申请核心城市,杭州、上海的SAT培训市场机构林立,但质量参…

2025年如何选择优质的火锅桌生产厂家?

在选择合适的现代轻奢风火锅桌生产厂家时,首先需要明确自身的需求,包括风格、尺寸和功能等。厂家提供的设计方案与材料选择应符合现代轻奢风格,展示出细腻与高端感。同时,评估厂家的技术实力和生产规范也十分关键,…

2025 年 11 月留香阁食品推荐排行榜,预制菜/调理半成品/咀留香/黑椒牛排,精选优质食材与创新工艺,满足便捷餐饮与家庭烹饪的多重需求!

2025 年 11 月留香阁食品推荐排行榜:预制菜与调理半成品行业深度解析 行业背景与发展趋势 预制菜与调理半成品行业近年来呈现爆发式增长态势,这背后反映了现代生活节奏加快与消费升级的双重驱动。随着城市化进程加速…

多元体育竞技优化 赛事亚运奥运实战赋能

2025-11-27 16:41:18 多元体育竞技优化 赛事亚运奥运实战赋能|@dEt.SpRiNg-YoUnG.cOm@||@dEu.sPrInG-YoUnG.COM@||@dEv.SpRiNg-YoUnG.cOm@||@dEw.sPrInG-YoUnG.COM@||@dEx.SpRiNg-YoUnG.cOm@||@dEy.sPrInG-YoUnG.COM@|…

拥抱现代:C++ 的蜕变与核心特性概览

自 C++11 标准发布以来,C++ 语言经历了一场深刻的变革,被称为“现代 C++”(Modern C++)。这不仅仅是简单的语法更新,更是对语言设计理念的重大升级,旨在提高代码的安全性、可读性、性能和开发效率。 现代 C++(通…

最新育儿必看,婴幼儿特应性皮炎推荐什么护肤品?纽强屏障修复专业守护

一、揪心的数据:婴幼儿特应性皮炎的隐形困扰 我国1-7岁儿童特应性皮炎发病率已攀升至12.94%,每10个宝宝中就有1个正遭受皮肤干燥、红斑、剧烈瘙痒的折磨。这种慢性复发性皮肤问题的核心症结,在于宝宝皮肤屏障功能异…

quic协议监听与Alt-Svc响应头的应用

本文分享自天翼云开发者社区《quic协议监听与Alt-Svc响应头的应用》.作者:沈****扬 QUIC是快速UDP网络连接(英语:Quick UDP Internet Connections)的缩写,是一种基于UDP协议实现的应用层可靠传输协议。目前已经被…

全球前四!京东云云海AI存储跻身IO500高性能存储榜单

近日,在最新公布的 IO500 排行榜中,京东云云海 AI 存储基于通用 NVMe 盘存储服务器,结合全栈自研软件体系与深度调优,成功跻身 IO500 生产榜单全球前四、国产自研第一。相较传统超算存储技术,云海AI存储不采用 PM…

2025 年 11 月电动伸缩门厂家权威推荐榜:悬浮门/空降闸/工业伸缩门,智能防护与耐用品质全景解析

2025 年 11 月电动伸缩门厂家权威推荐榜:悬浮门/空降闸/工业伸缩门,智能防护与耐用品质全景解析 随着城市化进程加速和智慧安防需求升级,电动伸缩门、悬浮门、空降闸及工业伸缩门作为现代出入口管理的核心设备,正迎…

体育竞技赛事赋能 全项目亚运奥运提升

2025-11-27 16:46:44 体育竞技赛事赋能 全项目亚运奥运提升|@dGh.SdSaIsHi.cOm@||@dGi.sDsAiShI.COM@||@dGj.SdSaIsHi.cOm@||@dGk.sDsAiShI.COM@||@dGl.SdSaIsHi.cOm@||@dGm.sDsAiShI.COM@||@dGn.SdSaIsHi.cOm@||@dGo.…

2025年江苏深海环境模拟设备服务商排行,卡普蒂姆的管理制度

为帮助科研院所、海洋工程企业精准筛选可靠的深海环境模拟设备合作伙伴,避免技术选型风险,我们从管理制度规范性、产品创新性、技术专业性、客户口碑及服务能力五大维度,对多家服务商展开深度评估,终梳理出2025年的…

【本不该故障系列】告别资源“不确定性”,SAE如何破解刚性交付核心困境

作者:娜米 资源的刚性交付,不是云上天生就具备的能力。当选择自建或自管理一个 Kubernetes/ECS 资源池时,就必须直面一个残酷的现实:所依赖的底层 IaaS 资源本身就是非刚性的。 阿里云上 ECS 有多代实例规格(如 g…