docs/review/mcp-resources-pr-2215-review.md
更新日期: 2026-06-29 分支:
mcp_resourcesPR: langbot-app/LangBot#2215 主题: MCP Resources 在 LangBot 中的产品价值、AgentRunner 集成方式与后续架构方向
PR #2215 对 LangBot 有明确价值:它补齐了 MCP 协议中 Resources 这一重要能力,让 MCP server 不再只暴露 tools,也可以暴露文档、代码片段、配置、日志、图片等上下文资源。管理端可以发现和预览资源,Agent 也可以通过当前实现按需列出和读取资源。
但当前 AgentRunner 层的接入方式更接近一个可用的第一阶段方案,而不是最终架构。现在 MCP Resources 被包装成两个 synthetic tools:
langbot_mcp_list_resourceslangbot_mcp_read_resource这让模型可以通过 function calling 主动探索资源,落地成本低,也复用了已有 ToolManager / LocalAgentRunner 的工具调用链路。不过从 MCP 规范和主流实现来看,Resources 更适合作为一种一等上下文来源,而不是长期隐藏在工具列表里。
建议保留当前 synthetic tools 作为探索能力,同时把后续主线设计调整为:MCP Resources 是 pipeline / conversation / message 级别可选择、可固定、可审计的上下文输入。
当前 AgentRunner 集成路径如下:
Pipeline 绑定 MCP server
-> query.variables['_pipeline_bound_mcp_servers']
-> Preproc 为 local-agent 加载工具
-> ToolManager.get_all_tools()
-> MCPLoader 注入 synthetic resource tools
-> LocalAgentRunner 将工具 schema 传给模型
-> 模型发起 list/read tool call
-> ToolManager.execute_func_call()
-> MCPLoader 调 MCP session.list_resources/read_resource
-> tool result 回灌给模型
这个路径的优点是:
主要问题是:
list/read,资源不会自然成为上下文。MCP Resources 是 server 暴露上下文数据的协议能力。规范没有要求 resources 必须以 tool call 形式给模型使用,而是把如何选择、过滤、读取和纳入上下文交给 Host application。
这意味着比较正统的集成方式是:LangBot 作为 Host,在 pipeline、会话或消息层决定哪些 resources 进入模型上下文。
参考: https://modelcontextprotocol.io/specification/2025-06-18/server/resources
VS Code 把 MCP Resources 做成 chat context 的一部分。用户可以通过 Add Context > MCP Resources 或命令浏览 MCP resources,并把选中的资源附加到一次 chat request。
这是目前最值得 LangBot 参考的产品形态:资源不是模型工具,而是用户和 Host 可控的上下文附件。
参考: https://code.visualstudio.com/docs/agent-customization/mcp-servers
Anthropic 的 client-side MCP helpers 提供资源读取和转换能力,例如把 MCP resource 转为 Claude message content 或 file。也就是说,应用先读取 resource,再显式放进模型消息。
这同样是 application-owned context injection,而不是把 resource 伪装成模型工具。
参考: https://platform.claude.com/docs/en/agents-and-tools/mcp-connector
LangChain 把 MCP Resources 更像 data loader / document input 来处理,可以把资源加载成 Blob,再进入 LangChain 的文档、检索或上下文处理链路。
这说明 Resources 很适合作为知识源、文档源或上下文源,而不只是即时工具调用。
参考: https://docs.langchain.com/oss/python/langchain/mcp
OpenAI Agents SDK 主路径仍偏向 MCP tools,但底层 MCP server API 已经有 list_resources、list_resource_templates、read_resource 等能力。当前形态说明 resources 是 client 能力,但并未默认变成 agent-visible tools。
参考: https://openai.github.io/openai-agents-python/mcp/
Cline 会拉取 MCP tools、resources、resourceTemplates、prompts,并通过类似 access_mcp_resource 的内置访问方式让模型读取资源。这个方向和 LangBot 当前 synthetic tools 比较接近。
这种模式适合让 Agent 自主探索,但更像 Host 自定义的模型访问协议,不应成为唯一集成路径。
参考: https://github.com/cline/cline/blob/main/src/services/mcp/McpHub.ts
保留当前两个 synthetic tools:
langbot_mcp_list_resourceslangbot_mcp_read_resource它们适合处理“用户没有显式选择资源,但 Agent 判断需要探索 MCP server 上下文”的场景。后续可以优化工具描述、返回格式、资源大小限制和错误信息。
新增一个 Host 层资源上下文概念,例如:
PipelineResourceBinding
ConversationResourceAttachment
MessageResourceAttachment
Preproc 或独立的 ResourceContextProvider 在模型调用前读取这些资源,按 MIME 类型、大小、token budget 转为模型可消费的上下文。
当前 MCP 详情页的 Resources tab 可以继续作为资源发现和预览入口。建议增加操作:
这样 UI 资源管理能力才能真正影响 Agent 行为。
MCP resource templates 允许 server 暴露参数化资源,例如:
repo://{owner}/{repo}/file/{path}
log://{service}/{date}
LangBot 后续应支持模板发现、参数填写、实例化和绑定。否则只能使用静态 resources,覆盖面会受限。
建议补齐:
resources/listChanged 或订阅更新。PR #2215 可以作为 MCP Resources 的第一阶段实现继续推进。它让 LangBot 快速拥有“资源发现、预览、按需读取”的闭环,也给 Agent 探索资源提供了可运行路径。
但在正式设计上,不建议把 “Resources == Tools” 固化为长期抽象。LangBot 更应该把 MCP Resources 定位为上下文来源,与 tools、prompts、knowledge base 并列:
Tools -> Agent 可以执行的动作
Resources -> Host/用户/Agent 可以选择的上下文数据
Prompts -> 可复用的任务模板
Knowledge -> 可检索、可索引的长期知识
这样既尊重 MCP 协议语义,也能让 LangBot 在 Agent 工作流、企业知识接入和多 MCP server 管理上走得更稳。