SendMessage(センドメッセージ)

組み込みツール
SendMessage
センドメッセージ
Agent Team のチームメイトへリードから直接メッセージを送る、あるいは止まったサブエージェントを agent ID 指定で再開させるための、Claude が裏で発火させる内蔵ツール。私たちユーザーが直接叩くものではなく、リードに自然文で「○○にこう伝えて」と頼むと、リードが代わりに発火させる

Agent Team 機能で複数の Claude Code を同時に動かして互いに会話させたい人、または止まったサブエージェントを再開させたい人向け

Agent Team を組んでチームメイト同士で議論させたいとき、たとえば PR レビューを3観点で並列にやらせたい場面や、停止したサブエージェントを記憶ごと続きから動かしたい場面で使う。だから私たちは直接コマンドを打たず、リードに「セキュリティ担当のチームメイトに『JWT 周りもう一度見て』と伝えて」「さっきの code-reviewer の続きで認可ロジックも見て」と自然文で頼めばいい。リード側で <code>SendMessage</code> が自動発火する

SendMessage は、Claude Code の Agent Team 機能の中で、リードからチームメイトへ直接メッセージを届けるための内蔵ツールです。もう1つの用途として、止まったサブエージェントを、過去のやり取りを覚えたまま動かし直すのにも使われます。

ここで一番大事なのは、これは私たちが直接打ち込むツールではないという点です。私たちはリードに自然文で「セキュリティ担当のチームメイトに『JWT 周りもう一度見てくれ』と伝えて」と頼むだけで、リードが裏で SendMessage を発火させます。読者は仕組みだけ把握しておけばよくて、コマンドのように覚える必要はありません。

噛み砕くと

普通のチャットでは、私と Claude の2人だけが会話しています。Agent Team はそこに、別の Claude が3〜5人加わって、それぞれが独立した部屋で並行して仕事を進める形に近いです。会議室のホワイトボード役の共有タスクリストと、内線電話役の Mailbox が用意されていて、誰がどこまで進めたか、誰に何を頼みたいかを互いにやり取りできます。

SendMessage はその内線電話そのものです。リードが「セキュリティ担当の田中さん」に電話するときに使う受話器、というイメージが一番近い。私たちが直接ダイヤルすることはなくて、秘書役のリードに「田中さんに連絡しといて」と頼むと、リードが代わりに受話器を取ってくれる。それが SendMessage の発火です。

大事な前提:experimental 機能なので、設定値を立てないと存在しない

SendMessage は実験段階のツールです。普通に Claude Code を起動しただけでは、使えるツール一覧に出てきません。CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 という設定値が有効になっている状態で起動したセッションでのみ、ツールとしてロードされます。

もう1つの前提として、Claude Code 本体が v2.1.32 以上である必要があります。古いバージョンで設定値だけ立てても動きません。claude --version で確認できます。

設定の入れ方は2通り。ターミナル起動時の設定値として立てるか、settings.json に書く形です。

{
  "env": {
    "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"
  }
}

「PR #142 のレビュー」を例に、リードが SendMessage を発火させる流れを見る

公式 docs に載っている代表例で見ていきます。GitHub に上がってきた PR を、3つの観点で並列にレビューさせる流れです。普通に1人の Claude にやらせるとセキュリティかパフォーマンスかテストカバレッジのどれか1つに偏って、他がおざなりになる、というよくある問題への対処策として使います。

ステップ1: リードを立ち上げる

まず CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 を立てた状態で Claude Code を起動。これが「リード」セッションになります。普通に claude と打つだけ。

$ CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 claude

ステップ2: リードにチーム結成を頼む

あとは自然文で頼むだけです。コマンドではなく、ふつうの日本語または英語でリードに指示します。

PR #142 をレビューするためにエージェントチームを作って。
3人のレビュアーを起こしてほしい:
 - 1人はセキュリティ観点
 - 1人はパフォーマンス観点
 - 1人はテストカバレッジ観点
それぞれにレビューさせて、結果を報告させて。

ここで初心者がやりがちな勘違いをひとつ。SendMessage を私たちが直接「SendMessage --to security ...」みたいに打つわけではありません。私たちはリードに自然文で頼むだけ。SendMessage は、リードがチームメイトに話しかけるとき内部で自動的に呼び出されるツールです。

ステップ3: リードがチームメイトを3人立ち上げる

リードは内部的に「Team lead」「Teammates」「Task list」「Mailbox」の4要素から成るチームを作り、3人のチームメイトを起動します。それぞれ別ターミナル相当の Claude Code セッションとして走り、各自が独立した記憶を持ちます。リードのこれまでの会話履歴は、チームメイトには引き継がれません。

ステップ4: リードが SendMessage を発火させてタスクを配る

チームメイトが起動した後、リードは SendMessage を使って「セキュリティ観点のレビュアー」に「PR #142 の認証周りを見て」と直接メッセージを投げます。送り先はチームメイトの名前です。3人それぞれに、別のメッセージが個別に飛びます。「全員に同時送信」のような機能はなく、宛先1つにつき1メッセージずつ送る形です。

ステップ5: チームメイト同士も SendMessage で会話する

