Model Context Protocol (MCP) 通信过程详解

1. MCP 简介

Model Context Protocol (MCP) 是一种开放标准,用于在 AI 应用程序和外部系统之间建立安全的双向连接。它允许 AI 应用(如 Claude 或 ChatGPT)连接到数据源(如本地文件、数据库)、工具(如搜索引擎、计算器)和工作流(如专用提示),使它们能够访问关键信息并执行任务。

可以把 MCP 理解为 AI 应用的"USB-C 接口",就像 USB-C 为电子设备提供标准化连接方式一样,MCP 为 AI 应用提供了一种标准化的方式来连接外部系统。

2. MCP 架构

MCP 采用客户端-服务器架构,其中:

  • MCP Host:AI 应用程序,协调和管理一个或多个 MCP 客户端
  • MCP Client:维护与 MCP 服务器连接的组件,并从 MCP 服务器获取上下文供 MCP Host 使用
  • MCP Server:提供上下文给 MCP 客户端的程序

MCP 架构包含两个层次:

  1. 数据层:定义基于 JSON-RPC 的客户端-服务器通信协议,包括生命周期管理、核心原语(如工具、资源、提示)等
  2. 传输层:定义客户端和服务器之间数据交换的通信机制和通道,包括传输特定的连接建立、消息帧和授权

3. MCP 通信流程

MCP 通信遵循严格的生命周期管理,确保正确的功能协商和状态管理。整个通信过程分为三个阶段:

3.1 初始化阶段

初始化阶段是客户端和服务器之间的第一次交互,主要完成协议版本协商和功能能力交换。

sequenceDiagram participant C as MCP Client (AI应用) participant S as MCP Server C->>S: initialize 请求 Note right of C: 包含协议版本、<br/>客户端功能和支持的实现信息 S->>C: initialize 响应 Note left of S: 返回协议版本、<br/>服务器功能和支持的实现信息 C->>S: initialized 通知 Note right of C: 表示客户端已准备好开始正常操作

初始化过程详细步骤:

  1. 客户端发送 initialize 请求,包含协议版本、客户端功能和支持的实现信息
  2. 服务器响应 initialize 请求,返回协议版本、服务器功能和支持的实现信息
  3. 客户端发送 initialized 通知,表示已准备好开始正常操作

3.2 操作阶段

在操作阶段,客户端和服务器根据协商的功能进行消息交换。

MCP 定义了三种核心原语,服务器可以暴露这些原语供客户端使用:

  1. 工具 (Tools):AI 应用可以调用的可执行函数(如文件操作、API 调用、数据库查询)
  2. 资源 (Resources):为 AI 应用提供上下文信息的数据源(如文件内容、数据库记录、API 响应)
  3. 提示 (Prompts):帮助构建与语言模型交互的可重用模板(如系统提示、少量示例)
sequenceDiagram participant C as MCP Client (AI应用) participant S as MCP Server note over C,S: 工具发现和调用流程 C->>S: tools/list 请求 S->>C: 工具列表响应 C->>S: tools/call 请求 Note right of C: 调用具体工具,<br/>传递参数 S->>C: 工具调用结果 note over C,S: 资源访问流程 C->>S: resources/list 请求 S->>C: 资源列表响应 C->>S: resources/read 请求 Note right of C: 读取具体资源内容 S->>C: 资源内容响应 note over C,S: 提示使用流程 C->>S: prompts/list 请求 S->>C: 提示列表响应 C->>S: prompts/get 请求 Note right of C: 获取具体提示内容 S->>C: 提示内容响应

3.3 关闭阶段

关闭阶段是一方(通常是客户端)正常终止协议连接的过程。

对于不同的传输机制,关闭方式有所不同:

  • Stdio 传输:通过关闭输入/输出流来关闭连接
  • HTTP 传输:通过关闭相关 HTTP 连接来关闭连接

4. MCP 核心原语详解

4.1 工具 (Tools) 原语

工具是 AI 应用可以调用的可执行函数,允许模型与外部系统交互。工具通常用于执行操作,如文件操作、API 调用或数据库查询。

示例:

{
  "name": "get_weather",
  "title": "Weather Information Provider",
  "description": "Get current weather information for a location",
  "inputSchema": {
    "type": "object",
    "properties": {
      "location": {
        "type": "string",
        "description": "City name or zip code"
      }
    },
    "required": ["location"]
  }
}

当 AI 模型需要获取天气信息时,它可以调用这个工具,传入位置参数,服务器会执行相应的操作并返回结果。

4.2 资源 (Resources) 原语

资源是为 AI 应用提供上下文信息的数据源。它们通常是只读的数据,可以是文件内容、数据库记录或 API 响应。资源通过 URI 进行唯一标识,客户端可以列出和读取这些资源。

