什么是 MCP 资源(MCP Resource)?

MCP 资源(MCP Resource)是 MCP Server 暴露、由 MCP Client 列出或读取的应用控制型 URI 数据契约,但内容不会因此自动进入模型上下文或变成可信数据。

快速了解

规范文档官方规范

工作原理

MCP Resource 是 Model Context Protocol 中面向上下文数据的 Primitive。Server 描述并提供数据,Client 负责发现或读取,Host 决定是否读取、何时读取以及向模型上下文放入多少内容。注册 Resource 只表示协议可访问,不会把正文自动注入对话,也不保证模型一定可见。Resource 是 Application-controlled 交互约定,不同于 Model-controlled 的 MCP Tool 动作,也不同于 User-controlled 的 MCP Prompt 模板。

在 MCP 2026-07-28 中,每个 resources/listresources/templates/listresources/read Request 都是 Stateless,并在 _meta 中携带 Protocol Version 与相关 Client Capabilities。支持 Resource 的 Server 通过 server/discover 声明 resources Capability,可选开启 listChangedsubscribe。Resource List 可以为空,也可按当前 Request 的 Credential 过滤,但不能仅因其他 Request 复用了同一 Connection 而变化。多个 Server 可能暴露相同 URI,Host 因此需要同时使用已配置 Server Identity 与 URI 限定目标。

resources/list 返回当前已知的具体 Resource,resources/templates/list 返回按 RFC 6570 描述的参数化 URI Space;两者都支持 Opaque Cursor Pagination 和可缓存的 Complete Result。Resource Definition 包含 uriname,并可包含显示 Title、Description、Icon、MIME Type、Raw Byte Size、Annotation 与 Metadata。Template 用 uriTemplate 代替 uri,变量可通过 completion/complete 提供建议。Template Expansion 只负责构造 Identifier,不会校验业务对象、证明对象存在,也不会授权展开后的 Tenant、Repository、Record 或 Path。

URI 按 RFC 3986 标识 Resource,不一定是浏览器 URL,也不天然适合直接 Dereference。只有 Client 能自行从 Web 获取时才应使用 https://file:// 可以表示文件系统风格数据,并不要求映射到真实本地文件,git:// 与有文档的 Custom Scheme 可以表达领域语义。不得把 Access Token、Credential 或敏感 Query Data 放入 URI,因为 Log、History、Cache、Telemetry 与 Error Report 经常保留 Identifier。实现应使用理解 Scheme 的 Parser,而不是拼接字符串。

resources/read 接收具体 URI,并返回一个或多个 Text 或 Base64 Blob Content Item。每项重复 URI,也可声明 MIME Type;Descriptor 中的 size 只是 Base64 编码和 Tokenization 前的 Raw Byte 估算。渲染或加入模型上下文前,要限制 Response Byte、Item Count、Decompression、Decode Time 与 Media Type。声称的 MIME Type、文件扩展名,或 audienceprioritylastModified Annotation 都只是提示,不能证明格式、新鲜度、重要性或可信度。

完整的 List、Template List 与 Read Result 携带 resultType: "complete"、非负 ttlMscacheScope。只有所有调用方获得相同且可共享的内容才使用 public;依赖 User、Tenant、Role 或 Token 的响应必须使用 private,并把 Cache Key 绑定 Authorization Context。TTL 是 Freshness Hint,不是一致性保证;Notification 会让尚未过期的 Cache 立即失效。Pagination 的各 Page 不保证跨页 Snapshot 一致;需要完整一致列表时,应在数据变化或 Cursor 无效后从第一页重取。

当前订阅使用长连接 subscriptions/listen Request。Client 选择 resourcesListChanged 或具体 resourceSubscriptions,Server 先确认接受的 Filter,再用 io.modelcontextprotocol/subscriptionId 关联 Notification。notifications/resources/list_changed 使 Discovery Cache 失效;notifications/resources/updated 只报告 URI,Client 需要再次调用 resources/read,它不会携带替换正文。关闭 Stream 即取消订阅,断线重连后必须重新请求。旧 resources/subscriberesources/unsubscribe 与独立 HTTP GET Stream 属于 Legacy Protocol。

resources/read 可以通过 MRTR 返回 resultType: "input_required",请求受支持的 Elicitation、Roots 或 Legacy Sampling 输入;List 操作不支持。重试是带新 JSON-RPC ID、inputResponses 与可选不透明 requestState 的独立 Request,不能缓存。State 必须按攻击者可控输入处理;若影响 Identity、Authorization、Target URI 或 Query Semantics,需要保护完整性,并绑定 Principal、Method、关键 Parameter、Policy Revision 与短 TTL。Client 必须原样回传,但不能检查或修改它。

错误语义会影响 Cache 和调用方。2026-07-28 中缺失 Resource 返回 JSON-RPC -32602 Invalid Params;Client 仍应接受 Legacy -32002,Internal Failure 使用 -32603。不能用空 contents 数组表示不存在,因为它与合法空 Resource 无法区分。内部 Telemetry 应区分 Not Found、Denied、Timeout、Too Large、Invalid Encoding、Stale Cursor 与 Upstream Failure;外部错误则需控制细节,避免跨授权边界泄露 Resource 是否存在。

