十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

opencodex Cursor 桥接 mcp_tools 工具通告通道加固实战:channel 一致性缺陷修复与回归验证

opencodex Cursor 桥接 mcp_tools 工具通告通道加固实战:channel 一致性缺陷修复与回归验证 【免费下载链接】opencodexUniversal provider proxy for OpenAI Codex Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code项目地址https://gitcode.com/gh_mirrors/ope/opencodex点击查看免费下载本指南围绕 opencodexUniversal provider proxy for OpenAI Codex Claude CodeCursor 适配器中的一次关键加固展开修复AgentRunRequest.mcp_tools工具通告通道与RequestContext.tools、事件状态clientToolNames之间可见集不一致的缺陷并通过回归测试锁定边界行为。读完本文你将理解 Cursor 路由下客户端工具为何无法被模型调用、正确的 protobuf 封装形状如何避免解析崩溃以及如何用同一份过滤后的可见集保证多条通告通道的一致性。背景为什么 Cursor 路由下的客户端工具不可见在 Cursor 桥接中Codex 的客户端工具如mcp__node_repl__js、mcp__codex_apps__*系列由 opencodex 通过合成 Provider 标识opencodex-responses通告见 tool-naming.ts 中OCX_RESPONSES_TOOL_PROVIDER opencodex-responses。根因分析001_wp1_root_cause.md确认这不是权限问题而是未注册 / 合成 Provider 路由缺口——Cursor 只会把挂载在可路由的provider.mcpServers下的 MCP 工具暴露给模型的可调用目录而合成 Provideropencodex-responses无法被 Cursor 路由于是其下的工具被隐藏/丢弃。此前唯一通告通道是 native-exec 的RequestContext.tools即requestContextArgs实测中模型会回复我没有这个工具并回退到 Cursor 原生 Shell。而顶层AgentRunRequest.mcp_tools通道McpTools封装才是 Cursor 真正注册进模型可调用目录的通道。修复主线用正确的 McpTools 封装形状恢复 wire 兼容性早期 Phase 42 曾尝试把工具镜像进mcp_tools但 Cursor 实况解析器直接崩溃parse binary: illegal tag: field no 13 wire type 7wire type 7 是非法类型这是序列化形状错误而非通道被拒绝。加固文档004_fix_mcp_tools_channel.md确认正确姿势是用McpToolsSchema封装赋值const mcpToolDefs buildCursorToolDefinitions(request.tools, request.toolChoice); // ... ...(mcpToolDefs.length 0 ? { mcpTools: create(McpToolsSchema, { mcpTools: mcpToolDefs }) } : {}),实现在 protobuf-request.ts 的encodeCursorRunRequest/prepareCursorRunRequest中buildCursorToolDefinitions把request.tools映射为McpToolDefinitionname、toolName、providerIdentifier、description、inputSchema见 tool-definitions.ts再以create(McpToolsSchema, { mcpTools: defs })封装进runRequest.mcpTools。该形状与生成的 protobuf 定义McpTools.mcp_tools repeated McpToolDefinition严格对应。修复后实况端到端验证通过cursor/gpt-5.6-luna与cursor/claude-4.5-sonnet均产生了对注入工具的FINAL function_call而修复前所有变体裸名、mcp_前缀名、mcp_instructions等都产生零次工具调用。RequestContext.tools通道被保留作为第二条通告通道两通道同时填充。加固核心三通道可见集必须来自同一过滤结果A-gate 评审折叠了一个 BLOCKERmcp_tools原先直接取自原始request.tools而另外两处——RequestContext.toolslive-transport.ts 附近的requestContextArgs与事件状态clientToolNameslive-transport.ts 的clientToolDefs.map(tool tool.toolName || tool.name)——都来自经cursorToolsForActivePrompt(...)过滤后的可见集。以通用的工具计数演示类 prompt如 use any 3 tools为例这类 prompt 会把客户端工具收窄到裸exec_command。若mcp_tools仍通告非 exec 工具模型一旦调用其中某个工具就会被当作未知 Responses 工具拒绝见 protobuf-events.ts 的recordToolCall未知工具判定。因此加固后的encodeCursorRunRequest改为从同一份cursorToolsForActivePrompt(request.tools, activePromptText(request), request.toolChoice)可见集构建mcp_tools使三条通道mcp_tools、RequestContext.tools、事件状态名称保持一致// Hoisted out of the mcp_tools spread below so the estimate can read the same // filtered definitions the wire carries. Both helpers are pure. const mcpToolDefs buildCursorToolDefinitions(visibleTools, request.toolChoice);cursorToolsForActivePrompt可见集的裁决逻辑过滤规则位于 tool-guidance.ts当shouldUseNativeExecOnlyForGenericToolUse判定为通用工具计数演示时可见集收窄为仅执行路径工具isCursorExecutionPathTool否则返回完整工具集。识别逻辑isGenericToolUseCountDemoPrompt覆盖中英文与韩文模式如/\buse\sany\stools?\b/i、/\b\d\stools?\b/i等见 tool-guidance.ts并支持从 prompt 中解析期望的工具数量requestedCursorToolUseCount上限 50。正因为buildCursorToolDefinitions接收的是过滤后的visibleToolsmcp_tools的最终内容才与事件状态clientToolNames完全一致杜绝了通告了但调用即被拒的跨通道漂移。非阻塞结论审计无需修改的确认项加固评审同时确认了四项无需改动的边界无双重执行返回的客户端工具调用只被 surfacing 一次并按 call id 去重——事件状态中的completedToolCalls: Setstringprotobuf-events.ts在recordToolCall、toolCallCompleted、dropInvalidFreeformCall等路径统一先查重再处理OCX_RESPONSES的mcpArgs由 Responses bridge 拦截不会在本地重复执行。wire 形状正确create(McpToolsSchema, { mcpTools: defs })与McpTools.mcp_tools repeated McpToolDefinition一一对应。空工具与toolChoice:none均产出空列表mcpToolDefs为空时字段保持 unset除非显式设置suppressDefaultCursorToolCatalog此时序列化一个显式空McpTools封装以抑制 Cursor 默认原生目录。性能可忽略仅为一次小规模的同步 filter/map 加编码。回归测试用测试锁定每条边界加固在 cursor-blob.test.tstests/providers/cursor/目录下新增了describe(Cursor AgentRunRequest.mcp_tools channel)测试组逐一锁定行为场景输入断言普通 prompt含mcp__node_repl命名空间工具mcp_tools [mcp__node_repl__js]通用工具计数 promptuse any 3 tools exec_command 非 exec 工具mcp_tools [exec_command]过滤器一致性即 BLOCKER 的测试通用 prompt 统一 execuse any 3 tools execwait node_replmcp_tools [exec]空工具tools: []mcpToolsunset抑制默认目录tools: []suppressDefaultCursorToolCatalog: truemcpTools.mcpTools []显式空封装toolChoice: none含 node_repl 工具mcpToolsunset测试辅助函数mcpToolNames(bytes)从编码后的AgentClientMessage反解run.mcpTools.mcpTools.map(def def.toolName)cursor-blob.test.ts直接断言 wire 层真实载荷。验证与交付加固交付验证分三层类型检查bunx tsc --noEmit退出码 0单元测试bun test tests/cursor-blob.test.ts13 项全部通过完整bun test tests/cursor-*.test.ts265 项通过 / 0 失败此前为 261 项本次净增 4 项实况验证本轮不占用实况 Cursor probe线上代理端口 10100不受影响改动在代理重启后生效。最终状态为 DONEchannel 一致性缺陷已修复、边界行为由测试锁定、经 sol 评审后提交到分支。对于运行中的线上代理重启前现有会话行为不变工具 RESULT 返回路径未改动既有 client-tool bridgefunction_callsurfacing → Codex 执行 → 结果作为历史在下一轮回放如需完整多轮浏览器往返node_repl → result → 下一次调用可另行做一次端到端冒烟验证。延伸阅读修复发现与实况验证全过程004_fix_mcp_tools_channel.md根因分析合成 Provider 路由缺口001_wp1_root_cause.md工具定义与 wire 编码tool-definitions.ts、protobuf-request.ts可见集过滤与 prompt 识别tool-guidance.ts事件状态与工具调用去重protobuf-events.ts赞分享【免费下载链接】opencodexUniversal provider proxy for OpenAI Codex Claude Code — use any LLM (Claude, Gemini, Grok, DeepSeek, Ollama…) with Codex CLI, App, SDK, and Claude Code项目地址https://gitcode.com/gh_mirrors/ope/opencodex点击查看免费下载相关推荐opencodex PR 73 Cherry-Pick 与传输加固Codex/Cursor 桥接层的错误分类与取消语义修复opencodex PR 73 Cherry Pick 与传输加固Codex/Cursor 桥接层的错误分类与取消语义修复 导读 本文基于 opencodexComposio 回归测试指南从复现缺陷到提交可验证的修复Composio 回归测试指南从复现缺陷到提交可验证的修复 导读 本文面向 Composio SDK 的贡献者与维护者系统讲解在仓库中开展回归测试Regr人工智能AI Agent工具调用MCP 服务MCP ClientsAptos MoveFlow State-Label 验证修复Move Prover 后置条件中间状态断言缺陷的修复与回归验证Aptos MoveFlow State Label 验证修复Move Prover 后置条件中间状态断言缺陷的修复与回归验证 导读 本指南围绕 Aptos区块链Web3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表