MCP 协议集成
Model Context Protocol(MCP)是 AI 工具生态的标准化协议,Spring AI Alibaba 提供了完整的 MCP 客户端与服务端实现,并通过 Nacos 支持分布式 MCP 注册中心。
什么是 MCP?
MCP(Model Context Protocol)是 Anthropic 提出的开放标准,定义了 AI 模型与外部工具/数据源之间的通信协议:
传统 Tool Calling:
LLM ←→ 应用代码(紧耦合,工具与应用绑定)
MCP 方式:
LLM ←→ MCP Client ←→ MCP Server(松耦合,工具独立部署)
├── 文件系统 MCP Server
├── 数据库 MCP Server
├── GitHub MCP Server
└── 自定义业务 MCP ServerMCP 的核心价值
| 特性 | 描述 |
|---|---|
| 标准化 | 统一的工具描述和调用协议 |
| 可复用 | MCP Server 可被多个 AI 应用共享 |
| 解耦 | 工具独立部署,不依赖特定 AI 框架 |
| 生态 | 丰富的开源 MCP Server 生态 |
MCP 架构
┌─────────────────────────────────────────────────────┐
│ AI 应用(Spring Boot) │
│ │
│ ChatClient │
│ │ │
│ ▼ │
│ MCP Client(Spring AI) │
│ │ │
│ ├── STDIO Transport ──→ 本地 MCP Server 进程 │
│ │ │
│ └── SSE Transport ───→ 远程 MCP Server(HTTP) │
└─────────────────────────────────────────────────────┘
MCP Server 提供:
- Tools(工具列表)
- Resources(资源访问)
- Prompts(提示词模板)MCP Client 配置
连接本地 MCP Server(STDIO)
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-client-spring-boot-autoconfigure</artifactId>
</dependency>yaml
spring:
ai:
mcp:
client:
stdio:
servers-configuration: classpath:mcp-servers.jsonjson
// mcp-servers.json
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/workspace"],
"env": {}
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
},
"database": {
"command": "java",
"args": ["-jar", "my-db-mcp-server.jar"],
"env": {
"DB_URL": "jdbc:mysql://localhost:3306/mydb"
}
}
}
}连接远程 MCP Server(SSE)
yaml
spring:
ai:
mcp:
client:
sse:
connections:
my-remote-server:
url: http://mcp-server.internal:8080/sse
headers:
Authorization: "Bearer ${MCP_TOKEN}"在 ChatClient 中使用 MCP 工具
java
@Configuration
public class McpConfig {
@Autowired
private List<McpSyncClient> mcpClients; // 自动注入所有 MCP 客户端
@Bean
public ChatClient chatClient(ChatClient.Builder builder) {
// 将所有 MCP 工具注册到 ChatClient
return builder
.defaultTools(
new SyncMcpToolCallbackProvider(mcpClients)
)
.build();
}
}
// 使用时和普通 Tool Calling 完全一样
@GetMapping("/ask")
public String ask(@RequestParam String question) {
return chatClient.prompt()
.user(question)
.call()
.content();
// LLM 会自动选择合适的 MCP 工具调用
}开发 MCP Server
Spring AI Alibaba 支持将 Spring Boot 应用快速转换为 MCP Server:
xml
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-mcp-server-spring-boot-autoconfigure</artifactId>
</dependency>定义 MCP 工具
java
@Service
public class OrderMcpService {
@Autowired
private OrderRepository orderRepo;
@Tool(description = "根据订单号查询订单详情")
public OrderDetail getOrderDetail(
@ToolParam(description = "订单号,格式:ORD-XXXXXXXX") String orderId
) {
return orderRepo.findById(orderId)
.map(OrderDetail::from)
.orElseThrow(() -> new RuntimeException("订单不存在:" + orderId));
}
@Tool(description = "查询用户的订单列表,支持按状态筛选")
public List<OrderSummary> listOrders(
@ToolParam(description = "用户 ID") String userId,
@ToolParam(description = "订单状态:ALL/PENDING/PAID/SHIPPED/COMPLETED,默认 ALL")
String status
) {
return orderRepo.findByUserIdAndStatus(userId,
"ALL".equals(status) ? null : status);
}
@Tool(description = "申请退款,需要提供退款原因")
public RefundResult applyRefund(
@ToolParam(description = "订单号") String orderId,
@ToolParam(description = "退款原因") String reason
) {
return refundService.apply(orderId, reason);
}
}注册为 MCP Server
java
@SpringBootApplication
public class OrderMcpServerApplication {
public static void main(String[] args) {
SpringApplication.run(OrderMcpServerApplication.class, args);
}
@Bean
public ToolCallbackProvider mcpTools(OrderMcpService orderService) {
return MethodToolCallbackProvider.builder()
.toolObjects(orderService)
.build();
}
}yaml
# application.yml
spring:
ai:
mcp:
server:
name: order-mcp-server
version: 1.0.0
type: SYNC # SYNC 或 ASYNC
sse-message-endpoint: /mcp/message # SSE 模式端点MCP Gateway:零代码转换
Spring AI Alibaba 提供了 MCP Gateway,可以将存量 REST API 零代码转换为 MCP 工具:
yaml
# mcp-gateway.yml
spring:
ai:
alibaba:
mcp:
gateway:
enabled: true
services:
- name: user-service
url: http://user-service:8080
openapi-spec: http://user-service:8080/v3/api-docs
# 自动从 OpenAPI 规范生成 MCP 工具描述
- name: inventory-service
url: http://inventory-service:8080
tools:
- path: /api/products/search
method: GET
name: searchProducts
description: "搜索商品,支持关键词和分类筛选"
parameters:
- name: keyword
in: query
description: "搜索关键词"
- name: category
in: query
description: "商品分类"Nacos 分布式 MCP 注册中心
Spring AI Alibaba 与 Nacos 深度集成,实现 MCP Server 的服务发现和动态配置:
xml
<dependency>
<groupId>com.alibaba.cloud.ai</groupId>
<artifactId>spring-ai-alibaba-starter-nacos-mcp</artifactId>
</dependency>yaml
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
ai:
alibaba:
mcp:
nacos:
enabled: true
server-group: MCP_SERVERS
# 自动发现注册在 Nacos 中的 MCP ServerMCP Server 注册到 Nacos
java
@SpringBootApplication
@EnableNacosMcpServer // 启用 Nacos MCP 注册
public class OrderMcpServerApplication {
// MCP Server 启动时自动注册到 Nacos
// 包含:服务地址、工具列表、版本信息
}MCP Client 动态发现
java
@Service
public class DynamicMcpService {
@Autowired
private NacosMcpClientRegistry mcpRegistry;
public String callWithDynamicTools(String question) {
// 从 Nacos 动态获取可用的 MCP Server 列表
List<McpSyncClient> availableClients = mcpRegistry.getAvailableClients();
return chatClient.prompt()
.user(question)
.tools(new SyncMcpToolCallbackProvider(availableClients))
.call()
.content();
// 新部署的 MCP Server 无需重启即可被发现和使用
}
}常用开源 MCP Server
| MCP Server | 功能 | 安装 |
|---|---|---|
@modelcontextprotocol/server-filesystem | 文件系统读写 | npx -y @modelcontextprotocol/server-filesystem |
@modelcontextprotocol/server-github | GitHub 操作 | npx -y @modelcontextprotocol/server-github |
@modelcontextprotocol/server-postgres | PostgreSQL 查询 | npx -y @modelcontextprotocol/server-postgres |
@modelcontextprotocol/server-brave-search | Brave 搜索 | npx -y @modelcontextprotocol/server-brave-search |
@modelcontextprotocol/server-puppeteer | 浏览器自动化 | npx -y @modelcontextprotocol/server-puppeteer |
实战:多 MCP Server 协作
java
@Service
public class ResearchAssistant {
@Autowired
private ChatClient chatClient;
/**
* 研究助手:结合搜索、文件系统、GitHub 多个 MCP Server
*/
public String research(String topic) {
return chatClient.prompt()
.system("""
你是一个研究助手,可以使用以下工具:
- brave_search:搜索最新信息
- read_file / write_file:读写本地文件
- github_search:搜索 GitHub 代码和项目
请系统地研究给定主题,将结果保存到文件。
""")
.user("深入研究:" + topic + ",并将研究报告保存到 research-" + topic + ".md")
.call()
.content();
// LLM 会自动编排多个 MCP 工具完成复杂任务
}
}MCP vs Tool Calling 对比
| 维度 | Tool Calling | MCP |
|---|---|---|
| 部署方式 | 工具与应用同进程 | 工具独立进程/服务 |
| 复用性 | 仅限当前应用 | 多应用共享 |
| 语言限制 | 同语言(Java) | 跨语言(任意语言实现 Server) |
| 动态发现 | 静态注册 | 支持动态发现(Nacos) |
| 适用场景 | 简单工具、业务逻辑 | 复杂工具、跨团队共享 |
选择建议
- 简单的业务工具 → 用
@Tool注解(Tool Calling) - 需要跨应用共享的工具 → 用 MCP Server
- 存量 REST API 快速接入 → 用 MCP Gateway
- 微服务架构 → 用 Nacos MCP 注册中心