Resource 即使面向读取也需要授权。每个 Request 都要校验 Authenticated Principal、Server、Tenant、URI Scheme、Object、Projection、Data Classification、Purpose 与 Output Policy。处理 file:// 时,应按目标平台解码和规范化,拒绝 Path Traversal、非法 Authority 与 Device Name,解析 Symlink,将最终对象限制在 Allowed Root,并降低 Time-of-check / Time-of-use Race。Server-side Remote Fetch 需要 Allowlist Scheme 与 Destination,阻断 Loopback、Link-local、Private 和 Metadata Network,重新校验 DNS 与 Redirect,并限制 Timeout 和 Byte,以控制 SSRF。

Resource Content 是不可信数据。Document、Issue Text、Log、HTML、图片提取文本和数据库字段都可能包含 Prompt Injection,尝试覆盖 Host Policy 或触发 Tool。系统应保留 Provenance,把 Data 与 Instruction 分隔,只把必要片段放入 Context,对 Grounded Claim 要求 Citation,并阻止内容自行授予权限。MCP Resource 也不等于 RAG:MCP 标准化可寻址的 Discovery 与 Retrieval,RAG 负责 Chunking、Indexing、Ranking、Evidence Selection 与 Answer Evaluation。Resource 可以暴露 RAG Output 或 Index,但不会自动继承其检索质量。

生产 Trace 应关联 Immutable Server Build、Resource 或 Template Revision、Normalized URI Digest、Principal 与 Tenant、Authorization Policy、Pagination 或 Subscription ID、Cache Decision、Source Revision、MIME Validation、Byte 与 Token Estimate、Truncation、Latency、Error Class 和 Model-context Inclusion Decision。Resource Body、Secret、Personal Data 与原始敏感 URI 必须脱敏。成功的 resources/read 只证明协议读取完成,不能证明内容准确、最新、适合渲染或应该交给模型。

主要特点

  • 应用控制上下文:Host 决定发现、读取、展示与模型上下文注入,不会向模型自动授权
  • URI 寻址契约:具体 Resource 使用 RFC 3986 Identifier,RFC 6570 Template 描述参数化 URI Space
  • 类型化有界内容:Read 返回 Text 或 Base64 Blob,并在 Byte、Decode 与 Context Budget 限制下使用可选 MIME Metadata
  • 缓存感知新鲜度:Complete Result 声明 TTL 与 Public/Private Scope,Notification 使 Discovery 或 Content Cache 失效
  • 订阅驱动更新:subscriptions/listen 传递可关联的列表或 Resource 变化信号,Client 按需重新读取内容
  • 零信任数据边界:URI、Object、Path、Remote Destination、Annotation 与返回 Byte 都要经过授权和内容安全策略

常见用途

  1. 在 Allowed Root 内暴露选定代码仓库文件与文档,而不授予任意文件系统遍历能力
  2. 把 Tenant-scoped 数据库 Schema 或 Record 作为 Private Cache Context 提供,同时不暴露写操作
  3. 用 URI Template 描述版本化文档或 Issue Record,并提供经过权限过滤的 Completion Suggestion
  4. 通知应用 Configuration、Runbook 或 Live Metric Resource 已变化,使其失效并选择性重新读取上下文
  5. 通过受限 Resource Link 返回大型 Tool Artifact,并附带 Provenance、Size Limit、Expiration 与显式 Context Inclusion

示例

loading...
Loading code...

常见问题

MCP Resource 和 MCP Tool 有什么区别?

Resource 是由应用控制、Client 按 URI 读取、Host 可选择加入上下文的数据契约;Tool 是经 tools/call 调用的模型控制动作契约。读取 Resource 不应故意修改 Backend State,但仍需要 Authorization、Limit 与 Content Safety,因为读取可能泄露敏感数据或触发昂贵的上游工作。

注册 MCP Resource 后模型会自动看到内容吗?

不会。注册只让 Metadata 可被发现;resources/list 不返回正文,resources/read 也只是把内容交给 Client。Host 仍要决定向用户展示、把选定内容加入模型请求、生成摘要还是完全忽略,并同时检查 Permission、Relevance、Provenance 与 Context Budget。

MCP Resource 和 RAG 是同一种机制吗?

不是。MCP 定义 Server 如何描述并返回可寻址上下文;RAG 定义如何对内容 Chunk、Index、Retrieve、Rank、Cite 与 Evaluate。Resource 可以暴露文档、Index 描述或选出的 RAG 结果,但 MCP 不保证 Retrieval Relevance、Grounding 或 Answer Faithfulness。

MCP Resource 的缓存和更新通知如何配合?

Complete Result 提供 ttlMs 与 public 或 private cacheScope。TTL 表示 Client 何时应把数据视为过期,已接受的 notifications/resources/updated 会提前使目标 Cache 失效。通知只携带 URI,不包含新正文,Client 按需重新读取;连接断开会结束 subscriptions/listen,重连后需要重新订阅。

如何保护文件型和远程 MCP Resource?

每个 Request 都要授权具体 Principal、Tenant、Scheme 与 Object。文件 URI 应使用平台感知解析,在 Allowed Root 内解析最终 Path 与 Symlink,并拒绝 Traversal、危险 Authority 和 Device Name;远程读取应限制 Destination,阻断内部网络与 Redirect Escape,并约束时间、Byte、Decode、MIME 和模型上下文注入。

相关工具

相关术语

相关文章