在构建企业级 AI Agent 时,最大的障碍往往不是模型推理本身,而是Agent 与外部系统之间缺乏标准化的通信协议。过去每个企业工具都需要单独写适配器,成本极高且无法复用。
Anthropic 在 2024 年末推出的 Model Context Protocol(MCP) 试图解决这个问题:定义一套中立、开放、语言无关的协议,让 AI Agent 和外部工具之间能即时互联,无需每次定制。
MCP 的核心设计原则有三条:
listTools、callTool、listResources 三个核心端点,即可接入任何 MCP 兼容客户端。MCP 完全基于 JSON-RPC 2.0 规范,所有请求/响应均为标准 JSON-RPC 格式:
// 请求(Client → Server)
{
"jsonrpc": "2.0",
"id": 42, // 用于追踪响应
"method": "tools/call", // 方法名,格式:域/方法
"params": {
"name": "query_inventory",
"arguments": {
"product_id": "SKU-7788",
"warehouse": "SH"
}
}
}
// 成功响应(Server → Client)
{
"jsonrpc": "2.0",
"id": 42,
"result": {
"content": [
{
"type": "text",
"text": "SKU-7788 在上海仓可用库存为 1,250 件,今日出库 320 件。"
}
]
}
}
// 错误响应
{
"jsonrpc": "2.0",
"id": 42,
"error": {
"code": -32601, // Method not found
"message": "Tool 'query_inventory' not found on this server",
"data": { "available_tools": ["list_orders", "create_ticket"] }
}
}
| 方法 | 方向 | 用途 |
|---|---|---|
| initialize | C→S | 握手,交换协议版本与能力 |
| tools/list | C→S | 获取服务端支持的所有工具列表 |
| tools/call | C→S | 调用某个工具,传入参数 |
| resources/list | C→S | 列出服务端可用的上下文资源(文件、提示词模板) |
| prompts/list | C→S | 列出预定义 Prompt 模板 |
| notifications/* | S→C | 服务端主动推送,如日志、状态变更 |
MCP 官方提供 Python SDK(mcp),Java 生态目前基于 Spring Boot + WebFlux 社区实现。完整架构分四层:
// ===== 第1层:MCP 协议解析层 =====
// 负责 JSON-RPC 2.0 消息编解码、连接生命周期管理
@RestController
@RequestMapping("/mcp")
public class McpServerController {
private final McpMessageHandler handler;
// SSE 端点(Server-Sent Events,服务端主动推送)
@GetMapping(value = "/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux> streamEvents(
@RequestHeader("Mcp-Session-Id") String sessionId) {
return McpEventBus.getEvents(sessionId)
.map(data -> ServerSentEvent.builder()
.id(UUID.randomUUID().toString())
.event("message")
.data(data)
.build());
}
// 标准 RPC 端点(HTTP POST)
@PostMapping("/rpc")
public ResponseEntity
<!-- pom.xml 核心依赖 -->
<dependencies>
<!-- MCP 协议 SDK(社区维护) -->
<dependency>
<groupId>io.modelcontextprotocol</groupId>
<artifactId>mcp-spring-boot-starter</artifactId>
<version>0.4.0</version>
</dependency>
<!-- WebFlux 响应式 Web(支持 SSE) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<!-- 企业工具适配:数据库、ERP、CRM -->
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency>
<!-- JSON Schema 校验 -->
<dependency>
<groupId>com.networknt</groupId>
<artifactId>json-schema-validator</artifactId>
<version>1.5.0</version>
</dependency>
</dependencies>
MCP 客户端(Agent)可基于 tools/call 的返回结果,自主决定是否继续调用下一个工具,形成多步推理链。以下是一个真实 Agent 决策示例:
// 场景:用户问"帮我查询SH仓库存,如果有货就创建采购单"
// Agent 的推理过程(完全自主):
// Step 1: 调用 query_inventory({product_id: "SKU-7788", warehouse: "SH"})
// → 返回: 可用 1250 件
// Step 2: Agent 判断 1250 > 安全库存下限(500),无需采购 → 返回结论
// OR 若结果 < 500:
// Step 2: 调用 purchase_order_create({product_id: "SKU-7788", qty: 2000})
// 这个"判断逻辑"完全由 LLM 在 prompt 中决定,无需硬编码工作流
// MCP 只提供标准化接口,不限制 Agent 的决策自由度
某些场景需要服务端向 Agent 主动推送数据(如:队列任务完成、监控告警触发)。MCP 通过 SSE 实现:
// Java 服务端推送 SSE 消息
@Service
public class McpNotificationService {
private final Sinks.Many sink = Sinks.many().multicast().onBackpressureBuffer();
// 业务某处:触发推送
public void onTaskCompleted(String taskId, String result) {
sink.tryEmitNext(McpNotification.builder()
.method("notifications/task/completed")
.params(Map.of("task_id", taskId, "result", result))
.build()
);
}
}
// Agent 通过 /mcp/events 端点持续监听
// 收到 → 触发新的 reasoning cycle → 可能调用 follow-up 工具
| 优化项 | 未优化 | 优化后 | 生效手段 |
|---|---|---|---|
| 工具调用 P99 | 480ms | 85ms | 连接池 + 缓存热点数据 |
| 并发吞吐量 | 20 QPS | 280 QPS | WebFlux 响应式 + 异步 IO |
| 重试开销 | 无重试 | 平均 +45ms | 指数退避 + 最大3次 |
| 冷启动 | 1.2s(Spring Boot) | 200ms(GraalVM Native) | Native Image 编译 |
# application.yml 关键配置
server:
port: 8080
http2:
enabled: true # HTTP/2 对 MCP 长连接性能提升显著
spring:
webflux:
base-path: /mcp
codec:
max-in-memory-size: 16MB # 大型工具结果(如二进制文件)需调大
# 限流配置(防止恶意 Agent DoS)
resilience4j:
ratelimiter:
instances:
mcp-api:
limit-for-period: 100
limit-refresh-period: 1s
timeout-duration: 50ms
requiresConfirmation: true,Agent 必须二次询问用户确认后才可执行。
在生产环境中,Java MCP 网关不能只是一个简单的 HTTP 服务,必须提供完整的可观测性和运维能力:
// 熔断配置示例(Resilience4j)
resilience4j:
circuitbreaker:
instances:
erp-api:
sliding-window-size: 20
failure-rate-threshold: 50
wait-duration-in-open-state: 30000ms
permitted-number-of-calls-in-half-open-state: 3
Spring AI 原生支持 MCP 作为 Function Calling 后端,集成后 Agent 可以自动发现工具列表并调用:
// Spring AI + MCP 集成示例
@Bean
public MCPToolCallbackProvider mcpProvider() {
McpSyncClient client = McpClient.sync()
.uri("http://localhost:8080/mcp/rpc")
.build();
return new MCPToolCallbackProvider(client, List.of());
}
// Agent 自动调用
chatModel.call(messages, MCPToolCallbacks.from(mcpProvider()));
// Agent 自主决定是否需要调用 query_inventory 工具
// 返回结构化结果 → 整合进回复 → 返回给用户
MCP 协议代表了 AI Agent 与工具之间通信的新标准。其核心优势在于抽象统一、语言中立、可组合。企业落地时,Java 生态具备成熟的 WebFlux + Spring Boot 支撑能力,完全可以支撑生产级别的高并发场景。
关键指标:工具调用 P99 延迟 < 100ms、并发吞吐量 > 200 QPS、错误率 < 0.1%。依据这些数据不断优化,MCP 网关会成为企业 AI Infra 的关键底座。