たとえばパフォーマンス担当が「この実装、トランザクションが二重に開いてるかも」と気づいたとき、セキュリティ担当に直接 SendMessage を投げて「認証側にも影響ない?」と確認できます。リードを経由せず、チームメイト同士で議論する。これがサブエージェントとの一番大きな違いです。

ステップ6: 結果がリードに集まる

各チームメイトが調査を終えてアイドル状態に入ると、自動的にリードへ「終わった」と通知が飛びます。私たちはリードの画面で結果のまとめを受け取り、必要なら追加の指示を出します。終わったらリードに「チームを片付けて」と頼むことで、共有リソースが解放されます。

もう1つの用途: 止まったサブエージェントを agent ID 指定で再開する

SendMessage には Agent Team 以外の使い道がもう1つあります。サブエージェントが仕事を終えて止まった後で、同じサブエージェントを「続きから」動かし直したいときに使われます。

普通にもう一度サブエージェントを呼び出すと、まっさらな記憶で初回起動になります。前回の調査履歴も、前回の判断も、何も覚えていない別人として動き直す。これを避けて「前回の続き」として動かすのが、サブエージェント resume の役目です。

仕組みはシンプル。サブエージェントが1回完了したとき、Claude は内部的に「この子の agent ID は xxx」という識別子を受け取ります。次に私たちが「さっきのレビューの続きで、認可ロジックも見て」と頼むと、Claude が SendMessageto 欄に前回の agent ID を入れて投げ直す。停止していたサブエージェントは、その SendMessage を受け取ると、Agent ツールでわざわざ再起動されなくても裏で勝手に復帰します。これが「auto-resume in the background」と呼ばれている挙動です。

agent ID を明示的に知りたい場合は、Claude に「さっきのサブエージェントの agent ID を教えて」と聞けば答えてくれます。もしくは、自分のパソコンの ~/.claude/projects/{project名}/{sessionId}/subagents/ の中に agent-{agentId}.jsonl という名前で transcript が残っているので、ファイル名から拾うこともできます。

つまり SendMessage は何をしてくれるのか

  • やってくれる: リードからチームメイトへの個別メッセージ送信、チームメイト同士の直接会話、停止したサブエージェントの記憶を保ったままの再開(バックグラウンド復帰)
  • やってくれない: 全チームメイトへの一斉送信、私たち人間がコマンドラインから直接叩く操作、ネストしたチーム編成。私たちはリードに自然文で頼むだけで、リードが裏で発火させる役回り
  • 意味が薄い場面: 1セッションで完結する単純作業、同じファイルを何人もで触る作業、依存関係が直列に並んでいて並列化できないタスク。こういう場面は普通の Claude Code 単体か、サブエージェント1人で足りる

使いどころ3シナリオ(具体題材で再現)

シナリオ1: PR レビューを3観点で並列にやらせたいとき

たとえば自社の認証ライブラリに変更を加えた PR #142 が上がってきて、1人レビュアーだとどうしてもセキュリティ視点に偏って、パフォーマンス劣化やテスト不足を見落とすことがあります。リードに「セキュリティ・パフォーマンス・テストカバレッジの3チームメイトを起こして並列レビューさせて」と頼むと、リードが裏で SendMessage を3回(各チームメイトへ1回ずつ)発火させて指示を配ります。3人がそれぞれ独立に PR を読み、必要に応じて互いに SendMessage で議論し、最後にリードに報告。私たちは3人分の集約結果を1画面で受け取れます。

シナリオ2: バグの原因が分からず、5つの仮説を競わせたいとき

「アプリが1回メッセージを送ると接続が切れる」というバグがあって、原因が WebSocket か認証トークンの有効期限かフロントの再描画かなど5つ仮説が立っているとします。リードに「5人のチームメイトを起こして、各自が別の仮説を担当して、互いに SendMessage で議論して相手の説を否定し合うように」と頼むと、5人が並行で各仮説を検証しつつ、Mailbox 越しに「君のその根拠、こっちのログだと矛盾するよ」と突き合わせをします。最後に生き残った仮説が、最も確からしい原因。1人で順番に仮説を潰すよりアンカリングを回避しやすい構造です。

シナリオ3: 止まったコードレビュー用サブエージェントの続きをやらせたいとき

たとえば code-reviewer サブエージェントに認証モジュールをレビューさせて、結果を受け取った後で「続けて認可ロジックも見て」と頼みたい場面。普通に「もう一度 code-reviewer を呼んで」と頼むと、まっさらな記憶で初回起動になり、認証モジュールを読んだ記憶も判断もゼロからやり直しになります。代わりに「さっきの code-reviewer の続きで、認可ロジックも見て」と頼むと、Claude が SendMessage で前回の agent ID 宛にメッセージを投げ直し、止まっていたサブエージェントが前回の記憶を保ったまま裏で動き出します。レビュー文脈を持ち越せるので、認証で見つけた怪しい設計を踏まえた認可レビューになる。これが resume の威力です。

