前置知识

阅读本文前,建议先了解:


一、MCP 架构概览

MCP 采用客户端 - 服务器架构,包含三个关键角色和两个层次。

1.1 完整架构图

flowchart TB
    subgraph App["📱 应用层"]
        direction LR
        A1["MCP Host (主机)"]
        A2["AI 应用本身<br/>如 Claude Desktop"]
    end
    
    subgraph Logic["⚙️ 逻辑层"]
        direction LR
        B1["MCP Client (客户端)"]
        B2["主机里的连接器<br/>每个服务器对应一个 Client"]
    end
    
    subgraph Service["🔌 服务层"]
        direction LR
        C1["MCP Server (服务器)"]
        C2["提供工具/资源<br/>本地或远程"]
    end
    
    subgraph Comm["📡 通信层"]
        D1["StdIO (本地)"]
        D2["Streamable HTTP (远程)"]
    end
    
    A1 -->|创建 | B1
    B1 -->|通信 | C1
    C1 -.-> D1 & D2
    
    style App fill:#e3f2fd,stroke:#1976d2,stroke-width:2px,rx:10
    style Logic fill:#fff3e0,stroke:#f57c00,stroke-width:2px,rx:10
    style Service fill:#e8f5e9,stroke:#388e3c,stroke-width:2px,rx:10
    style Comm fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px,rx:10


二、三个核心角色

2.1 MCP Host(主机)

定义:AI 应用本身,负责协调和管理 MCP 客户端。

特性说明
角色AI 应用程序的”宿主环境”
职责创建 MCP Client,管理连接,处理用户交互
例子Claude Desktop、VS Code、Cursor

[!比喻] Host 是什么? 把 Host 想象成”公司总部”——它负责决策和协调,但具体对外联系由业务员完成。

2.2 MCP Client(客户端)

定义:Host 内部的连接器,负责与 MCP Server 通信。

特性说明
角色Host 和 Server 之间的”桥梁”
职责维护连接、获取上下文、转发请求
数量每个 Server 对应一个 Client
示例场景:
VS Code(Host)连接了 3 个 MCP 服务器:
├─ 文件系统 Server → VS Code 创建 1 个 Client
├─ Sentry Server   → VS Code 创建 1 个 Client
└─ GitHub Server   → VS Code 创建 1 个 Client

总共:1 个 Host + 3 个 Client + 3 个 Server

2.3 MCP Server(服务器)

定义:提供上下文数据的程序。

特性说明
角色工具/资源/提示词的提供者
运行位置本地(StdIO)或远程(HTTP)
例子文件系统服务器、数据库服务器、Sentry 服务器

"服务器"的含义

MCP Server 的”服务器”指的是提供服务的程序,不代表它一定运行在远程服务器上。本地运行的程序也叫 MCP Server。

2.4 角色关系总结

┌─────────────────────────────────────────────┐
│  角色关系速查                                │
├─────────────────────────────────────────────┤
│  Host    = AI 应用本身(如 Claude Desktop)   │
│  Client  = Host 里的连接器(每个 Server 一个)  │
│  Server  = 提供工具/资源的程序               │
│                                             │
│  类比:                                      │
│  Host    = 公司总部                          │
│  Client  = 业务员(每个合作伙伴配一个)        │
│  Server  = 外部合作伙伴                      │
└─────────────────────────────────────────────┘

三、两个层次

MCP 分为两个层次:数据层传输层

3.1 架构分层图

┌─────────────────────────────────────────────┐
│           传输层 (Transport Layer)           │
│  管理通信通道:StdIO 或 Streamable HTTP       │
├─────────────────────────────────────────────┤
│           数据层 (Data Layer)                │
│  定义消息格式、生命周期、核心原语              │
│  (基于 JSON-RPC 2.0 协议)                     │
└─────────────────────────────────────────────┘

3.2 数据层(Data Layer)

核心:基于 JSON-RPC 2.0 的协议。

功能说明
生命周期管理连接初始化、能力协商、连接终止
服务器功能提供 Tools、Resources、Prompts
客户端功能支持 Sampling、Elicitation、Logging
工具功能Notifications、Progress Tracking

3.3 传输层(Transport Layer)

管理通信通道和认证。

传输方式说明适用场景
StdIO标准输入/输出流本地进程间通信
Streamable HTTPHTTP POST + SSE 流远程服务器通信

StdIO 传输

┌─────────┐         ┌─────────┐
│  Host   │ ←stdin→ │ Server  │
│         │ ←stdout→│ (本地)   │
└─────────┘         └─────────┘

特点:
✓ 速度快,无网络开销
✓ 适合访问本地文件、数据库
✗ 只能本地通信

Streamable HTTP 传输

┌─────────┐   HTTP   ┌─────────┐
│  Host   │ ──────→ │ Server  │
│         │ ←───────│ (远程)   │
└─────────┘  SSE     └─────────┘

特点:
✓ 支持远程通信
✓ 支持 OAuth、Bearer Token 等认证
✓ 支持 Server-Sent Events 流式响应
✗ 有网络延迟

如何选择?

  • 访问本地资源 → 用 StdIO
  • 连接云服务 → 用 Streamable HTTP

四、三大原语(Primitives)

MCP 定义了三种核心信息类型,服务器可以提供给 AI:

