客户端-服务器架构
MCP 的架构是三段式:Host(应用本体)、Client(协议连接)、Server(能力提供)。面试主线:三角关系、连接流程、协议消息。
三角架构
Host 嵌入 Client, Client 连 Server
| 角色 | 职责 |
|---|---|
| Host | 用户界面 + LLM 集成,决定暴露什么给模型 |
| Client | 协议实现:与服务器建连、发请求(一个服务器一个客户端) |
| Server | 暴露工具/资源/提示,执行操作 |
要点:Host 和 Client 是进程内关系(Client 是 Host 的库),Client 和 Server 可以跨进程/跨机器(通过传输层)。
连接流程
- 初始化:Client 发
initialize(协议版本 + 能力声明),Server 回版本 + 能力 - 协商:双方确认支持的特性(
initialized通知) - 能力发现:Client 请求工具列表(
tools/list)、资源列表 - 运行时调用:
tools/call、resources/read、prompts/get
Client → Server: initialize {protocolVersion, capabilities}
Server → Client: initialize result {capabilities, serverInfo}
Client → Server: initialized
Client → Server: tools/list → 拿到工具清单
Client → Server: tools/call {name, arguments}
Server → Client: 执行结果协议消息:JSON-RPC
- 传输层消息是 JSON-RPC 2.0:request / response / notification(无响应)
- 请求带 id,响应对应 id;notification 是单向通知
- 协议能力通过 capabilities 声明:双方只使用都支持的能力(向前兼容)
会话与生命周期
- 会话:连接建立到关闭,双方维护状态
- 服务器可以主动通知变化(工具列表变化、资源更新),走
notifications - 优雅关闭:Client 断连,Server 清理状态
- 长会话中模型上下文变化时,Client 可更新服务器侧上下文(
contexts/update等扩展)
面试追问
- Host 和 Client 的区别? Host 是应用本体(UI + LLM),Client 是协议实现(进程内库)。一个 Host 可有多个 Client
- 连接流程? initialize 协商版本能力 → 能力发现(tools/list)→ 运行时调用(tools/call)
- 协议消息格式? JSON-RPC 2.0:请求/响应/通知。capabilities 声明保证兼容
- Server 能主动发消息吗? 能:notification(工具列表变化、资源更新)
- 一个服务器一个客户端? 是:每个服务器连接对应一个 Client 实例,Host 管理多个