加载中

MCP 中的资源允许您的服务器公开可以直接包含在提示中的数据,而不需要通过工具调用来访问信息。这创建了一种更高效的方式来为像 Claude 这样的 AI 模型提供上下文。

理解资源流程

当用户想要访问资源内容时,流程如下:

  • 用户请求有关某个资源的信息(例如"@report.pdf")
  • 您的代码需要一份文档名称列表以实现自动补全
  • MCP 客户端向 MCP 服务器发送 ReadResourceRequest
  • 服务器以包含资源数据的 ReadResourceResult 作为响应
  • 您的代码随后可以将此数据直接放入提示中

实现资源读取

要从您的 MCP 客户端读取资源,您需要实现一个 read_resource 函数。首先,添加必要的导入:

python
import json
from pydantic import AnyUrl

核心函数向您的 MCP 会话发出请求并处理响应:

python
async def read_resource(self, uri: str) -> Any:
    result = await self.session().read_resource(AnyUrl(uri))
    resource = result.contents[0]

处理不同的资源类型

资源可以返回不同类型的内容,因此您需要检查 MIME 类型并相应地进行解析:

python
if isinstance(resource, types.TextResourceContents):
    if resource.mimeType == "application/json":
        return json.loads(resource.text)
    
    return resource.text

这种方法处理两种主要场景:

  • 需要解析的 JSON 资源
  • 可以原样返回的纯文本资源

测试资源访问

您可以通过在应用程序中进行测试来验证您的资源实现是否有效。当您输入"@"后跟资源名称时,您应该会看到可用资源的自动补全列表。选择其中一个将把其内容直接包含在您的提示中。

这种方法的关键优势在于效率——Claude 可以立即接收文档内容,而无需进行额外的工具调用来访问信息。

资源与工具的使用对比

资源在以下情况下特别有用:

  • 您有经常被引用的静态或半静态内容
  • 您想要减少 API 调用的次数
  • 内容应立即在提示上下文中可用

这与工具不同,工具更适合动态操作,或者当您需要 AI 根据对话上下文来决定是否访问某些信息时。