四、使用Spring AI实现MCP Client调用MCP Server

news/2025/11/27 16:18:30/文章来源:https://www.cnblogs.com/laoluo2025/p/19277359

四、使用Spring AI实现MCP Client调用MCP Server

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

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

参考资料:

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

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

spring AI实战:mcp客户端_spring-ai-starter-mcp-client-CSDN博客

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

1、创建SpringBoot工程

150ced72-d516-4ba2-807a-aa58fba83f15

3fdb7370-f12f-4cb9-a3af-abd81b189f48

1.1、application.yml

配置文件定义了一个基于 Spring AI 的异步 MCP 客户端,调用了SSE 和 Stdio 两种MCP服务,

server1采用SSE方式,连接指向http://localhost:9090;

server2采用Stdio 方式,Stdio 通过 Java 命令启动,指定 Jar 文件位置。

同时集成大模型qwen3-max。读者需要把api-key替换为自己的key进行测试验证。

server:port: 8896spring:ai:mcp:client:enabled: truename: springai_mcp_clientversion: 1.0.0request-timeout: 30stype: ASYNCtoolcallback:enabled: truesse:connections:server1:url: http://localhost:9090stdio:connections:server2:command: javaargs:- -Dspring.ai.mcp.server.stdio=true- -Dspring.main.web-application-type=none- -Dspring.main.banner-mode=off- -Dfile.encoding=UTF-8- -jar- D:\workspace\springAI\springboot-ai-demo\springai_mcp_stdio_server\target\springai_mcp_stdio_server-0.0.1-SNAPSHOT.jaropenai:# 注意去掉 /v1,Spring AI 会自动补base-url: https://dashscope.aliyuncs.com/compatible-modeapi-key: ${BAILIAN_API_KEY}chat:options:#模型名称: qwen-plus  deepseek-v3  deepseek-r1model: qwen3-max

1.2、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.5.8</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.youzhuo</groupId><artifactId>springai_mcp_client</artifactId><version>0.0.1-SNAPSHOT</version><name>springai_mcp_client</name><description>springai_mcp_client</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.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client</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、新建client

@SpringBootApplication
public class SpringaiMcpClientApplication {public static void main(String[] args) {SpringApplication.run(SpringaiMcpClientApplication.class, args);}@Beanpublic CommandLineRunner predefinedQuestions(ChatClient.Builder chatClientBuilder,ToolCallbackProvider tools,ConfigurableApplicationContext context) {return args -> {// 构建ChatClient并注入MCP工具var chatClient = chatClientBuilder.defaultToolCallbacks(tools).build();// 创建Scanner对象用于接收用户输入Scanner scanner = new Scanner(System.in);System.out.println(">>> 欢迎使用问答系统!输入'exit'退出程序。");while (true) {// 提示用户输入问题System.out.print("\n>>> QUESTION: ");String userInput = scanner.nextLine();// 如果用户输入"exit",则退出循环if ("exit".equalsIgnoreCase(userInput)) {System.out.println(">>> 已退出问答系统。");break;}// 使用ChatClient与LLM交互try {System.out.println("\n>>> ASSISTANT: " + chatClient.prompt(userInput).call().content());} catch (Exception e) {System.out.println("\n>>> ERROR: 无法处理您的请求,请稍后再试。");e.printStackTrace();}}// 关闭Spring上下文context.close();scanner.close();};}
}

3、运行测试

先启动MCP Server服务,再运行MCP Client,进行AI对话,观察日志输出结果,确定是否理解了用户的输入信息,并分别调用了对应的MCP Server服务。
6edcbb9b-4f45-4c0a-af83-1769eb8c6332

2aea0a16-da23-4be0-b82e-20278d501f5f

6ebd3a18-fdbe-46e9-9d21-ae29455da716

be8c5824-56a5-44a2-b275-803abac8f112

06939f0a-af21-462c-b1bf-8a996385b745

观察输出结果:

