手元の Mac(以下「母艦」)から、常時起動の別の Mac(以下「リモート Mac」)に Claude Code の並行実装を任せたい。そのとき、マシンと Claude アカウントの組み合わせごとに、どうつなげばよいかをまとめました。
これはなに?
Claude Code の Agent Teams は、1 つのセッションがリーダーになり、仲間(teammate)の Claude を何体も立てて仕事を分ける機能です。仲間どうしの連絡はとてもなめらかで、人が間に入らなくても話が回ります。
- 報告が勝手に届く:リーダーが見回らなくても、仲間のメッセージは自動で配達される
- 終わったら知らせてくれる:仲間が止まると、最後の答えを付けてリーダーに通知される
- 共有のタスク表:仲間が自分で次の仕事を取っていく
- 直接話しかけられる:人もリーダーも、名前で仲間に指示できる
ただし、この仲間は 同じマシンの中・同じ Claude アカウントの中 にしか呼べません。連絡帳(メールボックス)が、そのマシンの ~/.claude/teams/ にあるファイルだからです。
この記事では、その壁を越えて「常時起動の別の Mac」や「別の Claude アカウント」、さらに「codex」にまで仕事を渡す方法を、4 つのケースに分けて説明します。
結論を先に言うと、別アカウントのマシンにも、tmux でリーダーを立てれば、そのマシンの中で Agent Teams を回せる のがいちばんのポイントです。チームはそのアカウントの中で完結し、母艦とは打ち込みと郵便受けでつながります(アカウントをまたいで 1 つのチームになるわけではありません)。
前提:Agent Teams が「見える形」で動く条件
仲間を 分割ペインに並べて 見るには、公式には 2 つの道があります。iTerm2 なら tmux なしでそのまま並び、それ以外のターミナルでは tmux の中で claude を起動します。
| 条件 | 内容 |
|---|---|
| 機能をオンにする |
~/.claude/settings.json の env に "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1"(実験的機能)。claude -p などの非対話では仲間を作れない |
| in-process(既定) | どのターミナルでも動く。仲間は 1 つの画面の中で ↑↓ で選んで Enter で切り替える。連絡のなめらかさは分割ペインと同じ |
| ① iTerm2 |
tmux なしで分割ペイン になる。it2 CLI を入れ、iTerm2 の設定で Python API をオンにする(Settings → General → Magic → Enable Python API)。"teammateMode": "iterm2" で指定する(v2.1.186 以降)。"auto" でも it2 CLI が入っていれば iTerm2 を使うが、入っていないと黙って in-process に落ちる(v2.1.77 より前は auto が iTerm2 を判定しなかった) |
| ② tmux | tmux の中で claude を起動すると分割ペインになる。ターミナルを選ばない。公式は iTerm2 で使うなら tmux -CC から入るのを推奨 |
| 分割ペイン非対応 | VS Code の統合ターミナル、Windows Terminal、Ghostty |
| 例:cmux | cmux は Ghostty のエンジンで作られたターミナルアプリなので、単体では分割ペインにならない(in-process なら動く)。cmux のペインで tmux を起動し、その中で claude を動かす |
| リモートのマシン | ssh の先には iTerm2 の画面がないので、リモートでは tmux 一択。この記事の CASE 2〜4 が tmux を使うのはこのため |
| マシンとアカウント | チームは 1 つのセッションの中。仲間はリーダーと同じマシン・同じログイン(アカウント)で動く。別の Claude アカウントどうしを 1 つのチームにはできない |
cmux の CLI(cmux new-workspace など)は、cmux から起動したプロセスしか受け付けない設定にしていると、tmux の中から呼ぶと Broken pipe で失敗します。tmux の中にいるときは、ペインの操作も tmux で行います。
この記事での呼び名
この記事では、つなぐための部品をたとえで呼びます。
| 呼び名 | 実体 | 出てくるところ |
|---|---|---|
| 仲間 | Agent Teams の teammate。リーダーが立てる別の Claude セッション | CASE 1・3 |
| のぞき窓 |
ssh -t remote "tmux attach -t '=名前'" でリモートの tmux 画面を見ること。抜けるときは detach(Ctrl+b → d) |
全ケース |
| 打ち込み | リモートの tmux に文字を貼り付けて Enter を送ること(tmux load-buffer → paste-buffer → send-keys Enter。rmac send) |
CASE 3・4 |
| 手紙 | Claude どうしの SendMessage(cross-session messaging)。別マシン間は Remote Control を経由し、同じアカウントのときだけ届く | CASE 2 |
| Remote Control |
claude --remote-control / /remote-control。セッションを claude.ai につなぎ、スマホや別マシンから届くようにする |
CASE 2 |
| 郵便受け | リモートのファイル ~/.rmac/inbox/<名前>.md。相手が報告を書き、最後の行を STATUS: DONE / BLOCKED / QUESTION にする |
CASE 3・4 |
| 見張り | 母艦で郵便受けを定期的に見るループ(rmac wait を Claude Code の Monitor やバックグラウンドで回す)。画面のエラーやペインの消失も見ておくとよい |
CASE 3・4 |
言いたいことは 4 つ
- Agent Teams をそのまま使えるのは、同じマシンの中だけ。 仲間との連絡帳がそのマシンのファイルだから。
- 同じアカウントなら、別のマシンともつながる。 ただし Agent Teams ではなく、Remote Control 経由の手紙(SendMessage)で。
- 別アカウントのマシンにも、tmux でリーダーを立てれば、そのマシンの中で Agent Teams を回せる。 チームはリモートのアカウントの中で完結し、母艦とは打ち込み・郵便受けでつながるだけ。アカウントをまたいで 1 つのチームになるわけではない。← ここが重要
- codex も相手にできる。 tmux に打ち込んで頼み、報告はファイル(郵便受け)でもらう。
| ケース | リーダー | 子 | 頼み方 → 報告 | Agent Teams |
|---|---|---|---|---|
| 1. 同じマシン・同じアカウント | 母艦 | 母艦 | 仲間どうしで会話 | そのまま使う |
| 2. 違うマシン・同じアカウント | 母艦 | リモート | 手紙 → 手紙 | 使わない(手紙で代わり) |
| 3. 違うマシン・違うアカウント | リモート | リモート | 打ち込み 1 回 →(任意で郵便受け) | リモートの中で使う |
| 4. 違うマシン・codex | 母艦 | リモートの codex | 打ち込み → 郵便受け | 使えない |
つなぐための 4 つの部品
| 部品 | できること | 届く範囲 |
|---|---|---|
| ssh + tmux(のぞき窓とキーボード) | リモートの画面を見る・文字を打ち込む・画面を読む | ssh が通ればどこでも。アカウント・AI の種類を問わない |
| Agent Teams(同じ机の仲間) | リーダーが仲間を呼び、話しながら分担する | 同じマシンの中だけ |
| cross-session messaging(手紙) | Claude が別の Claude に SendMessage を送り、返事が届く | 別マシンなら、両方が Remote Control に接続していて同じ claude.ai アカウント |
| 郵便受け + 見張り | 相手が報告をファイルに書き、母艦の見張りが拾う | ssh が通ればどこでも |
CASE 1:同じマシン・同じアカウント → Agent Teams をそのまま
母艦の claude を tmux の中 で起動しておけば、Agent Teams の仲間が分割ペインに並びます。仲間からの報告は自動で届き、困った仲間には直接話しかけられます。
{
"env": { "CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS": "1" },
"teammateMode": "auto"
}
# tmux の中で起動して、自然な言葉で頼む
tmux new -s work
claude --permission-mode auto
> issue #1 #2 #3 を、それぞれの worktree で並行実装する teammate を 3 体作って
- teammate は Claude だけ。teammate が teammate を作ること(入れ子)はできない
- 頼んだのに分割ペインが増えないときは、中身の見えない subagent で代用されていることがある。
tmux list-panesで確かめる
CASE 2:違うマシン・同じアカウント → 手紙でつなぐ
Agent Teams ではありません。 仲間は同じマシンの中にしか呼べないので、母艦のリーダーとリモートの子は 手紙(SendMessage) でやりとりします。手紙は Remote Control を通るので、両方が同じ claude.ai アカウント で、両方が Remote Control に接続 している必要があります。
# 1. 母艦のセッションで(人が打つ。Claude からは実行できない)
/remote-control
# 2. リモートに子を Remote Control 付きで起動(表示名 = 手紙の宛先の名前)
rmac start child-a '~/project/wt-a' child-a
rmac start child-b '~/project/wt-b' child-b
- 母艦の Claude に
ListAgentsで子が見えることを確かめさせ、最初の指示を SendMessage で送らせる(打ち込みで頼むと、子は返事の宛先を知らない) - 指示の最後に「報告は、受け取ったメッセージの
fromにそのまま SendMessage で」と書く。別マシンからは母艦の名前が違って見えるので、名前で探させない - 子が PR を作る・止まる・質問すると、母艦の会話に手紙が届く
全セッションを最初から接続させたいなら ~/.claude/settings.json に "remoteControlAtStartup": true。接続済みかは環境変数 CLAUDE_CODE_BRIDGE_SESSION_ID の有無でわかります。
CASE 3:違うマシン・違うアカウント → tmux でリーダーを立て、そのマシンの中で Agent Teams
いちばん大事なケースです。
このケースは、筆者はまだ通しで試していません(同じアカウントで手紙を使う CASE 2 は実機で確認済み)。
手紙はアカウントをまたげません。でも tmux(ssh)はアカウントに関係ありません。リモートの tmux にリーダーを立てて 1 回だけ打ち込んで頼めば、リーダーと子はリモートの中で「同じマシン・同じアカウント」になり、そのマシンの中で Agent Teams が使えます。
母艦のアカウントのセッションがそのチームに加わるわけではありません。母艦とチームをつなぐのは、最初の打ち込みと、必要なら郵便受けだけです。
# リモートでも Agent Teams を有効にしておく(CASE 1 と同じ settings.json)
# リーダーを起動(Remote Control は不要。付ければスマホから見られる)
rmac start lead '~/project'
# 1 回だけ頼む
rmac send lead <<'EOF'
issue #1 #2 #3 を並行実装してください。あなたはこのマシンのリーダーです。
このマシンの Agent Teams で teammate を作り、PR のマージまで進めてください。
さらに別のマシンへは任せないでください。
EOF
# 見たいときだけ覗く(抜けるときは Ctrl+b → d)
ssh -t remote "tmux attach -t '=lead'"
- 使用量は リモートのアカウント にかかる。母艦の枠を使い切りたくないときにも使える
- 頼んだら母艦は閉じてよい。報告がほしければ、最後に郵便受け(CASE 4)へ書いてもらう
- PR の作成・マージは各マシンの
ghの認証で行う。Claude のアカウントとは関係ない
CASE 4:違うマシン・codex → 打ち込み+郵便受け
codex は Claude ではないので、手紙も Agent Teams も使えません。tmux に打ち込んで頼み、報告は ファイル(郵便受け) に書いてもらい、母艦の 見張り が拾います。画面の文字は流れて消えますが、ファイルなら「来たか」だけ見ればよいので確実です。
# codex を tmux で起動(対話モード)
ssh remote "tmux new-session -d -s cx-a -c ~/project/wt-a 'zsh -ic \"codex; exec zsh -i\"'"
# 頼む(最後に郵便受けの書き方を付ける)
rmac send cx-a <<'EOF'
issue #1 を実装して PR を作ってください。
終わったとき・止まったときは ~/.rmac/inbox/cx-a.md に報告を書き、
最後の行を STATUS: DONE / BLOCKED / QUESTION のどれかにしてください。
EOF
# 母艦で見張る(Claude Code の Monitor やバックグラウンド実行で回す)
rmac wait cx-a 60
# 画面のいらない仕事なら codex exec。最後の返事がそのまま郵便受けに入る
ssh remote "cd ~/project/wt-a && codex exec -o ~/.rmac/inbox/cx-a.md 'issue #1 を実装して'"
同じやり方は、CASE 2 で手紙を使えないとき(Remote Control を使いたくないときなど)にもそのまま使えます。
道具:rmac(約 70 行)
上で使った rmac は、ssh と tmux の部品を 1 本にまとめた最小のヘルパーです。起動スクリプトをリモートにファイルで置くので、引用符の三重入れ子が起きません。RMAC_HOST で接続先を変えられます(既定は remote)。
| やること | コマンド | 中身 |
|---|---|---|
| 起こす | rmac start <名前> <dir> [表示名] |
リモートの tmux に claude を起動。表示名を付けると Remote Control 付き |
| 打ち込む | rmac send <名前> [file] |
base64 で運び、tmux のバッファから貼り付けて Enter(日本語・引用符が崩れない) |
| 読む | rmac screen <名前> |
tmux capture-pane の末尾 |
| 見張る | rmac wait <名前> |
郵便受けの最終行が STATUS: になるまで待つ |
| 片付ける | rmac stop <名前> |
tmux kill-session |
| 覗く | ssh -t remote "tmux attach -t '=名前'" |
抜けるときは Ctrl+b → d(Ctrl+C は claude が終了する) |
#!/usr/bin/env bash
# rmac — リモート Mac の tmux で Claude を動かす最小ヘルパー
# rmac start <session> <dir> [表示名] 表示名を付けると Remote Control 付きで起動
# rmac send <session> [file] 指示を貼り付けて Enter(file 省略時は標準入力)
# rmac screen <session> [行数] 画面の末尾を読む
# rmac wait <name> [間隔秒] 郵便受け ~/.rmac/inbox/<name>.md の最終行が STATUS: になるまで待つ
# rmac stop <session>
set -euo pipefail
HOST="${RMAC_HOST:-remote}"
# リモートで bash スクリプトを実行する。引数は VAR=値 で渡し、-- の後ろは標準入力のスクリプト
remote() {
local pre="export PATH=/opt/homebrew/bin:/usr/local/bin:\$PATH; mkdir -p ~/.rmac/inbox ~/.rmac/run;"
while [ "$1" != "--" ]; do pre+=" ${1%%=*}=$(printf %q "${1#*=}");"; shift; done; shift
{ echo "$pre"; cat; } | ssh -o BatchMode=yes "$HOST" bash -s
}
cmd="${1:-}"; [ $# -gt 0 ] && shift
case "$cmd" in
start)
remote S="$1" D="$2" L="${3:-}" -- <<'EOF'
case "$D" in "~"|"~/"*) D="$HOME${D#\~}";; esac
f=~/.rmac/run/$S.sh
{
echo '#!/bin/zsh'
printf 'cd %q || exit 1\n' "$D"
if [ -n "$L" ]; then
echo 'unset CLAUDE_CODE_OAUTH_TOKEN' # Remote Control は長期トークンでは起動しない
printf 'claude --permission-mode auto --remote-control %q\n' "$L"
else
echo 'claude --permission-mode auto'
fi
echo 'exec zsh -i' # claude が終わってもペインを残す
} > "$f"
chmod +x "$f"
tmux new-session -d -s "$S" -x 200 -y 50 "zsh -ic $f"
echo "started: $S"
EOF
;;
send)
B=$(base64 < "${2:-/dev/stdin}")
remote S="$1" B="$B" -- <<'EOF'
printf %s "$B" | base64 -D | tmux load-buffer -b rmac -
tmux paste-buffer -p -d -b rmac -t "=$S:"
sleep 1; tmux send-keys -t "=$S:" Enter
EOF
;;
screen)
remote S="$1" N="${2:-40}" -- <<'EOF'
tmux capture-pane -p -t "=$S:" | sed -e :a -e '/^[[:space:]]*$/{$d;N;ba' -e '}' | tail -n "$N"
EOF
;;
wait)
while :; do
out=$(remote N="$1" -- <<'EOF'
f=~/.rmac/inbox/$N.md
[ -f "$f" ] && tail -n 1 "$f" | grep -q '^STATUS:' && cat "$f"
true
EOF
)
[ -n "$out" ] && { printf '%s\n' "$out"; exit 0; }
sleep "${2:-60}"
done
;;
stop)
remote S="$1" -- <<'EOF'
tmux kill-session -t "=$S"
EOF
;;
*) sed -n '2,8p' "$0"; exit 2 ;;
esac
ハマりどころ
| 症状 | 原因と対処 |
|---|---|
| Remote Control が起動しない |
claude setup-token の長期トークン(CLAUDE_CODE_OAUTH_TOKEN)では起動できない。リモートで claude auth login し、起動時に unset する(rmac は自動) |
| 子が返事の宛先を見つけられない | 名前で探させている。指示を SendMessage で送り、from へ返信させる |
zsh: work not found |
リモートの zsh が =work をパス展開する。'=work' と引用符で囲む |
can't find pane: =work |
ペインを指す引数では末尾に : が要る。'=work:'
|
| ループ内の ssh が入力を食う | 入力の要らない ssh には -n を付ける |
timeout: command not found |
macOS には無い。待ち時間は呼び出し側で管理する |
Remote Control の長時間(8 時間以上)連続稼働は未検証です。手紙での会話は Anthropic のサーバーを経由します(スマホから使うときと同じ)。
付録:iTerm2・cmux・tmux とは
-
iTerm2:macOS の定番ターミナルアプリ。Python API と
it2CLI で外からペインを操作できるので、Agent Teams は tmux なしで仲間を分割ペインに並べられる("teammateMode": "iterm2")。 - cmux:AI コーディングエージェントを並べて使うための macOS ターミナルアプリ。Ghostty のエンジンで動き、縦タブ・ワークスペース・通知などを持つ。Agent Teams の分割ペインには対応していないので、中で tmux を起動して使う。
- tmux:ターミナルの中を複数のペインやウィンドウに分けるソフト(ターミナル多重化)。セッションは tmux のサーバー側で動き続けるので、画面を閉じても・ssh が切れても止まらない。ssh の先でも使えるので、リモートで Claude を動かす土台になる。









