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

Spring AI 系列之七 - MCP Client

之前做个几个大模型的应用,都是使用Python语言,后来有一个项目使用了Java,并使用了Spring AI框架。随着Spring AI不断地完善,最近它发布了1.0正式版,意味着它已经能很好的作为企业级生产环境的使用。对于Java开发者来说真是一个福音,其功能已经能满足基于大模型开发企业级应用。借着这次机会,给大家分享一下Spring AI框架。

注意由于框架不同版本改造会有些使用的不同,因此本次系列中使用基本框架是 Spring AI-1.0.0,JDK版本使用的是19
代码参考: https://github.com/forever1986/springai-study

目录

  • 1 MCP
    • 1.1 定义
    • 1.2 架构
  • 2 Spring AI 中的MCP
    • 2.1 说明
    • 2.2 MCP Java SDK的架构
  • 3 MCP-Client示例演示
    • 3.1 MCP-Client(Stdio模式)
      • 3.1.1 前提准备
      • 3.1.2 项目初始化
      • 3.1.3 使用MCP-Client调用Playwright
      • 3.1.4 演示效果
    • 3.2 MCP-Client(SSE模式)
      • 3.2.1 前提准备
      • 3.2.2 项目初始化
      • 3.2.3 使用MCP-Client调用高德服务
      • 3.2.4 演示效果

上一章讲了Spring AI 如何使用工具,而且Spring AI也提供了工具定义的标准化,正常来说已经可以让用户定义各种各样的工具,让大模型能够使用各类工具完成复杂问题,但为什么后面又有MCP,MCP是什么?这一章来揭晓一下最近很火的概念。

1 MCP

1.1 定义

先来看看官方文档的定义:

MCP is an open protocol that standardizes how applications provide context to 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 是一种开放协议,它规范了应用程序如何为大型语言模型提供上下文。可以把 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 为您的设备连接各种外设和配件提供了标准化方式一样,MCP 也为 AI 模型连接不同的数据源和工具提供了标准化方式。

从上文中有几个关键词:上下文标准化不同的数据源和工具
可以看到MCP其实就是一个标准协议,这个协议的作用就是让大模型可以无缝接入外部的工具,它解决3个大问题:

  • 1)工具对外提供服务统一化:解决不断增长的各式各样的工具,大模型可以直接接入,无需适配各种工具。
  • 2)不同大模型适配:无论哪种大模型,都遵循MCP协议,那么你就可以随意切换大模型而不影响你的应用调用工具
  • 3)安全规范:提供本地数据访问服务,也通过外部访问服务。这样既能做到数据保护,也能做到数据共享

说白了就是将之前在前面定义的各种工具,按照一定规范封装并且是可以提供远程访问的方式,而这个规范就是MCP。

1.2 架构

在这里插入图片描述

  • MCP Hosts: 使用方程序(比如可以通过Claude Desktop, IDEs, or AI tools),通过MCP访问服务
  • MCP Clients: 与服务器保持一对一连接的协议客户端
  • MCP Servers: 轻量级程序各自通过标准化的MCP来展现特定功能
  • Local Data Sources: 计算机中的文件、数据库以及可由 MCP 服务器安全访问的服务
  • Remote Services: 可通过互联网访问的外部系统(例如通过API)以及 MCP 服务器能够连接到的这些系统

说简单一点,有了MCP。如果程序想要调用其它工具,只需要实现 MCP Clients 即可访问其它工具。如果你想把自己的服务封装为MCP,只需要实现 MCP Servers 程序,之后该 MCP Servers 程序可以让使用者自己部署或者你部署在公共地方供他人调用。

2 Spring AI 中的MCP

2.1 说明

在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的架构

在这里插入图片描述

  • Client/Server Layer:McpClient 处理客户端作,而 McpServer 管理服务器端协议作。两者都使用 McpSession 进行通信管理。
  • Session Layer (McpSession):通过 DefaultMcpSession 实现管理通信模式和状态。
  • Transport Layer (McpTransport):处理 JSON-RPC 消息序列化和反序列化,并支持多种传输实现。

上图中解释了客户端与服务端的访问层级和流程,其最下面有两个通讯协议:

  • Stdio:标准输入输出,也就是通过程序的输入输出方式进行通讯,比如java程序一般都是类似在控制台输出
  • SSE:服务器发送事件,通过类似Websocket方式进行通讯订阅

