OH07: MCP OpenHarness · 对标 S07
与 S07 同主题:外部 MCP server 暴露的 tools/resources 必须变成模型可见的同质 Tool,并在同一 Loop 里执行;关键是命名、schema 转换与调用转发。
上游:HKUDS/OpenHarness · 本仓库快照:reference/rererence_harness/OpenHarness/ · 路径亦见 专题映射表。
course-s07)。🎯 关键路径(读什么)
在 src/openharness/ 下优先打开:
mcp/:客户端管理、连接与call_tool。tools/mcp_tool.py:McpToolAdapter,工具名mcp__{server}__{tool}。read_mcp_resource_tool.py/list_mcp_resources_tool.py:资源发现与读取。
🔍 源码导读
动态 Pydantic 模型
_input_model_from_schema 用 create_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)。
⚖️ 与课内叙事对照
| 维度 | 课内 S07 | OpenHarness |
|---|---|---|
| 工具名 | 课内 MCP 工具前缀策略 | mcp__ 分段 sanitize |
| 传输 | stdio / sse | 配置在 settings mcp_servers,cli mcp list 可读 |
| 错误 | tool 失败回传 | ToolResult 字符串进父对话 |
🤔 思考题
- sanitize 后工具名碰撞时会发生什么?
- 为何 adapter 的
execute里del context?若工具需要 cwd 应怎么改? - 与内置
bash相比,MCP 工具权限走同一套PermissionChecker吗?有无特例?
📎 延伸阅读
OH01–12 目录 · OH06 · OH08 · S07 · D07