ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

AIRI computer-use-mcp 的 Tool Lane Hygiene 验证机制:跨车道 MCP 工具调用的告警式追踪与测试实践

AIRI computer-use-mcp 的 Tool Lane Hygiene 验证机制:跨车道 MCP 工具调用的告警式追踪与测试实践 AIRI computer-use-mcp 的 Tool Lane Hygiene 验证机制跨车道 MCP 工具调用的告警式追踪与测试实践【免费下载链接】airi Self hosted, you-owned Grok Companion, a container of souls of waifu, cyber livings to bring them into our worlds, wishing to achieve Neuro-samas altitude. Capable of realtime voice chat, Minecraft, Factorio playing. Web / macOS / Windows supported.项目地址: https://gitcode.com/GitHub_Trending/ai/airiAIRI 的 computer-use-mcp 服务将数十个 MCP 工具划分为桌面自动化、浏览器 DOM、PTY 终端、编码、工作流等多个车道lane。当 Agent 在某个执行面工作却误调了另一个车道的工具时容易产生前后文错乱甚至破坏性的误操作。本文基于仓库中的services/computer-use-mcp/validation/tool-lane-hygiene.md验证文档结合其配套源码与测试完整讲解 Tool Lane Hygiene工具车道卫生机制的设计目标、核心实现、验证命令与测试用例并给出可复现的验证流程。读完后你将掌握该机制只告警、不拦截的运作原理、车道描述符注册表如何成为唯一事实来源以及如何用一条命令复跑整套验证。一、背景为什么 MCP 工具需要车道概念computer-use-mcp 是 AIRI 面向 macOS 的桌面编排 MCP 服务见 services/computer-use-mcp/package.json包名为proj-airi/computer-use-mcp。它同时暴露了桌面点击、浏览器 DOM 操作、终端执行、编码补丁、VS Code 自动化、工作流编排等多类工具每类工具都面向不同的执行面surface。如果 Agent 上一秒还在用terminal_exec操作终端下一秒却直接调用属于浏览器车道的browser_dom_click而没有通过显式的交接handoff或工作流切换执行面就会出现认知与执行环境错位截图是桌面的、坐标是浏览器的、终端会话却是另一个进程的。Tool Lane Hygiene 正是在这一背景下引入的跨车道使用追踪机制。1.1 车道与工具描述符的唯一定义车道的规范定义位于 services/computer-use-mcp/src/server/tool-descriptors/types.ts共 11 种车道ToolLane语义desktop桌面自动化点击、输入、截图等browser_dom通过扩展桥接的浏览器 DOMbrowser_cdp通过 Chrome DevTools Protocol 的浏览器coding代码分析与编辑ptyPTY/终端会话管理display显示器枚举与识别accessibility无障碍树检查task_memory任务执行状态管理vscodeVS Code CLI 自动化workflow工作流编排工具internal内部/诊断工具同文件中还定义了ToolKindread/write/control/workflow/memory/internal与完整的ToolDescriptor接口。每个公开 MCP 工具都必须注册一份描述符且必填字段采用fail-closed关闭即失败策略validateDescriptor()会对缺失字段或非法枚举直接抛错例如ToolDescriptor xxx is missing required field: lane。1.2 描述符注册表车道判定的数据底座描述符由 services/computer-use-mcp/src/server/tool-descriptors/registry.ts 中的ToolDescriptorRegistry统一管理提供register、get、getOptional、query、groupByLane、validateCompleteness、findOrphans等能力并导出全局单例globalRegistry。而 services/computer-use-mcp/src/server/tool-descriptors/all.ts 的initializeGlobalRegistry()会一次性注册全部公开描述符与内部描述符。以desktop_click为例见 services/computer-use-mcp/src/server/tool-descriptors/desktop.ts其描述符声明了lane: desktop、kind: write、readOnly: false、concurrencySafe: false等元数据——这正是 Tool Lane Hygiene 判断这个工具属于哪个车道的依据。二、核心实现Advisory-only 的跨车道追踪Tool Lane Hygiene 的核心实现位于 services/computer-use-mcp/src/server/tool-lane-hygiene.ts。文件头注释明确其定位Advisory-only tracking for cross-lane MCP tool usage. A lane mismatch appends a nudge to the tool result, but never blocks execution.即只做告警式追踪车道不匹配时向工具结果追加一条提示但绝不阻断执行。这一设计哲学贯穿全部五个导出函数。2.1 豁免车道哪些车道不参与告警const EXEMPT_LANES: ReadonlySetToolLane new SetToolLane([ workflow, internal, task_memory, display, ])workflow、internal、task_memory、display四个车道被排除在告警与活跃车道更新之外。从源码结构看这样设计是合理的workflow是编排层、internal是诊断工具、task_memory是状态管理、display是纯枚举型只读工具它们天然可以横跨多个执行面不应被视为当前执行面的信号也不应因被调用而污染活跃车道的推断。2.2 活跃车道状态管理接口export interface ToolLaneStateManager { getState: () Readonly{ inferredActiveLane?: ToolLane } updateInferredLane: (lane: ToolLane) void }该接口抽象出两个最小能力读取当前推断出的活跃车道、更新它。实际实现是RunStateManager见 services/computer-use-mcp/src/state.ts其RunState中专门预留了字段// --- Tool lane hygiene ------------------------------------------------ /** Inferred active lane from the most recent non-exempt tool invocation. */ inferredActiveLane?: ToolLane并实现updateInferredLane(lane)写入该字段、touch()刷新updatedAt。状态是进程内临时的ephemeral持久化审计走 session trace / JSONL。2.3 三个判定函数inferToolLane(toolName)按工具名从全局描述符注册表反查其车道若注册表为空会先调用initializeGlobalRegistry()惰性初始化查不到时返回undefined采用getOptional而非get避免对未注册工具抛错。buildCrossLaneAdvisory(params)核心告警判定返回string | null。只有同时满足以下三个条件才生成告警文本已存在活跃车道inferredActiveLane非空工具车道与活跃车道不一致工具车道与活跃车道都不在豁免集合中。告警原文格式为Advisory: You are currently in the coding lane but called browser_dom_click which belongs to the browser_dom lane. Consider using a handoff if you need to switch execution surfaces.shouldUpdateActiveLane(lane)判断某车道调用后是否应成为新的活跃车道即!EXEMPT_LANES.has(lane)。2.4 零侵入接入用 Proxy 包装 server.toolcreateToolLaneHygieneServer(server, stateManager)是整个机制最精妙的部分——它通过 JavaScriptProxy拦截McpServer实例的tool方法在不改动任何工具注册代码的前提下为每个工具 handler 加一层包装findLastHandlerIndex(rest)从参数末尾向前查找 handler 函数兼容server.tool(name, summary, schema, handler)与server.tool(name, schema, handler)两种重载形态包装后的 handler 先inferToolLane(name)查出工具所属车道若有车道信息则基于stateManager.getState().inferredActiveLane计算告警并在shouldUpdateActiveLane为真时调用updateInferredLane(lane)推进活跃车道调用原始 handler 得到CallToolResult若存在告警且结果content是数组则通过textContent见 services/computer-use-mcp/src/server/content.ts把\n\n 告警文本追加到content末尾工具的真实执行结果原样返回只多出一段追加文本不改变语义、不抛错、不阻断。2.5 接入点register-tools.ts在 services/computer-use-mcp/src/server/register-tools.ts 的registerComputerUseTools()中一行代码完成接入const server createToolLaneHygieneServer(params.server, runtime.stateManager)此后register-tools.ts中所有server.tool(...)注册desktop_click、terminal_exec、browser_dom_click、coding_apply_patch等都会自动经过车道卫生包装。runtime.stateManager正是RunStateManager实例满足ToolLaneStateManager接口。三、验证方案文档中的完整命令与结果验证文档 services/computer-use-mcp/validation/tool-lane-hygiene.md 记录了五组可复现的验证命令覆盖依赖安装、单元测试、联合测试、代码规范与差异检查、类型检查五个维度。3.1 依赖安装pnpm install --ignore-scripts --frozen-lockfile结果passed。锁文件保持不变--ignore-scripts有意跳过生命周期脚本仅用于本地验证环境搭建。注意这要求仓库根目录已配置 pnpm workspace见 pnpm-workspace.yaml。3.2 车道卫生专项测试pnpm -F proj-airi/computer-use-mcp exec vitest run src/server/tool-lane-hygiene.test.ts --config ./vitest.config.ts结果passed。1 个测试文件9 个测试。这 9 个测试用例与源码函数的对应关系详见下一节。3.3 契约联合测试pnpm -F proj-airi/computer-use-mcp exec vitest run \ src/server/tool-lane-hygiene.test.ts \ src/server/register-tools-coordinate-contract.test.ts \ src/server/register-tools-pty-approval.test.ts \ --config ./vitest.config.ts结果passed。3 个测试文件15 个测试。其中 services/computer-use-mcp/src/server/register-tools-coordinate-contract.test.ts 通过 mock 的McpServer捕获注册 schema断言desktop_click的坐标参数描述必须是 Global logical screen X coordinate, not Retina backing pixels 这类契约文本——它验证的是工具参数文档契约与车道卫生测试同批运行可确保注册层整体稳定。3.4 代码规范检查pnpm exec moeru-lint --fix \ services/computer-use-mcp/validation/tool-lane-hygiene.md \ services/computer-use-mcp/src/server/tool-lane-hygiene.ts \ services/computer-use-mcp/src/server/tool-lane-hygiene.test.ts \ services/computer-use-mcp/src/server/register-tools.ts \ services/computer-use-mcp/src/state.ts结果passed。在 Node 24 下运行0 warnings、0 errors。moeru-lint是 AIRI 仓库的 lint 工具配置见 alint.config.ts--fix会同时处理文档、源码与测试文件。3.5 Git 差异检查git diff --check结果passed无空白错误whitespace errors。3.6 类型检查基线失败而非回归pnpm -F proj-airi/computer-use-mcp typecheck结果failed但失败全部来自本次改动之外的历史基线文件src/chrome-session-manager.tssrc/chrome-session-manager.test.tssrc/desktop-grounding.ts基线错误类型包括TS2339与TS2353围绕ChromeSessionInfo.ensureOutcomeTS2451/TS2304重复的chromeWindowBounds与缺失的isChromeInFront文档明确给出结论本次补丁涉及的文件tool-lane-hygiene.ts / test、register-tools.ts、state.ts没有任何类型错误。这提醒读者遇到 typecheck 失败时应先确认是否属于已知基线问题再判断是否与自己的改动相关。四、测试用例与源码函数的逐一对应services/computer-use-mcp/src/server/tool-lane-hygiene.test.ts 的 9 个用例构成一张完整的判定表分组用例验证点期望inferToolLane从描述符注册表反查车道inferToolLane(desktop_click)desktopbuildCrossLaneAdvisory无活跃车道时inferredActiveLane: undefinednull不告警buildCrossLaneAdvisory工具车道与活跃车道一致coding_read_filecodingnull不告警buildCrossLaneAdvisory车道不一致browser_dom_clickbrowser_dom 活跃coding包含Advisory、coding、browser_dom、browser_dom_clickbuildCrossLaneAdvisory工具属于豁免车道workflow_coding_loopworkflow 活跃codingnullbuildCrossLaneAdvisory活跃车道为豁免车道browser_dom_click 活跃workflownullbuildCrossLaneAdvisory桌面→编码跨车道coding_apply_patchcoding 活跃desktop包含Advisory、desktop、codingshouldUpdateActiveLane非豁免车道coding/desktop/browser_dom/browser_cdp/pty/accessibility/vscode全部trueshouldUpdateActiveLane豁免车道workflow/internal/task_memory/display全部false从该测试表可以清晰看出机制的两个关键行为告警只在双方车道均已确立且不一致时触发且desktop→coding如执行面从桌面切换到编辑代码这种典型跨面场景是重点监控对象。五、设计边界与隐私约束验证文档开篇即声明两条边界Advisory-only只告警不拦截车道不匹配不会阻塞工具执行只追加提示文本。从 services/computer-use-mcp/src/server/tool-lane-hygiene.ts 的实现看即使buildCrossLaneAdvisory返回 null无告警原始 handler 也会照常执行并返回原始结果。真正的执行面强制切换由工作流层workflow_*工具、executeWorkflow、handoff 语义负责Tool Lane Hygiene 只提供认知辅助信号。隐私清洗验证文档面向公开仓库证据经过脱敏处理不包含本机绝对路径、令牌、账户标识、截屏或原始环境转储。这一点对涉及桌面自动化、终端、密钥读取secret_read_env_value的 MCP 服务尤其重要。六、如何在你的验证流程中复跑包范围命令所有验证都通过pnpm -F proj-airi/computer-use-mcp exec ...限定在services/computer-use-mcp包内执行vitest 使用./vitest.config.ts配置见 services/computer-use-mcp/vitest.config.ts。先装依赖再测仓库采用 pnpm workspace 锁文件见 pnpm-lock.yaml本地验证建议使用文档中的pnpm install --ignore-scripts --frozen-lockfile。理解基线失败若pnpm -F proj-airi/computer-use-mcp typecheck失败请对照文档 3.6 节确认是否命中已知的chrome-session-manager.ts/desktop-grounding.ts基线问题而非把改动文件一并误判为回归。延伸阅读车道卫生核心实现services/computer-use-mcp/src/server/tool-lane-hygiene.ts车道卫生测试用例services/computer-use-mcp/src/server/tool-lane-hygiene.test.ts工具注册与接入点services/computer-use-mcp/src/server/register-tools.ts运行态状态管理inferredActiveLaneservices/computer-use-mcp/src/state.ts车道与描述符类型定义services/computer-use-mcp/src/server/tool-descriptors/types.ts描述符注册表services/computer-use-mcp/src/server/tool-descriptors/registry.ts描述符聚合与初始化services/computer-use-mcp/src/server/tool-descriptors/all.ts描述符驱动注册辅助services/computer-use-mcp/src/server/tool-descriptors/register-helper.ts坐标契约联合测试services/computer-use-mcp/src/server/register-tools-coordinate-contract.test.ts【免费下载链接】airi Self hosted, you-owned Grok Companion, a container of souls of waifu, cyber livings to bring them into our worlds, wishing to achieve Neuro-samas altitude. Capable of realtime voice chat, Minecraft, Factorio playing. Web / macOS / Windows supported.项目地址: https://gitcode.com/GitHub_Trending/ai/airi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表