说明:这里就不细追这两种通讯协议,有兴趣的朋友可以自己了解。之所以将这个列出来,是后面示例中或者你在使用MCP服务时,需要注意其支持的是哪一种。下面的示例演示会分别挑选不同的通讯协议演示。

3 MCP-Client示例演示

3.1 MCP-Client(Stdio模式)

代码参考lesson08子模块

本示例中,演示如何通过已经封装好的Playwright工具来打开浏览器,并搜索内容。Playwright工具是通过Stdio通讯协议。
另外:关于如何看看已经有哪些已经实现了MCP的工具,可以访问该网站:https://mcp.so/

3.1.1 前提准备

1)安装NodeJS,由于Playwright的MCP Server是Node写的,因此需要安装NodeJS

2)安装Playwright

pip install playwright
playwright install  # 自动安装浏览器驱动

3.1.2 项目初始化

1)在springai-study父项目下,新建lesson08子模块,其pom引入如下:

<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-zhipuai</artifactId></dependency><!-- 引入mcp-client --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client</artifactId></dependency>
</dependencies>

2)在创建启动类Lesson08Application:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Lesson08Application {public static void main(String[] args) {SpringApplication.run(Lesson08Application.class, args);}}

3.1.3 使用MCP-Client调用Playwright

1)配置application.properties文件

# 聊天模型
spring.ai.zhipuai.api-key=你的智谱模型的API KEY
spring.ai.zhipuai.chat.options.model=GLM-4-Flash-250414
spring.ai.zhipuai.chat.options.temperature=0.7# 指定mcp-servers的文件
spring.ai.mcp.client.stdio.servers-configuration=classpath:/mcp-servers-config.json

注意:这里配置的是外部文件方式,使用一个json文件来配置MCP-Server,你也可以直接使用spring.ai.mcp.client.stdio.connections开头的格式直接在application.properties文件中配置

2)配置MCP-Server文件mcp-servers-config.json

{"mcpServers": {"Playwright": {"command": "npx.cmd","args": ["@playwright/mcp@latest"],"env": {}}}
}

说明:这里是定义一个启动MCP-Server服务的配置,里面就是通过cmd命令启动Playwright。这种格式是Claude Desktop format。

3)新建一个controller做演示,不一定是web模式,看自己需要

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 MCPClientController {private ChatClient chatClient;public MCPClientController(ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools) {this.chatClient = chatClientBuilder.defaultToolCallbacks(tools).build();}/*** @param message 问题*/@GetMapping("/ai/MCPClient")public String methodTool(@RequestParam(value = "message", required = true) String message) {return this.chatClient.prompt().user(message).call().content();}}

3.1.4 演示效果

1)访问以下地址:

http://localhost:8080/ai/MCPClient?message=打开浏览器访问google并搜索关键字周星驰

2)可以看到访问结果

在这里插入图片描述

3)再看看其打开了你机器的浏览器,并打开google,并搜索了周星驰

在这里插入图片描述

注意:这里有个细节可以看到任务管理器,多了node的服务,其实是Spring AI 通过配置的mcp-servers-config.json启动了MCP-Server
在这里插入图片描述

3.2 MCP-Client(SSE模式)

从上面的3.1中可知,MCP-Server是启动在本地的。这样做有两个比较麻烦的点,第一是本地要启动一个MCP-Server服务,耗费资源。第二就是安装MCP-Server服务的依赖,比如上面的例子需要安装NodeJS、Playwright。因此前面说到MCP-Server可以部署在其它服务器上,通过SSE通讯协议进行远程调用即可。下面来演示如何调用远程MCP-Server的服务

代码参考lesson09子模块

示例说明:通过将高德的MCP服务部署到魔塔免费的MCP广场,然后通过代码调用高德服务。由魔塔提供的远程MCP-Server是基于SSE通讯协议

3.2.1 前提准备

要远程SSE模式调用,需要启动一个MCP-Server服务,这里就使用魔塔的MCP广场,启动一个高德的MCP-Server服务。目前已经有很多支持部署MCP-Server服务的平台,可以选择自己熟悉的平台

