我會視情況交替使用 Claude Code、Meta 的 Muse、DeepSeek Harness。Codex 也有在用,特別是 Computer Use(操作 Mac 應用程式的功能)和 Meetings(會議錄音與逐字稿),我覺得它們比其他工具更順手。
不過,過去要使用 Codex 的 Computer Use,必須先請 Codex 再透過 Codex 自己的模型來操作。從 DeepSeek Harness 使用時,我也會把工作交給 Codex 當作子代理處理。由於子代理只能接收到會話的一部分,想做的事情有時未必能順利傳達。Muse 雖然可以操作自己 VM 裡的瀏覽器,但無法操作我透過 SSH 使用的那台 Mac 上的瀏覽器,所以以前我得請那台 Mac 上的 Codex 代為操作。
使用 codex app-server 之後,就能不經由 Codex 的模型,直接呼叫 Codex 的 Computer Use。也就是說,不必使用 Codex 的權杖,也能從 Claude Code、DeepSeek Harness、Muse 使用 Codex 的 Computer Use。像 Meetings、Sites 這類 Codex 的功能也能用同樣方式呼叫。
我測試的環境是 macOS、Codex CLI 0.164.0、ChatGPT 桌面應用程式 26.1023.50603。
codex app-server 是一個讓外部程式使用 Codex 功能的伺服器。啟動後,可以透過標準輸入/輸出交換 JSON-RPC 訊息。--help 會標示為 [experimental](實驗性功能)。
其中有一個 mcpServer/tool/call 方法,可用來呼叫 Codex 已連接的某個 MCP 伺服器工具。Computer Use 與 Meetings 的外掛在 Codex 內部就是以 MCP 伺服器形式運作,因此可以直接用這個方法呼叫。
呼叫時需要 thread ID,所以要先用 thread/start 建立一個執行緒。建立執行緒本身不會送出對模型的請求。因為完全沒有呼叫模型,所以也不會用到 Codex 的權杖。比較呼叫前後的 Codex 使用量與額度餘額,兩者都沒有變化。

