Claude Code headlessモード完全ガイド|-pフラグ・JSON出力・セッション管理でCI/CDと自動化スクリプトに組み込む方法

Claude Code headlessモード完全ガイド|-pフラグ・JSON出力・セッション管理でCI/CDと自動化スクリプトに組み込む方法 AI開発

Claude Codeは対話型AIアシスタントとして使うだけでなく、スクリプトやCI/CDパイプラインから呼び出す自動化ツールとしても使えます。-pフラグを付けることでUIを起動せずにプロンプトを渡し、結果をテキストやJSONで受け取れます。

これをheadless実行(非対話実行)と呼びます。GitHub Actionsのワークフロー・デプロイスクリプト・コードチェックの自動化など、人が画面を見ていない状況でClaude Codeを使いたいときに使います。

この記事では、-pフラグの基本からJSON出力・セッション管理・ストリーミング処理・CI/CDへの組み込みまで解説します。Claude Code全般の基礎はClaude Code完全ガイドを、GitHub Actionsとの連携はClaude Code GitHub Actions完全ガイドを参照してください。

スポンサーリンク

-pフラグで非対話実行する

claude -p "プロンプト"と入力すると、UIを起動せずに一発でClaudeに指示を送って結果を受け取れます。-p--printの短縮形です。

基本的な-p使用例
# 最もシンプルな使い方
claude -p "src/auth/login.ts を読んでバグがあれば報告してください"

# stdinからプロンプトを渡す(パイプ対応)
echo "このコードをレビューして" | claude -p -

# ファイルの内容をプロンプトに含める
claude -p "$(cat error.log) このエラーログの原因を教えてください"

デフォルトではClaude Codeのテキスト応答がそのまま標準出力に出力されます。シェルスクリプトに組み込んで後続の処理に渡すことができます。

シェルスクリプトへの組み込み例
#!/bin/bash
# テスト失敗時にClaude Codeで原因を分析するスクリプト

# テストを実行
TEST_OUTPUT=$(npm test 2>&1)
EXIT_CODE=$?

if [ $EXIT_CODE -ne 0 ]; then
  echo "テスト失敗。Claude Codeで分析中..."
  ANALYSIS=$(claude -p "以下のテスト失敗ログを分析して原因と修正方法を教えてください:

$TEST_OUTPUT" --allowedTools "Read,Bash")

  echo "=== 分析結果 ==="
  echo "$ANALYSIS"
  exit 1
fi

出力フォーマットを選ぶ(–output-format)

--output-formatオプションで結果の形式を指定できます。用途に応じて3つの形式から選びます。

フォーマット 用途 出力内容
text(デフォルト) 人が読む・シェルスクリプトへの組み込み プレーンテキストの応答
json 構造化データ処理・jqでの加工 {result, session_id, usage}をJSONで出力
stream-json リアルタイム処理・長い応答の逐次処理 改行区切りのJSONイベントストリーム

json形式:結果をプログラムで処理する

–output-format json の使い方
# JSON形式で取得
claude -p "src/以下のファイル一覧とその役割を教えてください"   --output-format json

# jqで結果だけを取り出す
RESULT=$(claude -p "バグを特定してください"   --output-format json   | jq -r '.result')

echo "$RESULT"

# セッションIDも取得する
OUTPUT=$(claude -p "分析開始" --output-format json)
SESSION_ID=$(echo "$OUTPUT" | jq -r '.session_id')
RESULT=$(echo "$OUTPUT" | jq -r '.result')
TOKENS=$(echo "$OUTPUT" | jq -r '.usage.input_tokens')

echo "セッションID: $SESSION_ID"
echo "使用トークン: $TOKENS"
json出力の構造
{
  "result": "Claudeの応答テキスト",
  "session_id": "sess_01AbCdEfGhIjKlMnOpQrStUv",
  "usage": {
    "input_tokens": 1523,
    "output_tokens": 847
  }
}

stream-json形式:リアルタイムで受け取る

長い応答をリアルタイムで処理したい場合はstream-jsonを使います。各イベントが改行区切りのJSONで逐次出力されます。

–output-format stream-json の使い方
# ストリーミングでテキストだけを取り出す(リアルタイム表示)
claude -p "詳しい説明をしてください"   --output-format stream-json   --verbose   --include-partial-messages   | jq -rj 'select(
      .type == "stream_event" and
      .event.delta.type? == "text_delta"
    ) | .event.delta.text'

