什么是 MCP?

Model Context Protocol (MCP) 是一种标准化协议,使 AI 模型能够以结构化的方式与外部工具和资源进行交互。可以将其视为 AI 模型与现实世界之间的桥梁——允许它们通过一致的接口访问数据库、API、文件系统和其他外部服务。

MCP 架构概览

MCP 采用三层架构设计,实现了关注点分离,提高了可维护性和灵活性:

┌─────────────────────────────────────────┐
│         Client/Server Layer            │
│    (McpClient / McpServer)             │
├─────────────────────────────────────────┤
│           Session Layer                 │
│  (McpSession / McpClientSession /      │
│         McpServerSession)              │
├─────────────────────────────────────────┤
│          Transport Layer               │
│     (McpTransport + 实现)              │
└─────────────────────────────────────────┘

1. Client/Server 层(顶层)

顶层处理主要的应用逻辑和协议操作:

  • McpClient - 管理客户端操作和服务器连接

  • McpServer - 处理服务器端协议操作和客户端请求

2. Session 层(中间层)

中间层管理通信模式并维护连接状态:

  • McpSession - 核心会话管理接口

  • McpClientSession - 客户端特定会话实现

  • McpServerSession - 服务器端会话实现

3. Transport 层(底层)

底层处理实际的消息传输和序列化:

  • McpTransport - 管理 JSON-RPC 消息的序列化和反序列化

  • 支持多种传输实现:STDIO、HTTP/SSE、Streamable-HTTP 等

MCP 核心组件

MCP Client(客户端)

MCP Client 是架构中的关键组件,负责建立和管理与 MCP Server 的连接。主要功能包括:

// MCP Client 核心功能
- 协议版本协商(确保与服务器的兼容性)
- 能力协商(确定可用功能)
- 消息传输和 JSON-RPC 通信
- 工具发现和执行
- 资源访问和管理
- Prompt 系统交互

// 可选功能
- Roots 管理
- Sampling 支持
- 同步和异步操作

支持的传输选项:

传输类型

描述

Stdio

基于进程的标准输入/输出通信

HttpClient SSE

基于 Java HttpClient 的 SSE 客户端传输

WebFlux SSE

用于响应式 HTTP 流的 WebFlux SSE 客户端传输

MCP Server(服务器端)

MCP Server 是为客户端提供工具、资源和能力的基础组件。主要功能包括:

// MCP Server 核心功能
- 服务器端协议操作实现
- 工具暴露和发现
- 基于 URI 访问的资源管理
- Prompt 模板提供和处理
- 与客户端的能力协商
- 结构化日志和通知
- 并发客户端连接管理

// API 支持
- 同步 API
- 异步 API

// 传输实现
- STDIO
- Streamable-HTTP
- Stateless Streamable-HTTP
- SSE

服务器能力(Capabilities)

根据服务器和传输类型,MCP Server 可以支持以下能力:

能力

描述

Tools

允许服务器暴露可被语言模型调用的工具

Resources

提供标准化方式让服务器向客户端暴露资源

Prompts

提供标准化方式让服务器向客户端暴露提示模板

Completions

提供 Prompt 和资源 URI 的参数自动补全建议

Logging

提供标准化方式让服务器向客户端发送结构化日志消息

Progress

通过通知消息跟踪长时间运行操作的进度

Ping

可选的健康检查机制,让服务器报告其状态

传输协议类型

1. STDIO(标准输入输出)

# 配置示例
spring:
  ai:
    mcp:
      server:
        stdio: true

特点:

  • 进程内协议(服务器在宿主应用内运行)

  • 通过标准输入和标准输出进行通信

  • 适用于本地工具集成

2. SSE(Server-Sent Events)

# 配置示例
spring:
  ai:
    mcp:
      server:
        protocol: SSE  # 或留空

特点:

  • 用于实时更新的服务器推送事件协议

  • 服务器作为独立进程运行

  • 可处理多个客户端连接

3. Streamable-HTTP

# 配置示例
spring:
  ai:
    mcp:
      server:
        protocol: STREAMABLE

特点:

  • 使用 HTTP POST 和 GET 请求

  • 可选的 Server-Sent Events (SSE) 流用于多个服务器消息

  • 替代 SSE 传输的现代方案

  • 服务器作为独立进程运行

4. Stateless(无状态)

# 配置示例
spring:
  ai:
    mcp:
      server:
        protocol: STATELESS

特点:

  • 为简化部署而设计

  • 请求之间不维护会话状态

  • 适用于微服务架构和云原生部署

同步 vs 异步服务器类型

同步服务器 (SYNC)

spring:
  ai:
    mcp:
      server:
        type: SYNC
  • 使用 McpSyncServer 实现

  • 适用于简单的请求-响应模式

  • 仅注册同步 MCP 注解方法

异步服务器 (ASYNC)

spring:
  ai:
    mcp:
      server:
        type: ASYNC
  • 使用 McpAsyncServer 实现

  • 针对非阻塞操作优化

  • 内置 Project Reactor 支持

  • 仅注册异步 MCP 注解方法

JSON-RPC 通信

MCP 基于 JSON-RPC 2.0 规范,所有消息都遵循以下格式:

请求格式

{
  "jsonrpc": "2.0",
  "id": "unique-id",
  "method": "tools/call",
  "params": {
    "name": "tool-name",
    "arguments": {
      "arg1": "value1"
    }
  }
}

响应格式

{
  "jsonrpc": "2.0",
  "id": "unique-id",
  "result": {
    "content": [
      {
        "type": "text",
        "text": "result content"
      }
    ]
  }
}

通知格式

{
  "jsonrpc": "2.0",
  "method": "notifications/progress",
  "params": {
    "progressToken": "token-123",
    "progress": 0.5,
    "message": "Processing..."
  }
}

MCP 与 Spring AI 的集成

Spring AI 提供了全面的 MCP 支持:

Client Starters

Starter

描述

spring-ai-starter-mcp-client

核心 starter,支持 STDIO、Servlet-based Streamable-HTTP、Stateless Streamable-HTTP 和 SSE

spring-ai-starter-mcp-client-webflux

WebFlux-based Streamable-HTTP、Stateless Streamable-HTTP 和 SSE 传输实现

Server Starters

Starter

描述

spring-ai-starter-mcp-server

STDIO 传输支持

spring-ai-starter-mcp-server-webmvc

WebMVC SSE、Streamable-HTTP、Stateless 支持

spring-ai-starter-mcp-server-webflux

WebFlux SSE、Streamable-HTTP、Stateless 支持

总结

MCP 协议为 AI 应用与外部系统交互提供了标准化接口,具有以下优势:

  1. 标准化:统一的协议规范,便于不同系统间的互操作

  2. 灵活性:支持多种传输协议,适应不同部署场景

  3. 可扩展:模块化设计,易于添加新功能

  4. Spring 集成:Spring AI 提供完善的 Boot Starter,简化开发

在下一篇文章中,我们将详细介绍如何使用 Spring 框架开发 MCP Server。