ツール解説 · 小互の読み解き

Claude Code、「クロスセッションメッセージ機能を発表 異なる会話ウィンドウ同士が会話して共同作業が可能に

公式ドキュメントを徹底解説:2つのツール、3つの配信結果、そして「伝言」と「権限昇格」を分ける設計上の赤線
1分でわかる要点
  • 開いている複数のClaude Codeセッションが会話できるようになりました。あるターミナルで完了した作業を、Claudeが別のターミナルに伝えに行きます。
  • 送信されるのはテキストのみ。会話履歴もファイルも含まれません。コンテキスト全体を移すのは、別の機能の役割です。
  • 設計上、最も重要な点:別のセッションからのメッセージは、あなたの承認として扱われることは絶対にありません。
⚑ この記事はAnthropic公式ドキュメントを解説したものです。メカニズムの説明と設定項目はすべてこのドキュメントに基づいています。「当サイト検証済み」と記載した3箇所は、macOS上の実際の動作確認結果です。
01 はじめに

複数のClaude Codeセッション間でメッセージを送信可能に

フロントエンドを修正し、データベースマイグレーションを実行し、別のワークツリーで作業するなど、複数のターミナルでClaude Codeを同時に使っているなら、これまでこれらのセッションは互いに隔離されていました。隣のセッションが何をしているかは誰も知らず、情報を同期するには、ターミナル間でコピー&ペーストするしかありませんでした。

この壁に、ようやく穴が開きました。あるセッションが学んだことを、Claudeが別のセッションに渡せるようになったのです。あなたが指示しなくても、変更内容が別のセッションの作業に影響を与えると判断した場合、Claudeが主体的に伝えに行きます。

公式デモ:左のセッションがデータベースのフィールド users.nameusers.display_name に変更し、weekly-digest に伝えるよう指示。右側は @user-profiles で始まるメッセージを受信し、「統計クエリがまだ古いフィールドを参照している」と自分で判断して、即座にコードを修正します。ターミナル間のコピー&ペーストは一切不要です。動画:Anthropic

必要なのは、Claude Code v2.1.224 以降で、macOSまたはLinux上で動作することです。条件を満たしていれば自動で有効になり、設定は一切不要です。

v2.1.224
最低バージョン要件。当サイトの検証機は 2.1.225 で、ちょうど要件を満たしています
3 種類
配信結果:配信 / 保留(承認待ち)/ 拒否
5 分
承認ダイアログのデフォルト待機時間。放置するとメッセージは破棄されます
0 回
同一マシン内のメッセージがAnthropicサーバーを経由する回数

お使いの環境で機能が有効かどうかは、/list-agents と入力すれば確認できます(このコマンドは /peers とも書けます)。このコマンドが認識されれば、機能は有効です。

当サイト検証済み:このmacOSマシンでは claude --version が 2.1.225 と返し、ちょうど要件を満たしています。環境変数 CLAUDE_CODE_MESSAGING_SOCKET も確かに存在し、値は /tmp/cc-socks/27983.sock でした。ドキュメントに記載されている受信ボックスソケットが実際にバインドされています。セッションが1つしか開いていなかったため、リストは空でした。相手がいなければ、通信も発生しません。

セッション

ターミナルを1つ開いてClaude Codeを起動すると、それが1つのセッションです。ターミナルを3つ開けば、3つの独立したセッションになります。

3人の同僚がそれぞれ自分のデスクで作業しているようなもので、以前は互いに隔離されていましたが、今はメモを渡すための窓口ができました。

受信ボックスソケット

各セッションがローカルマシン上に開く受信用の窓口です。他のセッションがここにメッセージを投函します。

各家の玄関に掛けられた郵便受けのようなものです。同じ建物(同じマシン、同じシステムユーザー)に住む人だけが投函できます。

02 機能の正体

メッセージはテキストのみ。会話履歴やファイルは含まれない

これは最も誤解されやすい点なので、最初に明確にしておきます。

メッセージとは、あるClaudeが別のClaudeに送るテキストのみです。会話履歴でもファイルでもなく、コンテキストも含みません。受信側が見られるのは、送信者の名前とテキストだけです。相手が何を話し合ったか、どのファイルを操作したかは、一切わかりません。

ドキュメントに記載されているサンプルメッセージは次の通りです:

データベースマイグレーションは完了しました。新しいフィールドは tenant_id です。main へのリベースは安全です。

