Spring AI集成MCP Client

news/2025/11/28 13:42:31/文章来源:https://www.cnblogs.com/changelzj/p/19282218

 

在其他地方查看文章:https://blog.liuzijian.com/post/spring-ai/2025/11/08/spring-ai-mcp-client/

 

 

1.MCP概述

MCP(Model Context Protocol),即模型上下文协议,是一种开放标准,使大模型采用统一的标准化的方式与外部的工具和数据等进行通信交互。

之前提到,大模型可以通过Tools(Function calling)来实现一些获取信息和操作数据的功能,如果我们自定义好了一些公共的工具给别人用,例如提供实时日期信息、天气信息,股市交易信息、汇率信息等,想要开放给很多大模型来使用,如果没有标准化的接口,每产生一个大模型应用就要适配一次,MCP协议为解决这一问题而生,现在我们实现的工具只需要面向MCP接口协议进行开发,大模型也遵循MCP规范进行接入使用,这个问题就解决了,我们实现的服务就叫MCP服务端,大模型实现的就是MCP的客户端。

MCP协议产生于2024年,具体协议内容可见:https://modelcontextprotocol.io/docs/getting-started/intro

2.调用MCP

MCP调用方式有三种,SSE,streamable-http和Stdio,SSE和streamable-http以http方式调用部署好的远程MCP服务器上的MCP,Stdio是将MCP的源码下载到本地打成软件包,使用Spring AI驱动npx或uvx等命令来本地调用软件包中的MCP,其中常见的TypeScript编写的MCP需要由npx调用,Python编写的MCP需要由uvx调用,其他语言也有其他语言MCP的调用方式。

我使用的Spring AI 1.0.3版本不支持streamable-http,在远程调用modelscope时需要在modelscope上修改接口为SSE模式。从1.1.0版本开始支持了streamable-http

以部署在modelscope上面的12306-mcp为例,分别介绍SSE远程调用和Stdio模式本地调用。12306-mcp是一个查询铁路12306平台,返回列车订票信息的MCP应用

  • modelscope https://www.modelscope.cn/mcp/servers/@Joooook/12306-mcp
  • github https://github.com/drfccv/mcp-server-12306

2.1 SSE调用MCP

pom中引入调用MCP需要的spring-ai-starter-mcp-client依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.5.7</version>
</parent><dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.3</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-deepseek</artifactId></dependency><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client</artifactId></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>21</source><target>21</target><encoding>UTF-8</encoding></configuration></plugin></plugins>
</build>

application.yml中配置一个modelscope上面开放的MCP工具12306-mcp

spring:ai:mcp:client:enabled: truename: spring-ai-agenttype: asyncsse:connections:12306-mcp:url: https://mcp.api-inference.modelscope.net/sse-endpoint: /********/ssedeepseek:base-url: https://api.deepseek.comapi-key: ${DEEP_SEEK_KEY}logging:level:io.modelcontextprotocol: DEBUGorg.springframework.ai.mcp: DEBUG

配置类中,将外部MCP工具ToolCallbackProvider注入并和ChatClient进行绑定

package org.example.config;import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.deepseek.DeepSeekChatModel;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class AppConfig {@Beanpublic ChatClient chatClient(DeepSeekChatModel model, ChatMemory chatMemory, ToolCallbackProvider toolCallbackProvider) {return ChatClient.builder(model).defaultAdvisors(SimpleLoggerAdvisor.builder().build(),MessageChatMemoryAdvisor.builder(chatMemory).build()).defaultToolCallbacks(toolCallbackProvider).build();}}

对话接口和以往完全一样

package org.example.controller;import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;@RestController
@RequestMapping("ai")
public class ChatController {@Resourceprivate ChatClient chatClient;//127.0.0.1:8080/ai/chat-stream?msg=你是谁&chatId=001@GetMapping(value = "chat-stream", produces = "text/html;charset=utf-8")public Flux<String> stream(String msg, String chatId) {return chatClient.prompt().user(msg).advisors(advisor -> advisor.param(ChatMemory.CONVERSATION_ID, chatId)).stream().content();}
}

大模型已经能在对话中调用MCP了

2.2 Stdio调用MCP

