codex-plugin-cc から agmsg に乗り換えました
これまで Claude Code から Codex を呼ぶのに OpenAI 公式の codex-plugin-cc を使っていましたが、agmsg に乗り換えました。前者は「CC から Codex にレビューやタスクを投げる」一方向の仕組みですが、agmsg は両者を対等な対話相手として常駐させ、好きなメッセージを投げ合えます。
monitor モードの Claude Code を2つ同じ team に放り込んで放置すると、人間が一切介在しないまま三目並べを始める——という agmsg のデモを見て試したのがきっかけです。daemon なし・ネットワークなし・依存は bash と sqlite3 だけ、というミニマルさも気に入っています。
agmsg とは
Claude Code / Codex / Gemini CLI / Copilot CLI などの CLI エージェントが、ローカルの SQLite ファイルを「共有の床」にしてメッセージをやり取りするための薄いトランスポートです。MCP でもサブエージェントでもなく、単に「別々のターミナルで動いているエージェント同士が直接話せる」ための仕組みです。
動機はシンプルで、人間が Claude の出力をコピーして Codex に貼り、返事をまたコピーして…という「コピペ係」をやめることです。SQLite は WAL モードで、複数リーダー + 1ライターを前提にしているので、エージェントが何人いても読み書きが衝突しません。
なお agmsg 自体も Claude Code の Agent Skill として配布されます。スキルの仕組みそのものは別記事の個人的に入れておきたいスキルたちでも触れています。
codex-plugin-cc との違い
そもそも狙いが違うツールなので、機能比較というより「立ち位置の違い」を並べます。
| codex-plugin-cc | agmsg | |
|---|---|---|
| 立ち位置 | Claude Code のプラグイン | エージェント間トランスポート |
| 方向 | CC → Codex の一方向(CC が主、Codex は呼ばれる側) | 対等な双方向 |
| Codex の存在形態 | バックグラウンドジョブ / サブエージェントとして起動 | 独立した対話セッションとして常駐 |
| やり取りの中身 | review / rescue など定型ワークフロー(slash command) | 任意の自然言語メッセージ |
| 対応エージェント | Codex 専用(OpenAI 製) | ベンダー非依存(Codex / Gemini / Copilot …) |
| 3者以上 | 基本 1:1 | team に何人でも |
| 依存 | Node 18.18+ / Codex CLI / app server | bash + sqlite3 |
| 通信経路 | ローカルの Codex CLI 経由 | ローカル SQLite(ネットワークなし) |
codex-plugin-cc は /codex:review(通常レビュー)や /codex:adversarial-review(設計に切り込む挑発レビュー)、/codex:rescue(タスク委譲)といった完成されたワークフローを slash command で提供してくれます。Codex 側は app server を介したバックグラウンドジョブとして動き、/codex:status → /codex:result で結果を受け取ります。「Claude Code を主役にして、要所で Codex のレビューを呼ぶ」用途なら、こちらの方が手数が少なく完成度も高いです。
なぜ乗り換えたか
自分のやりたかったことは「レビューを投げて結果を受け取る」ではなく、Codex と継続的に往復で会話することでした。codex-plugin-cc の Codex は呼び出されるワーカーで、対話セッションを持ちません。一方 agmsg では Codex も独立した対話相手として生きているので、
- 設計の相談を投げて、返ってきた指摘にその場で反論する
- 片方に調べさせている間にもう片方と別の話を進める
- 3人目(別の Codex や Gemini)を team に足す
といった「会話としての使い方」がそのままできます。トランスポートに徹していて中身の運用は自由、というのが乗り換えの決め手でした。逆に言えば、レビューゲートのような出来合いの仕掛けは無いので、用途次第で使い分けるのが正解だと思います。
環境
- Mac(Apple Silicon)
- Claude Code
- Codex CLI(npm
@openai/codex、nvm の Node 20 配下)
インストール
clone して install.sh を叩きます。一行で入れたいなら setup.sh を curl で流す方法もあります。
git clone https://github.com/fujibee/agmsg.git && cd agmsg && ./install.shinstall.sh はインタラクティブでコマンド名を聞いてきます。デフォルトの agmsg のまま Enter。
✓ Installed to ~/.agents/skills/agmsg/skill 本体・slash command・SQLite の DB は ~/.agents/skills/agmsg/ 以下に入ります。一方、後述の配信モードの hook はプロジェクト側(<project>/.claude/settings.local.json)に書かれる、という分離になっています。インストール後はエージェント(Claude Code / Codex)を再起動して skill を読ませます。
チームに join
エージェントは (agent名, team名) で識別されます。同じ team に入った者同士がメッセージできます。
登場人物の名前は、各 AI を作っている中の人にしました。Claude Code は dario(Anthropic)、Codex は sam と greg(OpenAI)。agent の種別と名前が対応するので分かりやすいですし、「ライバル会社のトップ同士が人間抜きで1つの SQLite 部屋で会話している」という画もちょっと面白いです。team 名は任意なので、ここでは
myteamとしておきます。
Claude Code でプロジェクトを開いて /agmsg を実行すると、まだ team に入っていないと検知されて team 名と agent 名を聞かれます。
- team 名:
myteam(会話する仲間うちで揃える名前) - agent 名:
dario(その team 内でのこのエージェントの識別名)
この2つを入れれば join.sh が走って参加完了です。
ポイントは team はプロジェクトに縛られない ことです。プロジェクトは識別子ではなく登録メタデータとして保存されるので、同じ team・同じ agent 名で別プロジェクトから join しても identity は同一のまま、登録レコードが足されるだけです。なので「team = 自分の作業環境全体」と捉えて、どのリポジトリを開いても同じ仲間とやり取りする、という運用が楽です。
配信モードを選ぶ
join の最後に、受信メッセージの届き方を選びます。ここが agmsg の肝です。
| モード | 仕組み | レイテンシ | 用途 |
|---|---|---|---|
monitor | SessionStart hook → Monitor tool で SQLite を blocking stream | 約5秒でリアルタイム push | Claude Code 推奨(デフォルト) |
turn | Stop hook が応答ごとに inbox をチェック | 次のやり取りまで | Codex のデフォルト(Monitor tool がない) |
both | monitor を主、turn をフォールバック | 約5秒+取りこぼし時に turn 末で回収 | 安全網 |
off | 自動受信なし、手動 /agmsg のみ | — | 最小構成 |
Claude Code 側(dario)は monitor を選びました。これだと相手からのメッセージが手を動かさなくても勝手に届きます。
配信モード設定完了(monitor)。リアルタイム受信を開始しました。- チーム: myteam / エージェント名: dario配信モードはプロジェクト単位で <project>/.claude/settings.local.json に hook として書かれます。identity(team + agent名)は横断共有ですが、受信の挙動はリポジトリごとに変えられる、という設計です。set は冪等なので同じモードを再設定しても hook は重複しません。
Codex を同じ team に入れる
Codex でも $agmsg を実行して、同じ team myteam に別名 sam で join します。
Codex には Monitor tool がないので、配信モードは turn か off のみです。応答ごとに inbox をチェックする turn が実質の推奨です。
複数エージェントを並べる
3人目(2個目の Codex)を別名で入れたいときは、新しいターミナルで手動 join できます。
~/.agents/skills/agmsg/scripts/join.sh myteam greg codex "$(pwd)"join.sh <team> <agent名> <type> <project> の順です。第3引数の codex は agent の種別(claude-code / codex / gemini …)なのでそのままです。これで team myteam に dario(monitor)/ sam(turn)/ greg(turn)の3人が揃いました。
なお agmsg には、同じプロジェクト内で役割を切り替える actas / drop(例: tech-lead と biz-analyst を同じワークスペースに同居させる)といった一歩進んだ機能もありますが、ここでは触れません。
使い方
セットアップが終われば、基本はエージェントに自然言語で話すだけです。
- 「sam にこの差分のレビュー投げて」
- 「メッセージ来てる?」
- 「team に誰いる?」
slash command で直接叩くこともできます。
/agmsg # 受信箱を確認/agmsg send <相手> <メッセージ> # 送信/agmsg team # メンバー一覧/agmsg history # 履歴/agmsg mode <monitor|turn|both|off> # 配信モード切替疎通確認は、Claude Code(dario)側から:
/agmsg send greg testgreg 側は次のターンで受信します。逆に Codex から dario に送れば、dario 側は monitor で約5秒で届きます。
後始末
更新・削除も一行で済みます。
cd agmsg && git pull && ./install.sh --update # DB と team config は保持./uninstall.sh --keep-data # skill だけ消して DB は残すまとめ
- codex-plugin-cc は「CC → Codex の定型ワークフロー(review / rescue)」、agmsg は「対等な双方向メッセージング」で、狙いが違います
- レビューを手軽に呼びたいなら codex-plugin-cc、継続的に会話させたい・3者以上を並べたいなら agmsg です
- agmsg は SQLite(WAL モード)を共有床にした薄いトランスポートで、identity は
(agent名, team)。team はプロジェクト横断、配信モードはプロジェクト単位です - Claude Code は
monitor(約5秒のリアルタイム push)、Codex はturn(Monitor tool がないため) - 依存は bash + sqlite3 だけ。daemon もネットワークもありません
Claude Code をメインに、Codex を難所やレビューに使う構成は変わりませんが、両者を「呼び出す/呼び出される」ではなく対等に会話させられるのは想像以上に楽でした。コピペ係から解放されます。