オーケストレーター・ワーカー・MCP:複数のエージェントとツールを連携させる構造

約12分developer-tools
#オーケストレーター vs ワーカー#デリゲート#MCP#フォーク#リリースタグ#サブモジュール#AIコーディングツール#用語集
※ 編集方針:以下の業務状況および人物は、用語の理解を助けるための架空のシナリオです。実際の著者の経験や特定企業の出来事を再現したものではありません。
モバイルアプリ、バックエンド、管理者ツールの3つのリポジトリを一度にまとめてリリースする架空のプロジェクトを考えてみましょう。

1つのエージェントがすべてを行うのではなく役割を分担するときの、「オーケストレーターとワーカー」

text
1orchestrator: 릴리스 순서·의존성 관리
2 ├─ worker: mobile-app 빌드
3 ├─ worker: backend 빌드
4 └─ worker: admin-tool 빌드
数ヶ月前に残したメモに、すでにこの構造が整理されていました。全体の順序と依存関係を管理する役割と、実際の担当者の作業を一つひとつ処理する役割を分け、一方が指示すると他方がそれぞれの役割を処理する構造でした。全体のスケジュールを管理する工事現場の監督と、担当エリアを実際に施工する各チームに分かれているようなものです。
全体の順序を管理する役割と、実際の作業を処理する役割が分かれた構造
全体の順序を管理する役割と、実際の作業を処理する役割が分かれた構造
実際にリリースを開始すると、エージェントが3つのリポジトリの作業を一つずつ別のセッションに引き渡すのを何度も繰り返し目にすることになりました。

同じパターンが繰り返されるとき、これが「デリゲート」だと気づいた瞬間

text
1Delegating mobile-app build to worker session...
2Delegating backend build to worker session...
3回とも同じ文言が表示されるのを見て初めて、これがその場しのぎの臨機応変な対応ではなく、決められた方式であることに気づきました。直接処理する代わりに、その仕事をうまく処理できる別の主体に委ねて結果だけを受け取る動作がデリゲート(委譲)でした。チームリーダーが実務をすべて自分で行わずに各担当者に任せるのと同様の名前が、ここでもそのまま使われていました。
直接処理せずに任せ、結果だけを受け取る繰り返しのパターン
直接処理せずに任せ、結果だけを受け取る繰り返しのパターン
バックエンドリポジトリのリリースノートを準備しているとき、最近新しく連携したツールがどのように私たちのシステムに接続されているのか気になり、調べてみました。

異なるツールを標準化された方法で接続するときの「MCP」

json
1{ "mcpServers": { "figma": {...}, "notion": {...} } }
検索してみると、この略称はモデルと外部ツールを接続する共通規格を意味していました。各ツールごとに毎回異なる接続方法を新しく覚える必要はなく、定められた一つの規格に従うだけでどんなツールでも接続できるようにする標準でした。世界中の電化製品が異なるプラグ形状の代わりに標準規格のコンセントを使うのと似たアイデアなので、名前自体は馴染みがなくても、コンセプトはすぐに理解できました。
異なるツールを標準化された一つの規格で接続する構造
異なるツールを標準化された一つの規格で接続する構造
管理者ツールのリポジトリを整理していると、ログに残されたライブラリの参照元が、元々知っていたプロジェクトとリンク先が異なることに気づきました。

同じ名前なのにオリジナルではないときの「フォーク」

text
1origin: github.com/our-team/chart-lib-fork
2(원본: github.com/original-author/chart-lib)
ログを再確認したところ、数ヶ月前にチームでオリジナルのライブラリに必要な機能を追加するために丸ごと複製し、独自のバージョンとして分岐させた形跡でした。
オリジナルのリポジトリをそのまま複製し、その後は独立して開発を進めていく自分専用のコピーがフォークでした。オリジナルにない機能をこちら側だけに個別に追加していたのですが、今回のリリースにもその機能が必要でした。
オリジナルから複製され、独立して分岐したコピー
オリジナルから複製され、独立して分岐したコピー
同じ木から分かれた2つの枝を描いたイラストを、画面で確認するシーン
3つのリポジトリのビルドがすべて終わり、いよいよ正式にバージョンを表記する番になりました。リリースを担当する同僚が手順を教えてくれました。

今回のバージョンを後からでも正確に見つけられるようにする「リリースタグ」

bash
1$ git tag v3.4.0
2$ git push origin v3.4.0
同僚が「コミット番号は覚えにくいから、タグでラベルを貼っておくんだよ」と教えてくれました。
数多くのコミットの中から『これが正式にデプロイされた3.4.0バージョンだ』とピンポイントで示すラベルでした。後からトラブルなどの事例に対応することになっても、その時点のコードを正確に再び取り出すことができました。
数多くのコミットの中から、正式なデプロイ地点をラベルでピンポイントに指し示す構造
数多くのコミットの中から、正式なデプロイ地点をラベルでピンポイントに指し示す構造
最後に、管理者ツールのリポジトリの中に、別のチームが管理するデザインコンポーネントのリポジトリが丸ごと入っているのを発見しました。

リポジトリの中に別のリポジトリが丸ごと入っているときの「サブモジュール」

text
1.gitmodules
2[submodule "design-kit"]
3 path = libs/design-kit
4 url = github.com/design-team/design-kit
公式ドキュメントを調べてみると、このフォルダは私たちのリポジトリに属しているのではなく、別のリポジトリの特定のバージョンをそのまま参照しているだけでした。
独立して管理されている別のリポジトリを、自分のリポジトリ内の特定のフォルダ位置に、特定のバージョンで丸ごと組み込む方法でした。額縁の中に他人が描いた絵をそのまま入れて展示するようなものです。これで、3つのリポジトリの統合リリースがすべて完了しました。
独立した別のリポジトリを特定のバージョンで丸ごと組み込んだ構造
独立した別のリポジトリを特定のバージョンで丸ごと組み込んだ構造
夕方遅く、3枚のモニターにリリース完了画面が並んで表示されているのを確認するシーン
3つのリポジトリのリリースは、同日の午後に一斉に行われました。リポジトリが複数ある場合に難しいのは、それぞれをデプロイすることではなく、どのバージョンとどのバージョンがペアだったのかを後からでも確認できるように残しておくことでした。

よくある質問

オーケストレーターが停止すると、ワーカーはどうなりますか?

進行中だった作業は通常そのまま処理されますが、全体の順序を管理する主体が失われるため、次の段階に進めず停止します。オーケストレーター自体の復旧や再起動の方法を別途用意しておくのが安全です。

フォークしたライブラリは、オリジナルのアップデートを継続して受け取ることができますか?

アップストリームのリポジトリをリモートとして登録しておけば、新しいバージョンを取得できます。ただし、自分たちで独自に修正した部分と競合が発生した場合は、その都度手動でマージ(解消)する必要があります。

サブモジュールは常に自動的に最新バージョンに追従しますか?

いいえ。サブモジュールは特定のコミット時点に固定されているため、オリジナルがアップデートされても、手動で更新コマンドを実行するまではそのまま維持されます。

AIコーディングツール用語集シリーズの第12話です。次回予告 · 第13話:並行処理のバグを特定するために一晩中ログを解析した日(プラグイン · スキルファイル · 自動承認モード · デッドロック · レースコンディション)

参考・根拠

関連記事