因为是本地调用,所以需要先将这个MCP的源码clone并安装到本地,因为这个MCP是TS语言编写,因此还需要用npm将其安装到本地。

git clone https://github.com/Joooook/12306-mcp.gitcd 12306-mcp npm i

运行前,如未安装npx,还需要全局安装npx,用于被Spring AI驱动本地运行MCP

npm i -g npx

根据MCP的标准,Stdio模式将MCP按一定格式配置到JSON文件中

{"mcpServers": {"12306-mcp": {"args": ["-y","12306-mcp"],"command": "npx"}}
}

modelscope上面给出的JSON格式是Mac/Linux的,如果是Windows系统,需要修改:

{"mcpServers": {"12306-mcp": {"command": "cmd","args": ["/c","npx","-y","12306-mcp"]}}
}

将配置文件放入类路径下,同application.yml放在一级,这里将这个json文件命名为mcp-server.json,并将配置放入spring ai

spring:ai:mcp:client:enabled: truename: spring-ai-agenttype: syncstdio:servers-configuration: classpath:mcp-server.jsondeepseek:base-url: https://api.deepseek.comapi-key: ${DEEP_SEEK_KEY}logging:level:io.modelcontextprotocol: DEBUGorg.springframework.ai.mcp: DEBUG

启动后,可见日志

2025-11-09T12:15:07.418+08:00  INFO 39432 --- [pool-5-thread-1] i.m.c.transport.StdioClientTransport     : STDERR Message received: 12306 MCP Server running on stdio @Joooook

运行起来是相同的效果

2.3 续:Streamable-HTTP调用MCP

2025年11月14日前后,Spring AI 1.0.0发布,支持了Streamable-HTTP方式,只需要修改版本号,然后做以下配置即可:

spring:ai:mcp:client:enabled: truename: spring-ai-agenttype: asyncstreamable-http:connections:12306-mcp:url: https://mcp.api-inference.modelscope.net/endpoint: /********/mcp
 

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

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

相关文章

2025 年 11 月管理咨询公司权威推荐榜:战略规划与组织变革领域十大专业机构深度解析

2025 年 11 月管理咨询公司权威推荐榜:战略规划与组织变革领域十大专业机构深度解析 在当今快速变化的商业环境中,战略规划与组织变革已成为企业持续发展的核心驱动力。随着数字化转型加速、市场竞争加剧以及全球化进…

2025英国留学中介机构

2025英国留学中介机构一、2025年英国留学中介选择指南作为从业12年的国际教育规划师,我经常遇到学生和家长咨询如何筛选可靠的英国留学中介。在2025年,英国留学申请人数持续增长,据《全球教育趋势报告》数据,中国赴…

精华液哪个牌子最好用?紧致提拉、美白亮肤、屏障修护全解析

在护肤品市场中,精华液因其高浓度活性成分与针对性功效,成为功能型护肤的核心环节。随着科研技术发展,多肽抗老、美白亮肤以及屏障修护等技术日趋成熟,精华液能够针对不同肌肤问题提供精准改善。本篇评测基于专业机…

2025上海留学中介服务哪个好

2025上海留学中介服务哪个好一、2025上海留学中介服务如何选择作为从业十二年的国际教育规划师,我经常被上海的学生和家长询问:"2025年上海地区哪家留学中介更值得信赖?" 这个问题的答案需要结合多方因素…

2025留学香港研究生哪个中介好一点

2025留学香港研究生哪个中介好一点一、2025年留学香港研究生如何选择中介机构作为从业12年的国际教育规划师,我经常被学生和家长询问:“2025年申请香港研究生,哪家留学中介更可靠?”这个问题在搜索引擎上高频出现,…

2025杭州英国留学机构排名

2025杭州英国留学机构排名一、2025年杭州英国留学机构排名解读作为从事国际教育规划工作8年的资深顾问,我注意到许多杭州学生在选择英国留学机构时普遍存在三个核心疑问:如何验证机构的本地服务能力、如何评估文书质…

2025北京复印机租赁服务TOP5权威推荐:降本增效避坑指南

