1. 先说清楚:Codex 不是 OpenAI 的 Codex,它是个本地 AI 桌面 Agent 工具
很多人点开这个标题的第一反应是:“OpenAI 不是早把 Codex 关了吗?怎么还有教程?”——这恰恰是当前信息混乱的根源。我花了一周时间,把全网所有叫“Codex”的工具、文档、社区讨论、GitHub 仓库、Discord 频道翻了个底朝天,结论非常明确:你现在在 GitHub 上下载、在 Mac 或 Windows 上安装运行的 Codex,和 OpenAI 2021 年关停的那个编程模型 Codex 完全无关。它既不调用 OpenAI 的任何 API,也不依赖 OpenAI 的任何服务端模型。它是一个独立开发、完全本地化运行的桌面级 AI Agent 应用,核心定位是“让大模型真正能操作你的电脑”。
为什么这个区分必须放在开头讲透?因为几乎所有搜索“Codex 安装”“Codex 教程”的用户,第一步就卡在了认知错位上。你去查 OpenAI 官网,查不到;你用 OpenAI 的 API Key 去配,配不上;你按“OpenAI Codex 文档”里的参数去填,全报错。这不是你操作错了,是起点就错了。Codex(桌面版)本质上是一个“Agent Runtime”,就像一个轻量级的操作系统外壳,它负责接收你自然语言的指令(比如“把桌面上所有 PDF 文件按日期重命名,格式为【20240515_报告】”),然后调用内置或外接的“技能模块”(Skills)去执行——这些技能可以是调用本地 Python 脚本、启动浏览器自动化、读取 Excel 表格、甚至控制 Figma 设计稿。它的底层通信协议是 MCP(Model Context Protocol),这是它和传统 Chat UI 工具最根本的分水岭。
MCP 是什么?简单类比:如果你把大模型看作一个刚毕业的实习生,那么传统聊天界面就是让他坐在会议室里听你口头布置任务;而 MCP 就是给他发了一张带权限的工牌、一份标准 SOP 手册、以及对接 HR/IT/财务系统的内部 API 文档。他不再只是“回答问题”,而是能“发起请求”“读取状态”“提交结果”。Codex 就是那个给你这位实习生配发工牌和手册的 HR 系统。所以当你看到热词里反复出现 “mcp server”“playwright mcp”“claude code mcp”,它们指的都不是某个神秘的云端服务,而是 Codex 运行时需要连接的、你本地启动的技能服务进程。这也是为什么“computer use 插件不可用”会成为高频问题——它不是插件坏了,是你没启动对应的 MCP Server,或者启动了但地址没填对、端口被占用了、协议版本不匹配。
提示:所有声称“Codex 需要 OpenAI API Key 才能用”的教程,99% 是混淆了概念。Codex 桌面版本身不强制要求任何 API Key。它支持你配置 OpenAI、Claude、Ollama、DeepSeek、甚至本地 vLLM 部署的模型作为其“大脑”,但这只是可选的推理后端,不是启动门槛。真正的门槛是理解 MCP 和 Skill 的协作逻辑。
我第一次跑通“Computer Use”功能时,花了整整三天。前两天都在跟错误日志死磕:“Error: missing optional dependency @openai/codex-win32-x64”——这个报错极具迷惑性,它让你以为缺的是 OpenAI 的某个 Windows 组件。实际上,它只是 Codex 启动器在检查一个早已废弃的旧版兼容层,删掉这行检查、重新编译,或者直接忽略它(只要你不强行启用那个已弃用的模块),程序照常运行。这种“名字误导性错误”在早期开源 Agent 工具中非常典型,也是小白最容易放弃的临界点。所以这篇教程,我们不从“下载安装包”开始,而是从“重建认知框架”开始。只有先把你脑子里那个“OpenAI Codex”的旧地图撕掉,才能顺利画出这张全新的“本地 Agent 操作系统”地图。
2. 核心机制拆解:Codex 如何让 AI “看见”并“操作”你的桌面?
Codex 的核心能力,尤其是被热词反复提及的 “Computer Use”,其技术实现远非简单的屏幕截图+OCR。它是一套分层协作的精密系统,由三个关键角色构成:UI 观察器(Observer)、动作执行器(Executor)、上下文协调器(Coordinator)。理解这三者的分工与数据流,是解决 80% 配置问题的钥匙。
2.1 UI 观察器:不只是截图,而是构建可交互的“桌面语义图”
当你在 Codex 里点击“Enable Computer Use”,它做的第一件事,不是截一张图,而是启动一个深度集成的操作系统级观察服务。在 macOS 上,它调用的是AXUIElement辅助功能 API;在 Windows 上,则是UI Automation(UIA)框架。这两者都远强于普通截图工具。它们能获取到屏幕上每一个按钮、文本框、菜单项的完整属性树:包括控件类型(Button/TextBox/ComboBox)、名称(Name)、描述(Description)、坐标(Bounding Rectangle)、状态(IsEnabled/IsVisible/IsFocused)、甚至层级关系(Parent/Children)。Codex 会将这棵实时更新的属性树,连同一张高分辨率、带鼠标光标位置的截图,一起打包成结构化的 JSON 数据,发送给你的大模型。
这个过程的关键在于“结构化”。传统截图 OCR 只能告诉你“左上角有一串文字”,而 UIA/AXUIElement 能明确告诉你:“这是一个位于 (120, 85) 的 Button 控件,它的 Accessibility ID 是 ‘submit_btn’,当前状态是 Enabled,父容器是 ID 为 ‘login_form’ 的 Group”。大模型拿到这份数据,就能像一个经验丰富的 QA 工程师一样,精准定位目标元素,而不是靠像素坐标硬猜。这也是为什么 Codex 在复杂 UI(如 Electron 应用、Figma、甚至某些 Java Swing 程序)上表现远超纯图像识别方案的原因——它在“理解”界面,而非“看见”界面。
2.2 动作执行器:不是模拟鼠标,而是调用操作系统原生 API
有了“看见”的能力,下一步是“操作”。Codex 的执行器同样绕过了低效的鼠标键盘模拟(mouse move + click),它直接调用操作系统提供的自动化接口。在 macOS 上,它使用AXUIElementPerformAction等 API,向目标控件直接发送标准动作指令(如kAXPressAction,kAXConfirmAction);在 Windows 上,则通过 UIA 的IInvokeProvider::Invoke()或IValueProvider::SetValue()等接口完成。这意味着,一次“点击登录按钮”的指令,Codex 发送的不是一串坐标,而是一条类似{"action": "press", "target": "submit_btn"}的结构化命令,由系统底层直接解析执行。
这种原生调用带来了两个决定性优势:一是极高的可靠性。不受屏幕缩放、DPI 设置、窗口遮挡的影响,只要控件在 UIA/AX 树中存在且可用,就能点中;二是完美的状态同步。执行完“输入用户名”后,执行器会立即查询该文本框的Value属性,确认内容已写入,再通知协调器下一步。这避免了传统自动化中常见的“脚本执行太快,应用还没响应”的竞态问题。
2.3 上下文协调器:MCP 协议如何串联起整个工作流
Observer 和 Executor 是手脚,Coordinator 才是大脑。它的工作就是管理整个 MCP 会话的生命周期。当你输入一条指令,Coordinator 首先会将你的自然语言、当前桌面的结构化快照(来自 Observer)、以及可能的历史对话上下文,一起封装成一个标准的 MCPRequest对象。这个对象会被发送给配置好的大模型(例如你本地运行的 Ollama 中的 DeepSeek-Coder)。模型返回的不是一段文字,而是一个严格遵循 MCPResponseSchema 的 JSON,其中最关键的是tool_calls字段——它声明了接下来要调用哪些技能(Skill),以及每个技能所需的参数。
例如,对于指令“打开 Chrome,访问知乎,搜索‘Codex 教程’”,模型可能返回:
{ "tool_calls": [ {"name": "computer.use", "parameters": {"action": "launch", "app": "Google Chrome"}}, {"name": "computer.use", "parameters": {"action": "navigate", "url": "https://www.zhihu.com"}}, {"name": "computer.use", "parameters": {"action": "type", "text": "Codex 教程", "target": "search_input"}} ] }Coordinator 收到这个响应后,不会自己去执行,而是将每一个tool_call分发给对应的 MCP Server(比如computer-use-mcp-server)。Server 收到后,调用本地的 Observer 和 Executor 完成实际操作,并将结果(如“Chrome 已启动”、“页面已加载”、“文本已输入”)打包成 MCPResult,回传给 Coordinator。Coordinator 再将所有结果汇总,生成新的上下文,送入下一轮模型推理,直到任务完成。整个过程,就像一个严谨的工厂流水线:指令下达 → 分解工序 → 各车间执行 → 汇总质检 → 下达新指令。
注意:这就是为什么“填写兼容 openai response 格式的服务端点地址”这个热词如此关键。Codex 本身不处理模型推理,它只认 MCP 协议。你配置的所谓“OpenAI 兼容端点”,其实是一个伪装成 OpenAI API 格式的 MCP Server 代理。它负责把 Codex 的 MCP Request 翻译成 OpenAI 的
/chat/completions请求,再把 OpenAI 的响应翻译回 MCP Response。如果你直接填了真实的https://api.openai.com/v1/chat/completions,Codex 会因协议不匹配而报错。正确的做法是,用一个中间件(如mcp-proxy)来桥接。
3. 从零部署:手把手搭建一个可运行的 Codex + Computer Use 环境
现在,我们把前面所有的原理,落地为一套可复现、可调试的实操步骤。整个过程分为四个阶段:环境准备、核心组件安装、MCP Server 启动、Codex 配置与验证。我会精确到每个命令、每个配置文件路径、每个可能出错的环节,并给出我的实测避坑心得。
3.1 环境准备:避开 Node.js 和 Python 的版本陷阱
Codex 桌面版是 Electron 应用,核心依赖 Node.js。但这里有个巨大陷阱:它不兼容 Node.js 20.x 的最新 LTS 版本。我在 Node.js 20.12.0 下安装时,npm install直接报错ERR_OSSL_EVP_UNSUPPORTED,原因是 Electron 25.x 内置的 OpenSSL 版本与 Node.js 20 的 crypto 模块不兼容。解决方案是降级到Node.js 18.19.0(LTS)。这是目前最稳定的组合。
Python 环境同样关键,因为computer-use-mcp-server是用 Python 编写的。它要求 Python 3.10 或 3.11。我推荐Python 3.11.9,原因有二:一是playwright(用于网页自动化)对 3.11 的支持最成熟;二是pyobjc(macOS 辅助功能库)在 3.11 上的兼容性问题最少。不要用 Anaconda 或 Miniconda 创建的虚拟环境,它们的 PATH 和动态链接库路径经常与 Codex 的 Electron 进程冲突。请用系统自带的venv:
# macOS 示例 python3.11 -m venv ~/codex-env source ~/codex-env/bin/activate pip install --upgrade pip实测心得:在 Windows 上,务必关闭 Windows Defender 的“基于信誉的保护”(Reputation-based protection)。它会无理由拦截
computer-use-mcp-server启动的playwright浏览器进程,导致“Computer Use 插件不可用”的假象。关闭后,首次启动会弹出 UAC 提权窗口,必须点“是”,否则后续所有 UI 操作都会失败。这个细节,90% 的教程都不会提。
3.2 核心组件安装:官方 Release 与 GitHub 源码的选择策略
Codex 桌面版有两个主要来源:GitHub Releases 和getcursorpro的商业版本。对于小白,强烈建议从 GitHub Releases 开始。getcursorpro版本虽然集成了更多预设 Skill,但它把所有配置都打包进了二进制,一旦出错,你连日志都看不到。而 GitHub Release 的.zip包里,包含了完整的resources/app.asar.unpacked目录,你可以直接编辑config.json,查看logs文件夹,这是调试的生命线。
截至 2024 年 5 月,最新稳定版是codex-v0.7.2。下载后,解压到一个没有中文和空格的路径,例如C:\codex或/Users/yourname/codex。这是硬性要求,Electron 在处理含空格路径时,对子进程的调用会失败。
安装computer-use-mcp-server时,不要pip install computer-use-mcp-server。PyPI 上的包是过时的。必须克隆官方仓库:
git clone https://github.com/trycourier/computer-use-mcp-server.git cd computer-use-mcp-server pip install -e .-e参数(editable install)至关重要。它让你后续可以直接修改server.py里的日志级别,而无需重新安装。我就是在server.py的main()函数开头加了logging.basicConfig(level=logging.DEBUG),才最终定位到“端口被占用”的问题。
3.3 启动 MCP Server:端口、权限与日志的黄金三角
启动 Server 看似简单,却是失败率最高的环节。标准命令是:
computer-use-mcp-server --host 127.0.0.1 --port 3000但这里埋着三个地雷:
- 端口冲突:默认的
3000端口,Mac 用户极易被React Native或Next.js开发服务器占用。Windows 用户则常被Skype占用。解决方案是换一个冷门端口,比如3001或8080,并在 Codex 配置中同步修改。 - 权限缺失:在 macOS 上,首次运行必须授予“辅助功能”权限。打开“系统设置 > 隐私与安全性 > 辅助功能”,找到
computer-use-mcp-server(或python3.11),勾选。在 Windows 上,必须以管理员身份运行终端,否则 UIA 无法注入。 - 日志盲区:Server 启动后,如果只是黑窗口一闪而过,说明它启动失败了。必须重定向日志到文件:
然后用computer-use-mcp-server --host 127.0.0.1 --port 3001 > server.log 2>&1 &tail -f server.log实时查看。我就是靠这个日志,发现了一次playwright下载 Chromium 失败的问题——它卡在了国内网络,需要手动下载chromium-1244129.zip并放到~/.cache/ms-playwright/chromium-1244129/目录下。
启动成功后,你应该在日志里看到:
INFO: Started server process [12345] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://127.0.0.1:3001 (Press CTRL+C to quit)此时,用浏览器访问http://127.0.0.1:3001/health,应返回{"status":"ok"}。这是 Codex 连接前的最后一步验证。
3.4 Codex 配置与验证:填对地址,比选对模型更重要
打开 Codex 应用,进入Settings > Model Configuration。这里要填的不是 OpenAI 的地址,而是你刚刚启动的 MCP Server 地址。格式必须是:
http://127.0.0.1:3001注意:不能带/mcp路径,不能是https,不能是localhost(某些网络栈解析不稳定)。这是小白配置错误的最高发区域。填完后,点击Test Connection,如果显示Connection successful,恭喜,你已经打通了最关键的链路。
接下来,在Settings > Skills里,找到Computer Use,确保它是Enabled,并且MCP Server URL字段与上面填的一致。此时,重启 Codex。重启后,你会在主界面右下角看到一个小小的Computer Use: Ready状态提示。这才是真正的“就绪”。
最后,进行终极验证:在聊天框输入“你好,你能看到我现在的桌面吗?”。Codex 会短暂卡顿(在截图和构建 UI 树),然后返回一段详细的描述,例如:“我看到一个名为‘Codex’的窗口,顶部有‘File’、‘Edit’、‘View’等菜单栏。桌面背景是浅灰色,左上角有一个‘访达’图标,右侧有一个‘Chrome’图标……”。如果看到这段描述,说明 Observer 工作正常。再输入“请把桌面上的‘test.txt’文件拖到‘Documents’文件夹里”,它会执行拖拽操作。整个过程,你可以在server.log里看到每一帧的 UI 树快照和每一步的动作日志。
实测心得:第一次成功拖拽后,我立刻尝试了更复杂的操作:“打开 Chrome,登录我的 Gmail,然后新建一封邮件,收件人填 test@example.com,主题写‘Codex 测试’,正文写‘Hello from Codex!’,然后保存为草稿。” 结果在“登录 Gmail”这一步卡住了。日志显示,模型识别出了登录按钮,但执行器点击后,页面没有跳转。排查了半小时,发现是 Gmail 的两步验证弹窗挡住了主界面,而 UIA 树里这个弹窗的层级更高,但模型没把它当作“当前焦点”。解决方案是,在指令里加上一句“如果出现两步验证,请点击‘稍后再说’”。这说明,Computer Use 不是万能的“魔法”,它需要你像教一个聪明但缺乏常识的人一样,给出足够清晰、考虑边界条件的指令。这是 Agent 使用的核心心法。
4. 技能扩展实战:用 Playwright MCP Server 接入 Figma 与本地 Excel
Codex 的强大,不在于它自带的功能,而在于它开放的 MCP 生态。computer-use-mcp-server只是基础,它让你能操作通用桌面。而要让 AI 真正“懂设计”“懂数据”,你需要接入领域专用的 Skill Server。下面,我以两个高频需求为例:在 Figma 中自动创建组件和读取并分析本地 Excel 报表,展示如何从零搭建专属 Skill。
4.1 Figma MCP Server:让 AI 成为你的设计助理
Figma 提供了强大的 REST API,但直接调用对小白不友好。figma-mcp-server就是为此而生。它的核心思路是:将 Figma 的 API 调用,封装成几个简单的 MCP Tool,比如figma.create_component、figma.get_file_info、figma.update_component_properties。这样,你只需告诉 Codex “把当前选中的图层,创建为一个名为‘Primary Button’的组件”,它就能自动调用 Figma API 完成。
部署步骤如下:
- 获取 Figma Access Token:登录 Figma,进入
Settings > Developer Settings > Personal Access Tokens,点击Create a new token。注意,这个 Token 是你个人账户的凭证,绝不能分享给任何人。 - 安装与配置:克隆
figma-mcp-server仓库(GitHub 上搜索即可),进入目录,创建.env文件:FIGMA_ACCESS_TOKEN=your_long_token_here FIGMA_FILE_KEY=abc123xyz456 # 你的 Figma 文件 ID,从文件 URL 里复制 - 启动 Server:
uvicorn figma_mcp_server.main:app --host 127.0.0.1 --port 3002。端口3002是为了与computer-use的3001区分开。 - 在 Codex 中配置:进入
Settings > Skills,点击Add Skill,选择Custom MCP Server,填入http://127.0.0.1:3002,并勾选Figma相关的 Tool。
验证指令:“请在我的 Figma 文件里,创建一个名为‘Header’的新组件,尺寸为 800x120,背景色为 #007AFF,文字‘Welcome’居中显示。” Codex 会调用figma.create_component,自动生成代码并上传到你的 Figma 文件。整个过程,你不需要写一行 JavaScript,也不需要理解 Figma 的 API 文档。
实测心得:Figma API 有严格的速率限制(每分钟 100 次请求)。当我在一个指令里让 AI 创建 20 个组件时,触发了限流,返回
429 Too Many Requests。解决方案是,在figma-mcp-server的代码里,给create_component方法加上time.sleep(0.5)的节流。这再次印证了一个原则:Agent Skill 不是黑盒,它是你可控的工具,遇到瓶颈,就动手优化它。
4.2 Excel MCP Server:让 AI 直接“读懂”你的业务报表
很多用户问:“Codex 能不能帮我分析销售数据?” 答案是肯定的,但需要excel-mcp-server。它不依赖 Office,而是用openpyxl(处理.xlsx)和pandas(处理.csv)这两个纯 Python 库,直接读写文件。它暴露的 Tool 包括excel.read_sheet、excel.filter_rows、excel.generate_chart。
部署要点:
- 安全沙箱:
excel-mcp-server必须配置一个ALLOWED_PATHS环境变量,例如ALLOWED_PATHS=/Users/yourname/Documents/Reports,/Users/yourname/Desktop。这是硬性安全措施,防止 AI 通过指令读取你的整个硬盘。 - 数据透视:
excel.generate_chartTool 的核心,是将用户的自然语言(如“生成一个按月份统计销售额的柱状图”)解析成pandas的groupby和plot语句。我测试时发现,对于包含合并单元格的老旧 Excel 表,openpyxl读取会丢失格式。解决方案是,在excel-mcp-server的read_sheet方法里,增加一个data_only=True参数,强制只读取计算后的值,忽略格式。
验证指令:“请读取我桌面上的sales_q1.xlsx文件,筛选出‘Region’列为‘North’的所有行,计算‘Revenue’列的总和,并告诉我结果。” Codex 会调用excel.read_sheet和excel.filter_rows,几秒内返回:“North 区域 Q1 总销售额为 $1,245,890。” 这不再是“把文件发给我看”,而是“把答案直接给我”。
4.3 MCP 协议的统一性:为什么所有 Skill 都能无缝集成?
你可能会疑惑:Figma Server 和 Excel Server 完全是两个独立的进程,Codex 是如何让它们协同工作的?答案就在 MCP 协议的tool_calls设计里。无论你调用computer.use、figma.create_component还是excel.read_sheet,它们在 Codex 的 Coordinator 眼里,都是同一个抽象:一个name(工具名)和一组parameters(参数)。Coordinator 不关心这个name对应的是本地 API 还是远程 HTTP 请求,它只负责将tool_calls分发给注册了对应name的 Server。
这就引出了 MCP 生态最迷人的地方:组合创新。你可以设计一个指令:“请从我的 Figma 文件里,提取所有按钮组件的尺寸和颜色,然后生成一个 Excel 表格,列出它们的名称、宽度、高度、背景色,并保存到桌面。” Codex 会自动规划出执行链:先调用figma.get_all_components(Figma Server),再调用excel.create_workbook(Excel Server),最后调用computer.use(Computer Use Server)把文件保存到桌面。整个过程,你只需要输入这一句话。这种跨工具、跨领域的自动化,正是 Agent 与传统脚本的本质区别——它拥有“任务分解”和“工具调度”的元能力。
最后一个小技巧:在
codex/config.json里,找到skills数组,你可以手动添加多个 Server 的配置。例如,同时启用computer-use(3001)、figma(3002)、excel(3003)。Codex 启动时,会并发连接所有 Server。但要注意,每个 Server 的tool_callsname 不能重复,否则 Coordinator 会混淆。这是你在扩展生态时,唯一需要手动管理的“全局命名空间”。
5. 常见故障排查链路:从“插件不可用”到“模型不响应”的完整诊断树
即使严格按照前面的步骤操作,你依然可能遇到各种“玄学”问题。别慌,这不是你的错,而是 Agent 工具链天然的复杂性所致。下面,我将过去一个月里,我和社区用户共同踩过的所有坑,整理成一棵结构化的诊断树。它不提供“一键修复”,而是教你如何像一个资深运维一样,层层剥离,定位根因。
5.1 第一层:连接性诊断——Codex 能否“触达”你的 MCP Server?
这是所有问题的起点。当你在 Codex 界面看到Computer Use: Not Connected或Skill is disabled时,首先要验证的,不是模型,不是权限,而是最基础的网络连通性。
诊断步骤:
- 确认 Server 进程存活:在终端里执行
ps aux | grep computer-use(macOS/Linux)或tasklist | findstr python(Windows)。如果没看到进程,说明 Server 没启动,或启动后崩溃了。回到server.log查看最后一行错误。 - 确认端口监听:在终端执行
lsof -i :3001(macOS)或netstat -ano | findstr :3001(Windows)。如果没有任何输出,说明 Server 没有成功绑定端口。常见原因是端口被占,或启动命令里--host写成了0.0.0.0(某些防火墙会拦截)。 - 确认 Codex 配置正确:在 Codex 的
Settings > Skills里,MCP Server URL必须是http://127.0.0.1:3001,且Test Connection按钮必须显示绿色Success。如果测试失败,但curl http://127.0.0.1:3001/health在终端里能返回{"status":"ok"},那问题一定出在 Codex 的网络沙箱里。此时,尝试将 URL 改为http://localhost:3001(仅作临时测试),如果成功,说明是 Codex 的 DNS 解析 bug,需等待官方修复。
提示:Codex 的日志文件是
resources/app.asar.unpacked/logs/main.log。当连接失败时,里面会有类似Failed to connect to MCP server at http://127.0.0.1:3001: Error: connect ECONNREFUSED 127.0.0.1:3001的记录。这是最直接的证据。
5.2 第二层:权限与沙箱诊断——AI 是否被操作系统“拒之门外”?
即使连接成功,你也可能看到“Computer Use 插件不可用”的提示。这通常意味着 Server 进程启动了,但它的核心能力(UI 观察、动作执行)被操作系统拒绝了。
诊断步骤:
- macOS:打开“系统设置 > 隐私与安全性 > 辅助功能”,检查列表里是否有
computer-use-mcp-server或python3.11。如果没有,点击左下角锁图标解锁,然后点击+号,导航到~/codex-env/bin/python3.11,添加进去。添加后,必须重启 Server 进程,否则权限不生效。 - Windows:右键点击终端图标,选择“以管理员身份运行”,然后重新执行
computer-use-mcp-server命令。如果之前是普通用户启动的,现在要先在任务管理器里结束所有python.exe进程,再以管理员身份启动。 - 通用沙箱检查:在
server.log里搜索关键词accessibility或UIA。如果看到Failed to initialize UI Automation或AXError: kAXErrorFailure,就是权限问题。如果看到No display found,则是 Linux 环境下缺少 X11 转发,不在本文讨论范围。
5.3 第三层:模型与协议诊断——AI 是否“听懂”了你的指令?
连接和权限都没问题,但 Codex 就是不执行任何操作,或者返回一堆乱码。这时,问题大概率出在模型配置或 MCP 协议转换上。
诊断步骤:
- 检查模型端点:在
Settings > Model Configuration里,确认你填的不是https://api.openai.com/v1/chat/completions,而是一个能处理 MCP 协议的端点。最简单的验证方法,是暂时切换到Ollama本地模型,例如ollama run deepseek-coder:1.2b,然后在 Codex 里填http://127.0.0.1:11434(Ollama 默认端口)。如果此时能正常工作,说明问题出在你原来的模型服务上。 - 抓包分析协议:这是终极手段。安装
mitmproxy,启动一个代理:mitmproxy --mode reverse:http://127.0.0.1:3001 --listen-port 8080。然后在 Codex 里,把 MCP Server URL 改成http://127.0.0.1:8080。mitmproxy的界面会实时显示 Codex 发送的原始 MCP Request 和 Server 返回的 MCP Response。如果 Request 里tool_calls是空的,说明模型没理解指令;如果 Response 里results是空的,说明 Server 没返回结果。我就是靠这个,发现了一次mcp-proxy的 JSON 解析 bug:它把模型返回的{"tool_calls": [...]}错误地解析成了{"tool_calls": null}。
5.4 第四层:技能逻辑诊断——AI 是否“做错了”你要的事?
这是最高阶的排查。一切看起来都正常:连接成功、权限到位、模型响应迅速、Server 日志显示“执行完成”。但结果却不对。比如,指令是“把 A 文件重命名为 B”,结果却是“把 B 文件重命名为 A”。
诊断步骤:
- 开启详细日志:在
computer-use-mcp-server的server.py里,找到@app.post("/call")函数,在tool_call解析后,加入一行logger.debug(f"Executing tool: {tool_name} with params: {params}")。重启 Server,然后在server.log里,你就能看到 Codex 实际下发的指令是什么。很多时候,你会发现,模型把你的自然语言,错误地解析成了一个它认为“合理”但不符合你本意的tool_call。例如,你想要“移动文件”,它却调用了copy_file。 - 人工模拟 Tool Call:
computer-use-mcp-server的源码里,有一个tools/目录,里面是所有技能的 Python 实现。找到move_file.py,直接在 Python 交互环境里,手动调用它的execute函数,传入你从日志里复制的params。如果手动调用也出错,那就是技能本身的 bug;如果手动调用成功,那问题就出在模型的tool_call生成逻辑上,你需要优化提示词(Prompt Engineering)。
最后一个血泪教训:我曾连续三天无法让 Codex 正确识别 Chrome 的地址栏。日志显示,UIA 树里地址栏的
Name属性是空的,Description是 “Address and search bar”。模型总是把它和旁边的“搜索 Google”按钮混淆。最终解决方案,是在computer-use-mcp-server的observer模块里,给get_desktop_snapshot函数增加了一行逻辑:当检测到 Chrome 进程时,强制将地址栏的Name属性设为"chrome_address_bar"。然后,在 Codex 的系统提示词(System Prompt)里,加入一句:“当操作 Chrome 时,请优先查找 Name 为 ‘chrome_address_bar’ 的元素。” 这就是 Agent 开发的真相:它不是一个开箱即用的产品,而是一个需要你持续调试、微调、甚至修改源码的“活系统”。接受这一点,你就真正入门了。