客户端与 Host
原文:客户端与 Host
一句话
MCP 客户端是由 Host 应用程序(如 Claude.ai 或 IDE)实例化的组件,用于与特定 MCP 服务器通信,同时提供征询、根目录和采样等核心功能。
什么时候翻这页
当你需要理解 MCP 架构中客户端与 Host 的区别,或者需要实现客户端功能(如征询用户信息、限制服务器文件访问范围、通过客户端请求 LLM 完成任务)时。
核心概念
Host 与客户端的区别
- Host:用户直接交互的应用程序(如 Claude.ai 或 IDE),管理整体用户体验并协调多个客户端
- 客户端:协议级别的组件,处理与一个服务器的直接通信,由 Host 实例化
三大核心客户端功能
-
征询 (Elicitation)
- 服务器可在交互过程中向用户请求特定信息
- 提供结构化方式按需收集信息
- 服务器可暂停操作等待用户输入
-
根目录 (Roots)
- 定义服务器操作的文件系统边界
- 客户端指定服务器应关注的目录
- 使用 file:// URI 方案标识目录
-
采样 (Sampling)
- 服务器通过客户端请求 LLM 完成任务
- 客户端控制用户权限和安全措施
- 维持不同上下文间的清晰边界
怎么做
实现征询功能
- 服务器发起征询请求:
{
"method": "elicitation/create",
"params": {
"message": "请确认您的巴塞罗那度假预订详情:",
"schema": {
"type": "object",
"properties": {
"confirmBooking": {
"type": "boolean",
"description": "确认预订(航班+酒店=3,000美元)"
},
"seatPreference": {
"type": "string",
"enum": ["靠窗", "过道", "无偏好"],
"description": "航班座位偏好"
}
},
"required": ["confirmBooking"]
}
}
}
- 客户端显示征询界面并收集用户响应
- 将响应返回给服务器继续处理
配置根目录
- 客户端向服务器提供文件系统根目录:
{
"uri": "file:///Users/agent/travel-planning",
"name": "旅行规划工作区"
}
- 服务器尊重这些边界,在指定目录内操作
- 当用户打开不同项目时,客户端通过
roots/list_changed通知服务器
使用采样功能
- 服务器发起采样请求:
{
"messages": [
{
"role": "user",
"content": "分析这些航班选项并推荐最佳选择:\n[47个航班的价格、时间、航空公司和经停信息]\n用户偏好:早晨出发,最多1次经停"
}
],
"modelPreferences": {
"hints": [{
"name": "claude-sonnet-4-20250514"
}],
"intelligencePriority": 0.9
},
"systemPrompt": "您是帮助用户根据偏好找到最佳航班的旅行专家",
"maxTokens": 1500
}
- 客户端向用户展示请求并获取批准
- 客户端与 LLM 交互并返回批准的响应
命令 / 配置速查
征询相关
elicitation/create- 服务器发起征询请求- 包含 message(提示消息)和 schema(数据结构)参数
根目录相关
roots/list_changed- 根目录变更通知- 根目录使用 file:// URI 方案
- 客户端可动态更新根目录列表
采样相关
sampling/createMessage- 服务器发起采样请求- 包含 messages、modelPreferences、systemPrompt 和 maxTokens 参数
与 Claude Code / Hello-Agents 的联系
在 Claude Code 手册的 MCP 章节中,我们了解了 MCP 的基本架构。本章节深入探讨了客户端的具体功能,特别是采样功能与 Hello-Agents 第 10 章中代理行为模式相呼应,展示了如何通过客户端控制 AI 交互的安全性和权限。
初学者易错点
- 混淆 Host 与客户端:Host 是用户交互的应用,客户端是协议组件,不是同一层级
- 误解根目录的安全作用:根目录是协调机制而非安全边界,实际安全需通过操作系统权限实现
- 忽略用户控制:采样功能设计包含用户审查点,不应完全绕过用户控制
- 过度依赖征询:征询应作为补充而非替代,避免频繁打断用户工作流