办公场景中,企业对高效、低成本的复印机解决方案需求日益迫切。2024年北京OA设备租赁市场规模突破120亿元,年增速达32%,但超30%的企业反馈曾遭遇设备品控差、服务响应慢、隐性收费等问题——某律所因租赁商维修不及…

python打包apk

将 Python 代码打包成 Android 可执行程序(.apk 或 .aab),核心是通过「中间层框架」将 Python 运行时、代码与 Android 原生环境(Java/Kotlin)整合。由于 Android 系统原生不支持 Python 解释器,需借助第三方工具…

CF1824C

Sol 首先注意到答案就是 \(1\) 把子树内所有叶子都变为 \(0\) 的最小代价,那么考虑 DP,设 \(f_{i,j}\) 表示 \(i\) 子树里面叶子全部改成 \(j\) 的最小代价,不难发现不同的 \(j\) 代价不会超过 \(1\)。 那么直接记录…

记游Noip

吾初试Noip,而已高一尔。不称迟乎? 乙巳丁亥庚子,日阙壹 日方升,至机室,为习数论也。 午时过。模拟赛取缔而代之以体育也。不知其故。盖教者未尝寻得赛题简易以致可称信心赛尔。 体育后,复习数论,呕哑嘲哳难为听…

2025年重庆口碑不错的西点烘焙培训机构排名:有实力的西点烘

本榜单依托全维度市场调研与真实学员口碑,深度筛选出五家标杆机构,为西点技能学习者选型提供客观依据,助力精准匹配适配的教育伙伴。 TOP1 推荐:重庆欧米奇西点西餐学校 推荐指数:★★★★★ 口碑评分:重庆及周边…

2025年重庆西式餐饮教育机构排名,重庆欧米奇西点西餐学校的

为帮不同需求的学员精准锁定适配的西式餐饮教育机构,避免择校走弯路,我们从品牌知名度、师资力量、规模实力、教学成果、学员口碑五大核心维度展开深度评估,终筛选出2025年的5家专业西式餐饮教育机构。 TOP1 推荐:…

LuatOS实战:64位数据处理的实践与优化!

在LuatOS开发中,64位数据处理不仅需要实现基础功能,还需兼顾性能与稳定性优化。本文从实践角度出发,探讨LuatOS中64位数据处理的实现方法,并深入分析性能优化策略,如减少运算开销、优化内存使用等,通过实战案例展…

ubuntu掉驱动

https://zhuanlan.zhihu.com/p/16617931696

C#开发后端:API 控制器(Controller) - 教程

C#开发后端:API 控制器(Controller) - 教程2025-11-28 13:15 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: …

python 关于ASCII 码的常见操作示例

以下是Python中关于ASCII的常用操作示例及执行结果,涵盖字符转换、字符串处理、编码解码等核心场景: 1. 字符与ASCII码互转单字符转换 ord(A) 返回65,chr(65) 返回A。 示例输出:字符 A 的ASCII码是: 65 ASCII码 …

2025年厦门公司注册代理公司推荐:服务不错、信誉好的公司注

本榜单基于厦门本地市场调研与企业真实口碑,聚焦公司注册代理核心需求,筛选出5家专业机构,为企业(尤其是初创及中小企业)提供客观选型参考,助力高效解决工商注册、财税配套等初创痛点。 TOP1 推荐:厦门知联中…

超强汇总!9款免费降AIGC神器让你告别AI写作痕迹 - BUAA

在写论文或者做内容创作的时候,AIGC(就是人工智能生成的内容)确实能帮我们省好多时间,效率一下就上去了。但问题是,AI写的东西有时候会留下明显的痕迹,这就容易被检测出来。不管是写论文还是日常写文案,要是想让…

洛谷 P2071:座位安排 ← 二分图 + 匈牙利算法 + 二分图最大匹配

​​【题目来源】https://www.luogu.com.cn/problem/P2071【题目描述】已知车上有 N 排座位,有 2N 个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最多使多少人坐到自己想坐的位置。【输入格式】…

ASCII 码表常用符号

ASCII(美国信息交换标准代码)定义了128个字符,其中包括控制字符和可打印字符。以下是一些常用的ASCII字符及其分类和详细说明: 一、控制字符(不可打印,用于设备控制) 控制字符主要用于控制硬件设备(如打印机、…