ツール許可と実行環境の制御

–allowedToolsでツールを明示的に許可する

headless実行では確認ダイアログが出ません。Claudeが使おうとしたツールが許可されていない場合、自動的に拒否されます--allowedToolsで使用を許可するツールを明示的に指定してください。

–allowedTools の指定方法
# Read と Bash のみ許可
claude -p "テストを実行して結果を教えてください"   --allowedTools "Read,Bash"

# Bashのコマンドをパターンで制限する
claude -p "gitの変更をコミットしてください"   --allowedTools "Read,Bash(git diff *),Bash(git add *),Bash(git commit *)"

# 読み取りのみ許可(ファイル変更禁止)
claude -p "このプロジェクトのアーキテクチャを説明してください"   --allowedTools "Read,Glob,Grep"

–bareフラグでクリーンな環境で実行する

--bareフラグを付けると、CLAUDE.md・MCPサーバー・カスタムスキルなどの環境依存の設定を読み込まずに実行します。CI/CD環境や異なるマシンでの再現性を確保したい場合に使います。

–bareの使い方
# 環境に依存しないクリーンな実行
claude --bare -p "このファイルのバグを特定して修正してください"   --allowedTools "Read,Edit"

# bareモード + 特定の設定ファイルを指定
claude --bare   --settings ".claude/ci-settings.json"   -p "テストを実行してください"   --allowedTools "Bash(npm test)"
headless実行での権限設定のベストプラクティス
権限は最小限に絞るのが基本です。「何でも許可」ではなく、そのスクリプトが実際に必要とするツールだけを指定してください。settings.jsonによる権限管理の詳細はClaude Code 権限・パーミッション設定完全ガイドを参照してください。

セッション管理:–continueと–resume

通常、-pで実行するたびに新しいセッションが開始されます。前の会話を引き継いで複数のステップに分けて処理したい場合は--continueまたは--resumeを使います。

オプション 説明 使いどころ
--continue 最新のセッションを継続 直前の作業を続けるとき
--resume session_id 指定したセッションIDのセッションを再開 並列処理・後でセッションを再開するとき
セッションを引き継いで複数ステップを処理する
#!/bin/bash
# セッションを引き継いで段階的に作業する例

# Step 1: 最初の作業 → セッションIDを保存
SESSION_ID=$(claude -p "src/auth/ ディレクトリを読んで認証フローを把握してください"   --output-format json   | jq -r '.session_id')

echo "セッションID: $SESSION_ID"

# Step 2: 同じセッションで次の作業
claude -p "把握した認証フローに基づいてセキュリティ上の問題を列挙してください"   --resume "$SESSION_ID"   --output-format json   | jq -r '.result'

# Step 3: さらに続ける
claude -p "最も深刻な問題を修正してください"   --resume "$SESSION_ID"   --allowedTools "Read,Edit"
セッションの有効期限
セッションIDは一定時間で無効になります。長時間の処理を設計する場合は、各ステップのセッションIDをファイルや環境変数に保存しておき、セッション切れの場合は最初からやり直す仕組みも検討してください。

JSON Schemaで構造化された出力を得る

--json-schemaオプションを使うと、Claudeの応答を指定したJSONスキーマに準拠した形式で受け取れます。後続の処理でパースしやすい構造化データが必要なときに使います。

–json-schemaの使い方
# ファイルから関数名のリストを抽出する
claude -p "src/utils/string.ts の全関数名を抽出してください"   --output-format json   --json-schema '{
    "type": "object",
    "properties": {
      "functions": {
        "type": "array",
        "items": {"type": "string"}
      }
    },
    "required": ["functions"]
  }'   | jq '.structured_output.functions[]'

# コードレビュー結果を構造化して取得
REVIEW=$(claude -p "src/auth/login.ts をレビューしてください"   --output-format json   --allowedTools "Read"   --json-schema '{
    "type": "object",
    "properties": {
      "severity": {"type": "string", "enum": ["critical", "warning", "info"]},
      "issues": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "line": {"type": "number"},
            "description": {"type": "string"},
            "suggestion": {"type": "string"}
          }
        }
      }
    }
  }')

