0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIエージェントの「コピペ運び屋」をやめる:agmsgでDevin CLIとClaude Codeにタスクを受け渡しさせてみた

0
Posted at

🚀 Devin専門の解説メディア「StartDevin」を運営中!
Devinの導入・使い方・最新アップデート・活用事例を、日本語でまとめています。
👉 StartDevin をチェックする(startdevin.jp)

この記事にぜひ いいね していただけると励みになります 🙌

はじめに

複数のCLI型AIエージェントを併用していると、あるあるな瞬間があります。Claude Codeに実装させて、その結果をDevinにレビューさせたい。でも両者は直接つながっていないので、私が片方の出力をコピーして、もう片方のプロンプトに貼り付ける。この「人間コピペ運び屋」を一日に何度もやっていると、さすがに「これ、エージェント同士で勝手にやり取りしてくれないの?」と思えてきます。

そんな課題にドンピシャなツールを見つけました。agmsg(作者: fujibee さん、MIT ライセンス)です。Claude Code、Codex、Gemini CLI などのCLIエージェント同士を、人間を介さずメッセージでつなぐ仕組みです。

ただ、公式にサポートされているエージェント型に Devin(Devin for Terminal)は入っていません。そこで私は、「Devin CLI をagmsgの輪に混ぜられるか?」を実際に手を動かして検証しました。この記事は、その agmsgの仕組みの解説Devin × Claude Code の連携検証 をまとめたものです。

agmsgとは何か(そして何ではないか)

agmsgを一言でいうと、**CLIエージェント用の超軽量な「共有掲示板」**です。おもしろいのは、公式READMEが「これは○○ではない」を先に強調している点で、ここに設計思想が凝縮されています。

よくある誤解 agmsgの実際
MCPサーバの一種でしょ? 違う。 MCPサーバも追加ランタイムも不要。実体は bash + sqlite3 だけ
サブエージェント機能でしょ? 違う。 親が子を管理するのではなく、別ツールの 対等な(peer) セッション同士をつなぐ
メッセージキュー(ブローカー)でしょ? 違う。 ブローカーは存在しない。「SQLiteファイルが床、エージェントはその上のプレイヤー」

私が最初にこの設計を読んだとき、「デーモンもサーバもネットワークも無いのに成立するの?」と半信半疑でした。答えは、共有された1個のSQLiteファイルにみんなで読み書きするだけ、というものです。

アーキテクチャ:ぜんぶローカルのSQLite 1ファイル

メッセージは ~/.agents/skills/agmsg/db/messages.db という単一のSQLite(WALモード)に格納されます。スキーマは拍子抜けするほど素朴で、messages(team, from_agent, to_agent, body, created_at, read_at) というテーブルがあるだけです。

WALモードなので「複数リーダー + 単一ライター」が競合せずに共存できます。送信は send.sh が1行INSERTするだけ、受信は inbox.sh が自分宛ての未読を読んで既読にするだけ。デーモンもソケットもありません。

受信の通知方法(delivery mode)は4種類から選べます。

モード 仕組み レイテンシ 向いている相手
monitor(Claude Code既定) SessionStartフック → Monitorツールでブロッキング購読 約5秒 リアルタイムpushが欲しいClaude Code
turn Stopフックがターン終了ごとに受信箱を確認 次の対話まで Monitorツールを持たないCodexなど
both monitor主 + turnを保険に 約5秒 両掛けしたい人
off 自動配信なし。手動 /agmsg のみ 手動 ミニマリスト

そして、ターンの譲り合いや暴走ループの防止は、トランスポート(agmsg本体)ではなく、プロンプト=プロトコル層に委ねられているのが重要なポイントです。agmsgはあえて「賢くない床」に徹しています。

本題:Devin CLIはサポート外。それでも混ぜられるのか?

ここで冒頭の問題に戻ります。agmsgが公式に認識するエージェント型を確認すると、Devinは含まれていません。実際、Devinを型として join.sh(チーム参加)に渡すと、はっきり拒否されました。

