「Commands refused」エラーの原因と対処 — Claude Codeバックグラウンド
Claude Codeのバックグラウンドセッションで/install-github-appや/mcpが拒否される理由と、agent viewからアタッチして再実行する手順を解説します。
Claude Codeのバックグラウンドセッションで /install-github-app や /mcp の設定一覧を開こうとすると、ダイアログは開かずにメッセージが返ります。原因は、そのセッションに対話端末が接続されていないことです。対処は、agent viewから該当セッションにアタッチして同じコマンドを実行し直すだけです。
画面に出るメッセージと、拒否されるコマンド
バックグラウンドセッションは claude agents(agent view)や /bg、claude --bg で作れます。端末を占有せずに裏で動き続ける一方、選択肢やブラウザ承認を伴うダイアログは、画面の前に人がいないと完結しません。裏でセッションを動かしているsupervisorの再起動時に、実行中の処理を次のプロセスへ引き継ぐかどうかは設定で変えられます。
端末が接続されていないときに応答だけが返るのは、/install-github-app、/mcp の設定一覧、MCPサーバーメニューの認証アクションです。/mcp の設定一覧なら、次の文言になります。
文言はコマンドごとに変わります。agent viewの Needs input に移るのは、このうち /install-github-app と /mcp の設定一覧の2つです。MCPサーバーメニューの認証アクションはメッセージが返るだけで、行は移りません。
端末がなくても動くもの・動かないもの
拒否される
/install-github-app/mcpの設定一覧- MCPサーバーメニューの認証アクション
そのまま動く
/mcp reconnect <server>/mcp enable/mcp disable
Claude Codeは、この種の拒否を「端末が付くまで待つ状態」として扱い、agent viewの一覧に出します。
対処法 — agent viewからアタッチして再実行する
拒否されたコマンドを通す流れ
- 1
agent viewを開く
シェルで
claude agentsを実行します。 - 2
Needs inputの行を選ぶ
/mcpの拒否なら、行の説明にopen this session to manage MCP serversのような案内が出ています。行を選んでSpaceを押すとpeekパネルが開き、全文を読まずに最新の出力や待っている質問を確かめられます。各行には、セッション名、直近の状況、時刻が並びます。 - 3
アタッチして同じコマンドを打つ
行を選んで
Enterか→を押します。アタッチ時にはClaudeが不在中の出来事を短く要約し、端末が付いた状態では/install-github-appも/mcpも通常どおり動きます。Needs inputの行は、アタッチした時点で消えます。 - 4
←で戻る
空のプロンプトで
←を押すか/exitを実行すると、セッションはバックグラウンドに戻ります。
シェルからセッションIDを直接指定する方法もあります。claude attach <id> なら、agent viewの一覧を経由せずに入れます。IDは claude --bg が起動時に表示するほか、claude agents の一覧にも出ます。v2.1.289の --help は次のとおりです。
claude attach --help
# Usage: claude attach <id>
#
# Open the background session in this terminal. ← returns to agent view,
# Ctrl+Z drops back to your shell. The session keeps running either way.claude logs <id> は、セッションの直近の端末出力をシェルに表示します。アタッチする前に、どのコマンドが拒否されたかを確かめる用途に使えます。
同じコマンドを、端末の付いた通常のセッションで先に済ませておく手もあります。claude を直接起動したセッションはその端末につながっているため、ダイアログがそのまま開きます。
/mcp は、パネルを開かずに済ませる道があります。拒否メッセージ自体が /mcp enable|disable|reconnect <server> を案内しています。MCPサーバーの認証アクションだけは、アタッチして /mcp を開き、進めます。
似た表示との見分け方
バックグラウンドセッションまわりには、よく似た状況がいくつかあります。メッセージの文言で切り分けられます。
| 見えるもの | 起きていること | 次の一手 |
|---|---|---|
Can't open MCP settings while no terminal is attached… | 起きていること端末なしで /mcp の設定一覧を開いた | 次の一手アタッチして再実行、または /mcp reconnect など |
入力欄に attach to a session to run it のヒント | 起きていることagent viewの入力欄から、直接は実行できない組み込みコマンドを打った | 次の一手入力は残るので、セッションにアタッチして実行 |
Can't open — this session is running in another terminal | 起きていること別の端末で claude --resume や /resume したセッションを開こうとした | 次の一手その端末で続けるか、終了してから開き直す |
| peekパネルでの返信が処理されない | 起きていること権限確認やサンドボックスなど、ダイアログ待ち | 次の一手返信はキューに残る。→ でアタッチしてダイアログに答える |
2行目の補足です。agent viewの入力欄では、スキル、自作コマンド、/init のようにプロンプトへ展開される組み込みコマンドは、新しいセッションの最初のプロンプトとして送られます。ヒントが出るのは、それ以外の組み込みコマンドです。
claude --bg の起動時にも拒否は起きますが、別の種類です。-p や --print と組み合わせると、セッションを作る前に拒否されます。--print は、agent viewがアタッチする対話セッションを起動しないためです。信頼していないディレクトリでは、先にワークスペースの信頼確認が出ます。断ると、セッションを作らずに終了します。スクリプトのように確認画面を出せない場所では、Workspace not trusted エラーで終わります。
端末がアタッチされているかどうかは、/status が教えてくれます。表示されるセッションの種類は、interactive、またはバックグラウンドで attached か unattended のいずれかです(v2.1.221以降)。
アタッチしたあとの挙動と、セッションの状態
アタッチしても、セッションの性質は変わりません。覚えておくと迷わない点が4つあります。
- アタッチした画面は、
tuiの設定にかかわらず常にフルスクリーン表示です。バックグラウンドセッションには、追記先になる端末のスクロールバックがないためです。スクロールはPgUp、PgDn、マウスホイールで行い、Ctrl+Oでトランスクリプトモードに入ります。 ←、Ctrl+Z、/exit、Ctrl+CやCtrl+Dの2回押しはどれも、セッションを止めずに離れます。終わらせるときは、セッションの中で/stopを実行するか、シェルからclaude stop <id>を使います。止めたセッションも会話は残り、claude attach <id>で開き直せます。- agent viewの行のアイコンが
∙なら、プロセスはすでに終了しています。返信するかアタッチすると、Claudeは途中の状態から再開します。 - agent viewから送った返信が届けられなかったときは、返信が保存され、プロセスが再び起動したときに次のプロンプトとして送られます。先頭に
!を付けたBashコマンドの返信は保存されません。
Needs input の黄色い行は、人にしか答えられない待ち状態を指します。質問への回答、権限の判断、サンドボックスのネットワーク許可、MCPサーバーからの入力要求が該当します。
バージョンによる挙動の違い
同じ「拒否される」でも、バージョンで中身が違います。古いバージョンを使っているなら、先に自分の位置を確かめてください。アップデート後にバックグラウンドセッションが古いバイナリのまま動いていることもあります。claude respawn <id> を実行すると、そのセッションを現行のバイナリで再起動でき、--all なら全件が対象です(v2.1.289の --help による)。
拒否まわりの挙動の移り変わり
- v2.1.207以前ダイアログがバックグラウンド内で開く
/install-github-appも/mcpの設定一覧も、バックグラウンドセッションの中でそのまま開きました。 - v2.1.208〜v2.1.212端末があっても拒否される
Can't open MCP settings in a background sessionのようなメッセージが出ます。通常のclaudeセッションから実行するか、アップデートが回避策です。v2.1.208に限り、/modelのピッカーも拒否され、/upgradeはブラウザを開かずにアップグレードのURLを出力しました。 - v2.1.213〜v2.1.215アタッチすれば動く
端末が付いていれば通常どおり動き、拒否メッセージは「アタッチして再実行」を案内します。ただし、
Needs inputにはまだ移りません。 - v2.1.216以降Needs inputに表示される
/install-github-appと/mcpの設定一覧が拒否されると、セッションがNeeds inputグループに移り、探しやすくなります。
自分のバージョンは claude --version で確かめられます。v2.1.289では 2.1.289 (Claude Code) と1行で表示されます。v2.1.216より前のバージョンでは Needs input に行が出ないので、拒否されたセッションは自分で探すことになります。
Needs inputのセッションをスクリプトで拾う
Needs input に並ぶセッションを機械的に拾いたい場合は、claude agents --jsonでバックグラウンドセッションを操作する方法が参考になります。--json は稼働中のセッションをJSON配列で出力して終了します。--all を付けると完了済みも含み、--cwd <path> で特定のディレクトリ配下に絞れます(v2.1.289の --help による)。監視スクリプトから拒否を拾って通知に回せます。
よくある質問
アタッチしたのに ← で戻れないときは
Windowsでは、アタッチ直後の約0.5秒以内に ← を押すと Ambiguous ←, press again to detach と表示されます。もう一度押せば戻ります。ダイアログにフォーカスがあって ← が効かないときは、Ctrl+Z で戻れます。Ctrl+Z の戻り先は、agent viewから入ったならagent view、claude attach から入ったならシェルです。
まとめ
端末のないバックグラウンドセッションで拒否されたら、Needs input の行から入って同じコマンドを打ち直します。サーバー単位のMCP操作なら、アタッチせずに /mcp reconnect などで済みます。
Claude Code全般でよく出るエラーは、Claude Codeでよくあるエラー10選で対処をまとめています。