示例:

{
  "uri": "file:///project/src/main.py",
  "name": "main.py",
  "title": "Python Application Main File",
  "description": "Primary application entry point",
  "mimeType": "text/x-python"
}

当 AI 模型需要了解项目代码结构时,它可以请求读取这些资源,获取文件内容作为上下文信息。

资源的特点:

  • 通过 URI 唯一标识
  • 可以是文本或二进制数据
  • 支持 MIME 类型标识
  • 可以包含元数据(如最后修改时间、重要性等)

4.3 提示 (Prompts) 原语

提示是可重用的模板,有助于构建与语言模型的交互。它们通常由用户主动选择使用,可以是系统提示、少量示例或其他预定义的对话模板。

示例:

{
  "name": "code_review",
  "title": "Request Code Review",
  "description": "Asks the LLM to analyze code quality and suggest improvements",
  "arguments": [
    {
      "name": "code",
      "description": "The code to review",
      "required": true
    }
  ]
}

当用户想要对代码进行审查时,可以选择这个提示模板,传入需要审查的代码,系统会生成一个结构化的请求发送给 AI 模型。

提示的特点:

  • 由用户主动选择使用
  • 可以包含参数占位符
  • 支持多种内容类型(文本、图像、音频等)
  • 可以嵌入资源内容

5. 传输机制

MCP 支持两种标准传输机制:

5.1 Stdio 传输

在 Stdio 传输中:

  • 客户端将 MCP 服务器作为子进程启动
  • 服务器从标准输入 (stdin) 读取 JSON-RPC 消息,并向标准输出 (stdout) 发送消息
  • 消息通过换行符分隔,且不能包含嵌入的换行符

5.2 Streamable HTTP 传输

在 Streamable HTTP 传输中:

  • 服务器作为独立进程运行,可以处理多个客户端连接
  • 使用 HTTP POST 和 GET 请求进行通信
  • 服务器可以使用服务器发送事件 (SSE) 来流式传输多个服务器消息
sequenceDiagram participant C as MCP Client participant S as MCP Server note over C,S: 建立 SSE 连接 C->>S: GET /sse (建立SSE连接) S->>C: SSE 连接建立,返回消息端点 note over C,S: 客户端发送请求 C->>S: POST /messages (JSON-RPC请求) S->>C: 202 Accepted note over S: 服务器通过SSE<br/>发送响应或通知 S->>C: SSE message 事件

6. 工具调用示例

工具调用是 MCP 中最重要的功能之一,允许 AI 模型与外部系统交互:

sequenceDiagram participant M as AI 模型 (LLM) participant C as MCP Client participant S as MCP Server M->>C: 请求调用天气查询工具 C->>S: tools/list (发现可用工具) S->>C: 返回工具列表 C->>S: tools/call (调用具体工具) Note right of C: 参数: {location: "北京"} S->>S: 调用外部API获取天气信息 S->>C: 返回天气信息 C->>M: 将天气信息传递给AI模型

7. 安全考虑

MCP 实现需要考虑以下安全问题:

  1. 服务器必须

    • 验证所有工具输入
    • 实现适当的访问控制
    • 限制工具调用频率
    • 清理工具输出
  2. 客户端应该

    • 在敏感操作上提示用户确认
    • 在调用服务器前向用户显示工具输入,避免恶意或意外的数据泄露
    • 验证工具结果后再传递给 LLM
    • 实现工具调用超时机制
    • 记录工具使用情况用于审计

8. 错误处理

MCP 使用两种错误报告机制:

  1. 协议错误:标准 JSON-RPC 错误,用于处理未知工具、无效参数、服务器错误等问题
  2. 工具执行错误:在工具结果中使用 isError: true 标记,用于报告 API 失败、无效输入数据、业务逻辑错误等

9. 总结

MCP 通过标准化的协议为 AI 应用提供了一种强大的机制来访问外部系统和工具。其基于 JSON-RPC 的通信机制、严格的生命周期管理以及对多种传输方式的支持,使得 AI 应用可以安全、可靠地与各种外部资源进行交互。通过工具、资源和提示三种核心原语,MCP 为构建功能丰富的 AI 应用提供了坚实的基础。

工具、资源和提示这三种原语各有不同的用途和特点:

  • 工具:由 AI 模型主动调用,用于执行操作
  • 资源:由应用主动提供,作为上下文信息
  • 提示:由用户主动选择,用于引导对话流程

这种设计使得 MCP 能够支持各种不同的使用场景,从简单的工具调用到复杂的上下文管理和对话流程控制。

posted @ 2025-09-22 20:19  JMCui  阅读(122)  评论(0)    收藏  举报