claude -pで自動化する
claude -pは成功するとexit 0、失敗すると0以外で終わります。出力形式、権限の渡し方、cronで定時実行する手順が分かります。
- claude -p はプロンプトを1回だけ実行して結果を出力し、終了します。確認のダイアログは出ず、パイプの stdin は 10MB までです。
- 出力形式は text(既定)、json、stream-json で、total_cost_usd は手元の見積もりです。確認が必要な呼び出しは --allowedTools などで許可しない限り拒否されます。
- --bare を付けないと、プロジェクトの hook や .mcp.json を信頼の確認なしで読み込みます。スクリプトから呼ぶなら --bare が勧められています。
PR:この記事にはアフィリエイトリンク(VPS)を含みます。選んだ基準はリージョンと課金の形だけで、報酬で評価は変えません。
claude -p は、プロンプトを1回だけ実行して結果を出力し、終了するモードです。対話のセッションと違って、確認のダイアログは出ず、人の返事を待ちません。この記事では、基本の形、出力形式、権限の渡し方、続きからの実行、終了コードとエラー処理、cron での定時実行、料金の注意を順に説明します。編集部の検証環境(macOS、Claude Code 2.1.304、2026年10月20日)で、claude --help の確認と、空のディレクトリでの claude -p の実行を1回だけ行いました。
基本の形
プロンプトを引数で渡すか、stdin からパイプします。
claude -p "What does the auth module do?"
cat build-error.txt | claude -p "concisely explain the root cause of this build error" > output.txt
パイプで渡せる stdin は 10MB までです。超えると、エラーを出して0以外の終了コードで終わります。それより大きいものはファイルに書き、プロンプトでパスを指定します。
出力形式は --output-format で選びます。
| 値 | 中身 |
|---|---|
text | 既定。本文だけ |
json | 結果、セッション ID、メタデータを含む JSON |
stream-json | 1行に1つのイベントが並ぶ JSON。最後の行が result |
出典:https://code.claude.com/docs/en/headless 、2026-10-20確認
空のディレクトリで、「OK とだけ返して」を --output-format json --no-session-persistence 付きで実行しました。終了コードは 0 で、主なフィールドは次のとおりです(セッション ID と金額は伏せています)。
{
"type": "result",
"subtype": "success",
"is_error": false,
"result": "OK",
"num_turns": 1,
"session_id": "<伏せた>",
"total_cost_usd": <伏せた>,
"permission_denials": [],
...
}
本文は jq -r '.result' で取り出せます。total_cost_usd は Claude Code が手元で計算した見積もりで、請求額とは一致しないことがあります。
claude -p "Summarize this project" --output-format json | jq -r '.result'
権限を渡す
-p では確認のダイアログが出ません。確認が必要な呼び出しは、何かが許可しない限り拒否されます。v2.1.302 以降は、権限モードを何も指定しないと Manual(default)で始まります。使わせたいツールは --allowedTools で渡します。書式は permissions のルールと同じです。
claude -p "Look at my staged changes and create an appropriate commit" \
--allowedTools "Bash(git diff *),Bash(git log *),Bash(git status *),Bash(git commit *)"
Bash(git diff *) の * の前の空白は必要です。空白を省くと git diff-index にも当たります。ツールを並べる代わりに --permission-mode で基準を決めることもできます。claude --help に出た値は acceptEdits、auto、bypassPermissions、manual、dontAsk、plan でした。無人の CI のように締めたい実行には、確認が必要なものをすべて拒否する dontAsk が向いています。
--dangerously-skip-permissions は --permission-mode bypassPermissions と同じで、確認を飛ばします。--help には「インターネットにつながっていないサンドボックスでだけ勧める」とあります。コンテナや VM のように壊れても困らない環境以外では使いません。
出典:https://code.claude.com/docs/en/headless 、https://code.claude.com/docs/en/cli-reference 、2026-10-20確認
もう1つ注意があります。--bare を付けないと、-p は対話のセッションと同じように、プロジェクトの .claude/settings.json の hook や .mcp.json のサーバーを読み込みます。信頼していないフォルダーでも、信頼の確認なしで動きます。公式は、スクリプトから呼ぶなら --bare を勧めています。ただし --bare ではサブスクリプションのログインを使わないので、ANTHROPIC_API_KEY が必要です。ルールの書き方はpermissions設定の早見表にまとめています。
続きから実行する
--continue で直前の会話を、--resume <session_id> で指定した会話を続けます。対話のセッションでの再開はClaude Codeの会話を再開するにまとめています。
session_id=$(claude -p "Start a review" --output-format json | jq -r '.session_id')
claude -p "Continue that review" --resume "$session_id"
上限を決めるオプションもあります。--max-turns はエージェントのターン数の上限で、達するとエラーで終わります。--max-budget-usd は、見積もりの支出が指定した額に達したところで止めます。どちらも -p のときだけ使えます。--max-turns は docs に載っていますが、2.1.304 の claude --help には出てきませんでした。--no-session-persistence を付けると会話を保存せず、あとから再開できなくなります。
出典:https://code.claude.com/docs/en/headless 、https://code.claude.com/docs/en/cli-reference 、2026-10-20確認
終了コードとエラー処理
公式によると、claude -p は成功すると exit 0、失敗すると0以外で終わります。不正なフラグは実行前に stderr に出ます。認証が無いなど、実行の途中で起きた失敗は、結果として stdout に出ます。json の結果では、--max-turns に達したときの subtype が error_max_turns になります。
出典:https://code.claude.com/docs/en/headless 、https://code.claude.com/docs/en/agent-sdk/agent-loop 、2026-10-20確認
シェルでは、終了コードと is_error と空の結果の3つを見ます。ダミーの todo アプリで前日のコミットを要約するスクリプトです。
#!/usr/bin/env bash
# nightly-summary.sh: summarize yesterday's commits of the todo app
set -euo pipefail
cd "$HOME/todo-app"
out=$("${CLAUDE_BIN:-claude}" -p "Summarize the commits from the last 24 hours in 5 bullet points." \
--output-format json --max-turns 5 \
--allowedTools "Bash(git log *)" --permission-mode dontAsk)
if [ "$(jq -r '.is_error' <<<"$out")" != "false" ]; then
echo "claude reported an error: $(jq -r '.subtype' <<<"$out")" >&2
exit 1
fi
result=$(jq -r '.result // empty' <<<"$out")
if [ -z "$result" ]; then
echo "empty result" >&2
exit 1
fi
printf '%s\n' "$result" > "$HOME/todo-app/reports/$(date +%F).md"
CLAUDE_BIN に、決まった JSON を返すだけのダミーのスクリプトを渡して、分岐を確かめました(本物の claude は呼んでいません)。
| ダミーが返したもの | 出力 | exit |
|---|---|---|
is_error: false、result あり | レポートを書く | 0 |
is_error: false、result が空 | empty result | 1 |
is_error: true、subtype: error_max_turns | claude reported an error: error_max_turns | 1 |
| stderr にエラーを出して exit 1 | Error: unknown option | 1 |
cron で VPS から定時実行する
常駐させるなら、手元のPCではなく VPS に置きます。
VPSの候補:東京リージョンで時間課金から試せる ConoHa VPS
か、メモリ量で選べる XServer VPS
が候補です。料金とプランは変わるので、契約前に公式ページで確認してください。
crontab の行です。以下は Linux の VPS を想定した例で、編集部の検証環境(macOS)には flock が無いため、実行していません(未実行)。
# crontab -e
PATH=/home/dev/.local/bin:/usr/local/bin:/usr/bin:/bin
0 6 * * * /usr/bin/flock -n /tmp/nightly-summary.lock /home/dev/bin/nightly-summary.sh >> /home/dev/logs/nightly-summary.log 2>&1
- 絶対パスで書く。cron の
PATHや環境変数は、対話のシェルとは違う flock -nで、前の実行が終わっていなければ次を起動しない- stdout と stderr をまとめてログに残す。失敗は上のスクリプトの exit 1 で分かる
cron で環境変数が届かない問題はClaude Codeで環境変数が効かないで扱っています。無人の実行に鍵と信頼できない入力を一緒に渡さない話はAIエージェントの権限設計にあります。
料金の注意
Anthropic のヘルプによると、Agent SDK と claude -p は、2026年10月20日時点で引き続きサブスクリプションの利用枠を使えます。以前に告知されていた Agent SDK の利用に関する変更は、2026年6月15日に一時停止されました。10月7日の更新で、Max と Team のプランに毎月の API クレジットが付き、Agent SDK や claude -p にも使えるようになりました。料金は変わることがあるので、契約前に公式ページで確かめてください。
出典:https://support.claude.com/en/articles/15036540-use-the-claude-agent-sdk-with-your-claude-plan 、2026-10-20確認
CI で回すときの費用はClaude Code×CIの費用と罠を読んでください。プランごとの料金はClaude Codeの料金、実際いくら?にまとめています。
まとめ
claude -pは1回実行して終わる。プロンプトは引数か stdin(10MB まで)で渡す--output-format jsonのresult・is_error・session_idをjqで読む- 確認のダイアログは出ないので、
--allowedToolsか--permission-modeで権限を渡す。全許可は隔離した環境だけ --resume <session_id>で続きから実行でき、--max-turnsと--max-budget-usdで上限を決められる- 終了コード、
is_error、空の結果の3つで失敗を拾う - cron では絶対パスと
flockを使い、ログを残す