考察点
字节、腾讯、百度的 Agent 岗一面都考过这道。面试官想确认你理解 MCP 不只是「一个工具协议」,而是有明确角色划分的客户端-服务端架构。高频追问:「Host 和 Client 是同一个东西吗」「Tools 和 Resources 为什么不能合并」。
参考答案
三角色各干什么
MCP(Model Context Protocol,Anthropic 2024 年底开源)把工具接入拆成三个角色:
- Host(宿主):跑模型的那个应用本身,比如 Claude Desktop、Cursor、你自己写的 Agent 服务。它持有 LLM,决定什么时候需要工具,统筹整个会话。
- Client(客户端):Host 内部的协议连接器,一个 Client 对一个 Server 保持一条独立的会话连接,负责协议握手、能力协商、消息收发。它是 Host 的内部组件,不是独立部署的东西。
- Server(服务端):轻量进程或服务,向外暴露具体能力——查数据库的 Server、操作 Git 的 Server、读文件系统的 Server,各管一摊。
用比喻说:Host 是大脑,Client 是每根神经,Server 是各个器官。大脑通过神经控制器官,神经只管传输不管决策。
为什么要拆 Host 和 Client
这是最常见的追问。拆开解决两个问题:一是一对多,一个 Host 要同时接 10 个 Server,每个连接有独立的生命周期和能力集,必须每连接一个 Client 实例来隔离状态;二是安全边界,Client 是唯一和 Server 说话的组件,鉴权、消息校验、敏感信息过滤都可以收敛在这一层,Server 之间互相看不到对方的连接和数据。
Server 暴露的三类原语
- Tools:模型可以调用的函数,有副作用或计算逻辑,对应 Function Calling 里的工具。
- Resources:可读取的数据,比如文件内容、数据库表结构、日志。由应用侧决定什么时候读,类似只读的上下文注入源。
- Prompts:预定义的 Prompt 模板,Server 把「这类数据该怎么分析」的最佳实践打包成模板提供给 Host。
Tools 和 Resources 不合并是有道理的:模型自主决策的粒度(Tool)和应用/用户控制的粒度(Resource)不同,混成一个「能力」就没法做权限和触发策略的区分——Resource 读取通常不需要模型介入,Tool 调用必须经过模型决策或用户确认。
一次调用的完整链路
Host 启动时为每个配置的 Server 拉起一个 Client 连接,握手时 Server 上报自己有哪些 Tools/Resources/Prompts;Host 把 Tools 转换成模型能理解的 Function Calling schema 随对话发给模型;模型返回 tool_calls 后,Host 找到对应 Client 发 tools/call 请求;Server 执行并返回结果;结果经 Host 回填给模型。可以看到,MCP 并没有取代 Function Calling,它规范的是「工具从哪来、怎么调」这一段,模型侧仍然走标准 FC。
可能的追问
- Client 和 Server 是一对一还是一对多? 严格一对一,每个 Server 一条连接。好处是单个 Server 崩溃、重连不影响其他工具链路。
- MCP 和插件机制(如早期 OpenAI Plugins)有什么区别? 插件是各厂商私有规范、应用绑定;MCP 是开放协议,Server 写一次可以被任何支持 MCP 的 Host 复用,生态不锁定。
- Server 能反向调用 Host 吗? 协议支持 Server 发起采样(sampling)请求让 Host 的模型帮忙生成内容,也支持日志和进度通知,但主导权始终在 Host 手里。