MCP协议核心组件详解及交互关系
1. 核心组件定义与功能
1.1 Resources(资源)
- 定义:服务器提供的静态数据访问接口,支持类文件系统操作,通过URI标识资源路径(如
file:///doc.txt
或https://api.example.com/data
) - 功能:
- 支持只读操作(读取文件内容/查询数据库/获取API响应)
- 提供结构化元数据(MIME类型/描述)
- 示例:IDE通过MCP读取本地代码文件作为LLM调试上下文
- 控制权:用户完全控制资源的可见性与访问权限
1.2 Prompts(提示)
- 定义:预定义的指令模板,用于优化LLM的输入上下文结构和输出格式
- 功能:
- 提供任务导向的引导(如”按JSON格式生成报告”)
- 支持动态参数注入(如
{user_name}
占位符) - 示例:客户支持场景强制LLM引用CRM用户历史记录
- 控制权:用户定义模板,LLM根据模板生成内容
1.3 Tools(工具)
- 定义:模型可调用的动态操作接口,需用户授权执行
- 功能:
- 执行外部操作(发送邮件/调用API/提交代码)
- 支持JSON Schema定义输入参数
- 示例:天气查询工具获取实时数据生成自然语言回答
- 控制权:用户定义工具,LLM自主决定是否调用
1.4 Sampling(采样)
- 定义:服务器反向调用LLM生成内容的逆向交互机制
- 功能:
- 允许服务器向LLM提交查询请求(生成代码片段)
- 支持多轮对话上下文传递实现”AI协作”
- 兼容性:仅部分客户端(如Claude Desktop)支持
1.5 Roots(根资源)
- 定义:客户端声明的资源访问范围标识符
- 功能:
- 防止资源越界访问(限制文件系统到
/projects
目录) - 支持多工作区管理(区分开发/生产环境资源)
- 防止资源越界访问(限制文件系统到
- 实现:客户端连接时声明Roots,服务器优先在此范围内操作
1.6 Transports(传输)
- 定义:组件间通信的协议实现层
- 功能:
- 支持两种标准传输方式:
- Stdio:本地进程间通信(低延迟)
- SSE:流式更新(实时日志推送)
- 允许自定义协议(WebSocket/gRPC)
- 支持两种标准传输方式:
2. 组件联系与协作
2.1 功能互补性
组件 | 数据流向 | 典型协作场景 |
---|---|---|
Resources → Tools | 静态→动态 | 工具调用前读取配置文件作为参数 |
Prompts → Sampling | 模板→生成 | 使用提示模板约束Sampling的输出格式 |
Roots → Transports | 范围→通信 | 传输层根据Roots过滤非法资源请求 |
2.2 工作流示例:智能代码助手
- 资源加载:IDE客户端通过
Roots
限定访问/src
目录代码文件 - 提示注入:使用”代码审查”提示模板要求LLM按Checklist格式输出
- 工具调用:LLM调用
git commit
工具提交代码修改(需用户授权) - 传输保障:Stdio返回代码分析结果,SSE推送编译错误日志
3. 核心区别与设计哲学
3.1 控制权与交互模式
组件 | 控制方 | 交互方向 | 数据特性 |
---|---|---|---|
Resources | 用户 | 单向(读) | 静态/结构化 |
Tools | 用户+模型 | 双向(调用) | 动态/操作化 |
Prompts | 用户 | 单向(输入) | 模板化/引导性 |
Sampling | 服务器 | 逆向(请求) | 生成式/上下文敏感 |
3.2 设计原则对比
- Resources vs Tools Resources 强调数据安全性(只读),Tools 强调操作可控性(需授权)
- Prompts vs Sampling Prompts 是前馈控制(预设模板),Sampling 是反馈控制(动态生成)
- Roots vs Transports Roots 定义逻辑边界,Transports 定义物理通道,共同保障系统安全性
4. 技术实现细节
4.1 协议消息结构(JSON-RPC 2.0)
// 工具调用示例
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_weather",
"arguments": {"latitude": 45.5155, "longitude": -122.6789}
}
}
// 资源读取示例
{
"method": "resources/read",
"params": {"uri": "file:///project/docs/api.md"}
}
4.2 开发实践
@server.list_tools()
async def handle_list_tools() -> list[types.Tool]:
return [types.Tool(name="debug", input_schema=DEBUG_SCHEMA)]
@server.read_resource()
async def read_resource(uri: AnyUrl) -> str:
return open(uri.path).read()
5. 应用价值与局限
5.1 核心价值
- 通过模块化设计实现AI能力扩展:
- 开发效率提升(减少70%集成代码量)
- 支持混合部署(本地+云端资源)
- 跨平台互操作(如Cursor IDE与GitHub服务器)
5.2 当前局限
- 动态工具发现可能增加延迟(需多轮协商)
- Roots路径解析存在跨平台兼容性问题(Windows/macOS路径差异)
- 实时通信带来的性能开销(高并发场景需优化)
6. 总结
MCP通过七大组件的协同设计构建层次化AI交互协议:
- 基础层(Transports/Roots):保障通信安全与边界控制
- 能力层(Resources/Tools):提供静态数据与动态操作
- 引导层(Prompts/Sampling):优化模型行为与输出质量
该架构推动LLM从文本生成器进化为智能体操作系统,标志着AI集成从”硬编码”向”协议驱动”的范式转变,为构建开放AI生态系统奠定技术基础。
上篇MCP详解