  1. 提问“你是谁?”,大模型回答:“我是你的智能助手,可以帮你完成各种任务,比如进行数学计算、查询天气、获取当前时间,甚至设置闹钟等。有什么我可以帮你的吗?”

说明大模型已经发现了时间和天气预报、算术运算两个MCP服务。

  1. 提问“宁波的天气怎么样?”,大模型回答:“抱歉,未能查询到宁波的天气信息。请确认城市名称是否正确,或者尝试其他方式获取天气预报。” 再问:“北京的天气呢?”大模型的回答:“北京的天气是晴空万里!”。调用了基于sse协议的MCP Server,可以到该服务后台查看日志,确定是否被调用。
  2. 提问“4的平方根是多少?”,大模型的回答:“4的平方根是2.0”。调用了基于stdio协议的MCP Server,可以到.log日志文件中查看日志,确定是否被调用。

通过验证结果表明:大模型根据用户的提问,选择了合适的工具进行回答,分别调用了对应的MCP Server服务。

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

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

相关文章

2025长沙西点培训学校TOP5权威推荐:长沙欧米奇专业吗?

职业技能培训市场中,西点领域因低门槛、高潜力成为转型热门赛道,但行业乱象丛生:62%学员遭遇理论空转、就业无门问题,小机构教学设备陈旧、师资流动性大,导致学员技能与市场脱节。面对选择困境,本榜单基于教学实…

2025年11月蒸汽发生器品牌评价排行:行业数据与用户场景化分析

随着工业领域对高效节能设备需求的持续增长,蒸汽发生器作为热能供应核心设备,其选择成为许多企业用户关注的重点。2025年,在双碳政策推动和制造业智能化升级背景下,蒸汽发生器市场呈现技术迭代加速、能效标准提升、…

Android开发TextView字体大小自适应实现

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="28"android:maxLines="1" //必须指定最大多少行或者指定高度,这里…

我的机器人制作流程

起兴莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。 2025-11-24 23:55:13 星期一写在前面 这篇博客方便知识点的记录和日后的学而时习之。笔者梦到哪里写到哪里,如有不对之处,请读者纠正见…

解决Unity中使用C#自带类库没有代码提示的问题

欢迎前往我的B站查看该内容视频:https://www.bilibili.com/video/BV1wutozQEYS/问题描述 在Unity中书写代码时,使用C#自带的类库时,不会显示注释文字 预期:问题:原因 Unity中的netstandard.dll不包含xml注释,手动…

球缺与球台公式完整总结表

球缺与球台公式完整总结表 基本定义球缺:球被一个平面截下的部分,形状如帽子或碗 球台:球被两个平行平面截下的中间部分,形状如桶或带通用参数球半径:\(R\) 球缺高:\(h\) 球台高:\(h\) 底面半径:\(r\)(球缺)…

基于MATLAB实现的PSO优化BP神经网络

基于MATLAB实现的PSO优化BP神经网络的代码,结合了粒子群优化算法(PSO)和BP神经网络,用于提高预测精度。 1. 初始化参数 % 清除环境变量 clear; clc;% 定义BP神经网络结构 inputLayerSize = 7; % 输入层节点数 hidd…

2025年十大高压旧电缆回收公司排行榜,金属电缆回收厂家推荐

为帮助企业、工厂及个人精准锁定合规、高效的废旧电缆回收合作伙伴,避免资源浪费与经济损失,我们从回收资质合规性(如环保认证、质量管理体系认证)、技术处理能力(如铜铝提纯效率、资源回收率)、服务响应速度(含…

2025年中国仿真模拟商家满意度榜单:行业口碑与个性化定制能

本榜单基于全国200+企业客户深度调研、真实项目交付数据及行业专家评审,从技术实力、定制化能力、售后服务、客户留存率四大维度筛选标杆企业,为科研机构、工业企业选型提供客观参考,助力精准匹配能解决真实需求的仿…

2025 年 11 月牙刷品牌权威推荐榜:涵盖软毛/电动/儿童/便携/声波/护龈/脱敏/旋转式/超软毛/深层清洁牙刷的全方位口腔护理精选指南

2025 年 11 月牙刷品牌权威推荐榜:涵盖软毛/电动/儿童/便携/声波/护龈/脱敏/旋转式/超软毛/深层清洁牙刷的全方位口腔护理精选指南 随着人们对口腔健康意识的不断提升,牙刷作为日常口腔护理的基础工具,其技术迭代与…

2025年花都人气湘菜馆TOP5推荐,花都菜品好的湘菜馆与旅

在广州花都的美食版图中,湘菜馆是极具烟火气的存在。对于食客而言,如何在众多湘菜馆里找到口味地道、人气爆棚、适合旅游打卡的店?以下结合花都人气湘菜馆花都菜品好的湘菜馆花都湘菜馆旅游打卡地三大关键词,为你推…

更年期综合征调理产品推荐:从传统中成制剂到前沿疗法,精准避坑攻略

前言:认识更年期综合征 更年期是女性从生育期向老年期过渡的关键阶段,因卵巢功能衰退、雌激素水平波动,常伴随潮热盗汗、失眠心悸、情绪波动、关节疼痛等身心不适。中国疾病预防控制中心调查显示,40-60岁女性中约4…

懒人必藏!小程序推荐休闲游戏,十款挂机休闲神作,躺着也能享受乐趣

在快节奏的现代生活中,我们都需要一点“躺平”时光。无需下载、点开即玩的微信小程序游戏,就成了放松身心的完美选择。今天,就为各位“懒人”玩家精心挑选十款挂机、休闲神作,让你躺着也能享受游戏的乐趣!第一名:…

租用美国服务器的网站能做些什么

美国服务器凭借带宽充足(1Gbps起步)、IP资源丰富、内容限制少和全球覆盖优势,成为各类网站的理想选择。以下是租用美国服务器可搭建的主要网站类型及应用场景:美国服务器凭借带宽充足(1Gbps起步)、IP资源丰富、内容限…

boringssl中0-RTT的错误码

本文分享自天翼云开发者社区《boringssl中0-RTT的错误码》.作者:沈****扬 在TLS协议中,0-RTT(零往返时间)是指在某些情况下,客户端可以在第一个往返(RTT)中就开始发送加密的应用数据,而不需要等待完整的TLS握手…

2025年快开盲板优质生产商服务商排行榜,最新测评精选供应

为帮助石油化工、海洋工程等领域企业精准锁定适配的快开盲板合作方,避免因产品密封失效、耐压不足导致的安全事故与成本损耗,我们从技术壁垒(如高压密封可靠性、结构疲劳寿命)、生产实力(自动化产线占比、核心部件…

再议求函数定义域中的一类难懂易错题目

求函数定义域中的一类难懂易错题目前情概要 在高一数学的学习中,开学伊始,往往会学到函数的概念,虽说学生对此并不陌生,但要真正理解还不是一件简单的事情。尤其是碰到求函数定义域中的一类难懂易错题目,往往非常…

长文本溢出展开/收起功能

长文本溢出展开/收起功能* { margin: 0; padding: 0; box-sizing: border-box; font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif } \3c pre>\3c code> body { background: linear-g…

2025 年 11 月冲牙器品牌权威推荐榜:涵盖声波脉冲、便携迷你、智能变频及儿童专用,全方位洁净体验与创新科技深度解析

2025 年 11 月冲牙器品牌权威推荐榜:涵盖声波脉冲、便携迷你、智能变频及儿童专用,全方位洁净体验与创新科技深度解析 随着口腔健康意识的提升和消费升级趋势的深化,冲牙器市场正迎来快速增长期。根据行业数据显示,…