原典: Message your other Claude Code sessions / 日本語版
一行要約
セッション同士が平文テキストだけを送り合える仕組みで、SendMessage / ListAgents の2ツールで動く。要点は信頼モデルにあり、届いたメッセージはあなたの同意にならず、設定も変えられず、コマンドも実行されない。さらに受信側の既定は、送り手と受け手の permission mode の組み合わせで決まる。
要点
何であって、何でないか
A message is a piece of text one Claude writes to another, never the sender’s conversation history or files.
メッセージとは、ある Claude が別の Claude に書いた1片のテキストであり、送り手の会話履歴やファイルでは決してない。
会話そのものや context を移したいなら、メッセージではなくセッションの resume を使う。
原典は使いどころを4つ挙げる。Claude は必要だと判断すれば頼まれなくても送れるし、頼んで送らせることもできる。
| 場面 | 内容 |
|---|---|
| 発見を渡す | 一方のセッションが破壊的変更を見つけたり決定を下したら、影響する領域を作業中のセッションに Claude が要約して伝える。あなたが向こうで説明し直さずに済む |
| 並行する worktree の調整 | 同じリポジトリを別々の worktrees で進めているとき、何が入ったかを他のセッションに伝える |
| 長い作業の状況を得る | migration やテストの実行に、見ているセッションへ報告させる。見ているセッションから自分で尋ねてもよい。このマシンのセッションなら「次に idle になるか終了したら知らせて」とも頼める |
| マシンをまたぐ | 別のマシンや cloud にある自分のセッションに届ける |
Claude が使うのは2つのツール。ListAgents で到達できる相手を発見し、SendMessage で名前を指定して届ける。同じ SendMessage は sub-agents や agent-teams の teammate 宛にも使われる。このページが扱うのは独立したセッション間の話。
利用条件
| 条件 | 内容 |
|---|---|
| バージョン | macOS / Linux(WSL 2 内を含む)は v2.1.224 以降、native Windows は v2.1.234 以降。他マシンのセッションへ会話を開始するには v2.1.225 以降 |
| OS | macOS・Windows・Linux(WSL 2 内を含む)。同一マシン内は macOS / Linux が Unix domain socket、native Windows は名前付きパイプ |
| 同一マシン内 | どの provider でも使える。 Amazon Bedrock、Claude Platform on AWS、Google Cloud の Agent Platform、Microsoft Foundry、feature flag 取得を切った状態も含む。ただしこれらでは v2.1.248 以降が要る |
| マシンの外 | Remote Control 接続が要る(claude.ai サインインがそのセッションの有効な認証であること)。API キーや Bedrock / AWS / GCP / Foundry では他マシンや cloud のセッションを見つけられない |
条件を満たせば有効化の操作は要らない。 確認は /list-agents(別名 /peers)。
/list-agentsが認識されない → そのセッションには機能自体がない(まずclaude --version)/list-agentsは動くが届かない → より狭い原因: deny ルール、受信側の inbound 制御、Remote Control 未接続(他マシンのセッションは、相手も自分も Remote Control に接続していて初めて出る)、相手がoffline(再接続後に届く)、一覧のページ送り上限から落ちた古いセッション
宛先の指定(@ メンション)
Claude は自分で宛先を見つけるので、普通は何も要らない。 自分で指名したいときは
プロンプト中で @ + セッション名の頭文字を打ち、typeahead から選ぶ(subagent の
@メンションと同じ。v2.1.232 以降)。Claude Code がメンションを挿入し、どのセッションを指すかを Claude に伝えるので、Claude は一覧を取らずに送れる。
- typeahead に出るのはこのマシンの生きている他セッションだけ。cloud / Remote Control のセッションは、Claude が一度それらを列挙するかメッセージを送った後にしか出ない
- 英数字・ハイフン・アンダースコア以外を含む名前はダブルクォートで囲む(
@"release notes")。typeahead から選べば引用符は自動で入る - 同じ名前の生きたセッションが複数あると、送る前にどれかを聞かれる
メッセージがどう届くか
受信側の Claude は、ターンの実行中ならツール呼び出しの合間に読む。走っているツールが中断されることはない。 アイドルなら新しいターンが始まる。
メッセージは平文として届く。 本文がファイルや MCP リソースを @ で指していても、新しいターンを始めるメッセージでもターン中に届くメッセージでも、Claude Code は何も添付しない(Claude は書かれたとおりのメンションを見るだけ。自分のツールでそのパスを開くことは、受信側の権限の範囲でできる)。
送信側で拒否される場合:
- サイズ上限超え・同一マシンの相手への短時間の連投(どちらも下の「制約」)
- 他マシンの宛先が一覧で
can't receive cross-session messages (off in that session)になっている(相手のセッションで messaging が使えないかcrossSessionInboundがrefuse)。このマシンを出る前に送信側で拒否され、SendMessageの結果はNot sentで始まり理由を挙げる。相手で原因を直せば、次の一覧からこの表示は消える - 同一マシンの返信先が安全性検査に落ちた(symlink された宛先など)
受信側は届いたメッセージを自分の inbound 制御で検査し、結果は3つのいずれかになる。
| 結果 | 意味 |
|---|---|
| Delivered | Claude に渡される |
| Held | 未配送のまま保留。承認するか、後の mode / 設定変更が許すまで届かない |
| Refused | 配送せずに破棄される |
配送されたメッセージは、自分が打ったプロンプトと同じように利用(usage)に算入される(costs)。受信側の Claude は同じ方法で返信できる(返信アドレスの無い、マシン外への一方向のメッセージを除く)。
権限の境界はセッションごとに保たれる。 Claude は、自分のセッションで拒否・ブロックされた動作や、自分の permission 設定が禁じる動作を、他のセッションに頼まないよう指示されている。代わりにあなたへ差し戻す。受信側でも、メッセージが求めることには受信側自身の permission プロンプトとルールが適用される。
他セッションが idle になったら知らせてもらう
このマシンのセッションに対してだけ、「次に idle になるか終了したら1回だけ知らせて」と頼める。 idle とはキューが空の状態でターンを終えたこと。両方のセッションで v2.1.236 以降が要る。
Claude は SendMessage の notify_when_idle 入力で購読する。送るメッセージに相乗りさせることも、
単独で購読することもできる。単独の場合、見張られる側でターンを起こさずトークンも使わない。
相手がすでに idle なら即座に知らせが来る。相乗りの場合は、メッセージを先に配送し、知らせは後から送る。
見張られる側には「次に idle になったら知らせてほしいと頼まれた」という行が出る。頼んだ側には、見張ったセッションの名前を書いた行が知らせとして出る(そのターンが終わった時刻と、そのターンの1行ステータスを含むことがある)。頼んだ側が idle なら、知らせで新しいターンが始まる。
| 挙動 | |
|---|---|
| 一度きり | 見張られた側から1回送って終わり |
| 12時間 | 知らせが来なければ購読を破棄し、Claude に伝える(待ち続けさせないため) |
どちらかが refuse | 何も届かない。見張られる側は要求を記録も応答もせず捨てるので、購読は12時間後に無応答のまま失効する。頼む側が refuse なら、そもそも購読しない |
どちらかが hold | 減った形で届く。見張られる側は1行ステータスを省き、頼んだ側は transcript に出すだけで Claude には配送しない |
購読できるのはメイン会話の Claude だけで、宛先もこのマシンのセッションだけ。 teammate・subagent・マシン外のセッションに対して 知らせを頼むと、相乗りしたメッセージごと呼び出し全体が拒否される。
信頼モデル(このページの核心)
When session A messages session B, Claude Code tells B’s Claude that the message came from another session, not from you, and limits what the message can do.
セッション A がセッション B にメッセージを送るとき、Claude Code は B の Claude に対し、そのメッセージがあなたからではなく別のセッションから来たことを伝え、そのメッセージにできることを制限する。
| 制限 | 内容 |
|---|---|
| 承認できない | 他セッションからのメッセージは決してあなたの同意にならない。保留中の permission プロンプトに代わりに答えることはできない |
| 設定を変えられない | 他のセッションに言われたからといって、permission 設定・CLAUDE.md・その他の設定を変えるなと受信側の Claude は指示されている |
| コマンドは走らない | メッセージ本文中の /compact のようなコマンドはただの平文として届く。Claude Code がそれを実行することはない |
| permission プロンプトは出る | メッセージに従って動くのに権限が要るなら、通常の作業と同じプロンプトが出る |
受信側の既定は permission mode の組み合わせで決まる(最も間違えやすい点)
crossSessionInbound を設定していれば、それに従う。
| 値 | 挙動 |
|---|---|
accept | 各メッセージを Claude に配送する |
hold | 通知を出すだけで配送しない。後から(優先順位の規則に従って)accept が適用されると保留分を解放する |
refuse | 配送せずに破棄する |
設定がない場合、Claude Code はメッセージごとに「両セッションの permission mode の階級」で判断する。 セッションは2階級に分けられる。
- bypassing 階級 —
bypassPermissions。bypass permissions が使える対話ターミナルセッションでは、plan mode もこちらに数える - prompting 階級 — それ以外。
auto、acceptEdits、dontAskは prompting に数える
| 受信側 | 挙動 |
|---|---|
| prompting | 各メッセージを配送する。送信側が bypassing だと名乗ったときにだけ承認待ちで保留する |
| bypassing | 各メッセージを承認待ちで保留する。送信側も bypassing のときにだけ配送する |
承認ダイアログ(送信者とプレビューが出る): 承認するとその1通が配送される。拒否または閉じると破棄。dialogExpiry(既定5分)を過ぎて未応答なら閉じて破棄する。 ただしバックグラウンドセッションにターミナルが接続されていない間は、期限を過ぎてもダイアログを開いたままにする(接続した後、期限と同じ長さだけ待っても未応答なら閉じて破棄)。ダイアログを出すのは対話ターミナルのセッションだけ —— VS Code 拡張と Desktop アプリのセッションは出せないので、保留したメッセージを非対話セッションと同じ期限まで持つ。
- 保留中に permission mode の階級が変わると、inbound 規則が再適用され、通るようになったものが配送されて通知が出る
- 保留は最大100通。超えると古いものから捨てる
設定の入口: 設定ファイル以外に、/config の Messages from your other sessions 行で選べる(選んだ値は user settings に書かれる)。v2.1.232 以降で、managed settings か --settings がこのキーを持っている間は行そのものが出ない(user settings の値が効かないため)。/config crossSessionInbound=value の短縮形はこのキーでは拒否される。
どこを通るか(マシンをまたぐ場合)
| 相手の居場所 | 経路 |
|---|---|
| 同じマシン | セッションごとの socket(macOS / Linux)か名前付きパイプ(native Windows)経由。Anthropic のサーバを通らない |
| 自分の別のマシン | Anthropic のサーバ経由で、相手マシンの Remote Control 接続に届く |
| Claude Code on the web | Anthropic のサーバ経由で cloud セッションへ直接 |
他マシンのセッションへ会話を始めるには、版の条件(上の「利用条件」)に加えて相手が一覧に出ていること。offline(Remote Control 接続が切れた相手)にも送れるが、届くのは相手のマシンが再接続した後。
同じコンピュータでも届かない組み合わせがある —— コンテナ内のセッションとホストのセッション、WSL 2 内のセッションと native Windows のセッション。同じコンテナ内の2つは到達できる(self-hosted runner 上でも)。
返信アドレス: 送信側が Remote Control に接続していない状態でマシン外へ送ると、届きはするが返信アドレスが無いので受信側は返答できない。
一覧に何が出るか(/list-agents)
先頭行(あれば)はこのセッション自身の名前 —— 他のセッションがここへ送るときに使う名前。 その下が到達できる相手。
| 種別 | 備考 |
|---|---|
| subagent | 現セッション内で走っているもの |
| teammate | このセッションの agent team |
| 同じマシンの他セッション | background セッションを含む。inbox socket を bind したものだけが出る |
| cloud セッション | Claude Code on the web。Remote Control 接続中のみ |
| 他マシンの Remote Control セッション | Remote Control 接続中のみ。Remote Control と表示され、接続が切れた相手は offline |
Remote Control に接続している間は、/list-agents の出力でローカルセッションの詳細が伏せられる(Claude 自身が宛先を探すときに見えるものは変わらない)—— 作業ディレクトリ、
人に帰属できない名前(その行は (unnamed session) になる)、そしてこのターミナルで自分が
名前を打っていない限り先頭行。伏せたことは出力の末尾に注記される。そのセッションの端末で、まだ使われていない名前に /rename すれば、出力に名前が出るようになる。
cloud と Remote Control のセッション一覧は新しい順に読み、ページ数に上限がある。 収まらない 古いセッションには名前で送れない。
名前
セッションは /rename か --name で付けた名前で応答する。付けなければ Claude Code が自分で付ける
(対話セッションでは、実行中セッションの一覧に出るのと同じ名前)。
- 同じマシンの生きたセッションが既に使っている名前を付けようとすると(rename したとき、または対話セッションを起動・再開したとき)、先にいる側が名前を保ち、 こちらが変種に改名される
- それでも名前は重なりうる(片方が古い Claude Code を走らせている、重なった名前が Claude Code の自動生成だった、など)。
/list-agentsは各ローカルセッションの作業ディレクトリを併記する(Remote Control 接続中を除く) - その名前を持つセッションが1つなら名前だけで届ける。 複数が同じ名前を持つか、セッションの走る場所をすべては確かめられなかったときは、Claude が一覧の各行に短い識別子を足し、それで宛先を指す
届いたメッセージの見え方
薄い1行のプレビューとして会話に出て、その行は後も残る(送信者名と本文1行目、長ければ … で切る。例: › Message from @api-worker: Schema migration finished (ctrl+o to expand))。
全文を見るには Ctrl+O で transcript viewer を開くか、
--verbose で起動する。短くなるのは表示だけで、Claude は常に全文を読む。
Claude は送信者の名前と返信アドレスつきでメッセージを受け取る(マシン外への一方向のメッセージには返信アドレスが無い)。
非対話セッション(-p)
claude -pでも inbox socket を bind するので、長時間走る-pワーカーはメッセージを受け取れ、一覧にも出る- bare mode では socket を bind しない。したがって受信できず、一覧にも出ない
-pは承認ダイアログを出せない。既定で保留になった場合、dialogExpiry(既定5分)と同じ期限で扱う。期限前に mode / 設定変更が許せば配送、過ぎれば破棄して送信者に期限切れを報告dialogExpiryを"never"にするとセッション終了まで保持する。明示的なhold設定による保留は期限切れしない(acceptが適用されたときにだけ配送)-pワーカーに無人でメッセージを受けさせたいなら、--settingsでcrossSessionInboundをacceptにして起動する。user settings のacceptでも動くが、自分が走らせるすべてのセッションに効く
inbox socket
- 置き場所は macOS / Linux(WSL 2 内を含む)では Unix domain socket、native Windows では名前付きパイプ
- macOS / Linux では OS ユーザーに限定され、native Windows では自分の OS ユーザーしか読めない鍵での認証を接続ごとに要求する。どちらでも、共有マシンの他ユーザーのセッションからは届かない
- macOS / Linux では受け入れられないディレクトリ(他ユーザーの所有など)に socket を作らず、ユーザーごとの
/tmp/cc-socks-<uid>を使う。どこにも作れなければ inbox 無しで走り、通知が出て、/statusのPeer address行にunavailableと理由が出る - パスは
/statusのPeer address行(uds:接頭辞)と、環境変数CLAUDE_CODE_MESSAGING_SOCKETで分かる。メッセージングが有効な状態で始まるセッションでは、エクスポートはSessionStartを含むどの hook よりも前に起きる - あわせてセッションごとのトークン
CLAUDE_CODE_MESSAGING_TOKENがエクスポートされる。自セッションの socket に投げるスクリプトは、接続の最初の行に{"type":"auth","token":"<token>"}を送れる。macOS / Linux では任意、native Windows では必須(最初の行が正しい認証行でない接続は閉じられ、何も配送されない) - 30秒以内に1行を送り切らない接続は閉じられる。 遅いコマンドの出力は先に取っておき、送る準備ができてから接続を開く
- 自分の子プロセスからのメッセージ(hook や Bash コマンドが自セッションの socket に投げるもの)は、
crossSessionInboundの値がないとき、自分の子だと検証できれば配送される。検証の手段が OS で違う:
| 環境 | プロセスの痕跡による検証 | 痕跡が無いとき |
|---|---|---|
| Linux(WSL 2 内を含む) | すでに終了した子でも検証できる | — |
| macOS | 投げたプロセスが生きている間だけ | 認証行の CLAUDE_CODE_MESSAGING_TOKEN で検証 |
| Claude Code が PID 1 のコンテナ | できない | 認証行のトークンで検証 |
| native Windows | できない | トークンが唯一の手段 |
どちらの方法でも検証できないときは「permission 階級を名乗らないメッセージ」として扱われるので、bypassing のセッションでは承認待ちで保留される。
sandbox 内の Bash から socket に届くかは sandbox.network.allowAllUnixSockets と sandbox.network.allowUnixSockets で制御する。
止め方
受信と送信は別の制御。
| 止めたいもの | 方法 |
|---|---|
| 受信 | crossSessionInbound を refuse。project / local 設定からの refuse は他のあらゆる source に優先する。user 設定からのものは managed settings と --settings に負ける |
| 送信と一覧 | permission の deny ルールに SendMessage と ListAgents を書く。どちらも指定子なしの素のツール名で書く |
SendMessage を deny すると、subagent と teammate へのメッセージも消える(同じツールなので)。managed settings で両方を止めても inbox socket は bind されるが、届いたものはすべて Claude に渡さず捨てられる。
refuse にしたセッションは、自分の /status にも同じマシンの他セッションの一覧にも変化が出ないので、同じマシンでは設定側で確認するしかない(他マシンからの一覧には上の can't receive cross-session messages が出る)。
マシン外への送信に承認を要求する
isolatePeerMachines: true で、マシンの外へ出るすべての SendMessage に明示的な承認を要求する。
bypassPermissionsモードでも承認を求める- どのスコープの
trueも適用されるので、チェックインしたプロジェクト設定で有効化はできるが、無効化はできない - 同一マシン内のメッセージには適用されない
制約
Plain text only: Claude sends only plain text across sessions. Structured agent team protocol messages stay within a team.
平文のみ: Claude がセッション間で送るのは平文だけである。構造化された agent team の protocol メッセージはチーム内に留まる。
| 制約 | 内容 |
|---|---|
| 同一マシン宛のサイズ上限 | シリアライズした形が約100万文字を超えると送信側で拒否され、受信側には何も届かない |
| 短時間の連投は送信側で拒否 | 相手の inbox の受け入れ量に達すると以降の送信を拒否し、残りを1通にまとめるか待つよう Claude に伝える |
| ループは自動で止まる | 受信側で送信者ごとに繰り返しをレート制限し、短時間に届いた同一内容を捨て、Claude が読むのを待つ受理済みメッセージを50通で頭打ちにする |
そのまま使える具体例
到達できる相手を確認する:
/list-agents送信を頼む(本文は Claude が書くので、内容まで指定しなくてよい):
Ask the session running in my other terminal whether the migration finishedExplain what we just did to the session working on the payments API届いたメッセージの実例(プレビューを展開したときの全文):
Schema migration finished
The new column is tenant_id, and rebasing on main is safe now.宛先を自分で指名する:
Let @api-worker know the schema migration finished他セッションの完了を知らせてもらう:
Tell me when the migration session finishes what it's working on-p ワーカーに無人でメッセージを受けさせる:
claude -p --settings '{"crossSessionInbound": "accept"}' "..."マシン外への送信に承認を要求する:
{
"isolatePeerMachines": true
}組織全体で両方向を止める(managed settings):
{
"permissions": {
"deny": ["SendMessage", "ListAgents"]
},
"crossSessionInbound": "refuse"
}原典で言及されている関連文書
- sessions — 会話ごと移すなら resume。セッションの名前
- worktrees — 並行する worktree の調整
- sub-agents — 同じ
SendMessageで subagent を resume する。@メンション - agent-teams — チーム内のメッセージ。構造化 protocol メッセージはチームを出ない
- mcp —
@で指された MCP リソースは添付されない - costs — 配送されたメッセージは打ったプロンプトと同じく利用に算入される
- cli-reference —
--name/--verbose/--debug - permission-modes — inbound の既定を決める2階級の出どころ
- permissions —
SendMessage/ListAgentsの deny ルール - headless —
-pと bare mode(bare は socket を bind しない) - hooks —
CLAUDE_CODE_MESSAGING_SOCKETは(メッセージングが有効な状態で始まるセッションでは)SessionStartより前にエクスポートされる - env-vars —
CLAUDE_CODE_MESSAGING_SOCKET/CLAUDE_CODE_MESSAGING_TOKEN - tools-reference —
ListAgents/SendMessageの行