Computer Use 的工具是 cua_repl 的 js。只要傳入 JavaScript 程式碼,就能用 cua 這個物件操作應用程式。
下面的腳本會在計算機 App 按下「3×4=」。從其他 AI 呼叫時,可以把這個腳本當成指令來用。
import json
import subprocess
proc = subprocess.Popen(["codex", "app-server"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
next_id = 0
def request(method, params=None):
global next_id
next_id += 1
proc.stdin.write(json.dumps({"id": next_id, "method": method, "params": params or {}}) + "\n")
proc.stdin.flush()
while True:
msg = json.loads(proc.stdout.readline())
if msg.get("id") == next_id:
return msg["result"]
def js(thread_id, code):
result = request("mcpServer/tool/call", {
"threadId": thread_id, "server": "cua_repl", "tool": "js", "arguments": {"code": code},
})
return "\n".join(c["text"] for c in result["content"] if c["type"] == "text")
request("initialize", {"clientInfo": {"name": "calc-demo", "version": "0.0.1"}})
thread_id = request("thread/start", {"ephemeral": True})["thread"]["id"]
js(thread_id, "1") # 第一次呼叫會回傳 Computer Use API 文件
print(js(thread_id, """
const app = await cua.getApp("com.apple.calculator", { emit: false });
const ax = await app.getAXState({ emit: false, disableDiffing: true });
const find = (id) => Number(ax.split("\\n").find((l) => l.includes(`ID: ${id}`)).trim().split(" ")[0]);
for (const id of ["AllClear", "Three", "Multiply", "Four", "Equals"]) await app.click(find(id));
await app.getAXState({ disableDiffing: true });
"""))
proc.terminate()
getAXState() 會把畫面上的元素以帶有編號的清單形式回傳,而按鈕也會附上像 ID: Three 這樣的 ID。腳本會根據 ID 找出對應編號,再呼叫 click()。第一次呼叫 js 時,會先回傳 Computer Use 的 API 說明,所以我先空呼叫一次。

我讓 Claude Code 透過 app-server 操作計算機。Claude Code 會讀取計算機畫面的列表,並從中自行決定要按下哪些按鈕的編號。
8 按鈕 說明:全部清除,ID: AllClear
19 按鈕 說明:1,ID: One
22 按鈕 說明:加法,ID: Add
26 按鈕 說明:執行計算,ID: Equals
按下「全部清除 → 1 → + → 1 → =」對應的編號(8、19、22、19、26)之後,顯示結果變成「1+1」「2」。負責讀畫面並決定按哪裡的是 Claude Code,Codex 只負責回傳畫面列表與執行點擊。
DeepSeek Harness 本身也有 Computer Use 功能,但我認為 Codex 的 Computer Use 完成度更高。透過 app-server,DeepSeek Harness 所選的模型可以負責讀取畫面,而實際操作則交給 Codex 的 Computer Use。這樣就不需要把工作交給 Codex,DeepSeek Harness 裡正在工作的模型也能沿用前面的對話脈絡來讀畫面並操作。
Muse 有自己的 VM,而且可以操作其中的瀏覽器。我會把一台沒在使用的 Mac 交給 Muse,讓它能透過 SSH 進入並工作,但 Muse 無法直接操作那台 Mac 上的瀏覽器。因此,遇到需要瀏覽器操作時,過去我都得請那台 Mac 上的 Codex 幫忙操作。
我讓 Muse 去研究是否有方法能直接操作時,它得出的結論是:只要不經由 Codex 的模型,直接呼叫那台 Mac 上 Codex 的 Computer Use 就可以了。實際嘗試後,Muse 真的能操作 SSH 連線目標 Mac 上的瀏覽器。
用 mcpServerStatus/list 查詢清單時,除了 Computer Use 之外,還能看到 Meetings,以及 Sites、Slides、Gmail、Slack、GitHub 等 ChatGPT 連接器(合計 430 個以上的工具)。這些都能用同一個 mcpServer/tool/call 呼叫,因此可從 Claude Code 或 DeepSeek Harness 不經由 Codex 直接使用。
Meetings:這是 ChatGPT 的 Pro 與 Business 方案可使用的 Beta 功能(ChatGPT 中的 Meetings 外掛)。我可以用 meetings.find_all 取得逐字稿清單,再用 meetings.fetch 取得單一項目的摘要與逐字稿。我也用這個方式,將 Meetings 的逐字稿定期同步到各專案的儲存庫中。
Sites:我用 sites.list_sites 取得自己網站的清單,再用 sites.deploy_private_site_version 重新發布原本沒在使用的網站已儲存版本,最後順利完成。
Slides:我可以透過 chatgpt_space.create_presentation 建立空白投影片。不過內容編輯(chatgpt_space.execute_artifact_code)會以 artifact_preparation_failed 錯誤失敗,即使從 Codex 呼叫也一樣。
既然可以從腳本呼叫,也很適合自動化那些每次都得照相同步驟執行的 App 操作。
app-server 是實驗性功能,而 cua_repl 也是 Codex App 內部使用的元件。Codex 更新之後,這種呼叫方式有可能無法再使用。
Computer Use 需要針對每個 App 個別允許是否可以使用。計算機以前已經在 Codex 中授權過,所以可以直接操作。當我嘗試開啟尚未授權的文字編輯時,app-server 會透過 mcpServer/elicitation/request 向呼叫端發出詢問。
Allow Computer Use to use "TextEdit"?
(譯:是否允許 Computer Use 使用「文字編輯」?)
若選擇拒絕,就會以 Computer Use was not approved to use TextEdit(Computer Use 未獲准使用文字編輯)錯誤停止;若允許,就能取得文字編輯畫面。
這個詢問需要由呼叫端的腳本或 AI 回答。若設計成讓 AI 自動允許,它就能操作任何 App。請在讓 Muse 或 DeepSeek Harness 使用時特別留意這一點。
在文章寫完之後,我又用其他方法測試了一次,結果發現 Computer Use 其實不用透過 app-server 也能使用。Computer Use 的 MCP 伺服器在外掛的 .mcp.json 裡就有啟動指令,可以直接啟動後再由 MCP 用戶端呼叫。
前提是 MCP 用戶端要支援 elicitation(表單式詢問)。如果不支援,即使是已授權的 App,也會因為「MCP 用戶端不支援表單式詢問」而無法運作。我從 Muse 使用時,會另外夾一個小型中繼程式,替它申報這項支援並代為回應授權詢問。
負責控制 Meetings 錄音的 MCP 伺服器(具有 chatgpt_meetings_start_local 等工具的那個)也是在本機啟動,因此同樣可以不用 app-server 直接啟動,並且能回應狀態確認(chatgpt_meetings_local_status)。另一方面,Sites、Slides,以及取得 Meetings 逐字稿(meetings.find_all、meetings.fetch)則屬於 ChatGPT 連接器,沒有可在本機啟動的 MCP 伺服器。若要從外部呼叫這些功能,就必須透過 app-server。
使用 codex app-server 的 mcpServer/tool/call,就能不使用 Codex 的權杖,直接從 Claude Code、DeepSeek Harness、Muse 使用 Codex 的 Computer Use。像 Meetings、Sites 這類 Codex 的功能也可以用相同方式呼叫。
株式会社xincere正在招募沒有實務經驗的工程師與學生工程師實習生,大家一起工作。
※ 關於シンシア的工作方式,請參考這裡
在シンシア,每年大約有 100 位沒有實務經驗的人投遞並參加技術面試。
透過這些經驗,我們將在這裡介紹「希望沒有實務經驗的人特別培養的技術能力」。
原文出處:https://qiita.com/tatsuya582/items/4d79021c9f78f4015992