# 重大な問題だけを取り出す
echo "$REVIEW" | jq '.structured_output | select(.severity == "critical") | .issues[]'

実践:CI/CDへの組み込み例

① PRの自動コードレビュー

pr-review.sh
#!/bin/bash
# GitHub ActionsのPRレビュー自動化スクリプト

PR_NUMBER="${PR_NUMBER:-$(gh pr view --json number -q .number)}"
DIFF=$(gh pr diff "$PR_NUMBER")

# Claude Codeでレビュー
REVIEW=$(echo "$DIFF" | claude -p "
以下のPull Requestの差分をレビューしてください。

バグ・セキュリティ問題・コードの問題点があれば指摘してください。
問題なければ「LGTM」と一言だけ返してください。

---
$DIFF"   --bare   --allowedTools ""   --output-format json   | jq -r '.result')

# PRコメントとして投稿
gh pr comment "$PR_NUMBER" --body "## ? Claude Code レビュー

$REVIEW"

echo "レビュー完了"

② デプロイ前のセルフチェック

pre-deploy-check.sh
#!/bin/bash
# デプロイ前に変更内容をClaudeにチェックさせる

set -e

echo "デプロイ前チェック開始..."

# 変更ファイルの一覧取得
CHANGED_FILES=$(git diff --name-only origin/main...HEAD)

if [ -z "$CHANGED_FILES" ]; then
  echo "変更なし。チェックをスキップ"
  exit 0
fi

# Claude Codeでチェック
CHECK_RESULT=$(claude -p "
以下のファイルが変更されています:
$CHANGED_FILES

これらのファイルを読んで、本番デプロイで問題になりそうな点を確認してください:
1. 設定ファイルに本番用の値が正しく設定されているか
2. デバッグ用のコード(console.log、TODO等)が残っていないか
3. 環境変数が正しく参照されているか

問題があれば「BLOCK: 理由」、問題なければ「OK」と最初に書いてください。"   --bare   --allowedTools "Read,Glob"   --output-format json   | jq -r '.result')

echo "$CHECK_RESULT"

# BLOCKで始まる場合はデプロイを中断
if echo "$CHECK_RESULT" | grep -q "^BLOCK:"; then
  echo "❌ デプロイをブロックしました"
  exit 1
fi

echo "✅ チェック完了。デプロイを続行します"

③ テスト失敗時の自動デバッグレポート

test-failure-report.sh
#!/bin/bash
# テスト失敗時に自動でデバッグレポートを生成する

TEST_OUTPUT=$(npm test 2>&1) || true
EXIT_CODE=$?

if [ $EXIT_CODE -ne 0 ]; then
  echo "テスト失敗 - Claudeで分析中..."

  # JSON Schemaで構造化されたレポートを生成
  REPORT=$(claude -p "
以下のテスト失敗ログを分析してください:

$TEST_OUTPUT"     --bare     --allowedTools "Read,Glob,Grep"     --output-format json     --json-schema '{
      "type": "object",
      "properties": {
        "failedTests": {
          "type": "array",
          "items": {"type": "string"}
        },
        "rootCause": {"type": "string"},
        "suggestedFix": {"type": "string"},
        "affectedFiles": {
          "type": "array",
          "items": {"type": "string"}
        }
      }
    }'     | jq '.structured_output')

  # Slackに通知(例)
  curl -s -X POST "$SLACK_WEBHOOK"     -H "Content-Type: application/json"     -d "{
      "text": "テスト失敗
原因: $(echo $REPORT | jq -r '.rootCause')
修正案: $(echo $REPORT | jq -r '.suggestedFix')"
    }"

  exit 1
fi

Agent SDK(TypeScript)でプログラムから制御する

@anthropic-ai/claude-agent-sdkを使うと、TypeScript/Node.jsのコードからClaude Codeをプログラムで制御できます。CLIの-pフラグと同等の機能をライブラリとして利用できるため、ループ処理・条件分岐・エラーハンドリングを含む複雑な自動化に適しています。

インストール
npm install @anthropic-ai/claude-agent-sdk

Agent SDKはCLIの-pフラグと同じオプション(allowedTools・bare・resume等)をTypeScriptのオブジェクトとして渡せます。応答はAsync Iterableとして受け取り、ストリームを処理するパターンが基本です。具体的なAPIの使い方・型定義・コード例はAnthropic公式のAgent SDK ドキュメント(platform.claude.com/docs/en/agent-sdk)を参照してください。最新バージョンで変更される可能性があるため、公式ドキュメントを最新情報として使ってください。

主要CLIオプション一覧

オプション 短縮形 説明
--print "プロンプト" -p プロンプトを渡して非対話実行
--output-format 出力形式。text(デフォルト)/ json / stream-json
--json-schema JSON Schemaで出力の構造を指定(–output-format json のとき有効)
--allowedTools 使用を許可するツール一覧(カンマ区切りまたはパターン)
--bare CLAUDE.md・MCP・スキル等の環境設定を無視してクリーン実行
--continue 最新セッションを引き継いで実行
--resume "session_id" 指定したセッションIDを引き継いで実行
--verbose 詳細なログを出力
--include-partial-messages stream-json形式で部分メッセージを含める
--append-system-prompt システムプロンプトを追加
--settings "ファイル" 設定JSONファイルを指定

まとめ

Claude Codeは-pフラグで非対話(headless)実行できます。--output-format jsonで結果を構造化して取得し、--allowedToolsでツールを最小限に絞り、--bareで環境に依存しないクリーンな実行ができます。

セッション管理(--continue/--resume)を使えば複数ステップに分けた処理も一つの会話として扱えます。PRレビュー自動化・デプロイ前チェック・テスト失敗分析など、人が見ていない場面でClaude Codeを活用する幅が大きく広がります。

Hooksと組み合わせると、特定のコマンドが実行される前後にheadless実行を挟むことも可能です。Claude Code Hooks完全ガイドも参考にしてください。

よくある質問

Q-pフラグを使うと確認ダイアログはどうなりますか?

A確認ダイアログは表示されません。--allowedToolsで許可したツールは確認なしに実行され、許可されていないツールは自動的に拒否(スキップ)されます。Claudeが必要なツールを使えずに途中で止まることがあるため、タスクに必要なツールをあらかじめ--allowedToolsに列挙してください。

Q–bareを使うとCLAUDE.mdが読み込まれませんが、問題ありますか?

ACI/CD環境ではCLAUDE.mdの内容(チームのルール・コマンド定義)が読み込まれないため、プロジェクト固有のルールが適用されません。--append-system-promptでCI用のシステムプロンプトを追加するか、--settingsでCI専用の設定ファイルを指定することで補完できます。再現性を優先するCI環境と、ルール適用が必要なローカル環境を使い分けてください。

QAPIキーはどこに設定しますか?

A環境変数ANTHROPIC_API_KEYにAnthropicのAPIキーを設定してください。GitHub Actionsではシークレットに設定してenv: ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}として渡すのが標準的な方法です。キーをスクリプトに直接書くことは絶対に避けてください。

Q–output-format json の .result にはどんな内容が入りますか?

AClaudeのテキスト応答がそのまま文字列として入ります。--json-schemaを使った場合は.structured_outputにスキーマに準拠した構造化データが入ります。jqでjq -r '.result'とすると改行を含むテキストを正しく取り出せます。

Qheadless実行でトークンが足りなくなった場合はどうなりますか?

Aコンテキストウィンドウが上限に達するとエラーになります。大きなコードベースを分析する場合は、ファイルを絞って渡す・複数のセッションに分割する・--continueで前のセッションを引き継ぎながら段階的に処理するといった工夫が有効です。stream-json形式を使うと途中まで受け取った結果を処理できます。

QAgent SDKとCLIの-pフラグはどちらを使うべきですか?

A単純な自動化スクリプト・シェルからの呼び出しにはCLIの-pフラグが手軽です。TypeScript/Node.jsプロジェクトに組み込む・ループ処理・条件分岐を含む複雑な自動化にはAgent SDKがコードとして管理しやすく適しています。どちらを使っても機能的な差はほとんどないため、既存の技術スタックに合わせて選んでください。