1)在高德开放平台注册并获得API KEY,高德开放平台:https://console.amap.com/dev/key/app

在这里插入图片描述

2)在魔塔的MCP广场中部署高德的MCP-Server

在这里插入图片描述

3)部署完成之后,会得到一个url,这是MCP-Server的远程地址,拷贝下来,后面配置使用
在这里插入图片描述

{"mcpServers": {"amap-maps": {"type": "sse","url": "https://mcp.api-inference.modelscope.net/xxxxx/sse"}}
}

3.2.2 项目初始化

1)在springai-study父项目下,新建lesson09子模块,其pom如下

<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-zhipuai</artifactId></dependency><!-- 引入的是mcp-client --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-mcp-client</artifactId></dependency>
</dependencies>

2)创建启动类Lesson09Application:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class Lesson09Application {public static void main(String[] args) {SpringApplication.run(Lesson09Application.class, args);}}

3.2.3 使用MCP-Client调用高德服务

1)在application.properties中配置魔塔部署的MCP-Server的高德地址

# 聊天模型
spring.ai.zhipuai.api-key=你的智谱模型的API KEY
spring.ai.zhipuai.chat.options.model=GLM-4-Flash-250414
spring.ai.zhipuai.chat.options.temperature=0.7# 指定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

2)在MCPClientRemoteController类中,增加高德演示示例

@RestController
public class MCPClientRemoteController {private ChatClient chatClient;public MCPClientRemoteController(ChatClient.Builder chatClientBuilder, ToolCallbackProvider tools) {this.chatClient = chatClientBuilder.defaultToolCallbacks(tools).build();}/*** @param message 问题*/@GetMapping("/ai/MCPClientRemote")public String amapMaps(@RequestParam(value = "message", required = true) String message) {return this.chatClient.prompt().user(message).call().content();}}

3.2.4 演示效果

1)访问以下地址:

http://localhost:8080/ai/MCPClientRemote?message=帮我规划从天安门驾车到首都机场T1航站楼

2)显示效果
在这里插入图片描述

说明:这里就可以看到,无需部署MCP-Server服务,只需配置指定url,在写一个访问接口,就可以通过远程访问到高德的服务,是不是非常方便。

结语:本章讲述了MCP的模式,同时演示了通过Spring AI的MCP-Client插件,分别演示了使用标准的stdio模式以及使用SSE模式。那么用户该如何定义自己的MCP-Server给他人使用呢?下一章揭晓。

http://www.dtcms.com/a/271751.html

相关文章:

  • 限流式保护器如何筑牢无人驾驶汽车充电站的安全防线
  • linxu内核的signal fault和arm内核的flault
  • 【LeetCode100】--- 2.字母异位词分组【复习回顾】
  • 如何发现 Redis 中的 BigKey?
  • 正向代理服务器Squid:功能、架构、部署与应用深度解析
  • 黄瓜苦多于意外,苦瓜苦来自本源——“瓜苦”探源
  • CloudCanal:一款企业级实时数据同步、迁移工具
  • 浪潮CD1000-移动云电脑-RK3528芯片-2+32G-开启ADB ROOT破解教程
  • tomcat源码02 - 理解Tomcat架构设计
  • MyBatis集成Logback日志全攻略
  • 微软云语音识别ASR示例Demo
  • 激活函数与损失函数:神经网络的动力引擎与导航系统
  • defer学习指南
  • 《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
  • 启辰智慧预约团队5周年活动掠影,打造一流预约系统
  • 论文精读(一)| 量子计算系统软件研究综述
  • IoT 小程序:如何破解设备互联的碎片化困局?
  • 一条Redis命令是如何执行的?
  • 两种方式清除已经保存的git账号密码
  • 并发编程第一节
  • 【WEB】Polar靶场 Day7 详细笔记
  • 深度学习模型表征提取全解析
  • 【PyTorch】PyTorch中数据准备工作(AI生成)
  • 内置函数(Python)
  • 树莓派免密登录(vs code/cursor)
  • EFK/ELK9.0.3 windows搭建
  • 【DB2】load报错SQL3501W、SQL3109N、SQL2036N
  • 【算法训练营Day10】栈与队列part2
  • SpringBoot mybatis
  • Idea如何解决包冲突