Claude Code には、手元で動いている別のセッションへ Claude 自身がメッセージを届ける cross-session messaging があります。あるセッションで分かったことや決めたことを、別のターミナルへ手でコピーせずに伝えられます。本記事は公式ドキュメント「Message your other Claude Code sessions」を基にした非公式の日本語まとめです。
概要と必要バージョン
メッセージとは、ある Claude が別の Claude に宛てて書くテキストです。送り手の会話履歴やファイルがそのまま渡るわけではありません。会話ごと引き継ぎたい場合は、セッションの再開(resume)を使います。
要件を満たしたセッションでは、有効化の操作なしにメッセージ機能が使えます。公式ドキュメントが示す必要バージョンは次のとおりです。
- macOS と Linux(WSL 2 上の Linux を含む): Claude Code v2.1.224 以降
- ネイティブ Windows: v2.1.234 以降
- 他のマシンのセッションへ会話を始める場合: v2.1.225 以降
- @ メンションで宛先を指定する場合: v2.1.232 以降
- アイドル通知(後述)を使う場合: 双方のセッションで v2.1.236 以降
主な使いどころは、(1) 破壊的な変更や決定事項を影響を受けるセッションへ伝える、(2) 同じリポジトリを別々の worktree で作業しているセッション同士で何が反映されたかを共有する、(3) 長時間の移行やテストの状況を確認する、(4) 別マシンやクラウド上のセッションに連絡する、の4つです。
別セッションへメッセージを送る
宛先の検索には ListAgents、送信には SendMessage というツールが使われ、利用者がこれらを直接呼ぶ必要はありません。Claude が必要と判断して自分から送ることもあれば、依頼して送らせることもできます。依頼は、相手に伝えたい内容や頼みたいことを自然な文章で書くだけです。
Ask the session running in my other terminal whether the migration finished
メッセージ本文は Claude が書くため、依頼文では文面まで指定する必要はありません。宛先を自分で指定したいときは、プロンプトに @ と名前の先頭数文字を入力し、候補から選びます。サブエージェントを @ メンションする操作と同じ要領です。
Let @api-worker know the schema migration finished
名前に空白など英数字・ハイフン・アンダースコア以外の文字が含まれる場合は、@"release notes" のように二重引用符で囲みます。同じ名前の稼働中セッションが複数ある場合、Claude はどれを指すのかを送信前に確認します。
どのセッションに届けられるかは、/list-agents(別名 /peers)で確認できます。一覧にはサブエージェント、同じ agent team のチームメイト、同じマシン上の他のローカルセッション、クラウドセッション、他マシンの Remote Control セッションが並びます。セッション名は /rename コマンドまたは --name フラグで付けられます。
メッセージが届くタイミング
受信側の Claude は、実行中のターンではツール呼び出しの合間にメッセージを読みます。実行中のツールが中断されることはありません。受信側がアイドルなら、Claude Code が新しいターンを開始してメッセージを渡します。届いたメッセージは利用量として、自分でプロンプトを入力した場合と同じく計上されます。
他セッションがアイドルになったら通知をもらう
別セッションの長い作業を待っているときは、次にそのセッションがアイドルになった(キューに何もなく、ターンが終わった)か終了したときに1回だけ通知するよう依頼できます。たとえば「Tell me when the migration session finishes what it's working on」のように頼みます。この購読は SendMessage の notify_when_idle 入力で行われ、12時間以内に通知がなければ購読は破棄されます。対象にできるのは、メインの会話の Claude から見た同じマシン上の自分のセッションだけです。
受信側の扱いと制御
別セッションからのメッセージは、利用者本人の指示ではなく他セッションからのものとして扱われ、できることが制限されます。
- 許可の承認はできません。権限確認のプロンプトに対して利用者の代わりに答えることはできません。
- 権限設定や
CLAUDE.mdなどの設定変更を、他セッションの依頼で行うことはありません。 - 本文中の
/compactのようなコマンドは、ただのテキストとして届き、実行されません。 - メッセージの内容に従って作業する際に必要な権限は、受信側セッションの通常の権限確認とルールがそのまま適用されます。
届いたメッセージは、会話内に送り手の名前と1行目のプレビュー(例: › Message from @api-worker: Schema migration finished)として表示されます。全文は Ctrl+O でトランスクリプトビューアを開くか、--verbose で起動したセッションで確認できます。
crossSessionInbound で受信方針を決める
設定キー crossSessionInbound で、他セッションからのメッセージの扱いを選びます。
| 値 | 動作 |
|---|---|
accept | 各メッセージを Claude に配信する |
hold | 通知だけを表示して配信しない。のちに accept が適用されると、保留分が配信される |
refuse | 各メッセージを配信せずに破棄する |
値は /config の「Messages from your other sessions」の行でも選べます(v2.1.232 以降。managed settings や --settings フラグで設定されている間は表示されません)。値が設定されていない場合は、送信側と受信側のそれぞれが権限確認をスキップする(bypass permissions)モードかどうかで判断されます。権限確認のあるセッションは原則として配信し、bypass しているセッションは、送信側も bypass と名乗る場合を除いて承認待ちとして保留します。保留されたメッセージは、対話セッションでは承認ダイアログに表示され、承認で配信、拒否または放置(既定は5分、dialogExpiry で変更)で破棄されます。保留できるのは最大100件です。
非対話の claude -p セッションもインボックスのソケットを持つため、長時間動く worker がメッセージを受け取れます。ただし承認ダイアログは出せないので、無人で受け取らせるには起動時の --settings で crossSessionInbound を accept にします。bare モードで起動したセッションはソケットを作らず、一覧にも現れません。
他マシン・クラウドへの送信
経路は宛先の場所で変わります。
| 宛先 | 経路 |
|---|---|
| 同じマシン | macOS と Linux はセッションごとのソケット、ネイティブ Windows は名前付きパイプ。Anthropic のサーバーは経由しない |
| 自分の別のマシン | Anthropic のサーバー経由で、相手の Remote Control 接続に届く |
| クラウド | Anthropic のサーバー経由でクラウドセッションへ直接届く |
クラウドや他マシンのセッションが一覧に出るのは、自分のセッションが Remote Control に接続されている間です。これには claude.ai でのサインインが必要で、API キーや Amazon Bedrock などのプロバイダ経由では見つけられません。一覧で offline と表示されたセッションへのメッセージは、そのマシンが再接続した後に届きます。can't receive cross-session messages と表示されたセッションへは、送信前に拒否されます。
クラウドセッションは SendMessage で他マシンからのメッセージに返信できません。応答は claude.ai/code のトランスクリプトで確認します。また、コンテナ内のセッションとホストのセッション、WSL 2 内のセッションとネイティブ Windows のセッションは互いに届きません。
マシンの外へ出るメッセージを必ず承認制にしたい場合は、isolatePeerMachines を true にします。bypassPermissions モードでも承認が求められ、同じマシン内のメッセージには確認は出ません。どの設定範囲でも true があれば有効になるため、プロジェクトの設定ファイルで有効にしたものを無効にはできません。
{
"isolatePeerMachines": true
}
制限と無効化
メッセージ経路自体の制限として、次の点が公式ドキュメントに挙げられています。
- 送れるのはプレーンテキストのみです。
- 同じマシン内のメッセージは、直列化した大きさが約100万文字を超えると、送信側で拒否されます。
- 1つのセッションへ短時間に大量に送ると、送信側で拒否されます。まとめて1通にするか、時間を置くよう案内されます。
- 受信側は、送信者ごとの繰り返しを制限し、短時間の同一メッセージを捨て、読み待ちのキューは最大50通までです。このためメッセージの無限ループは自然に止まります。
機能を止めたい場合は、受信と送信を別々に制御します。受信を止めるには crossSessionInbound を refuse にします。送信と一覧取得を止めるには、権限の deny ルールで SendMessage と ListAgents を指定します。管理者が組織全体で無効化する managed settings の例は次のとおりです。
{
"permissions": {
"deny": ["SendMessage", "ListAgents"]
},
"crossSessionInbound": "refuse"
}
なお SendMessage を拒否すると、サブエージェントや agent team のチームメイトへのメッセージも使えなくなります。同じツールがそれらにも使われているためです。メッセージが届かないときは、まず /list-agents が使えるかを確認します。認識されない場合はバージョン要件を満たしていません。使えるのに届かない場合は、deny ルールや受信側の受信制御が原因として考えられます。
参考: 公式ドキュメント(Message your other Claude Code sessions)、設定リファレンス