跳至主要內容

08|资源发现:为大模型提供服务器端的数据内容

悟空约 938 字大约 3 分钟...

总结一下

MCP 中的“资源”允许服务器向客户端暴露数据和内容,这些数据可作为 LLM 交互的上下文。

  • 定义:服务器通过 resources/list 接口,声明自己提供了哪些 URI(或 URI 模板),并给出名称、描述、MIME 类型等元信息。

  • 发现:客户端调用 resources/list 拿到资源清单(或模板),再根据清单中的 URI 调用 resources/read 获取实际内容;必要时,还可借助订阅机制保持数据的实时性。

这样,MCP 就在客户端(Consumer)与服务器(Provider) 之间,建立了一套灵活、可扩展的“资源管理”机制,使得 LLM 在生成时能够方便、安全地引用外部数据。

思考题

1.1、MCP 协议是如何通过资源模板实现访问动态资源

  • 1.1.1、MCP 底层是如何注册资源模板的:文件:src/mcp/server/fastmcp/server.py。通过 @server.resource("resource://{param}") 装饰器注册资源模板,底层会调用 ResourceManager.add_template,并最终创建 ResourceTemplate 实例。
  • 1.1.2、开发者是如何注册资源模板的:开发者用 @server.resource("resource://{param}") 注册模板,服务端保存模板和参数定义。类似 Java 中的 MVC 模式中定义的 API,通过路径匹配到 controller 定义的方法。
@mcp.resource("resource://users/{user_id}/posts/{post_id}")
def get_user_post(user_id: str, post_id: str) -> str:
    return f"Post {post_id} by user {user_id}"
  • 1.1.3、MCP Client 如何请求资源模板列表:MCP client 通过发送 resources/templates/list 请求,获取所有可用的资源模板。服务端收到后,返回所有注册的资源模板。

  • 1.4 开发者拼接 URI:将参数填充到模板 URI 中。

    # 假设你要访问 resource://users/{user_id}/posts/{post_id}
    user_id = "123"
    post_id = "456"
    uri = f"resource://users/{user_id}/posts/{post_id}"
    
  • 1.1.5 开发者发送获取资源的请求,resources/read

  • 1.1.6 MCP 服务端参数提取与资源生成。

    • 服务端遍历所有注册的资源模板,调用 matches() 方法用正则表达式匹配 URI 并提取参数。

    • 用提取的参数调用注册的函数,生成实际资源内容并返回。这里才是真正调用注册的函数。

    1.2、MCP 如何支持资源订阅和更新通知的?

  • 1.2.1 在 src/mcp/client/session.py 可以找到 subscribe_resource、unsubscribe_resource 支持资源的订阅和取消订阅。

  • 1.2.2 服务端会在资源变更时,向客户端推送 resources/updated 通知,客户端可在 _received_notification 方法中处理。

2、在实际生产系统中,要实现真实的资源读取逻辑、添加访问控制、实现真实的资源更新机制、增强错误与安全检查,需要注意哪些要点?

  • 2.1 真实的资源读取逻辑
    • 对接真实数据源:如数据库、对象存储,而不是硬编码内容。
    • 参数校验:防止 SQL 注入
    • 分页与过滤数据:避免一次返回大量数据造成服务器压力。
  • 2.2 添加访问控制
    • 统一入口校验,对请求进行身份验证,如利用 token,api key 等。
    • 对资源进行细粒度权限校验,如使用 RBAC 方案。
  • 2.3 真实的资源更新机制
    • 变更后及时推送,如果资源变更频繁或订阅的客户端很多,可以用消息队列来接收变更消息,缓解 MCP 服务端的压力。
    • 在客户端收到资源更新通知后,如果客户端还需要做其他操作,则还需要保证幂等性。
  • 2.4 增强错误与安全检查
    • 异常捕获。
    • 限制调用获取资源的频率。
    • 对输入输出内容进行校验,防止 SQL 注入、XSS 攻击。
    • 资源隔离。
    • 避免返回敏感信息。
    • 监控告警。
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v3.3.0