公式ドキュメントのサンプルメッセージ

これだけです。

つまり、境界線は明確です。会話全体を移したい場合、例えば別のコンピューターで続きをやりたい、あるいは新しいセッションに現在のコンテキストを引き継がせたい場合は、メッセージではなく、セッション全体を引き継ぐ復元(resume)を使うべきです。

SEND MESSAGE セッション A 会話履歴 · ファイル テキストのみ セッション B テキストのみ受信 履歴とファイルは 元の場所に残る RESUME SESSION 同じセッション コンテキスト全体を移す 別のターミナル
一言伝えるならメッセージ、会話全体を移すなら復元を使います。当サイトがドキュメント内容に基づいて作成した図です。
03 使い方

2つのツールはClaudeが自動で呼び出す。手動送信の必要なし

この機能の背後には2つのツールがあります。ListAgents は到達可能なセッションを発見し、SendMessage は名前を指定してメッセージを送信します。

これらのツールを直接操作する必要はありません。Claudeが送信すべきかどうか、誰に送るかを判断し、文言も自ら作成します。あなたは「別のターミナルのセッションに、マイグレーションが完了したか聞いて」とか「支払いAPIを担当しているセッションに、さっきやった作業を知らせて」といったプロンプトを出すだけで、具体的なメッセージ内容はClaudeが決定します。

到達可能なセッションを自分で確認したい場合は、/list-agents と入力します。リストには3つの種類があります:

1
サブエージェント

現在のセッション内で動作しているAgent。Agent teamのメンバーはこのリストには含まれない点に注意。Claudeはチーム独自の名簿を通じて連絡します。

2
同じマシン上の他のセッション

同じマシンで動作しているClaude Codeセッション(バックグラウンドセッションを含む)。セッションが受信ボックスソケットにバインドされている場合にのみリストに表示されます。

3
このマシン以外のセッション

Remote Control が接続されている場合にのみ表示され、Remote Control のラベルが付きます。別のマシンやWeb版のセッションが含まれます。これらのセッションは返信のみ可能で、こちらから能動的に話しかけることはできません。

NAMINGセッション名はどこから来るのか

メッセージは名前で配信されます。名前の由来は3つあります。/rename で変更した名前、起動時に --name で指定した名前、どちらもない場合はClaude Codeが作業ディレクトリのフォルダ名から派生させて myapp-3f のような名前を生成します。

2つのセッションが同名になる可能性があります。/list-agents の出力には各セッションの作業ディレクトリが付加されて区別されます。Claude自身のリストには各行に短い識別子も追加され、名前が衝突した場合にそれを使用して特定します。

04 配信

メッセージはツール呼び出しの合間に配信され、結果は3通り

メッセージが相手に届いても、相手の進行中の作業は中断されません。受信側のClaudeは2つのツール呼び出しの合間にメッセージを読み取るため、実行中のコマンドが中断されることは絶対にありません。セッションがアイドリング中だった場合、メッセージは新しいターンを直接開始します。

配信結果は3通りあります:

メッセージ 受信側の 受信ルール 配信 Claudeへ 保留 承認待ち または設定による許可待ち 拒否 破棄
届いた各メッセージは、まず受信側自身の受信ルールを通過し、3つの結果のいずれかに振り分けられます。当サイトがドキュメント内容に基づいて作成した図です。

メッセージが配信されると、あなた自身がプロンプトを入力したのと同様に課金されます。配信後、受信側も同様に返信できます。ただし、マシンをまたぐ一方通行の場合を除きます。

05 安全の赤線

別のセッションからのメッセージはユーザー承認として扱われない

これは設計全体で最も重要な点です。

セッションAがセッションBにメッセージを送信するとき、Claude CodeはBに明確に伝えます:このメッセージは別のセッションからのものであり、あなたの人間のユーザーからのものではありません。そして、実行可能なことを4つの制限で防ぎます。それぞれが具体的な悪用シナリオを防ぎます:

1
承認の代行はできない

別のセッションからのメッセージは、あなたの承認として扱われることは絶対にありません。承認待ちの権限プロンプトへの回答として使用することはできません。防ぐシナリオ:セッションAが「承認して」と言い、セッションBがあなたが承認していない操作を許可してしまうこと。

2
設定変更はできない

受信側は、別のセッションが何かを言ったからといって、権限設定、CLAUDE.md、その他の設定を変更しないよう明確に要求されます。防ぐシナリオ:1つのメッセージから始まって、セキュリティ設定を段階的に緩められること。

