【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(6)——MCP Client(MCP客户端)
Spring AI框架快速入门
- Spring AI 系列文章:
- 一、什么是MCP?
- 1.1 定义
- 1.2 MCP Client架构
- 二、Spring AI 中的MCP
- 2.1 MCP Java SDK
- 2.2 MCP Java SDK的架构
- 三、MCP-Client示例演示
- 3.1 Stdio模式
- 3.1.1 安装NodeJS
- 3.1.2 安装Playwright
- 3.1.3 导入maven依赖
- 3.1.4 配置文件
- 3.1.5 测试代码
- 3.1.6 演示效果
- 3.2 SSE模式
- 3.2.1 获取高德API KEY
- 3.2.2 部署高德MCP-Server
- 3.2.3 配置文件
- 3.2.4 测试代码
- 3.2.5 演示效果
- 3.2.6 SSE其他例子
- 四、总结
Spring AI 系列文章:
【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(1)——Chat Client API
【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(2)——Prompt(提示词)
【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(3)——Structured Output Converter(结构化输出转换器)
【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(4)——Chat Memory(聊天记录)
【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(5)——Tool Calling(工具调用)
【Spring AI 1.0.0】Spring AI 1.0.0框架快速入门(6)——MCP Client(MCP客户端)
一、什么是MCP?
1.1 定义
MCP官方定义:
MCP is an open protocol that standardizes how applications provide context to large language models (LLMs). Think of MCP like a USB-C port for AI applications. Just as USB-C provides a standardized way to connect your devices to various peripherals and accessories, MCP provides a standardized way to connect AI models to different data sources and tools. MCP enables you to build agents and complex workflows on top of LLMs and connects your models with the world.
Model Context Protocol (MCP)
即MCP 是一种开放协议,它标准化了应用程序如何为大型语言模型 (LLM) 提供上下文。将 MCP 视为用于 AI 应用的 USB-C 端口。正如 USB-C 提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP 也提供了一种将 AI 模型连接到不同数据源和工具的标准化方式。MCP 能够在 LLM 之上构建代理和复杂的工作流程,并将模型与世界连接起来。
从上文中有几个关键词:上下文,标准化,不同的数据源和工具。
可以看到MCP其实就是一个标准协议,这个协议的作用就是让大模型可以无缝接入外部的工具,它解决3个大问题:
- 1)工具对外提供服务统一化:解决不断增长的各式各样的工具,大模型可以直接接入,无需适配各种工具。
- 2)不同大模型适配:无论哪种大模型,都遵循MCP协议,那么你就可以随意切换大模型而不影响你的应用调用工具
- 3)安全规范:提供本地数据访问服务,也通过外部访问服务。这样既能做到数据保护,也能做到数据共享
如上图所示,可以通过MCP协议集成多种MCP服务,通过集成高德MCP服务,获取旅游路线的建议。通过集成Fetch MCP来自动抓取网页中的内容。下面内容具体说明如何集成这些MCP。
1.2 MCP Client架构
MCP 客户端是模型上下文协议(MCP)架构中的关键组件,负责建立和管理与 MCP 服务器的连接。它实现了协议的客户端部分,处理:
-
协议版本协商以确保与服务器的兼容性
-
能力协商以确定可用功能
-
消息传输和 JSON-RPC 通信
-
工具发现和执行
-
资源访问和管理
-
提示系统交互
-
可选功能:
-
根管理
-
采样支持
-
-
同步和异步操作
-
传输选项:
-
基于 Stdio 的传输用于基于进程的通信
-
基于 Java HttpClient 的 SSE 客户端传输
-
WebFlux SSE 客户端传输用于反应式 HTTP 流
-
二、Spring AI 中的MCP
2.1 MCP Java SDK
在Java中,已经有MCP Java SDK 提供了MCP的 Java 实现,通过同步和异步通信模式实现了与人工智能模型和工具的标准化交互。而Spring AI中的MCP 通过与 Spring Boot 的集成扩展了 MCP Java SDK,提供了客户端和服务器启动器。使用 Spring 初始化器为您的 AI 应用程序启用 MCP 支持。
也就是说,MCP其实已经提供底层的Java SDK包,使用Java开发的用户可以使用该SDK实现MCP,但是Spring AI又基于 MCP Java SDK 的基础上,集成了Spring Boot,使得用户如果使用Spring Boot框架更为方便。通过MCP Java SDK和Spring AI的两层封装,基本上可以让用户屏蔽底层的细节实现,简化开发的复杂度,从而能专心实现自身的代码逻辑。
2.2 MCP Java SDK的架构
Java MCP 实现遵循三层架构:
-
客户端/服务器层:MCP Client 处理客户端操作,而 MCP Server 管理服务器端协议操作。两者都使用 MCP Session 进行通信管理。
-
会话层(MCP Session):通过
DefaultMcpSession
实现管理通信模式和状态。 -
传输层(MCPTransport):处理 JSON-RPC 消息的序列化和反序列化,支持多种传输实现。
上图中底层传输有两种通讯协议:
- Stdio:标准输入输出,也就是通过程序的输入输出方式进行通讯,比如java程序一般都是类似在控制台输出
- SSE:服务器发送事件,他是将HTTP升级成长链接,通过类似
Websocket
方式进行通讯订阅
三、MCP-Client示例演示
本章节代码:GitHub
3.1 Stdio模式
Stdio模式使用Playwright
来模拟打开浏览器,并搜索出我们想要的内容。Playwright工具是通过Stdio通讯协议。
MCP工具访问网站:https://mcp.so/
3.1.1 安装NodeJS
安装
Playwright的MCP Server是Node写的,因此需要安装NodeJS
,可以直接进nodejs官网进行下载
安装步骤就是傻瓜式安装,一直点击下一步
安装完成后,win + r 打开运行框,输入cmd,进入终端,然后输入node -v
和 npm -v
,如果出现版本号就是安装成功了。如图:
配置
修改全局模块下载路径
在nodejs
根目录内新建两个文件夹 node_global
和 node_cache
如图:
创建完两个空文件夹之后,跟之前操作一样,在键盘按下【win+R】
键,输入cmd,然后回车,进入终端,输入下面命令,然后回车即可。
说明:管理员身份- 打开CMD,配置路径:(注意一定要管理员身份运行CMD!!!路径改成你自己的路径,不要无脑复制!!!)
prefix = 创建的node_global文件夹所在路径
cache = 创建的node_cache文件夹所在路径
npm config set prefix "E:\software\nodejs\node_global"
npm config set cache "E:\software\nodejs\node_cache"
配置环境变量
我的电脑”-右键-“属性”-“高级系统设置”-“高级”-“环境变量”
进入环境变量对话框,在【系统变量】下新建【NODE_PATH】,
输入【E:\software\nodejs\node_modules】,并且在path路径中新增【E:\software\nodejs\】和【E:\software\nodejs\node_modules】
将【用户变量】下的【Path】新增【E:\nodejs\node_global】和【E:\nodejs\node_global\node_modules】
常用的npm命令
npm -v:查看 npm 安装的版本。
npm init:会引导你建立一个 package.json 文件,包括名称、版本、作者等信息。
npm list:查看当前目录下已安装的 Node 包。
npm ls:查看当前目录下已安装的 Node 包。
npm install moduleNames:安装 Node 模块到本地目录 node_modules 下。
npm install < name > -g:将包安装到全局环境中。
npm install < name > --save:安装的同时,将信息写入 package.json 中,项目路径中若是有package.json文件时,直接使用 npm install 方法就能够根据 dependencies 配置安装全部的依赖包,这样代码提交到 Git 时,就不用提交 node_modules 这个文件夹了。
npm install < name> --save-dev:安装的同时,将信息写入 package.json 中项目路径中若是有 package.json 文件时,直接使用 npm install 方法就能够根据 devDependencies 配置安装全部的依赖包,这样代码提交到 Git 时,就不用提交 node_modules 这个文件夹了。
npm uninstall moudleName:卸载 Node 模块。
3.1.2 安装Playwright
pip install playwright
playwright install # 自动安装浏览器驱动
如果提示'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件。
,可以先安装python环境,或者安装 Anaconda,这两部也是傻瓜操作,直接下一步
注意 :nodejs和playwright安装后,假设idea是打开状态,需要重启idea,不然读不到npx.exe这个启动器
,保证idea控制台能输出nodejs
信息
3.1.3 导入maven依赖
在前面文章的配置文件中加上mcp client的依赖
<!-- spring-web -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- 质谱ai 依赖 -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-zhipuai</artifactId>
</dependency><!-- 引入mcp-client -->
<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client</artifactId>
</dependency>
在外层添加spring ai依赖
<dependencyManagement><dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-bom</artifactId><version>1.0.0-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
3.1.4 配置文件
# 聊天模型
spring.ai.zhipuai.api-key=49dadd9c9d504acbb60580f6d53cf30b.vlX0Fp67MTwxdZ5i
spring.ai.zhipuai.base-url=https://open.bigmodel.cn/api/paas
spring.ai.zhipuai.chat.options.model=glm-4-air-0111
logging.level.org.springframework.ai.chat.client.advisor=DEBUG# 指定mcp-servers的文件
spring.ai.mcp.client.stdio.servers-configuration=classpath:/mcp-servers-config.json
这里采用外部文件的形式配置MCP-Server配置,文件的目录放置在resources文件夹下
文件内容
{"mcpServers": {"Playwright": {"command": "npx.cmd","args": ["@playwright/mcp@latest"],"env": {}}}
}
说明:这里是定义一个启动MCP-Server服务的配置,里面就是通过npx.cmd命令启动Playwright。这种格式是Claude Desktop format。
3.1.5 测试代码
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.ai.chat.client.ChatClient;/*** @author hanson.huang* @version V1.0* @ClassName MCPClientController* @Description MCP Client测试* @date 2025/8/12 13:17**/
@RestController
public class MCPClientController {private ChatClient chatClient;public MCPClientController(ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools) {this.chatClient = chatClientBuilder.defaultToolCallbacks(tools).build();}/*** @param message 问题*/@GetMapping("/test/MCPClient")public String methodTool(@RequestParam(value = "message", required = true) String message) {return this.chatClient.prompt().user(message).call().content();}
}
3.1.6 演示效果
打开浏览器输入:
http://localhost:8080/test/MCPClient?message=打开浏览器访问weixin_45683778的csdn博客
其中,weixin_45683778
是我的csdn账号
可以看到访问结果
并且会有新打开的网页跳转到了我的csdn页面
注意:我们可以看到任务管理器中多了些node服务,其实是Spring AI通过json文件中配置的npx.cmd
启动了MCP-Server
3.2 SSE模式
在上面3.1中,我们使用Stdio模式来执行Mcp Server。但是这个方法掉的MCP-Server服务是启动在本地的,耗费资源。并且需要装一些环境,比如NodeJS
、Playwright
等。我们可以将MCP服务部署在其他服务器上,通过SSE通讯协议进行远程调用。
本文选取魔塔免费的MCP广场来部署高德的MCP服务,通过程序基于SSE通讯协议来调用魔塔提供的远程MCP-Server。
3.2.1 获取高德API KEY
在高德开放平台注册并获得API KEY,高德开放平台:https://console.amap.com/dev/key/app
3.2.2 部署高德MCP-Server
在魔塔的MCP广场中部署高德的MCP-Server
部署完成之后,会得到一个url,这是MCP-Server的远程地址,拷贝下来,后面配置使用
{"mcpServers": {"amap-maps": {"type": "sse","url": "https://mcp.api-inference.modelscope.net/xxx/sse"}}
}
3.2.3 配置文件
在application.properties
中配置魔塔部署的MCP-Server的高德地址
# 指定mcp-servers的文件
#spring.ai.mcp.client.stdio.servers-configuration=classpath:/mcp-servers-config.json
spring.ai.mcp.client.type=SYNC
spring.ai.mcp.client.sse.connections.server1.url=https://mcp.api-inference.modelscope.net
# 注意改成自身的连接
spring.ai.mcp.client.sse.connections.server1.sse-endpoint=/xxxxx/sse
3.2.4 测试代码
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MCPClientSseController {private ChatClient chatClient;public MCPClientSseController(ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools) {this.chatClient = chatClientBuilder.defaultToolCallbacks(tools).build();}/*** @param message 问题*/@GetMapping("/test/MCPClientSSE")public String mcpClientSSE(@RequestParam(value = "message", required = true) String message) {return this.chatClient.prompt().user(message).call().content();}
}
3.2.5 演示效果
打开浏览器输入:http://localhost:8080/test/MCPClientSSE?message=从上海虹桥火车站去浦东机场坐飞机,我要怎么走?
显示效果:
这里就可以看到,无需部署MCP-Server服务,只需配置指定url,在写一个访问接口,就可以通过远程访问到高德的服务,是不是非常方便。
3.2.6 SSE其他例子
魔方广场中有许多好玩的MCP-Server
这里再举个抖音小助手的例子,先同理去阿里百炼平台注册API KEY
然后在魔方广场的抖音小助手中绑定自己的API KEY,即可得到远程访问的url
我们以https://v.douyin.com/6WjBFinG4Fo/%20r@e.Ox这条抖音视频为例子
在浏览器中输入:http://localhost:8080/test/MCPClientSSE?message=https://v.douyin.com/6WjBFinG4Fo/%20r@e.Ox 获取链接中视频的下载地址和视频内容
可以看到返回结果:
这个视频可以直接下载且无水印,并且会对使用先进的语音识别技术提取文本内容
(打开DEBUG
日志级别),极大地提高了生产力!!!
四、总结
本章讲述了什么是MCP,同时分别演示了使用标准的stdio模式以及使用SSE模式。那么用户该如何定义自己的MCP-Server给他人使用呢?下一章揭晓。
创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️