はじめに
私は 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 の Computer Use を Codex のモデルを通さずに直接呼べます。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 app-server は、Codex の機能を外のプログラムから使うためのサーバーです。起動すると、標準入出力で JSON-RPC のメッセージをやり取りできます。--help には [experimental](試験的)と表示されます。
この中に、mcpServer/tool/call というメソッドがあります。Codex が繋いでいる MCP サーバーのツールを1つ呼ぶメソッドです。Computer Use や Meetings のプラグインは Codex の中で MCP サーバーとして動いているので、このメソッドでそのまま呼べます。
呼び出しにはスレッドの ID が要るので、先に thread/start でスレッドを作ります。作るだけで、モデルへの依頼は送りません。モデルを一度も呼ばないので、Codex のトークンは使いません。呼び出しの前後で Codex の使用率とクレジット残高を比べても、どちらも変わりませんでした。
Computer Use を呼ぶスクリプト
Computer Use のツールは cua_repl の js です。JavaScript のコードを渡すと、cua というオブジェクトでアプリを操作できます。
次のスクリプトは計算機アプリで「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") # first call returns the Computer Use API docs
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 の説明が返ってくるので、最初に1回空打ちしています。
Claude Code から使う
Claude Code に、app-server 経由で計算機を操作してもらいました。Claude Code は計算機の画面の一覧を取り、その中から押すボタンの番号を自分で選んでいます。
8 ボタン Description: すべて消去, ID: AllClear
19 ボタン Description: 1, ID: One
22 ボタン Description: 加算, ID: Add
26 ボタン Description: 計算実行, ID: Equals
「すべて消去 → 1 → + → 1 → =」の番号(8, 19, 22, 19, 26)を押して、表示は「1+1」「2」になりました。画面を読んで押す場所を決めたのは Claude Code で、Codex がやったのは画面の一覧を返すことと、クリックすることだけです。
DeepSeek Harness から使う
DeepSeek Harness にも Computer Use の機能はありますが、私は Codex の Computer Use のほうが完成度が高いと思っています。app-server を使えば、DeepSeek Harness で選んだモデルが画面を読み、操作だけを Codex の Computer Use で行えます。Codex に作業を渡さずに済むので、DeepSeek Harness で作業していたモデルが、それまでの会話を踏まえたまま画面を読んで操作できます。
Muse から使う
Muse には自分の VM があり、その中のブラウザは操作できます。私は使っていない Mac を Muse に渡して、SSH で入って作業できるようにしていますが、その Mac のブラウザは Muse から操作できませんでした。そのため、ブラウザの操作が必要なときは、その Mac の Codex に頼んで操作してもらっていました。
Muse に直接操作させる方法がないかを Muse に調べさせたところ、その Mac の Codex の Computer Use を、Codex のモデルを通さずに直接呼べばよいという結論になりました。試してみると、Muse から SSH 先の Mac のブラウザを操作できました。
Computer Use 以外の Codex の機能も使える
mcpServerStatus/list で一覧を取ると、Computer Use のほかに Meetings や、Sites・Slides・Gmail・Slack・GitHub などの ChatGPT のコネクタ(合わせて 430 個以上のツール)が並びました。どれも同じ mcpServer/tool/call で呼べるので、Claude Code や DeepSeek Harness から Codex を通さずに使えます。
Meetings:ChatGPT の Pro と Business のプランで使えるベータ版の機能です(The Meetings plugin in ChatGPT)。meetings.find_all で議事録の一覧を、meetings.fetch で1件の要約と文字起こしを取得できました。私はこれで、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-server は試験的な機能で、cua_repl も Codex アプリの内部で使われている部品です。Codex のアップデートで、この呼び方が使えなくなる可能性があります。
AI に PC を操作する権限を渡すことになる
Computer Use は、アプリごとに使ってよいかの許可が要ります。計算機は以前に 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 に自動で許可させる作りにすると、その AI はどのアプリでも操作できるようになります。Muse や DeepSeek Harness に使わせるときは、この点に気をつけてください。
補足:Computer Use は app-server を通さなくても使えた
記事を書いたあとに別の方法で試したところ、Computer Use は app-server を通さなくても使えました。Computer Use の MCP サーバーは、プラグインの .mcp.json に起動コマンドが書いてあり、そのまま起動して MCP クライアントから呼べます。
条件は MCP クライアントが elicitation(フォーム形式の問い合わせ)に対応していることです。対応していないと、許可済みのアプリでも「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 の Computer Use を、Codex のトークンを使わずに Claude Code や DeepSeek Harness、Muse から使えます。Meetings や Sites のような Codex の機能も同じように呼べます。
株式会社シンシア
株式会社xincereでは、実務未経験のエンジニアの方や学生エンジニアインターンを採用し一緒に働いています。
※ シンシアにおける働き方の様子はこちら
シンシアでは、年間100人程度の実務未経験の方が応募し技術面接を受けます。
その経験を通して見えてきた「実務未経験の方にぜひ身につけてほしい技術力」を、ここでは紹介していきます。