┌─────────────────────────────────────────────┐
│          MCP 三大原语                        │
├─────────────────────────────────────────────┤
│  ┌─────────┐  ┌─────────┐  ┌─────────┐     │
│  │  Tools  │  │Resources│  │ Prompts │     │
│  │  (工具)  │  │ (资源)  │  │ (提示)  │     │
│  ├─────────┤  ├─────────┤  ├─────────┤     │
│  │  执行   │  │  读取   │  │  复用   │     │
│  │  操作   │  │  数据   │  │  模板   │     │
│  └─────────┘  └─────────┘  └─────────┘     │
│       ↓            ↓            ↓           │
│     "做"         "看"         "用"          │
└─────────────────────────────────────────────┘

4.1 Tools(工具)

定义:AI 可以调用的可执行函数。

特性说明
作用执行操作(文件操作、API 调用、数据库查询等)
发现方式tools/list - 列出可用工具
调用方式tools/call - 执行工具
例子读取文件、查询数据库、发送邮件、执行计算
# 示例:定义一个 MCP 工具
@mcp.tool()
def get_weather(city: str) -> str:
    """获取指定城市的天气信息。"""
    return fetch_weather_from_api(city)

4.2 Resources(资源)

定义:AI 可以读取的数据源。

特性说明
作用提供上下文信息
发现方式resources/list - 列出可用资源
读取方式resources/read - 读取资源内容
例子文件内容、数据库表结构、API 响应、配置信息
# 示例:定义一个 MCP 资源
@mcp.resource("config://app/settings")
def get_app_settings() -> str:
    """返回应用程序的配置信息。"""
    return load_settings()

4.3 Prompts(提示模板)

定义:可重复使用的提示词模板。

特性说明
作用标准化交互流程
发现方式prompts/list - 列出可用提示
使用方式prompts/get - 获取提示模板
例子代码审查模板、会议总结模板、问题诊断模板
# 示例:定义一个 MCP 提示模板
@mcp.prompt()
def code_review_prompt(code: str) -> str:
    """生成代码审查的提示模板。"""
    return f"""请审查以下代码:
1. 检查潜在 bug
2. 评估代码风格
3. 提出优化建议
 
代码:
{code}
"""

4.4 原语对比表

原语作用AI 行为典型方法
Tools执行操作”做”tools/list, tools/call
Resources读取数据”看”resources/list, resources/read
Prompts复用模板”用”prompts/list, prompts/get

五、客户端原语

MCP 还定义了客户端可以提供的功能:

原语说明使用场景
Sampling请求 LLM 完成Server 需要 AI 能力但不想依赖特定模型
Elicitation请求用户输入需要用户确认或提供额外信息
Logging发送日志消息调试和监控
示例:Sampling 使用场景
MCP Server(数据库查询工具)需要解释查询结果
       ↓
通过 Sampling 请求 Host 的 LLM
       ↓
LLM 生成自然语言解释
       ↓
返回给用户

六、生命周期管理

MCP 连接建立需要经过”握手”过程:

6.1 初始化序列

sequenceDiagram
    autonumber
    participant C as 🖥️ MCP Client
    participant S as 🔌 MCP Server
    
    Note over C,S: 📋 Step 1: 初始化请求
    C->>S: initialize
    Note right of C: 包含客户端信息
    S-->>C: 响应能力
    Note left of S: 告知支持的功能
    
    Note over C,S: ✅ Step 2: 初始化完成通知
    C->>S: notifications/initialized
    Note right of C: 确认初始化完成
    
    Note over C,S: 🔍 Step 3: 发现能力
    C->>S: tools/list
    S-->>C: 返回工具列表
    Note left of S: 可用工具/资源

6.2 能力协商

初始化过程中,双方交换支持的能力:

// 客户端发送
{
  "protocolVersion": "2024-11-05",
  "capabilities": {
    "sampling": {},
    "elicitation": {}
  }
}
 
// 服务器响应
{
  "protocolVersion": "2024-11-05",
  "capabilities": {
    "tools": {},
    "resources": {},
    "prompts": {}
  }
}

七、通知机制(Notifications)

MCP 支持实时更新:

通知类型说明
工具更新Server 工具列表变化时通知 Client
资源更新资源内容变化时通知 Client
进度追踪长时间操作时报告进度
场景:Server 新增了一个工具

1. Server 添加新工具
2. Server 发送 notification → Client
3. Client 更新工具列表
4. AI 立即可见新工具

通知的优势

不需要重新建立连接,Server 可以主动通知 Client 变化。


八、完整示例:文件系统查询

让我们通过一个完整示例理解 MCP 的工作流程:

flowchart TB
    A["📝 Step 1: 用户提问<br/>「我桌面上有哪些文档?」"]
    --> B["🔍 Step 2: 分析可用工具<br/>发现文件系统 MCP Server"]
    --> C["🔌 Step 3: Client 连接 Server<br/>通过 StdIO 传输请求"]
    --> D["💻 Step 4: Server 执行操作<br/>扫描桌面返回文档列表"]
    --> E["💬 Step 5: 生成自然语言回答<br/>「你的桌面上有 5 个文档」"]
    
    style A fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
    style B fill:#fff3e0,stroke:#f57c00,stroke-width:2px
    style C fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
    style D fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
    style E fill:#c8e6c9,stroke:#2e7d32,stroke-width:2px

九、总结

概念说明
三层架构Host(应用)→ Client(连接器)→ Server(服务)
两层协议数据层(JSON-RPC)+ 传输层(StdIO/HTTP)
三大原语Tools(执行)、Resources(读取)、Prompts(复用)
生命周期初始化 → 能力协商 → 发现能力 → 正常通信
通知机制Server 可以主动通知 Client 变化

核心理解

MCP 的本质是标准化的上下文交换协议——让 AI 能以统一方式获取外部信息。


十、延伸阅读

日期更新内容
2026-03-18初始版本
2026-04-13基于官方文档重写,补充完整示例