初心者が踏みやすい落とし穴

  • experimental 設定値が未設定で「ツールが見つからない」と詰むCLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 がない状態だと、SendMessage 自体が Claude のツール一覧にロードされません。「リードにチームを作れと頼んでも何も起きない」場合、まずこの設定値を確認する
  • v2.1.32 未満だと設定値だけ立てても動かないclaude --version で確認し、古ければアップデートが先
  • チームメイトのツール制限で SendMessage を切れると思い込む。サブエージェント定義の tools 欄で他のツールを絞っても、SendMessage と Task 管理系ツールは常にチームメイトに与えられます。公式 verbatim: "Team coordination tools such as SendMessage and the task management tools are always available to a teammate even when tools restricts other tools." これは仕様。チームメイト間通信を完全に切る方法はなく、切りたいならそもそもチームではなくサブエージェントを使うべき
  • /resume でセッションを復帰させた後、リードが消えた相手にメッセージを投げ続ける。公式 Limitations より verbatim: 「/resume/rewind は in-process のチームメイトを復元しない。リードが既に存在しないチームメイトにメッセージを送ろうとする可能性がある」。こうなったらリードに「新しいチームメイトを起こし直して」と伝える
  • 1リードにつき1チームしか持てない。公式 Limitations より「One team at a time」。新しいチームを作る前に、現在のチームを「Clean up the team」で片付ける必要がある。同じリードで「サブチーム」を並走させる発想は通らない
  • ネストしたチームは作れない。チームメイトが自分の配下にさらにチームメイトを持つことはできません。公式 Limitations: "No nested teams"。階層構造を組みたい場合、リードが直接全員を管理する形になる
  • 「リードの交代」もできない。チームを作ったセッションがそのチームの寿命まで固定でリードです。公式: "Lead is fixed"。途中で別の Claude にリード役を渡せない
  • 「全員に同報」が標準機能としてはない。チームメイト全員に同じメッセージを届けたいときは、リードに「3人全員に同じ指示を伝えて」と頼んで、リードが3回 SendMessage を発火させる形になる。1発で全員に飛ぶ仕組みではない
  • シャットダウンが遅いことがある。公式 Limitations: 「チームメイトは現在のリクエストやツール呼び出しが終わるまで停止しないので、シャットダウンに時間がかかることがある」。急いでチームを片付けたいときに数秒〜数十秒待たされる場合がある

書き方

(ユーザーは直接叩かない。リードへの自然文依頼で発火する)

例: リードへの依頼文
  「セキュリティ担当のチームメイトに『PR #142 の認証周りを見て』と伝えて」
  「さっきの code-reviewer の続きで認可ロジックも見て」

内部呼び出し時に Claude が埋める情報:
  to        : 宛先チームメイト名 または agent ID
  message   : 送る本文

やってみるとこうなる

入力

(リードへの自然文)
PR #142 をレビューするためにエージェントチームを作って。
3人のチームメイトを起こして:
 - 1人はセキュリティ観点
 - 1人はパフォーマンス観点
 - 1人はテストカバレッジ観点
それぞれにレビューさせて、結果を報告させて。

出力例

リードが裏で SendMessage を3回発火させ、3人のチームメイトが起動。
各自が独立して PR を読み、必要に応じて互いに SendMessage で議論。
完了するとアイドル通知が自動でリードに飛び、リードが3人分の指摘を1画面に集約して返してくる。

(サブエージェント resume の場合)
停止していたサブエージェントが SendMessage を受け取り、Agent ツールでの再起動なしに裏で auto-resume。
前回の会話履歴・道具使用・推論をそのまま引き継いで続きから動く。

このページに出てきた言葉

Agent Team
複数の Claude Code を「チーム」として同時に動かして互いに会話させる、Claude Code の実験機能。リード1人+チームメイト数人で構成される
リード
チームを作った大元の Claude Code セッション。チームメイトに仕事を振り分けたり、結果をまとめたりする司令塔役
チームメイト
リードが別途立ち上げた独立した Claude Code セッション。それぞれ別の机で1人で仕事する
サブエージェント
メイン会話の脇で1回だけ呼ばれて働き、結果だけ返して消える別人格の Claude。チームメイトとは別物
Mailbox
チーム内で「誰が誰に何を伝えたか」を仲介してくれる Claude Code 内蔵のメッセージング機構。<code>SendMessage</code> はここにメッセージを投函する操作
agent ID
各サブエージェント/チームメイトに割り振られる一意の識別子。<code>SendMessage</code> の宛先として使われる
auto-resume
止まったサブエージェントが <code>SendMessage</code> を受け取ったとき、Agent ツールで明示再起動しなくても裏で自動的に動き出す挙動
transcript
そのサブエージェントのやり取りを1ファイルに残したログ。<code>~/.claude/projects/{project}/{sessionId}/subagents/agent-{agentId}.jsonl</code> に保存される
experimental
Anthropic がまだ正式リリースとして固めていないお試し段階の機能。既定では無効で、設定値で有効化する
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS
Agent Team 機能と <code>SendMessage</code> ツールを有効化する設定値。<code>1</code> をセットして Claude Code を起動する

関連項目

公式ドキュメント

https://code.claude.com/docs/en/agent-teams

-

← 戻る