模型上下文协议(MCP)为服务器向客户端暴露资源提供了标准化方式。资源允许服务器共享为语言模型提供上下文的数据,例如文件、数据库模式或应用特定信息。每个资源通过URI进行唯一标识。
用户交互模型
MCP中的资源设计采用应用驱动模式,由宿主应用程序根据自身需求决定如何整合上下文。
典型实现方式包括:
- 通过树形或列表视图的UI元素暴露资源,供用户显式选择
- 允许用户对可用资源进行搜索和筛选
- 基于启发式规则或AI模型选择,实现上下文自动注入
但具体实现时,开发者可自由选择最适合其应用场景的资源暴露方式——该协议本身并不限定特定的用户交互模式。
能力声明
支持资源功能的服务器必须声明resources能力项:
{
"capabilities": {
"resources": {
"subscribe": true,
"listChanged": true
}
}
}
该能力支持两个可选特性:
- 订阅功能(subscribe) :表示客户端是否可以订阅单个资源的变更通知
- 列表变更通知(listChanged) :表示当可用资源列表发生变化时,服务器是否会发送通知
这两个特性都是可选的,服务器可以都不支持、只支持一个或者两个都支持。
协议消息
资源列表查询
客户端可通过 resources/list 请求发现可用资源,该操作支持分页:
请求示例:
{
"jsonrpc": "2.0",
"id": 1,
"method": "resources/list",
"params": {
"cursor": "可选游标值"
}
}
响应示例:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"resources": [
{
"uri": "file:///project/src/main.rs",
"name": "main.rs",
"description": "应用主入口文件",
"mimeType": "text/x-rust"
}
],
"nextCursor": "下一页游标"
}
}
资源内容读取
客户端通过 resources/read 请求获取资源内容:
请求示例:
{
"jsonrpc": "2.0",
"id": 2,
"method": "resources/read",
"params": {
"uri": "file:///project/src/main.rs"
}
}
响应示例:
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"contents": [
{
"uri": "file:///project/src/main.rs",
"mimeType": "text/x-rust",
"text": "fn main() {\n println!("Hello world!");\n}"
}
]
}
}
资源模板
通过URI模板支持参数化资源访问,参数可通过自动补全API完成:
模板列表请求:
{
"jsonrpc": "2.0",
"id": 3,
"method": "resources/templates/list"
}
模板列表响应:
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"resourceTemplates": [
{
"uriTemplate": "file:///{path}",
"name": "项目文件",
"description": "访问项目目录中的文件",
"mimeType": "application/octet-stream"
}
]
}
}
列表变更通知
当资源列表变化时,支持listChanged的服务器应发送通知:
{
"jsonrpc": "2.0",
"method": "notifications/resources/list_changed"
}
订阅机制
客户端可订阅特定资源变更通知:
订阅请求:
{
"jsonrpc": "2.0",
"id": 4,
"method": "resources/subscribe",
"params": {
"uri": "file:///project/src/main.rs"
}
}
变更通知:
{
"jsonrpc": "2.0",
"method": "notifications/resources/updated",
"params": {
"uri": "file:///project/src/main.rs"
}
}
消息交互流程
数据类型
资源定义(Resource)
资源对象包含以下字段定义:
- uri:资源的唯一标识符
- name:易于理解的名称
- description:可选的资源描述
- mimeType:可选的MIME类型
- size:可选的字节大小
资源内容格式
资源可包含文本或二进制两种数据类型:
文本内容
{
"uri": "file:///example.txt",
"mimeType": "text/plain",
"text": "资源内容文本"
}
二进制内容
{
"uri": "file:///example.png",
"mimeType": "image/png",
"blob": "Base64编码数据"
}
标准URI协议方案
协议定义了几种标准URI方案。此列表并非全部——实现方始终可以使用额外的自定义URI方案。
https://
用于表示可通过网络访问的资源。
服务器应仅在客户端能够自行从网络获取和加载资源时使用此方案——即不需要通过MCP服务器读取资源。
对于其他情况,服务器应优先使用其他URI方案,或自定义方案,即使服务器本身将通过互联网下载资源内容。
file://
用于标识行为类似文件系统的资源。不过,这些资源不需要映射到实际的物理文件系统。
MCP服务器可以使用XDG MIME类型(如inode/directory)来标识file://资源,以表示没有标准MIME类型的非普通文件(如目录)。
git://
Git版本控制集成。
错误处理
对于常见错误情况,服务器应返回标准JSON-RPC错误码:
- 资源未找到:-32002
- 内部错误:-32603
错误示例:
{
"jsonrpc": "2.0",
"id": 5,
"error": {
"code": -32002,
"message": "资源未找到",
"data": {
"uri": "file:///nonexistent.txt"
}
}
}
安全注意事项
- 服务器必须验证所有资源URI
- 敏感资源应实施访问控制
- 二进制数据必须正确编码
- 执行操作前应检查资源权限