MCP 课程文档
通信协议
并获得增强的文档体验
开始使用
通信协议
MCP 定义了一个标准化的通信协议,使客户端和服务器能够以一致、可预测的方式交换消息。这种标准化对于整个社区的互操作性至关重要。在本节中,我们将探讨 MCP 中使用的协议结构和传输机制。
我们将深入探讨 MCP 协议的细节。您不需要了解所有这些才能使用 MCP 进行构建,但了解它的存在以及工作原理会很有帮助。
JSON-RPC:基础
MCP 的核心是使用 JSON-RPC 2.0 作为客户端和服务器之间所有通信的消息格式。JSON-RPC 是一种轻量级的远程过程调用协议,采用 JSON 编码,这使得它:
- 可读性强,易于调试
- 语言无关,支持在任何编程环境中实现
- 成熟稳定,规范清晰,应用广泛
该协议定义了三种类型的消息
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 上更新