第 76 页 / 共 100 页 / 飞书修订版 5

7.Defining resources

此文档由 学习AI的1000天 翻译制作(抖音,B站,YouTube)

邮箱: szqshan@gmail.com | 微信: szqshan
网址: www.xueai.org

==================================================

MCP 服务器中的资源允许您向客户端公开数据,类似于典型 HTTP 服务器中的 GET 请求处理程序。它们非常适合需要获取信息而不是执行操作的场景。

通过示例理解资源

假设您想构建一个文档提及功能,用户可以输入 @document_name 来引用文件。这需要两个操作:

  • 获取所有可用文档的列表(用于自动完成)
  • 获取特定文档的内容(当被提及时)
image1.jpeg

当用户输入 @ 时,您需要显示可用的文档。当他们提交包含提及的消息时,您会自动将该文档的内容注入到发送给 Claude 的提示中。

image2.jpeg

How Resources Work

资源遵循请求-响应模式。您的客户端发送带有 URI 的 ReadResourceRequest,MCP 服务器响应数据。URI 就像您要访问的资源的地址。

image3.jpeg

Types of Resources

有两种类型的资源:

image4.jpeg
  • 直接资源:不会改变的静态 URI,如 docs://documents
  • 模板化资源:带有参数的 URI,如 docs://documents/{doc_id}

对于模板化资源,Python SDK 会自动从 URI 中解析参数,并将它们作为关键字参数传递给你的函数。

实现资源

资源使用 @mcp.resource() 装饰器来定义。以下是创建两种类型资源的方法:

直接资源(列出文档)

@mcp.resource(

"docs://documents",

mime_type="application/json"

)

def list_docs() -> list[str]:

return list(docs.keys())

模板化资源(获取文档)

@mcp.resource(

"docs://documents/{doc_id}",

mime_type="text/plain"

)

def fetch_doc(doc_id: str) -> str:

if doc_id not in docs:

raise ValueError(f"Doc with id {doc_id} not found")

return docs[doc_id]

MIME Types

资源可以返回任何类型的数据 - 字符串、JSON、二进制数据等。mime_type 参数为客户端提供关于你返回的数据类型的提示:

  • application/json - 结构化 JSON 数据
  • text/plain - 纯文本内容
  • 任何其他适用于不同数据格式的有效 MIME 类型

MCP Python SDK 会自动序列化您的返回值。您无需手动转换为 JSON 字符串。

Testing Resources

您可以使用 MCP Inspector 测试您的资源。运行您的服务器:

uv run mcp dev mcp_server.py

然后在浏览器中连接到检查器。您将看到:

image5.jpeg
  • Resources:列出您的直接/静态资源
  • Resource Templates:显示接受参数的模板化资源

点击任何资源进行测试,查看客户端将接收到的确切响应结构。

image6.jpeg

Key Points

  • 资源暴露数据,工具执行操作
  • 对静态数据使用直接资源,对参数化查询使用模板化资源
  • MIME 类型帮助客户端理解响应格式
  • SDK 会自动处理序列化
  • 模板化 URI 中的参数名称会成为函数参数

Resources 为向 MCP 客户端提供数据提供了一种简洁的方式,支持文档提及、文件浏览或任何需要从服务器获取信息的场景等功能。

==================================================



此文档由 学习AI的1000天 翻译制作(抖音,B站,YouTube)
邮箱: szqshan@gmail.com | 微信: szqshan
网址: www.xueai.org