対話をやめると、AIは「社員」になる

Claude Codeを対話モードで使っていると、こんな瞬間はありませんか。

  • 朝起きて、ターミナルを開いて、昨日と同じ指示を打ち込む
  • 外出中に「あ、あの処理を回したかった」と気づく
  • 寝ている間に情報収集できたら、と毎晩思う

ある個人開発者は、これを全部やめました。彼は claude -p というたった一つのフラグを使い、Claude Codeを対話なしで起動するスクリプトに変えました。macOSのlaunchd(= 目覚まし時計のような定時実行の仕組み)から毎時呼び出され、標準入力でプロンプトを受け取り、標準出力で結果を吐き出す。ログはSQLite(= Excelに近い感覚の軽量データベース)に流し込まれ、1日200回以上、無人で動き続けています。

彼がUIを開くのは、成果物を確認するときだけ。対話は、もう週に一度もありません。

この記事では、その心臓部である「ヘッドレスモード」の組み立て方を、非エンジニアの方にもわかる言葉で解説します。読み終わる頃には、あなたも「AIを自分の代わりに働かせる」という発想が、現実的な選択肢として見えているはずです。

ヘッドレスモードとは何か

ヘッドレス(headless)とは、直訳すると「頭がない」。つまり画面(UI)を持たない状態で動くという意味です。ブラウザの世界でも「ヘッドレスブラウザ」という言葉があり、画面を開かずに裏側だけ動かすテスト用途で使われています。

Claude Codeにおけるヘッドレスモードは、claude -p(または --print)フラグで起動します。これを付けるだけで、対話プロンプト(> と表示されてキー入力を待つあの画面)が消え、1回きりの実行になります。指示を受け取り、仕事をし、結果を返して終了する。まるで派遣社員のように、来て、働いて、帰る。

6レイヤー全体像

図: 6レイヤー全体像

このヘッドレスモードを支えているのは、次の6つのレイヤーです。工場のベルトコンベアを想像してください。それぞれのレイヤーが、1つの工程を担当しています。

レイヤー1: 起動フラグ `-p`

claude -p "今日のHacker Newsトップ10を要約して"

読めなくても大丈夫。要点はこうです。-p を付けた瞬間、Claude Codeは「対話する気ゼロ」のモードに切り替わり、指示を受け取って1回だけ働いて終わります

対話モードが「カフェでの打ち合わせ」だとすれば、ヘッドレスモードは「FAXで依頼書を送って、完成品を郵送してもらう」イメージです。やり取りは一方通行で、その分、自動化と相性が抜群です。

レイヤー2: 入力を標準入力から流し込む

毎回プロンプトをダブルクオートで囲むのは、長文になると破綻します。そこで標準入力(stdin)を使います。

cat prompt.txt | claude -p

これは「prompt.txt の中身を、claudeコマンドの口元に流し込む」という意味です。比喩でいえば、業務マニュアルを綴じたファイルを、新入社員の机に置いてあげるようなもの。プロンプトが何百行になっても、ファイルに書いておけば再利用できます。

さらに便利なのは、テンプレートに日付や変数を埋め込めること。bashスクリプトでその日のニュースURLをプロンプトに差し込み、毎朝違う指示を自動生成する——といった応用が可能になります。

レイヤー3: 出力フォーマットで「読める形」に揃える

デフォルトのClaude Codeは、人間が読みやすい見た目で結果を返します。でも、自動化したいときに欲しいのは「プログラムが処理しやすい形」です。ここで --output-format stream-json の出番です。

cat prompt.txt | claude -p --output-format stream-json

これを付けると、結果が**JSON形式(= データに住所ラベルを貼った整理済みの箱)**で、しかもストリーム(= 仕事が進むたびに少しずつ)で流れてきます。

エージェント実行の流れ(時系列)

図: エージェント実行の流れ(時系列)

冒頭で紹介した個人開発者は、このJSONを jq(= JSONを切り分ける包丁のような小さな道具)で解析し、必要な部分だけSQLiteに保存しています。彼の言葉を借りると「結果が散らからないので、安心して放っておける」。

レイヤー4: ツール権限を絞る `--allowedTools`

