资源设计为应用程序控制,这意味着客户端应用程序可以决定如何以及何时使用它们。
不同的 MCP 客户端可能会以不同的方式处理资源。例如:
- Claude 桌面版目前要求用户明确选择资源后才能使用
- 其他客户端可能会根据启发式自动选择资源
- 一些实现甚至可能允许 AI 模型本身决定使用哪些资源
概述
资源表示 MCP 服务器希望向客户端提供的任何类型的数据。这可以包括:- 文件内容
- 数据库记录
- API 响应
- 实时系统数据
- 截图和图像
- 日志文件
- 以及更多
资源 URI
资源使用以下格式的 URI 进行标识:file:///home/user/documents/report.pdfpostgres://database/customers/schemascreen://localhost/display1
资源类型
资源可以包含两种类型的内容:文本资源
文本资源包含 UTF-8 编码的文本数据。适用于:- 源代码
- 配置文件
- 日志文件
- JSON/XML 数据
- 纯文本
二进制资源
二进制资源包含以 base64 编码的原始二进制数据。适用于:- 图像
- 音频文件
- 视频文件
- 其他非文本格式
资源发现
客户端可以通过两种主要方法发现可用资源:直接资源
服务器通过resources/list 端点暴露具体资源列表。每个资源包括:
资源模板
对于动态资源,服务器可以暴露URI 模板,客户端可以使用这些模板构建有效的资源 URI:读取资源
要读取资源,客户端使用资源 URI 发出resources/read 请求。
服务器响应资源内容列表:
服务器可以在一个
resources/read 请求中返回多个资源。这可以用于例如在读取目录时返回目录中的文件列表。资源更新
MCP 通过两种机制支持资源的实时更新:列表更改
服务器可以通过notifications/resources/list_changed 通知通知客户端其可用资源列表发生更改。
内容更改
客户端可以订阅特定资源的更新:- 客户端发送
resources/subscribe,附带资源 URI - 资源更改时,服务器发送
notifications/resources/updated - 客户端可以使用
resources/read获取最新内容 - 客户端可以使用
resources/unsubscribe取消订阅
实现示例
以下是实现 MCP 服务器中资源支持的简单示例:- TypeScript
- Python
最佳实践
实现资源支持时:- 使用清晰、描述性的资源名称和 URI
- 包含有助于 LLM 理解的描述
- 在已知时设置适当的 MIME 类型
- 为动态内容实现资源模板
- 对于频繁更改的资源,使用订阅
- 优雅地处理错误,并提供清晰的错误消息
- 对于大型资源列表,考虑分页
- 在适当时缓存资源内容
- 在处理之前验证 URI
- 文档化您的自定义 URI 方案
安全考虑
暴露资源时:- 验证所有资源 URI
- 实施适当的访问控制
- 清理文件路径以防止目录遍历
- 小心处理二进制数据
- 考虑对资源读取进行速率限制
- 审计资源访问
- 在传输中加密敏感数据
- 验证 MIME 类型
- 对于长时间运行的读取,实施超时
- 适当地处理资源清理