Skip to content

2.1 拆解 MCP——Client-Host-Server 三层架构

小周决定学 MCP 了。他打开 Claude Desktop 准备配置一个 GitHub MCP Server,但看到配置文件里的 commandargsmcpServers 一脸懵——他需要先理解 MCP 的架构是怎么运转的。


三层架构

MCP 采用三层架构,灵感来自 LSP:

🖥 Host(宿主)—— Claude Desktop / VS Code / Cursor
MCP Client 1 1:1
MCP Client 2 1:1
MCP Client 3 1:1
📂 文件系统 Server
🐙 GitHub Server
🗄 数据库 Server
每个 Client 和 Server 是 1:1 关系,Server 之间完全隔离

三个角色详解

Host(宿主)

Host 是创建和管理 Client 的应用程序。它是 AI 和 MCP 之间的桥梁。

Host说明
Claude DesktopAnthropic 的桌面应用,最先支持 MCP
VS Code微软的编辑器,2025 年添加 MCP 支持
CursorAI 编程编辑器,通过 Settings → MCP 配置
ChatGPTOpenAI 的聊天应用,2025 年支持 MCP
Claude CodeCLI 工具,已内置文件读写、Git、Bash 等能力,可通过 .claude/settings.json 配置额外 MCP Server

Host 的职责:

  • 创建和管理多个 MCP Client 实例
  • 汇聚所有 Client 发现的工具,暴露给 AI 模型
  • 处理 AI 模型的工具调用请求,分发给对应的 Client

Client(客户端)

Client 是 Host 内部的协议状态机,与 Server 保持 1:1 连接。

建立连接——维护与 Server 的 1:1 会话
能力协商——初始化时交换 capability
发现工具——获取 tools/resources/prompts
转发请求——分发 AI 的工具调用
接收通知——进度、变更、日志
声明能力——Roots、Sampling、Elicitation

Server(服务端)

Server 是提供能力的独立进程。它可以是:

  • 本地进程(通过 stdio 通信)——如文件系统 Server
  • 远程服务(通过 HTTP 通信)——如 GitHub API Server

Server 的职责:

  • 注册和暴露工具(Tools)、资源(Resources)、模板(Prompts)
  • 处理 Client 的请求
  • 发送通知(工具变更、进度更新、日志)
  • 可选:请求 Client 做事(Sampling、Elicitation)

传输方式

MCP 支持两种传输方式,分别对应本地和远程场景:

stdio 传输(本地)
原理:Host 将 Server 作为子进程启动,通过 stdin/stdout 通信
消息格式:每条 JSON-RPC 消息以换行符分隔
日志:Server 的日志写入 stderr(绝不能写 stdout)
版本:v1+ 支持
场景:本地工具——文件系统、Git、数据库
npx @modelcontextprotocol/server-filesystem /path
Streamable HTTP 传输(远程)
原理:Client 发送 HTTP POST,Server 可返回 JSON 或 SSE 流
会话管理:通过 Mcp-Session-Id 头
授权:支持 OAuth 2.1
版本:v2+ 支持(v2 引入,替代旧的 SSE 传输)
场景:远程 SaaS 服务——Slack、GitHub API
POST https://api.example.com/mcp

stdio 的关键规则

stdio Server 绝不能向 stdout 写入非协议数据。stdout 只能用于 JSON-RPC 消息,否则会破坏协议解析。所有日志必须写入 stderr。


生命周期

MCP 连接经历三个阶段:

Phase 1
初始化(Initialization)
Client 发送 initialize 请求,携带自己的能力和协议版本 → Server 回复自己的能力和版本 → Client 发送 initialized 通知 → 双方按协商的能力开始工作。
关键:能力协商——Client 声明支持 sampling/elicitation/roots,Server 声明提供 tools/resources/prompts。
Phase 2
正常通信(Operation)
双方按协商的能力进行通信。Client 调用 Server 的工具、读取资源、获取模板。Server 可以发送通知(工具变更、进度更新、日志)。Server 还可以请求 Client 做事(Sampling、Elicitation、Roots)。
Phase 3
关闭(Shutdown)
stdio:关闭连接,Server 进程退出。HTTP:发送关闭通知,断开连接。如果对方无响应,可超时后强制关闭。

小周的观察

小周打开了 Claude Desktop,配置了两个 MCP Server(文件系统和 GitHub)。他在输入框旁边看到了工具图标,悬停后显示了所有可用的工具。

这就是三层架构在起作用:

  1. Claude Desktop(Host)创建了两个 Client 实例
  2. 每个 Client 分别连接到文件系统 Server 和 GitHub Server
  3. 两个 Server 各自暴露工具,Client 汇聚后交给 Claude 模型使用

本节核心要点

  • MCP 三层架构:Host(管理 Client)→ Client(1:1 连接 Server)→ Server(提供能力)
  • Server 之间完全隔离,不直接通信
  • 两种传输:stdio(本地子进程)和 Streamable HTTP(远程 HTTP)
  • 生命周期三阶段:初始化(能力协商)→ 正常通信 → 关闭
  • stdio Server 绝不能向 stdout 写非协议数据

思考题:如果一个 Server 需要访问另一个 Server 的能力(比如 GitHub Server 需要读写文件),MCP 架构下应该怎么做?(提示:想想 Server 之间的隔离原则)

参考思路

MCP 架构下 Server 之间完全隔离,不直接通信。解决方案有两种:(1) 让 AI(Client/Host 层)编排——先调用 filesystem-server 读文件,再调用 github-server 创建 Issue;(2) 在 Server 内部直接使用需要的 API(如 GitHub Server 内部调用文件系统库),但这意味着该 Server 自己承担了职责,绕过了 MCP 的隔离。


← 上一节:你需要 MCP 吗? | 目录 | 下一节:三大原语 →