OH07: MCP OpenHarness · 对标 S07

S07 同主题:外部 MCP server 暴露的 tools/resources 必须变成模型可见的同质 Tool,并在同一 Loop 里执行;关键是命名、schema 转换与调用转发。

上游:HKUDS/OpenHarness · 本仓库快照:reference/rererence_harness/OpenHarness/ · 路径亦见 专题映射表

与 S07 站内导图对齐course-s07)。

🎯 关键路径(读什么)

src/openharness/ 下优先打开:

  • mcp/:客户端管理、连接与 call_tool
  • tools/mcp_tool.pyMcpToolAdapter,工具名 mcp__{server}__{tool}
  • read_mcp_resource_tool.py / list_mcp_resources_tool.py:资源发现与读取。

🔍 源码导读

动态 Pydantic 模型

_input_model_from_schemacreate_model 把 JSON Schema properties 变成字段,满足 BaseTool.input_model 约束。字段全是宽松 object | None 时,校验弱于手写模型——与「MCP schema 任意」的权衡。

注册时机

create_default_tool_registry(mcp_manager) 在拿到 live manager 后遍历 list_tools() 注册;故 MCP 断连或配置变更后常需重启会话或 refresh runtime(见 OH04 CommandResult)。

⚖️ 与课内叙事对照

维度课内 S07OpenHarness
工具名课内 MCP 工具前缀策略mcp__ 分段 sanitize
传输stdio / sse配置在 settings mcp_serverscli mcp list 可读
错误tool 失败回传ToolResult 字符串进父对话

🤔 思考题

  1. sanitize 后工具名碰撞时会发生什么?
  2. 为何 adapter 的 executedel context?若工具需要 cwd 应怎么改?
  3. 与内置 bash 相比,MCP 工具权限走同一套 PermissionChecker 吗?有无特例?

📎 延伸阅读

OH01–12 目录 · OH06 · OH08 · S07 · D07