ここが、無人運用でいちばん大事なレイヤーです。対話モードなら「それやっていい?」とAIが聞いてくれますが、ヘッドレスでは誰も答えません。だからこそ、最初から「できること」を決めておく必要があります

claude -p --allowedTools "Read,Write,Bash(git:*)"

これは「読み取り・書き込み・git系のコマンドだけ許可する」という指定です。比喩でいえば、新入社員の就業規則のようなもの。入ってはいけない部屋に鍵をかけておくイメージです。

検品なし vs 検品あり

図: 検品なし vs 検品あり

個人運営で無人化したいとき、一番こわいのは「気づかないうちに想定外のファイルを書き換えていた」という事故です。--allowedTools は、その事故を未然に防ぐ検品ゲートの役割を果たします。多少面倒でも、許可リストを明示しておくことが推奨されています。

レイヤー5: ログ(stderr)と成果物(stdout)を分ける

Unix系のコマンドには、出力口が2つあります。

  • stdout(標準出力): 完成品を置く出荷口
  • stderr(標準エラー出力): 作業日報を貼る掲示板

Claude Codeのヘッドレスモードは、この2つをきれいに使い分けます。成果物はstdoutへ、進捗や警告はstderrへ。だから、こんな書き方ができます。

cat prompt.txt | claude -p > result.json 2> debug.log

要点はこうです。完成品は result.json に、作業メモは debug.log、自動で振り分けられます。後から問題が起きても、debug.logを見れば「どこで詰まったか」がわかる。業務日報があれば、社員が何をしていたか遡れるのと同じです。

レイヤー6: スケジューラから呼び出す

ここまでの5つが揃えば、あとは「いつ起動するか」を決めるだけ。選択肢は3つあります。

  • launchd(macOS): plistという設定ファイルで起動時間を指定
  • cron(Linux/macOS): 昔ながらの定時実行の仕組み
  • GitHub Actions: クラウド上でスケジュール実行

どれを選んでも、やることは同じです。「この時間になったら、このシェルスクリプトを実行してね」と登録するだけ。スクリプトの中では、レイヤー1〜5で組み立てた claude -p ... のコマンドが呼ばれます。

冒頭の個人開発者は、launchdを選びました。自分のMacが起きている間は、毎時必ずパイプラインが回る。外出中も、寝ている間も、AI社員は黙々と働き続けています。

エンジニアじゃない方へのメッセージ

ここまで読んで「コードが並んでいて怖かった」と感じた方へ。大丈夫です。

この記事で紹介した6つのレイヤーは、一度組み立ててしまえば、あとは中身のプロンプトを差し替えるだけで、いくらでも応用できます。料理でいえば、最初に鍋とコンロを揃えるのが大変なだけで、あとは毎日違う材料を入れればいいのと同じです。

個人でメディアを立ち上げたい、ツールを運営したい、でも24時間自分が働き続けるのは無理——そんなとき、ヘッドレスモードは**「もう一人の自分」を雇う手段**になります。雇用契約もいらないし、給料も発生しません。必要なのは、最初の設計図だけです。

技術的ハードルに怯んでいる方も、ひとつだけ覚えて帰ってください。「対話をやめると、AIは社員になる」。この一行が、あなたのスモールビジネスの形を変えるかもしれません。

🎁 特典: 設定ファイル一式ダウンロード

この記事の内容を、あなたの環境にそのまま持ち込めるテンプレートを用意しました。解凍して、あなたのメディアテーマに合わせてプロンプトを書き換えるだけで、無人パイプラインが動き出します。

同梱物

  • run.sh / run.py — claude -p 実行テンプレート(bash / Python 両対応)
  • parse_stream.py — stream-json パーサー(結果をSQLiteに保存する例つき)
  • error_handler.sh — タイムアウト・権限エラー・レート制限のハンドリング例
  • com.user.claude-pipeline.plist — launchd 設定サンプル(毎時起動)
  • prompt_template.txt — 日付・変数を埋め込めるプロンプトの雛形
  • README.md — セットアップ手順(非エンジニア向けの解説つき)

[DOWNLOAD_URL]

📚 参考リファレンス