結論:CIではbareを起点に必要物だけを足す
Claude Codeを無人実行する時は、claude --bare -pを起点に、credential、読込context、tool、出力schema、timeout、成功条件をjob側で明示します。-pだけではinteractive dialogがないままproject hooksやMCPを読み得ます。bare modeはauto-discoveryを止めますが、Bash・Read・Editという能力そのものを消す設定ではないため、taskとpermissionも狭くします。
読者の困りごとは、開発者端末では成功したscriptがCIで別のhookやpluginを読み、credentialを使い、stdoutの自然文だけを成功として後工程へ渡すことです。この記事を読むと、通常-pとbare modeを比較し、read-onlyから段階導入できます。
次の行動:一つのrepositoryで「READMEを読みJSONで要約する」だけのjobを選び、write・network・MCPなしで試してください。
公式仕様:bareが省くものと残すもの
公式headless文書では、-pまたは--printで非対話実行し、成功時はexit code 0、失敗時はnon-zeroを返します。invalid flagは開始前にstderrへ、authenticationなど実行中の失敗はresultとしてstdoutへ出る場合があります。したがってchannelだけでなくexit codeとpayloadの両方を検査します。
--bareはhooks、skills、plugins、MCP servers、auto memory、CLAUDE.mdの自動探索を省き、machineごとの差を減らします。未trust folderでも-pはdialogを出せないため、bareなしではproject settingsのhookや.mcp.jsonが動く可能性があります。bareはscriptとSDK callで公式推奨とされ、将来-pのdefaultになる予定です。
bare modeはClaude subscriptionのOAuth credentialやsystem keychainを読みません。Anthropic APIならCI secretとしてANTHROPIC_API_KEYを渡すか、--settings内のapiKeyHelperを明示します。Bedrock、Google Cloud、Microsoft Foundryは各provider credentialを使います。secretをprompt、log、artifactへ書かず、job identityと短い有効期間を優先します。
必要contextは--append-system-prompt、--settings、--mcp-config、--agents、--plugin-dirなどで個別指定します。stdinは10MB上限で、超える入力はfileへ置いてpathを示します。structured outputはtext、json、stream-jsonを選べ、JSON Schemaも指定できます。
通常-pとbare modeを7軸で比較する
- context:端末とprojectの設定を再利用するなら通常、同一入力を再現するならbareです。
- trust:interactive確認を前提にできないCIでは、repository由来の自動実行をbareで止めます。
- credential:通常はlogin状態に依存し得ますが、bareはAPI keyなどを明示します。
- tool:どちらでも能力を持ち得るため、
--allowedToolsとpermission modeを別途固定します。 - 出力:人が読むtextではなく、schema、exit code、test結果をmachine gateにします。
- 依存:MCPやpluginが必要ならpath、version、checksum、load errorを確認します。
- 費用:jobごとの
total_cost_usd、model内訳、再試行、上限を記録します。
bareは「安全mode」ではなく「implicit contextを省くmode」です。Bash、file read、file editは利用できるため、untrusted pull requestへwrite tokenを渡したり、--dangerously-skip-permissionsを常用したりすれば境界は失われます。checkout、network、secret、tool、artifactをCI platform側でも制限してください。
無人実行を安全にする8手順
- read-onlyで失敗影響の小さいtaskを選び、期待JSONと不合格条件を先に書きます。
- runnerをfresh checkoutまたはcontainerへ隔離し、fork由来codeをtrustしない前提にします。
claude --version、model、provider、install channelをjob logへ残します。--bare -pを使い、必要なsettings、system prompt、MCPだけを明示します。- API keyをCI secret storeから最小scopeで渡し、stdout、debug、artifactのmaskをtestします。
--allowedToolsをReadなど必要最小限にし、Bash、Edit、networkは業務理由がある時だけ足します。--output-format jsonとJSON Schemaを使い、exit code、error field、load error、testを検査します。- 時間、費用、入力size、background waitへ上限を置き、失敗時は後工程を止めて人へ証拠を渡します。
チェックリストとHOLD条件
- bareを選ぶ理由がある
- fresh runnerを使う
- untrusted codeを分離した
- versionを固定した
- credentialをsecret storeから渡す
- log maskをtestした
- allowedToolsを限定した
- MCPとpluginを明示した
- stdinが10MB以内
- schemaを固定した
- exit codeを検査する
- 費用上限がある
- timeoutがある
- artifact保持期間を決めた
HOLDするのは、外部contributorのcodeへwrite credentialを渡す、bareなしの暗黙hookを把握していない、permission skipを前提にする、自然文に「成功」とあれば通す、MCP load errorを無視する、費用・時間上限がない場合です。
よくある質問と次の行動
bareならMCPは使えませんか?
自動探索しないだけです。必要なserverは--mcp-configで明示し、system/initのstatusとerrorを検査できます。
background processは残りますか?
background Bash taskはfinal result後、stdin closeから約5秒で終了します。background subagentは結果待ちの対象で、既定上限があります。job timeoutも別に置きます。
jsonなら必ず正しい結果ですか?
形式が正しいだけでは業務内容の正しさを保証しません。schema validationに加え、deterministic test、人のreview、差分上限を組み合わせます。
非対話仕様は公式headless guide、flagはCLI reference、trust境界はpermissionsで公開前に確認してください。
workspace trustはtrust判断、secretはcredential masking、費用はcost管理へつなげます。Miraigentの無料診断では、CIの入力、権限、secret、出力、停止条件を整理します。

