对比
MCP 服务端与客户端的区别
同一条连接的两端,职责完全不同。把这两者搞混,是新手实现时最常见的错误来源。
先记住一句话
服务端拥有能力:它定义工具、校验输入、执行工作、返回结构化结果。客户端拥有对话:它发现有哪些能力可用、 把这些选项呈现给模型、并把选中的调用路由给正确的服务端。
一条实用的判断标准:服务端应该可以在完全不知道"对面是谁"的情况下运行。一旦它开始做面向用户的决策, 边界就已经被越过了。
各用一句话
服务端负责暴露,客户端负责编排。谁都不该去干对方的活。
并排看
| 维度 | 服务端 | 客户端 |
|---|---|---|
| 拥有什么 | 能力及其契约 | 会话与模型交互 |
| 定义什么 | 工具名、schema、权限、错误 | 连哪些服务端,以及怎么呈现它们 |
| 校验什么 | 输入,在碰真实系统之前 | 这次任务到底该不该发起调用 |
| 是否知道用户 | 不知道,也不需要知道 | 知道,因为是它在驱动对话 |
| 如何扩展 | 暴露更多或更窄的能力 | 连更多服务端,而不用改模型 |
| 典型错误 | 把业务规则或用户偏好写进去 | 把"该调哪个工具"写死 |
一次调用怎么走
1
客户端建立连接
它连上服务端,获知存在哪些能力,以及各自的名称、描述和 schema。
2
客户端把它们交给模型
能力被呈现为可调用的选项,由模型判断当前请求是否匹配其中任何一个。
3
服务端校验并执行
坏输入在碰任何真实系统之前就被拒绝。调用合法才真正执行能力。
4
结构化结果返回
客户端把结果交给模型,模型拿到的是可用字段,而不是一堆原始文本,从而继续对话。
常见混淆
让服务端了解用户服务端开始按人设或历史来调整行为。这属于客户端和 Skill 层。
在客户端写死工具选择如果客户端已经知道该调哪个工具,模型就没有在做选择,协议只剩开销。
只在客户端做校验客户端不是信任边界。无论谁发来的请求,服务端都必须拒绝坏输入。
让服务端决定呈现方式组织面向用户的答案属于任务关注点,该归 Skill,而不是连接层。