3
メッセージ内のコマンドは実行されない

メッセージテキスト内にスラッシュコマンドが出現しても、それは単なるテキストであり、Claude Codeは実行しません。防ぐシナリオ:コマンドをメッセージ内容に偽装して送り込むこと。

4
必要な権限プロンプトは通常通り表示される

メッセージに基づいて作業する際に権限が必要な場合、通常とまったく同じプロンプトが表示されます。防ぐシナリオ:「別のセッションに頼まれた」ことを理由に、通常の承認プロセスを回避すること。

送信側にも同様の制約があります。Claudeは自分側で拒否されたり、ブロックされたり、権限設定上実行できないことを、別のセッションに依頼して実行させてはならないとされています。このような場合、別のセッションを通じて実行するのではなく、あなたに作業を戻す必要があります。

これら両側の制約を合わせると、同じ意味になります:クロスセッションメッセージは「伝言」のチャネルであり、「権限昇格」のチャネルではありません。

06 デフォルトルール

未設定の場合、2つのセッションの権限モードに基づいて配信が決まる

何も設定していない場合、Claude Codeは2つのセッションそれぞれの権限モードを確認して判断します。セッションを2つのタイプに分類します:プロンプトを表示して確認を求めるタイプと、権限プロンプトをスキップして直接実行するタイプです。

plan モードは、スキップ能力を持つセッションでは「スキップ」タイプとみなされます。autoacceptEditsdontAsk はすべて「プロンプト表示」タイプとみなされます。)

ルールは次の通りです:

受信側送信側が「プロンプト表示」タイプ送信側が「スキップ」タイプ
プロンプト表示配信保留(承認待ち)
スキップ保留(承認待ち)配信

一見複雑ですが、背後にあるロジックはシンプルです:確認なしで直接実行できるセッションは、外部からメッセージを送られるリスクが最も高いため、受け取ったメッセージをそのまま実行してしまいます。したがって、権限が緩いセッションほど、受信時のチェックが厳しくなります。

bypassPermissions

権限モードの1つ。このモードではClaudeは毎回確認せずに直接実行します。

アシスタントにマスターキーを渡すようなもの。効率的ですが、確認をしないからこそ、外部からのメモは先にあなたの目を通す必要があります。

crossSessionInbound

受信ポリシーを自分で設定する項目。3つの値:accept(すべて受け取る)、hold(すべて保留)、refuse(すべて破棄)。

自宅の郵便受けにルールを設定するようなもの:来たものは何でも受け取るか、一旦保留して確認するか、投函口を封鎖するか。

DIALOG保留された後はどうなるか

メッセージが保留されると、受信側は送信者とメッセージプレビューを表示する承認ダイアログを表示します。選択肢は3つ:

  • 承認:このメッセージをClaudeに渡す
  • 拒否:またはダイアログを閉じると、このメッセージは破棄される
  • 放置dialogExpiry の期限(デフォルト5分)を過ぎるとダイアログは自動的に閉じ、メッセージは破棄される

保留されたメッセージは最大100件まで保存され、超過分は最も古いものから破棄されます。保留中にこのセッションの権限モードが変更された場合、ルールが再評価され、許可すべきものは許可されます。拒否に変更された場合は、保留中の全メッセージが破棄され、到達可能な各送信者に拒否通知が返信されます。

送信側にも動きが見えます:メッセージが保留されると通知が届き、その後、配信されたか、拒否されたか、期限切れになったかを示すフォローアップメッセージも届きます。最初から拒否された場合のみ、送信側には何の通知もありません。

07 経路

同一マシンはローカルsocket経由、マシン間は返信のみ

メッセージがどの経路を通るか、こちらから何を送信できるかは、相手のセッションがどこにあるかによって決まります:

SAME MACHINE セッション A セッション B socket 双方向送信可能 Anthropic サーバー非経由 Anthropic サーバー 別のマシン Remote Control 経由 Web版セッション クラウドへ直接 この2つは返信のみ 相手からの連絡が必須
同一マシン内の経路は完全にローカルで完結し、他の2つはAnthropicサーバーを経由し、片方向です。当サイトがドキュメント内容に基づいて作成した図です。

「返信のみ」の意味は、相手が先に連絡してきた場合にのみ、こちらから返信できるということです。別のマシン上のセッションに能動的に連絡したい場合、この経路は使えません。