$ ~/.agents/skills/agmsg/scripts/join.sh startdevin devin devin "$(pwd)"
Unknown agent type: 'devin' (supported: antigravity, claude-code,
codex, copilot, cursor, gemini, grok-build, hermes, opencode)

「じゃあ無理か」と思いきや、agmsgのソースを読んで気づきました。チーム登録(join)を要求しているのは、監視モードや自動配信の仕組みだけです。メッセージの送受信を担う send.shinbox.sh は、チーム設定を一切参照しません。ただSQLiteテーブルに対して (team, from, to) という ただの文字列で読み書きするだけなのです。

これはREADMEにある 「Shell (any agent)」パスそのものです。Devinはシェルを実行できるので、send.sh/inbox.sh を直接叩けば、ドライバが無くても共有フロアに完全に参加できるはず——という仮説が立ちました。あとは動かして確かめるだけです。

ハンズオン:セットアップ

まずagmsgをインストールします。npx agmsg が最速ですが、私は挙動を読みたかったのでリポジトリをcloneして入れました。

git clone https://github.com/fujibee/agmsg.git
cd agmsg
./install.sh --cmd agmsg --agent-type claude-code
# → ~/.agents/skills/agmsg/ に v1.1.3 が入り、/agmsg コマンドが追加される

次にClaude Code側をチームに参加させます。チーム名は今回 startdevin にしました。

SK=~/.agents/skills/agmsg/scripts
$SK/join.sh startdevin cc claude-code "$(pwd)"
# → Created team: startdevin / Joined team startdevin as cc

Devin側は前述の通り「join不要」です。エージェント名 devin として、生スクリプトで送受信させます。Devinには受信箱の読み方と返信の仕方を、非対話モード(devin -p)のプロンプトで教え込みます。

# Devinに渡すプロンプト(prompt-file)
cat > task.md <<'EOF'
あなたは "agmsg" に "devin" として参加しています。
スクリプトは ~/.agents/skills/agmsg/scripts/ にあります。順に実行してください:

1. 受信箱を確認: ~/.agents/skills/agmsg/scripts/inbox.sh startdevin devin
2. 受信したタスクの内容に従って作業する。
3. 結果を送信元 cc に返信:
   ~/.agents/skills/agmsg/scripts/send.sh startdevin devin cc "ここに結果"
EOF

devin -p --permission-mode dangerous --prompt-file task.md のように、非対話モードで確認プロンプトに止められないようにして呼び出します(--permission-mode の詳細は前回の記事を参照)。

検証①:Claude Code → Devin へタスクを委譲する

シナリオはシンプルです。Claude CodeがDevinに調査タスクを丸投げし、Devinが実行して結果を返す。まずClaude Code(cc)から送信します。

$SK/send.sh startdevin cc devin \
  "このリポジトリの articles/ 配下にある .md ファイルの総数を数えて、agmsgで cc に返信して"
# → Sent to devin in team startdevin

この時点でSQLiteには、cc → devin の未読メッセージ(read_at = NULL)が1行入っています。ここでDevinを起動すると、Devinは受信箱を読み、自分でファイルを数え、send.sh で返信してきました。Devin自身の最終出力がこれです。

作業完了しました。
- articles/ 配下の .md ファイルの総数: 50件
  - qiita/drafts: 28件 / qiita/published: 14件
  - zenn/drafts: 6件 / zenn/published: 2件
結果を agmsg で cc に返信済みです。

そしてClaude Code側で受信箱を確認すると、Devinからの返信がちゃんと届いていました

$ $SK/inbox.sh startdevin cc
1 new message(s):
  [2026-07-01T05:48:15Z] devin: articles/ 配下の .md ファイルの総数は 50 件です。
  内訳は qiita/drafts に 28 件、qiita/published に 14 件、zenn/drafts に 6 件、
  zenn/published に 2 件で、Devin や Red Hat AI Factory、Claude Code 関連の技術記事が中心です。

