codex-async-mcp
codex-async-mcp
codex CLIを非同期でラップするローカルMCPサーバー。ブロックせずにjob_idを即座に返すため、ClaudeがMCPプロトコルのタイムアウト(-32001)に達することはありません。
要件
Python 3.11以上
codexCLIがインストールされており、$PATHに含まれていること(v0.125.0以上)Claude Code CLI
インストール
cd ~/payroll-mcp # or wherever this repo lives
pip install -e ".[dev]"確認:
python -c "from codex_async_mcp.server import mcp; print(mcp.name)"
# → codex-async-mcpClaudeへの登録
グローバル(すべてのプロジェクト)
claude mcp add codex-async -s user -- python -m codex_async_mcp.serverプロジェクトのみ
cd ~/payrollservice-thailand # or any project
claude mcp add codex-async -- python -m codex_async_mcp.server確認
claude mcp list
# codex-async: python -m codex_async_mcp.server - ✓ Connectedツール権限の追加 (settings.local.json)
{
"permissions": {
"allow": [
"mcp__codex-async__codex_start",
"mcp__codex-async__codex_poll",
"mcp__codex-async__codex_list",
"mcp__codex-async__codex_cancel"
]
}
}ツール
ツール | 説明 |
| バックグラウンドでcodexを開始 → |
| ステータスと出力の末尾を確認 |
| 最近のジョブを一覧表示(新しい順) |
| 実行中のジョブを強制終了 |
approval_policyの値
値 | Codexフラグ | 動作 |
|
| 読み取り専用サンドボックス、書き込みなし |
|
| 編集を自動適用 |
|
| プロンプトなし、サンドボックスなし |
Claudeの自動化には常にfull-autoを使用してください — suggestモードは対話的な入力を待ちますが、サブプロセス内では入力が届かないためです。
使用例
codex_start(
prompt="In app/services/prorate_calculation_service.rb line 96, change format(...) to number_to_currency(...)",
cwd="/Users/bbgummybear/payrollservice-thailand",
approval_policy="full-auto"
)
# → { job_id: "f3a9b2", status: "running", pid: 12345 }
codex_poll(job_id="f3a9b2")
# → { status: "running", output: "Reading file..." }
codex_poll(job_id="f3a9b2")
# → { status: "done", exit_code: 0, output: "Applied changes to prorate_calculation_service.rb" }ジョブの状態
ジョブは~/.codex-async/jobs/{job_id}/に保存されます:
~/.codex-async/jobs/f3a9b2/
meta.json ← status, pid, timestamps, exit_code
output.txt ← stdout + stderr from codexmeta.jsonの構造:
{
"job_id": "f3a9b2",
"status": "running | done | error | cancelled",
"prompt": "...",
"cwd": "/path/to/repo",
"approval_policy": "full-auto",
"pid": 12345,
"started_at": "2026-04-29T10:00:00+00:00",
"finished_at": null,
"exit_code": null
}トラブルシューティング
claude mcp listでcodex-async: ... - ✗ Failedと表示される
Pythonが見つからないか、パッケージが正しい環境にインストールされていません。
# Check which python Claude is using
which python
# If using conda, register with the full path
claude mcp add codex-async -s user -- /Users/bbgummybear/miniconda3/bin/python -m codex_async_mcp.server
# Verify the package is installed in that environment
/Users/bbgummybear/miniconda3/bin/python -c "import codex_async_mcp; print('ok')"codex_startの直後にstatus: "error"になる
Codexの起動に失敗しました。生の出力を確認してください:
cat ~/.codex-async/jobs/<job_id>/output.txt一般的な原因:
出力メッセージ | 修正方法 |
|
|
| Codexのバージョンが0.125.0未満です — |
|
|
status: "running"のまま終了しない
サブプロセスがハングしています(入力を待機しているか、ループに陥っています)。
# Check if the process is still alive
ps aux | grep codex
# Check live output
tail -f ~/.codex-async/jobs/<job_id>/output.txt
# Cancel the job
codex_cancel(job_id="<job_id>")最も一般的な原因: approval_policy="suggest"を使用しているため、対話的な承認を待機しています。代わりに"full-auto"を使用してください。
サーバー再起動後にジョブがstatus: "running"と表示される
MCPサーバーは再起動時にメモリ内のPopenレジストリを失います。次回のcodex_poll呼び出し時にPIDが終了していることが検出され、ステータスが自動的に更新されます。
codex_poll(job_id="<job_id>")
# → { status: "done", ... } ← auto-resolved on first poll古いジョブがディスクを圧迫している
# View all jobs sorted by date
ls -lt ~/.codex-async/jobs/
# Delete jobs older than 7 days
find ~/.codex-async/jobs -maxdepth 1 -type d -mtime +7 -exec rm -rf {} +プロジェクト構造
codex-async-mcp/
├── README.md
├── pyproject.toml
├── src/
│ └── codex_async_mcp/
│ ├── __init__.py
│ ├── server.py # MCP entry point, tool definitions
│ ├── job_manager.py # spawn / poll / cancel / list
│ └── config.py # JOBS_DIR, CODEX_BIN, defaults
└── tests/
└── test_job_manager.pyテストの実行
pytest tests/ -vResources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/benzkittisak/claude-codex-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server