MCP 课程文档

通信协议

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

通信协议

MCP 定义了一个标准化的通信协议,使客户端和服务器能够以一致、可预测的方式交换消息。这种标准化对于整个社区的互操作性至关重要。在本节中,我们将探讨 MCP 中使用的协议结构和传输机制。

我们将深入探讨 MCP 协议的细节。您不需要了解所有这些才能使用 MCP 进行构建,但了解它的存在以及工作原理会很有帮助。

JSON-RPC:基础

MCP 的核心是使用 JSON-RPC 2.0 作为客户端和服务器之间所有通信的消息格式。JSON-RPC 是一种轻量级的远程过程调用协议,采用 JSON 编码,这使得它:

  • 可读性强,易于调试
  • 语言无关,支持在任何编程环境中实现
  • 成熟稳定,规范清晰,应用广泛

message types

该协议定义了三种类型的消息

1. 请求

从客户端发送到服务器以发起操作。请求消息包括:

  • 唯一标识符(id
  • 要调用的方法名称(例如,tools/call
  • 方法的参数(如果有)

请求示例

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "weather",
    "arguments": {
      "location": "San Francisco"
    }
  }
}

2. 响应

服务器响应请求发送到客户端。响应消息包括:

  • 与相应请求相同的 id
  • result(成功)或 error(失败)

成功响应示例

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "temperature": 62,
    "conditions": "Partly cloudy"
  }
}

错误响应示例

{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -32602,
    "message": "Invalid location parameter"
  }
}

3. 通知

不需要响应的单向消息。通常从服务器发送到客户端,以提供有关事件的更新或通知。

通知示例

{
  "jsonrpc": "2.0",
  "method": "progress",
  "params": {
    "message": "Processing data...",
    "percent": 50
  }
}

传输机制

JSON-RPC 定义了消息格式,但 MCP 还规定了这些消息如何在客户端和服务器之间传输。支持两种主要的传输机制:

stdio(标准输入/输出)

stdio 传输用于本地通信,其中客户端和服务器在同一台机器上运行

宿主应用程序将服务器作为子进程启动,并通过向其标准输入 (stdin) 写入和从其标准输出 (stdout) 读取来与其通信。

此传输的用例是本地工具,如文件系统访问或运行本地脚本。

此传输的主要优点是它简单,无需网络配置,并通过操作系统安全沙盒。

HTTP + SSE(服务器发送事件)/可流式 HTTP

HTTP+SSE 传输用于远程通信,其中客户端和服务器可能位于不同的机器上

通信通过 HTTP 进行,服务器使用服务器发送事件 (SSE) 通过持久连接将更新推送到客户端。

此传输的用例是连接到远程 API、云服务或共享资源。

此传输的主要优点是它可以在网络上工作,实现与 Web 服务的集成,并与无服务器环境兼容。

MCP 标准的最新更新引入或完善了“可流式 HTTP”,它通过允许服务器在需要时动态升级到 SSE 进行流式传输,同时保持与无服务器环境的兼容性,从而提供了更大的灵活性。

交互生命周期

在上一节中,我们讨论了客户端 (💻) 和服务器 (🌐) 之间单个交互的生命周期。现在我们来看看 MCP 协议上下文中客户端和服务器之间完整交互的生命周期。

MCP 协议定义了客户端和服务器之间结构化的交互生命周期

初始化

客户端连接到服务器,它们交换协议版本和功能,服务器响应其支持的协议版本和功能。

💻
初始化
🌐
💻
响应
🌐
💻
已初始化
🌐

客户端通过通知消息确认初始化完成。

发现

客户端请求有关可用功能的信息,服务器响应可用工具列表。

💻
tools/list
🌐
💻
响应
🌐

此过程可以针对每个工具、资源或提示类型重复。

执行

客户端根据宿主的需求调用功能。

💻
tools/call
🌐
💻
通知(可选进度)
🌐
💻
响应
🌐

终止

不再需要时,连接会正常关闭,服务器确认关闭请求。

💻
关闭
🌐
💻
响应
🌐
💻
退出
🌐

客户端发送最终退出消息以完成终止。

协议演进

MCP 协议旨在可扩展和适应。初始化阶段包括版本协商,允许协议演进时向后兼容。此外,功能发现使客户端能够适应每个服务器提供的特定功能,从而在同一生态系统中实现基本和高级服务器的混合。

< > 在 GitHub 上更新