- Client 通过
resources/list发现资源(每个资源包含uri、可选的name、可选的mimeType等)。 - Client 通过携带
uri的resources/read读取资源。 - 服务器执行你的资源处理器。
- 服务器返回符合 MCP 规范、包含
contents的ReadResourceResult。
@resource(...) 定义资源,并通过 server.collect(...)(或在 with server.binding(): ... 代码块内)注册它们。
装饰器签名
resource(...):resource(uri: str, *, name=None, description=None, mime_type=None)
fn()→ 返回str(文本)或bytes(二进制)。(也支持使用async def。)
基础资源
collect() 负责注册它。Client 使用 resources/list 列出资源,并通过 resources/read 读取它们。
文本与二进制
str:
bytes 类型(Dedalus 会在 MCP 响应中将其编码为 base64):
异步资源
async def。(与工具类似,同步处理函数会在当前执行流中直接运行。)
MIME 类型
text/plain(当返回str且未提供mime_type时的默认值)application/octet-stream(当返回bytes且未提供mime_type时的默认值)
订阅
resources/subscribe 订阅资源变更,并通过 resources/unsubscribe 取消订阅。
当底层数据发生变化时,请通知订阅方:
notifications/resources/updated。
装饰器选项
错误处理
mimeType="text/plain"text="Resource error: <exception message>"
resources/read 会返回一个空的 contents 列表。
测试
resources/read):
资源模板
@resource_template(...) 通过 resources/templates/list 暴露 URI 模式(便于 Client 发现和自动补全)。Dedalus 模型上下文协议 (MCP) 当前只会为列表操作注册模板,不会自动将 resources/read 路由到某个模板函数——你仍然需要使用 @resource(...) 注册具体的资源 URI。