Macで Claude Code に作業させながら、席を立ったあともスマホから続きを指示したい。
それを叶えるのが Remote Control です。
公式ドキュメントどおりにやれば数分で終わる……はずが、実際には3回つまずきました。
同じところで止まる人が多そうなので、原因と直し方をまとめます。
先に結論から。
つまずいたのはこの3つでした。
- デスクトップアプリしか入っておらず、
claudeコマンドが存在しなかった - インストール後、開きっぱなしのターミナルでは PATH が古いままだった
.zprofileに紛れ込んだ全角スペースが、毎回エラーを吐いていた
Remote Control とは
claude.ai/code やスマホの Claude アプリから、自分のマシンで動いている Claude Code のセッションに接続する機能です。
重要なのは、処理はすべて手元の Mac で走るということ。
ファイルも MCP サーバーもローカルの環境がそのまま使えて、スマホ側は窓を覗いているだけです。
クラウド上で動く「Claude Code on the web」とはここが違います。
通信は手元からのアウトバウンド HTTPS のみで、待ち受けポートは開きません。
ノートを閉じてもネットが切れても、復帰時に自動で再接続してメッセージや権限確認を配送し直してくれます。
利用には Pro / Max / Team / Enterprise のいずれかが必要です(API キー認証では使えません)。
設定そのものは1行
自動接続を有効にするには、~/.claude/settings.json にこれを足すだけです。
{
"remoteControlAtStartup": true
}デスクトップアプリなら 設定 > Claude Code > Enable remote control by default が同じトグルです。
ここで注意点がひとつ。
この設定は「設定したあとに開いたセッション」にしか効きません。
すでに動いているセッションには適用されないので、「設定したのに何も起きない」の半分はこれが原因です。
罠1:デスクトップアプリに CLI は入っていない
設定を入れたのに何も表示されず、代わりに「ターミナルで claude rc を実行してください」と言われました。
言われたとおり打つと、こうなります。
$ claude rc
zsh: command not found: claude調べてみると、コマンドの実体がどこにもありません。
$ which claude
claude not found~/.local/bin、/opt/homebrew/bin、npm のグローバル、Claude.app のバンドル内——どこにもない。
デスクトップアプリ(Claude.app)と CLI(claude コマンド)は別物です。
アプリを入れただけではコマンドは生えません。
Remote Control のセッションを立てるのは CLI か VS Code 拡張の役目なので、まず CLI を入れる必要がありました。
インストール
公式インストーラが推奨です。
ネイティブビルドが入り、バックグラウンドで自動更新されます。
curl -fsSL https://claude.ai/install.sh | bashHomebrew でも入ります。
/opt/homebrew/bin に入るので PATH をいじらずに済む代わりに、自動更新はされません。
brew install --cask claude-codeインストール先は ~/.local/bin/claude で、実体は ~/.local/share/claude/versions/<version> へのシンボリックリンクです。
Version: 2.1.258
Location: ~/.local/bin/claude罠2:PATH は開き直すまで更新されない
インストーラがこう言ってきます。
Native installation exists but ~/.local/bin is not in your PATH. Run:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc~/.zshrc の末尾に追記します。
# Claude Code
export PATH="$HOME/.local/bin:$PATH"……が、開きっぱなしのターミナルではまだ command not found のままです。
当たり前といえば当たり前ですが、シェルの起動ファイルはシェルを起動したときにしか読まれません。
すでに開いているタブの PATH は、設定を書き換えた瞬間には変わらないのです。
対処は次のどれかです。
- ⌘T で新しいタブを開く(一番確実)
source ~/.zshrcで読み直す- その場しのぎで
export PATH="$HOME/.local/bin:$PATH"を直接打つ
私はここで2回同じエラーを踏みました。
「設定は正しいのに動かない」と思ったら、まずタブを開き直してみてください。
罠3:全角スペースが仕込まれていた
シェルを起動するたび、毎回この行が出ていました。
(eval):8: command not found: 犯人は ~/.zprofile の1行目でした。cat -v で不可視文字を可視化すると、こう見えます。
$ sed -n 1p ~/.zprofile | cat -v
eval "$(/opt/homebrew/bin/brew shellenv)" M-cM-^@M-^@末尾の M-cM-^@M-^@ は UTF-8 の E3 80 80、つまり全角スペース(U+3000)です。
日本語入力のまま編集して、変換確定の余韻で紛れ込んだのでしょう。
なぜエラーになるのか
eval は引数を空白で連結してから、まとめてシェルコマンドとして評価します。
eval "$(brew shellenv)" brew shellenv は7行ほどの export 文を吐きます。
その後ろに全角スペースが連結されると、8行目に「全角スペースだけの行」ができる。
zsh はそれをコマンド名だと解釈して探しに行き、見つからずに (eval):8: command not found を出していたわけです。
エラーメッセージの :8 が、まさにその行番号でした。
半角スペースなら区切り文字として無視されますが、全角スペースはただの文字なので区切りになりません。
ここが厄介なところです。
見つけ方
目視ではまず気づけません。
こう探します。
LC_ALL=C grep -n '[^ -~]' ~/.zprofile | cat -vLC_ALL=C でバイト単位に落として、ASCII の印字可能文字(スペース〜チルダ)以外を含む行を、不可視文字を可視化して表示します。
.zshrc .zshenv .bash_profile あたりも一緒に見ておくといいでしょう。
なお、日本語のコメントを書いている行も当然ヒットします。
コメント行ではなく、コマンドが書かれている行に不可視文字が乗っていないかを見てください。
ちなみに同じ .zprofile に eval "$(brew shellenv)" が7回書かれていました。
Homebrew を入れ直すたびに追記されたのだと思います。
害はありませんが、PATH に /opt/homebrew/bin が重複して入ります。
ログインとワークスペース信頼
CLI を入れたら、ログインします。
claude auth loginデスクトップアプリの認証は CLI と共有されません。
アプリで普段使えていても、CLI 側では改めてサインインが要ります。
状態は claude doctor で確認できます。
ログイン前はこう出ます。
Remote Control
Remote Control requires a claude.ai subscription. Run claude auth login to sign in.
- Not signed in to claude.ai
- claude.ai subscription auth not active
- Sign-in is missing the user:profile scopeログイン後はこうなります。
エラー3件が消えて、案内1行だけになれば成功です。
Remote Control
Control this session from claude.ai/code or the Claude mobile appあとはプロジェクトのディレクトリで起動します。
cd ~/path/to/project && claude初回は「このフォルダを信頼しますか」と聞かれるので承認します。
ホームディレクトリでは信頼が保存されない仕様なので、プロジェクトのディレクトリで起動してください。
つながったか確かめる
3か所で確認できます。
- ターミナル:入力欄の下のフッターに
/rc activeと表示される(ウィンドウが狭いと隠れます) - スマホ:Claude アプリの Code タブにセッション一覧が出る。
PC アイコン+緑の点でオンライン - ブラウザ:claude.ai/code に同じ一覧が出る
出ていなければ、ターミナルで /remote-control と打てば手動接続できます。
セッション URL と QR コードが表示されるので、QR をスマホで読めばそのまま開きます。
いま話している会話を、そのまま持っていく
すでに動いているセッションの続きをスマホでやりたい場合は、その入力欄でこう打ちます。
/remote-control短縮形は /rc です。
会話履歴を引き継いだままリモート接続されます。
名前を付けたければ /remote-control プロジェクト名 のように引数を渡せます。
サーバーとして常駐させたいなら、こういう起動の仕方もあります。
claude remote-controlターミナルに居座って接続を待ち受け、スペースキーで QR コードを表示してくれます。
おまけ:claude doctor の結果は起動元に影響される
デスクトップアプリの中から claude doctor を実行したら、こう出ました。
Auto-updates: disabled (set by env: DISABLE_AUTOUPDATER)自動更新を期待してネイティブインストーラを選んだのに、と焦りましたが、調べると設定ファイルにもログインシェルにも DISABLE_AUTOUPDATER は書かれていませんでした。
$ env -i HOME="$HOME" /bin/zsh -ic 'echo $DISABLE_AUTOUPDATER'
(空)環境を継承しないシェルでは空。
つまりデスクトップアプリのプロセス環境だけに設定されていた値で、普通のターミナルから起動する分には自動更新は効きます。
claude doctor は実行したプロセスの環境変数を読むので、どこから叩いたかで結果が変わります。
診断は素のターミナルから実行するのが確実です。
まとめ
Remote Control 自体は設定1行で、仕組みもよくできています。
つまずいたのは全部その手前でした。
| つまずき | 原因 | 対処 |
|---|---|---|
command not found: claude | デスクトップアプリに CLI は含まれない | 公式インストーラで CLI を導入 |
インストール後も command not found | 開いているシェルの PATH は更新されない | タブを開き直す |
(eval):8: command not found | .zprofile に全角スペース混入 | LC_ALL=C grep で探して削除 |
| 設定したのに自動接続しない | 設定前から動いているセッションには効かない | 新しいセッションを開くか /rc |
| CLI でログインを求められる | アプリと CLI で認証は別 | claude auth login |
特に全角スペースは、日本語環境で設定ファイルを編集する人なら誰でも踏みうる地雷です。
原因不明のシェルエラーが出ていたら、一度 LC_ALL=C grep -n '[^ -~]' で洗ってみることをおすすめします。