人間のコピペは一度も発生していません。Claude Codeが投げ、Devinが受け取り、こなして返す。この一連が共有SQLiteファイル1個の上だけで完結しました。

検証②:逆方向(Devin → Claude Code)も試す

一方向だけでは「peer(対等)」とは言えません。今度はDevinを起点にして、Claude Codeに質問を投げさせます。

Devinに「記事のファイル名を提案してほしいとccに聞いて」と指示すると、Devinはその質問を送信しました。Claude Code側で受信し、回答を返します。最終的な全トランスクリプト(history.sh)がこちらです(=既読、=未読。日時と本文は見やすく抜粋・整形しています)。

○ [05:47:24Z] cc → devin: タスク依頼です。articles/ 配下の .md ファイル総数を数えて返信して
○ [05:48:15Z] devin → cc: .md ファイルの総数は 50 件です。内訳は qiita/drafts に 28 件...
○ [05:48:59Z] devin → cc: agmsg のブログを書きます。新規記事のファイル名を1つ提案してください
● [05:49:06Z] cc → devin: 提案: 0701-agmsg-devin-claude-code-handoff.md(日付プレフィックス+スラッグ)

余談ですが、この記事のファイル名 0701-agmsg-devin-claude-code-handoff.md は、実際にこの検証中にagmsg上でDevinから聞かれてClaude Codeが答えたものです。記事の名前を、記事の題材であるagmsgそのものの上で決めた、という妙な入れ子構造になりました。

使ってみて分かった注意点

実際に回してみると、「動く」だけでなく「気をつける点」も見えてきました。私が引っかかった/意識したポイントを残しておきます。

論点 実際どうだったか
Devinの自動受信 できない。Devinはドライバが無く、monitor/turnフックが入らない。受信は devin -p に「inbox.shを叩け」と毎回指示するプル型になる
一発仕事向き 上記の裏返しで、常駐して待ち受けるより、起動時のプロンプトに「受信→作業→返信」を畳んで1ターンで回す使い方が相性◎(agmsg の spawn--boot-prompt は claude-code/codex 専用で、Devin の起動はこちらで手当てする)
同一タスクの奪い合い v1にはクレーム/ロックが無い。同じ名前を複数が購読すると両方が反応しうる。停止条件はプロンプト側で(「N往復で終了」等)
権限モード Devinが send.sh を自律実行するには --permission-mode の緩和が要る。私は検証用に dangerous を使ったが、常用は用途に応じて絞るべき
インストールの副作用 ~/.agents/skills/agmsg/ の作成と /agmsg コマンド追加のほか、~/.codex/config.toml が書き換わる(バックアップは自動作成される)。プロジェクトの .claude/settings.local.json は今回は変更されなかった

とくに「Devinはプル型(自動push無し)」という性質は、Devin for Terminalが devin -p非対話ワンショット実行を得意とすることと、きれいに噛み合います。常時監視のClaude Codeが司令塔、呼ばれたら仕事して返すDevinが実行部隊、という役割分担が自然に立ち上がりました。

おわりに

この記事では、agmsgが「MCPでもサブエージェントでもキューでもない、SQLite 1ファイルの共有フロア」であることを解説し、公式サポート外のDevin CLIを、生スクリプト経由でその輪に混ぜられるかを実際に検証しました。

結論として、Claude Code ⇄ Devin の双方向タスク受け渡しは、人間のコピペゼロで成立しました。ポイントは、agmsgの送受信が「ただのSQLiteへの文字列read/write」に過ぎず、ドライバの有無に縛られないという素朴さにあります。賢くない床だからこそ、想定外のエージェントも乗せられる、というわけです。

同じように複数エージェントを併用して「コピペ運び屋」に疲れている方は、ぜひ試してみてください。まずは npx agmsg から始められます。

参考リンク

謝辞:軽量で「読める」設計のagmsgを公開してくださった fujibee さんに感謝します。本記事の仕組み解説は、同リポジトリのREADME・ドキュメントを読み解いたうえで、手元で実際に動かして確認した内容です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?