MCP架构全解析:Host、Client与Server的协同机制
01. MCP 请求&响应消息格式
上节课我们了解了 MCP 的架构:Host、Client、Server,并且通过一份时序图,了解了 LLM+MCP 是如何工作的,如果作为使用者,了解到这个程度就足够了,但是作为开发者,我们还要熟悉它们之间是怎么通信的,传递的消息格式是什么样的,响应消息是什么样的(高频面试题)。
首先是消息的编码,MCP 客户端和服务器之间的所有消息必须遵循 JSON-RPC 2.0 规范,并且在协议中定义了四类消息类型:
① 请求 (Requests)
请求从 Client 发送到 Server,或者从服务器发送到客户端,用于启动操作,数据格式如下:
{
jsonrpc: "2.0";
id: string | number;
method: string;
params?: {
[key: string]: unknown;
};
}
- 请求必须包含字符串或整数 ID。
- 与基本 JSON-RPC 不同,ID 不得为
null。 - 请求 ID 不得在同一会话中被请求者先前使用过(不过现实服务中,大部分没这类要求)。
② 响应 (Responses)
响应是对请求的回复,包含操作的结果或错误,数据格式如下:
{
jsonrpc: "2.0";
id: string | number;
result?: {
[key: string]: unknown;
}
error?: {
code: number;
message: string;
data?: unknown;
}
}
- 响应必须包含与对应请求相同的 ID。
- 响应进一步分为成功结果或错误。必须设置
result或error中的一个。响应不得同时设置两者。 - 结果可以遵循任何 JSON 对象结构,而错误必须至少包含错误代码和消息。
- 错误代码必须是整数。
③ 通知 (Notifications)
通知从客户端发送到服务器,或者从服务器发送到客户端,作为单向消息。接收方不得发送响应,数据格式如下:
{
jsonrpc: "2.0";
method: string;
params?: {
[key: string]: unknown;
};
}
- 通知不得包含 ID。
④ 批处理 (Batching)
JSON-RPC 还定义了[批量处理多个请求和通知]的方法,将它们放在一个数组中发送。MCP 实现可以支持发送 JSON-RPC 批处理,但必须支持接收 JSON-RPC 批处理(具体是否支持看对应的 MCP 服务商),数据格式如下:
TypeScript
Array<{
jsonrpc: "2.0";
id: string | number;
method: string;
params?: {
[key: string]: unknown;
};
}>
除了 JSON-RPC 外,在 MCP 协议草案中,目前还提供了一个用于 HTTP 的授权认证,不过该方案目前仍然是草案阶段,目前的接入 MCP 服务都是客户端和服务端自行定义认证和授权策略(例如使用 ENV 环境变量 + api key 的方式)。
感兴趣的同学可以在该链接了解:https://modelcontextprotocol.io/specification/2025-06-18/basic/authorization
02. MCP 的生命周期
了解了 MCP Client 和 Server 之间通信的消息格式,在正式使用 MCP 服务之前,我们还有必要了解下 MCP 的生命周期,在 2025-06-18 版本中,MCP 为 Client-Server 定义了严格的生命周期(实际上不严格),确保适当的能力协商和状态管理,总共可以划分成 3 个阶段:
- 初始化: 能力协商和协议版本约定,亦或者初始化会话 id(类似双方自我介绍);
- 操作: 正常协议通信,例如
获取工具列表、调用指定工具、批处理等(类似我说你做)。 - 关闭: 连接的优雅终止(类似友好分手)。
使用时序图来表示 MCP 的完整生命周期,如下:

1万+

被折叠的 条评论
为什么被折叠?



