MCP Client、Host、Server 三者关系图解

智能体

读 MCP 文档最容易被 Host、Client、Server 三个词绕晕。本文用一张清晰的角色图讲透三者各自负责什么、消息怎么流动、为什么要这么分,看完再也不会把 Client 和 Server 搞混。

MCP(Model Context Protocol)时,几乎每个人都会在同一个地方卡住:Host、Client、Server 到底谁是谁?文档里这三个词来回出现,尤其「Host 里包含 Client」这种说法,第一次看很容易懵。而这三者的关系恰恰是理解 MCP 架构的钥匙——搞清楚了,后面的工具发现、权限、通信全都顺了。

这篇文章用最直白的方式把三者的角色、职责和消息流动讲清楚。如果你还不清楚 MCP 和 Function Calling 的关系,建议先读《MCP vs Function Calling》打底。

客户端与服务端的架构关系
客户端与服务端的架构关系

MCP 的三个角色不是并列的三方,而是「Host 内含 Client,Client 连接 Server」的嵌套关系。

一句话定位三个角色

先给最简版本,后面再展开:

  • Host(宿主):你实际在用的那个 AI 应用,比如 Claude Code、Cursor、某个桌面助手。它是和你、和大模型打交道的主体。
  • Client(客户端):Host 内部的一个「连接器」组件,负责和某一个 Server 建立并维护连接。Host 里有 Client,不是并列的两个东西。
  • Server(服务端):提供具体能力(工具、数据、提示模板)的独立程序,比如一个文件搜索 Server、一个数据库 Server、一个 GitHub Server。

关键的、最容易搞错的一点:Client 不是「用户端」,Server 不是「云端」。 在 MCP 里,Client 是 Host 内部的连接器,Server 往往就跑在你本机(作为子进程)。别用平时「客户端=手机 App、服务端=远程服务器」的直觉去套。

展开:各自到底负责什么

Host——总指挥

Host 是整台机器的大脑和门面。它负责:

  • 和用户交互、和大模型对话;
  • 决定要连接哪些 Server(你在配置里挂了哪些);
  • 为每个要连接的 Server 创建一个对应的 Client;
  • 汇总所有 Server 提供的工具,交给模型;模型决定调用某个工具时,Host 通过对应的 Client 把请求转发出去;
  • 掌握权限和安全:要不要执行某个工具调用、要不要请用户确认,是 Host 说了算。

Client——一对一的连接器

这是最需要澄清的角色。一个 Client 只负责连接一个 Server,是 Host 和某个 Server 之间的专属通道。如果 Host 同时连了三个 Server,它内部就有三个 Client,各管一个。Client 负责:

  • 和它对应的那个 Server 建立连接、维持会话;
  • 按 MCP 协议(基于 JSON-RPC)收发消息:向 Server 查询「你有哪些工具」,把模型的调用请求发给 Server,接收 Server 返回的结果;
  • 处理这条连接上的协议细节。

为什么要有 Client 这层、而不是 Host 直接连 Server?因为它把「怎么和一个 Server 通信」这件事标准化、隔离化了——每个连接独立,一个 Server 挂了不影响别的,也让 Host 的逻辑更清爽。

Server——能力提供方

Server 是真正干活的,它对外声明自己提供什么,MCP 定义了三类主要能力:

  • Tools(工具):可被模型调用的动作,如「搜索文件」「查订单」「发起 API 请求」;
  • Resources(资源):可被读取的数据,如文件内容、数据库记录;
  • Prompts(提示模板):预设的提示词模板,供 Host 调用。

一个 Server 通常聚焦一个领域(文件、数据库、某个 SaaS)。它可以跑在本机(通过标准输入输出和 Host 通信),也可以是远程服务(通过 HTTP 通信)。怎么从零写一个,见《从零写一个 MCP Server》

三层角色的消息流动示意
三层角色的消息流动示意

Host 管全局与权限,每个 Client 专管一条到 Server 的连接,Server 专注提供能力。

消息怎么流动:一次工具调用的全程

把三者串起来,看一次真实的工具调用是怎么走的:

[启动] Host 读配置,为每个 Server 创建一个 Client
       每个 Client 连上自己的 Server,问:“你有哪些工具?”
       Server 返回工具清单 → Client → Host 汇总所有工具

[对话] 用户提问 → Host 把问题 + 所有可用工具交给大模型
       模型决定:“调用 file-search 的 search_files 工具”

[调用] Host 找到管 file-search 的那个 Client
       → Client 按协议把调用请求发给 file-search Server
       → Server 执行搜索,返回结果
       → Client 收到结果 → Host

[生成] Host 把工具结果喂回模型 → 模型生成最终回答 → 用户

看清楚了:模型不直接碰 Server,Host 也不直接碰 Server,中间永远隔着对应的 Client。 这条「模型 ↔ Host ↔ Client ↔ Server」的链路,就是 MCP 的全部骨架。

为什么要这么分:三层的好处

这套看似绕的分层,换来的是实实在在的解耦:

  • Server 可复用:GitHub 官方写一个 Server,任何有 Client 能力的 Host(Claude Code、Cursor……)都能接,不用各写各的集成——这是 MCP 把集成从 M×N 变成 M+N 的核心;
  • 连接隔离:每个 Server 一个独立 Client,互不干扰,一个 Server 崩了不拖累其他;
  • 权限集中在 Host:安全决策统一由 Host 把关,Server 只管提供能力、不管该不该被调用,职责清晰;
  • 协议统一:Client 和 Server 之间说同一种 JSON-RPC 方言,语言无关,谁都能实现。
标准化接口带来的可复用性示意
标准化接口带来的可复用性示意

分层的回报:Server 一次封装、多 Host 复用,连接互相隔离,权限集中在 Host。

适用人群与常见误解

适合刚开始学 MCP、被术语绕晕的开发者,以及想搞清楚 Claude Code/Cursor 里「MCP 配置」到底在配什么的用户。澄清几个高频误解:

  • 「Client 是用户、Server 在云端」:错。Client 是 Host 内部组件,Server 常在本机。别套用 Web 的客户端/服务端直觉。
  • 「Host 和 Client 是两个程序」:不是。Client 是 Host 内部的模块,一个 Host 里有多个 Client。
  • 「Server 一定是个远程服务」:不是。最常见的本地 Server 就是 Host 拉起的一个子进程,通过标准输入输出通信。

常见问题

Q:我在 Cursor 里配置 MCP,配的是哪个角色? A:你配置的是「Host(Cursor)要连接哪些 Server」。Cursor 是 Host,会为你配的每个 Server 自动创建 Client 去连接。你只需提供 Server 的启动命令或地址。

Q:一个 Host 能连多少个 Server? A:技术上没硬限制,但连太多会让工具列表膨胀、占用大量上下文、干扰模型选择。建议按任务只挂需要的 Server,保持精简。

Q:Server 之间能互相通信吗? A:MCP 的标准模型里,Server 之间不直接通信,都通过 Host 协调。每个 Server 是独立的能力单元,编排由 Host(和模型)负责。

小结

MCP 的三个角色,记住这个嵌套关系就不会乱:Host 是你用的 AI 应用(总指挥、管权限),Host 内部为每个 Server 配一个 Client(一对一的连接器),Server 是独立的能力提供方(工具、资源、提示)。 消息永远沿「模型 ↔ Host ↔ Client ↔ Server」流动。这套分层换来的是 Server 可跨应用复用、连接互相隔离、权限集中管控。图解看懂了,MCP 的其余部分都是细节。