VISIBILITY同一マシン内連携の前提は「同じファイル群が見えること」

各セッションはディスク上のファイルに自身を登録し、そこに受信ボックスソケットをバインドします。Claudeがローカルセッションを一覧表示または連絡するとき、これらのファイルを読み取ります。したがって、2つのセッションが互いに到達可能であるためには、同じファイル群が見える必要があります

この推論は実際的です:コンテナには独自のファイルシステムがあるため、コンテナ内のセッションとホストマシン上のセッションは互いに到達できません。ただし、同じコンテナ内の2つのセッションは通信できます。セルフホストランナーでも同様です。

もう1つ、つまずきやすい詳細があります:マシンをまたぐ返信で、送信時にRemote Controlに接続していない場合、メッセージは(Anthropicサーバーへの直接リクエストで)配信されますが、返信先アドレスが含まれず、相手は返信できません。Claudeは送信時にこのことを通知されます。

このマシンから出るすべてのメッセージに承認を求める場合は、isolatePeerMachinestrue に設定します。設定すると、すべての権限プロンプトをスキップするモードでも、返信がマシン外に出る前に確認を求められます。どの設定レベルでも true が書かれていれば有効なので、リポジトリにコミットされたプロジェクト設定でこの要件を有効にできますが、無効にすることはできません。同一マシン内のメッセージには影響しません。

08 自動化エントリポイント

claude -p セッションもメッセージを受信可能。socket はスクリプト用

無人実行の claude -p セッションも受信ボックスソケットにバインドされ、メッセージを受信でき、リストにも表示されます。したがって、長時間実行される -p ワーカーは指示を受け取れます。

ただし、ここに落とし穴があります:-p セッションは承認ダイアログを表示できません。そのため、メッセージが保留されると、後で設定が変更されて許可されない限り、保留されたままになります。無人ワーカーがメッセージを自律的に受信できるようにするには、起動時の --settingscrossSessionInboundaccept に設定する必要があります。(ユーザーレベルの設定でも可能ですが、その場合、実行するすべてのセッションに影響します。)

また、bare mode と呼ばれる起動方法もあり、これはソケットをバインドせず、メッセージを受信できず、リストにも表示されません。

SOCKETsocket の場所と使い方

パスは2箇所で確認できます:

  • /statusPeer address の行。パスには uds: プレフィックスが付きます
  • 環境変数 CLAUDE_CODE_MESSAGING_SOCKET。hook と Bash コマンドの両方から取得でき、任意の hook が実行される前にエクスポートされています(SessionStart を含む)。各セッションは自身のものをエクスポートし、親セッションのものを継承しません

つまり、スクリプトや hook が自身のセッションにメッセージを投函できます。当サイトの検証では値は /tmp/cc-socks/27983.sock でした。数字の部分はセッションに対応するプロセスIDです。

この経路には、覚えておく価値のあるプラットフォーム間の違いがあります。セッション自身の子プロセス(hook や Bash コマンドなど)がメッセージを投函する場合、送信元を検証できれば直接配信されます:Linux(WSL 2 内も含む)は終了した子プロセスでも検証できます。macOS はプロセスが生きている間のみ検証可能です。コンテナ内でClaude CodeがPID 1の場合、検証はまったくできません。検証できない場合は通常のメッセージとして扱われるため、権限プロンプトをスキップするセッションはそれを保留し、あなたの承認を待ちます。

サンドボックス内の Bash コマンドがソケットに到達できるかどうかは、サンドボックスの Unix ソケット設定(sandbox.network.allowAllUnixSocketssandbox.network.allowUnixSockets)によって決まります。

09 無効化

受信と送信は個別に無効化可能。それぞれに副作用あり

受信と送信は2つの独立したスイッチで、片方だけを無効化できます:

無効にしたいもの方法
受信を停止したいcrossSessionInboundrefuse に設定。届いたメッセージはすべて破棄され配信されません。プロジェクトまたはローカル設定から設定すると、他のすべてのソースよりも優先されます
送信も一覧表示もされたくない権限拒否ルールを追加し、SendMessageListAgents を指定。両方とも引数なしのベアツール名で記述
組織全体で無効化管理者が managed settings に2つの拒否ルールと refuse を一緒に記述

2つの副作用を知っておく必要があります:

第一に、SendMessage を拒否すると、サブエージェントやチームメンバーへのメッセージ送信機能も一緒に無効になります。同じツールがこれらの機能を提供しているためです。セッション間の相互連絡を防ぎたいだけだったのに、セッション内のコラボレーションも無効になってしまいます。

