关于 Spring AI integration with MCP (Model Context Protocol)
Spring AI MCP 将 MCP Java SDK 集成到 Spring Boot,为 Java AI 应用提供客户端和服务端启动器。示例展示了通过 MCP 工具查询 PostgreSQL 数据,并由 LLM 根据提示词选择工具。
主要功能
- 01Spring Boot 客户端与服务端启动器
- 02同步与异步通信
- 03stdio 和 SSE 传输
- 04通过工具查询 PostgreSQL
适用场景
- 01为 Spring Boot AI 应用添加 MCP 支持
- 02构建查询 PostgreSQL 账户数据的 MCP 服务
- 03连接 MCP 服务并调用相应工具
MCP 相关
扩展 MCP Java SDK,提供 MCP 客户端和服务端能力。服务端可向客户端提供工具与资源,并支持 stdio 和 SSE 传输。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Spring AI 与 MCP(Model Context Protocol)集成
Model Context Protocol(MCP) 是一种标准化协议,可让 AI 模型以结构化的方式与外部工具和资源交互。它支持多种传输机制,以适应不同环境。
MCP Java SDK 提供了 Model Context Protocol 的 Java 实现,可通过同步和异步通信模式,实现与 AI 模型和工具的标准化交互。
Spring AI MCP 基于 Spring Boot 扩展了 MCP Java SDK,提供客户端和服务端启动器。使用 Spring Initializer 为 AI 应用添加 MCP 支持,快速搭建应用。
MCP Java SDK 架构
Java MCP 实现采用三层架构
-
客户端/服务端层:McpClient 处理客户端操作,而 McpServer 管理服务端协议操作。两者都使用 McpSession 管理通信。
-
会话层(McpSession):通过 DefaultMcpSession 实现管理通信模式和状态。
-
传输层(McpTransport):负责 JSON-RPC 消息的序列化和反序列化,并支持多种传输实现。
MCP 客户端
MCP 客户端是 Model Context Protocol(MCP)架构中的关键组件,负责与 MCP 服务建立和管理连接。
MCP 客户端
MCP 服务端是 Model Context Protocol(MCP)架构的基础组件,为客户端提供工具、资源和功能。
什么是 MCP?
MCP 采用客户端-服务端架构,包含几个关键组件:
MCP Host: 是我们的主应用,它集成了大模型,并需要连接外部数据源
MCP 客户端: 是建立并维护与 MCP 服务一对一连接的组件
MCP 服务端: 是与外部数据源集成并提供与其交互功能的组件
工具:指 MCP 服务端公开给客户端调用的可执行函数/方法 此外,为了处理客户端和服务端之间的通信,MCP 提供了两种传输通道。
为了通过标准输入和输出流与本地进程及命令行工具通信,MCP 提供了标准输入/输出(stdio)传输类型。此外,针对客户端和服务端之间基于 HTTP 的通信,MCP 提供了服务器发送事件(SSE)传输类型。
示例中实现了什么?
在本教程中,MCP 服务端连接到 Postgresql 数据库并获取数据,我们还在 MCP 服务端公开了两个工具。MCP 客户端连接到 MCP 服务端,并根据提示词由大模型决定要调用哪个工具。
步骤 1:创建 Postgresql 数据库
运行 docker-compose.yml 文件,并运行 table.sql 创建表。
步骤 2:在本地运行 ollama
步骤 3:创建 MCP 服务端
下载 mcp-server 项目并运行。
需要注意的重要类 - SellerAccountTools
@Service
public class SellerAccountTools {
private final SellerAccountRepository sellerAccountRepository;
public SellerAccountTools(SellerAccountRepository sellerAccountRepository) {
this.sellerAccountRepository = sellerAccountRepository;
}
@Tool(name = "Search Seller account by name", description = "Find all Seller Accounts by name")
public String getAccountByName(
@ToolParam(description = "Seller Account Name") String name) {
List<SellerAccount> accountList = sellerAccountRepository.findByName(name);
StringBuilder result = new StringBuilder();
for (SellerAccount account : accountList) {
result.append(account.toString()).append("\n");
}
return result.toString();
}
@Tool(description = "Find all Seller Accounts by owner")
public String getAccountByOwner(
@ToolParam(description = "Seller Account owner") String owner) {
List<SellerAccount> accountList = sellerAccountRepository.findByOwner(owner);
StringBuilder result = new StringBuilder();
for (SellerAccount account : accountList) {
result.append(account.toString()).append("\n");
}
return result.toString();
}
}
说明
- 工具允许服务端公开可供大模型调用的工具。在此示例中,我创建了两个工具,分别按名称和所有者搜索 account 表。
- 根据提示词,AI 大模型会自动选择正确的方法,但我们需要正确编写名称和描述
步骤 4:创建 MCP 客户端
下载 mcp-client 项目并运行。
步骤 5:测试
数据库表数据
使用 Promts 进行测试
在这里可以看到,大模型会根据提示词自动选择正确的工具并返回结果,同时还会对结果进行格式化。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。