前置知识
阅读本文前,建议先了解:
- 01-MCP 的定义与意义 - 了解 MCP 基本概念
一、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 HTTP | HTTP 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 能以统一方式获取外部信息。
十、延伸阅读
- 01-MCP 的定义与意义 - MCP 基本概念回顾
- 03-MCP 与 Function_Call 的区别 - MCP 与 Function Call 对比
- MCP 总览 - 返回 MCP 模块首页
- Function Call - Tool/Function Call 基础
| 日期 | 更新内容 |
|---|---|
| 2026-03-18 | 初始版本 |
| 2026-04-13 | 基于官方文档重写,补充完整示例 |