第二に、無効化した後、外部からはまったく見えません。Claude Codeは通常通りソケットにバインドし続け、届いたメッセージを単に破棄します。拒否設定のセッションは、自身の /status や他のセッションのリストに何のマークも表示されません。確認するには、その設定を調べるしかありません。

10 役割分担

復元、Agent teams などとの役割分担

Claude Code には「並行して開く」ためのメカニズムがいくつかあり、最も間違いやすい点です。ドキュメントには比較表が記載されているので、書き写しておく価値があります:

やりたいこと使用するもの
同じ会話を別のターミナルで続ける、またはコンテキストを新しいセッションに引き継ぐ復元(resume)
Claude 自身が生成し、統括するチームが必要Agent teams(Claude が自ら立ち上げて管理する Agent のチーム)
1つの場所で多数のセッションを監視・操作するAgent view
スマートフォンや他のデバイスでセッションを直接操作するRemote Control
外部イベント(CI結果、チャットメッセージ)をセッションに取り込むchannels
自分で開いた、それぞれ独立したセッション間で連絡を取り合うこの記事で説明しているクロスセッションメッセージ

一言で区別すると:クロスセッションメッセージは「自分で開いた、それぞれ独立したセッション」間の連絡手段です。Claude が生成して統括するチームは、チーム独自の名簿を通じて連絡します。コンテキスト全体を移すのは復元の役割です。

11 セルフチェック

システム、プロバイダーの制限、メッセージループのスロットリング

条件要件
OSmacOS と Linux(WSL 2 内の Linux を含む)。ネイティブ Windows では利用不可
バージョンv2.1.224 以降
プロバイダーAmazon Bedrock、AWS 上の Claude Platform、Google Cloud の Agent Platform、Microsoft Foundry では利用不可
環境変数プライバシー保護のためテレメトリーを無効化する変数(CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFICDISABLE_TELEMETRYDO_NOT_TRACKDISABLE_GROWTHBOOK)を設定すると、この機能が依存する機能フラグの判定も無効になります

最後の項目は最も見落としがちです:メッセージ機能を意図的に無効化していなくても、以前テレメトリーデータ送信を減らすために環境変数を設定しただけで、この機能がずっと無効になっている可能性があります。これらの変数はシェル、設定ファイルの env セクション、または管理者設定由来の可能性があります。

TROUBLESHOOT送信できない場合の調査方法

/list-agents と入力して、2つのケースを分けて考えます:

コマンドが認識されない:このセッションにはクロスセッションメッセージ機能がありません。上記の表を1つずつ確認し、まず claude --version から始めます。

コマンドは認識されるが、メッセージが届かない:機能は有効です。問題はより詳細な部分にあります。権限拒否ルールがこれらのツールを除外している可能性、受信側の受信制御がメッセージを保留または破棄している可能性、または相手が別のマシン上にある(返信のみ可能)可能性があります。

LIMITS2つのハード制限

プレーンテキストのみ送信可能です。Agent teams 内部の構造化されたプロトコルメッセージは、チームの外には出せません。

メッセージループは自動的に遮断されます。同じ送信者にはレート制限があり、短時間に届く完全に同一の重複メッセージは破棄されます。Claude が読むのを待つメッセージは、セッションごとに最大50件までスタックできます。したがって、2つのセッションが互いにメッセージを送り合う無限ループは、自然に停止します。あなたが介入する必要はありません。

✅ 導入セルフチェックリスト
出典
Message your other Claude Code sessionsClaude Code Docs·公式ドキュメント
当サイト注記
メカニズムの説明と設定項目はすべて上記の公式ドキュメントに基づいています。「当サイト検証済み」と記載した3箇所は、macOS上での実機検証結果です:バージョン 2.1.225、CLAUDE_CODE_MESSAGING_SOCKET の値は /tmp/cc-socks/27983.sock、シングルセッション状態ではエージェントリストは空でした。ドキュメントには、メッセージ長の上限、および「保留上限100件」と「未読待機上限50件」の2つのキューの関係は記載されておらず、受信側がメッセージによって引き起こした後続アクションの課金方法も明記されていません。スクリプトがsocketにメッセージを投函できると記載されていますが、プロトコル形式は提供されていません。図はすべて当サイトがドキュメント内容に基づいて作成しました。