NEW 最新比較ランキング | 運営者情報 | プライバシーポリシー
2026.05.12

n8n×Claude CLIで業務自動化を実運用に乗せる方法

「動かないn8n」に毎週消耗していた話 ― きっかけは深夜のWP誤投稿

n8nを業務に取り入れて1年。便利なのは確かなのですが、正直なところ最初の半年は「作ったが運用できない」「直そうとして壊す」の繰り返しでした。30個近いワークフロー(以下WF)を一人で抱えていると、ある日突然「翻訳WFが2日連続でエラー」「YouTube投稿WFがOAuth切れで止まっている」「GSC(Google Search Console)KPI集計WFが認証エラー」と、何かしらが壊れている状態が常態化します。

転機は、deactivateし忘れたまま編集していたWP投稿WFが深夜のcronで暴発し、中途半端な下書きが本番公開されてしまった事件でした。これを機に、Claude CLI(Claude Codeのターミナル版)にn8n運用の半分を任せる仕組みを作り、半年運用してきた知見をこの記事にまとめます。

結論を先に書きます。

  1. n8nのWF修正は「deactivate → 修正 → テスト実行 → 成果物確認 → activate → 通知」の6ステップを必ず守る。本番障害の体感9割はこの順番違反で起きます。
  2. Claude CLIには「運用カード」(workflow-n8n-ops.md)を読ませる。コマンド・パス・認証情報の在処を1ファイルに集約すれば、CLIが状況判断して修正提案まで自走してくれます。
  3. 認証情報は環境変数(VPSの/etc/n8n/.env)に寄せる。WF JSONには絶対に埋め込まない。トークン切れは再取得スクリプトで自動化する。

以下、実際にコピペで動かせるレベルで手順を書いていきます。なお、コマンド中のIPアドレス・ドメイン・認証情報は全てダミー値(192.168.x.xyour-server.example.comYOUR_N8N_API_KEY等)に置き換えてあります。自社環境の値に差し替えてご利用ください。

全体アーキテクチャ:手元のClaude CLIからVPS上のn8nを操作する

まず構成のイメージから共有します。難しいことはしていません。手元のMac(あるいはWindows + WSL)から、Claude CLI経由でn8nのAPIとVPSのSSHを叩いているだけです。

[手元のMac:Claude CLI]
   ├─ workflow-n8n-ops.md(運用カード)を読み込み
   ├─ n8n API(curl)でWF操作
   ├─ SSH で VPS の /etc/n8n/.env を確認
   └─ 認証再取得スクリプト(Python)を実行
        ↓
[VPS:Docker上のn8n]
   ├─ /etc/n8n/.env(GSC_SA_JSON 等を集約)
   └─ docker logs n8n(実行ログ確認)
        ↓
[連携先:WordPress / Supabase / Slack / YouTube]

ポイントは、「Claude CLIが自走するために必要な情報を、すべて1枚のMarkdownに集約しておく」こと。これがないと、毎回「VPSのIPは?」「APIキーはどこ?」と聞かれて手が止まります。逆にこれさえ整っていれば、「WF#38が落ちてるので調査して直してください」とだけ伝えれば、CLI側でログ取得 → 原因切り分け → 修正案提示まで進めてくれます。

ステップ1:運用カード(workflow-n8n-ops.md)を1枚作る

最重要かつ、一番面倒な作業です。私は半日かけて書きました。書く項目はざっくり以下の通り。

  • n8nインスタンス情報(管理画面URL、Basic認証の所在、APIキーの所在)
  • 認証方式(OAuth/サービスアカウント/JWT生成ノードの仕組み)
  • ファイルパス一覧(WF JSON / 認証情報 / 再認証スクリプト)
  • WF修正プロトコル(6ステップ)
  • 既知の障害WF一覧(症状・原因・対処手順)

テンプレートとして使えるよう、抜粋を載せておきます。実値は伏せた状態の例です。

# Workflow: n8n 運用管理(認証 + WF修正)

## n8n インスタンス情報
| 項目 | 値 |
|------|-----|
| 管理画面(直接IP) | http://192.168.x.x:5678 |
| 管理画面(ドメイン) | https://your-server.example.com |
| Basic認証ユーザー名 | shared/credentials.md 参照 |
| Basic認証パスワード | shared/credentials.md 参照 |
| n8n API キー | shared/credentials.md の N8N_API_KEY |

## VPS 接続情報
- SSH: ssh [email protected]
- n8nコンテナ名: n8n
- 環境変数ファイル: /etc/n8n/.env

## 認証情報の格納場所
- GSCサービスアカウント: VPS /etc/n8n/.env の GSC_SA_JSON
- YouTube OAuth(JP/EN): VPS /etc/n8n/.env の YT_*_TOKEN
- WordPress App Password: VPS /etc/n8n/.env の WP_APP_PASSWORD

## ファイルパス
- WF JSON 正本: ~/claude-workspace/ai-business/infra/n8n-workflows/
- 認証情報: ~/claude-workspace/shared/credentials.md(chmod 600)
- 再認証スクリプト: ~/claude-workspace/ai-business/scripts/

このとき絶対に守るべきは「認証情報の実値を書かない」ことです。書くのは「どこに保管してあるか」の場所だけ。私の場合はshared/credentials.md(パーミッション600、Gitignore済み)に実値を集約し、運用カードからは参照のみにしています。Claude CLIに渡しても安全な設計です。

やってみて分かったこと:このカードを書き上げると、自分の頭の中の「暗黙知」がいかに散らかっていたかが可視化されます。「あのAPIキーどこに保存したっけ」と探していた時間が嘘のようになくなりました。半日の投資はすぐペイします。

ステップ2:WF修正プロトコル(6ステップ)を徹底する

これがすべての中核です。n8nのWFを修正するときは、必ずこの順番で行います。

① deactivate(最優先)

修正中の自動実行を止めます。これを忘れると本当に痛い目に遭います。

curl -X POST "http://192.168.x.x:5678/api/v1/workflows/<WF_ID>/deactivate" \
  -H "X-N8N-API-KEY: YOUR_N8N_API_KEY"

なぜAPIを使うか? n8n UIでもdeactivateできますが、UIだと「ボタンを押したつもりで押せていない」事故が起きがちです。コマンド一発のほうが確実で、しかもClaude CLIに任せられます。「WF#38を直すので先にdeactivateしてください」と伝えれば、CLIがそのままcurlを叩いてくれます。

② 修正実施

WF JSONを直接編集するか、n8n UI上でノード設定を変更します。ここで決めておくべき大事なルールが「正本(Source of Truth)はどこか」。私の場合はinfra/n8n-workflows/*.jsonを正本とし、UIで編集したら必ずExport → Git commitする運用にしています。これを決めないと差分管理が地獄になります(実際に1回やらかしました)。

③ n8n上でテスト実行

UIの「Execute Workflow」ボタンを押すだけ。ですが、これを飛ばす人が本当に多い。「コードちょっといじっただけだから動くでしょ」が事故の元です。私は飛ばしてWP投稿が500記事分エラーキューに溜まったことがあります。

④ 成果物・出力を直接確認

WF実行が「成功」と表示されても、それは内部の処理が完了しただけです。必ず実際の成果物を確認すること。

  • WP投稿WF → WordPress管理画面で実際の記事を確認
  • Supabase書き込みWF → Supabase Studioでレコードを確認
  • Slack通知WF → 実際にチャンネルにメッセージが届いたか確認

n8nの「Success」は信用しない、と覚えてください。私はAPIレスポンスが200だけど中身が空、というケースで2回ハマりました。

⑤ activate

curl -X POST "http://192.168.x.x:5678/api/v1/workflows/<WF_ID>/activate" \
  -H "X-N8N-API-KEY: YOUR_N8N_API_KEY"

⑥ Slack通知

関係者への通知も自動化します。私の環境ではWF#04(運用通知用WF)にWebhookで投げると、Slackの#n8n-opsチャンネルに「WF#XX をactivateしました」と自動投稿される仕組みにしています。通知自体もWF化することで、属人化を防げます。

ステップ3:アクティブWF一覧をワンライナーで取得

WFが30個を超えると、「いま動いてるのどれだっけ」が分からなくなります。これを毎朝のチェックに使っているコマンドがこちら。

curl -s "http://192.168.x.x:5678/api/v1/workflows?active=true" \
  -H "X-N8N-API-KEY: YOUR_N8N_API_KEY" | \
  python3 -c "import json,sys; [print(f'{w[\"id\"]}: {w[\"name\"]}') for w in json.load(sys.stdin)['data']]"

Claude CLIに「いまアクティブなWFをリストアップして」とお願いすると、このコマンドを実行して整形までしてくれます。さらに「このうちcron実行しているものはどれ?」と続けて聞けば、各WFのトリガーノードを調べて返してくれます。一人運用の強い味方です。

やってみて分かったこと:このコマンドを毎朝の習慣にしただけで、「気付いたら無効化されていたWF」「テスト用に作ったまま残っていた重複WF」が一気に可視化されました。最初に走らせた朝、47個もWFがあって、うち14個は不要なゴミでした。

ステップ4:認証情報を環境変数に集約する

n8nを運用していて一番事故りやすいのが認証情報の管理です。WFのJSONに直書きしていると、Gitに上げる際の事故、UI上での誤コピー、引き継ぎ時の漏洩など、リスクだらけ。

解決策はシンプルで、すべてVPSの/etc/n8n/.envに集約し、WF内では{{ $env.変数名 }}で参照すること。例えばGSC用のサービスアカウントJSONなら、こうします。

# VPSの /etc/n8n/.env に追記
GSC_SA_JSON='{"type":"service_account","project_id":"...","private_key":"..."}'

# 確認コマンド(実値は出さず、設定されてるかだけ確認)
ssh [email protected] "grep -c '^GSC_SA_JSON=' /etc/n8n/.env"

# n8nコンテナを再起動して反映
ssh [email protected] "docker restart n8n"

WFのGenerate SA JWTノード内では{{ $env.GSC_SA_JSON }}と書くだけ。実値はWF JSONには現れません。

ハマりポイント:JSON文字列内のダブルクォートをエスケープし忘れて、.envファイル自体が壊れる事故が頻発します。シングルクォートで全体を囲むのが安全です。それと、.envを編集したら必ずdocker restart。再起動しないと変数が読み込まれず、「設定したのに動かない」と30分悩むことになります(実体験)。

ステップ5:OAuthトークン切れに備えて再取得を自動化

YouTube連携WFのトラブル原因の8割はOAuthトークンの期限切れです。手動再取得を毎回やっていられないので、Pythonスクリプトを2本用意して回しています。

# ① 手元でOAuthフローを通してトークンを再取得
python3 ~/claude-workspace/ai-business/scripts/youtube-oauth-reauth.py

# ② 再取得したトークンをVPSへ反映
python3 ~/claude-workspace/ai-business/scripts/update-vps-youtube-tokens.py

# ③ n8nを再起動して反映
ssh [email protected] "docker restart n8n"

1本目はローカルでブラウザを開いてOAuth同意画面を通し、refresh_tokenを取得。2本目はSCPでVPSの.envに書き戻すだけ。シンプルですが、これがあるとないとで作業時間が10倍違います。

Claude CLIに任せるときは、「WF#35bがエラーで止まっているので、OAuth切れかどうか確認し、切れていれば再取得手順を案内してください」と伝えれば、docker logsを見て切り分け、必要なら上記スクリプトの実行コマンドを提示してくれます。

ステップ6:エラー発生時のログ確認は最初の30秒で

WFが落ちたとき、まず叩くのはこれ。

ssh [email protected] \
  "docker logs n8n --tail 100 2>&1 | grep -E '(ERROR|error|failed|Unauthorized|expired)'"

これでだいたい原因の当たりがつきます。よくある検出パターンは以下。

  • Unauthorized → 認証情報の期限切れ、もしくは権限変更
  • ECONNREFUSED → 連携先サービスがダウン中
  • Rate limit exceeded → APIの呼び出し上限超過(特に翻訳APIで頻発)
  • Cannot read properties of undefined → 前段ノードの出力が想定と違う(API仕様変更が多い)

実際に使ってみたメリット

1. WF修正の所要時間が体感3分の1に

以前は「修正 → 動かない → 慌てて戻す」を繰り返していた時間が、6ステップ徹底だけでほぼゼロになりました。本番ロールバックは過去3か月で0回。

2. 属人化の解消

運用カードができたことで、「自分が休んでも誰かに引き継げる」状態になりました。実際、私が体調を崩した日にチームメンバーが運用カード片手にWF#38の認証エラーを復旧してくれて、感動しました。

3. 複数WFの棚卸しが楽

API一発でアクティブWFが一覧化できるので、月次の棚卸し(不要WFの削除、命名規則チェック)が10分で終わります。

4. 認証更新フローの標準化

YouTube OAuth・GCPサービスアカウントの再取得が「スクリプト2発」に圧縮されたのは精神衛生上もとてもいい。

デメリット・注意点

1. 初期の運用カード作成に半日〜1日かかる

これは正直しんどいです。ただし1度書けば資産になり、Claude CLIに渡せばさらにCLIが行間を補完して動いてくれるので、投資対効果は高い。

2. n8n APIキー / SSH鍵の取り扱いに細心の注意

Claude CLIに渡す前提なら、認証情報はshared/credentials.md(パーミッション600、Gitignore済み)のような場所に集約必須。間違ってもGitリポジトリに直接コミットしないこと。Pre-commitフックでgit-secretsを仕込んでおくと安心です。

3. JSON直編集とUI編集が混在しがち

n8nはDBにWFの状態を持つため、JSONファイルだけ変えても反映されません。正本をどちらにするか決めないと差分管理で詰みます。私のおすすめはinfra/n8n-workflows/*.jsonを正本にし、UI編集後は必ずExport → Git commitするルール。

よくある失敗とその対処法

失敗1:deactivateせずに修正してWFが暴発

症状:修正中のWFがcronで動き、中途半端なWP記事が公開された(私の実話)。
対処:プロトコルの1番(deactivate)を絶対の最初に。Claude CLIに「修正に入ります」と伝えた時点で最初に必ずdeactivate APIを叩く、というルールを運用カードに明記しています。

失敗2:Generate SA JWTノードが失敗(GSC KPI集計WF)

症状:GSC_SA_JSON環境変数が未設定、または式の構文ミス。
対処手順は以下。

# 1. envの存在確認
ssh [email protected] "grep -c '^GSC_SA_JSON=' /etc/n8n/.env"

# 2. 未設定なら GCPコンソールでサービスアカウントJSONを取得し、
#    シングルクォートで囲んで .env に追記
#    GSC_SA_JSON='{"type":"service_account",...}'

# 3. 再起動
ssh [email protected] "docker restart n8n"

# 4. WFをテスト実行してJWT生成ノードが通過することを確認

失敗3:YouTube Shorts WFが2日連続エラー

原因:OAuthトークン期限切れ。
対処:前述のyoutube-oauth-reauth.pyupdate-vps-youtube-tokens.pyの2発で復旧。所要時間5分。

失敗4:翻訳WFが突然停止

原因:翻訳API認証期限切れ、またはAPI使用量上限到達。
調査手順:n8n UIでWFの実行履歴を開き、最後のエラーログを確認 → APIプロバイダのダッシュボードで残量チェック。月初にリセットされるタイプのAPIだと、月末に突然止まるので、残量アラートを別WFで監視するのも有効です。

失敗5:WF JSONを直編集したがn8n UIに反映されない

原因:n8nはDBに状態を持つため、JSONファイルだけ書き換えても反映されない。
対処:JSON編集 → n8n UIでImport(または API PUT /workflows/<id>)→ activate の順を守る。これはn8nの仕様なので、慣れるしかありません。

Claude CLIへの指示の出し方(実例)

参考までに、私が普段Claude CLIに投げているプロンプトのパターンを共有します。

# パターン1:状況把握
「workflow-n8n-ops.md を読み込んで、現在アクティブなn8n WFを一覧表示してください」

# パターン2:障害対応
「WF#38(GSC KPI集計)が昨晩エラーで止まっています。
docker logs と /etc/n8n/.env を確認して、原因と対処手順を提示してください。
ただし、本番への変更コマンドは私の確認を取ってから実行してください」

# パターン3:定期メンテ
「今月分の不要WF棚卸しをします。
過去30日間1度も実行されていないWFをリストアップしてください」

ポイントは「本番への変更コマンドは確認を取ってから」と明記すること。Claude CLIは賢いですが、prompt次第ではcurl POSTまで一気に走らせてしまうこともあるので、人間のレビューを挟む運用が安全です。

まとめと次のアクション

n8nは本当に便利なツールですが、「運用」を仕組み化しないとあっという間に破綻します。逆に言えば、運用カード(Markdown 1枚)+ Claude CLI + 6ステップのプロトコル、というシンプルな3点セットを整えるだけで、現場は驚くほど安定します。

読者の方が明日から自社で動かすなら、以下の順番でやってみてください。

  • 今日やる:自社n8nの運用カードを書く。最低限、管理画面URL、認証情報の保管場所、VPSへのSSH接続情報、アクティブWFのID・名前一覧。
  • 今週やる:WF修正プロトコル(6ステップ)をチームのSlackに固定ピン。全員で守る合意を取る。
  • 今月やる:OAuth系の再取得をスクリプト化。手動運用から卒業する。
  • 発展:n8nメンテナンス用スクリプト(ヘルスチェック、不要WF検出、認証期限警告)を定期実行化する。

n8nもClaude CLIも、単体では「便利ツール」止まりです。組み合わせて、運用ドキュメントを介して「会話するように業務を回す」と、初めて中小企業の現場で実用に乗ります。本記事の手順テンプレートが、皆さんの現場の負担を少しでも軽くできれば幸いです。

運用が回り始めたら、次は「n8nメンテナンス用スクリプトでWF全体のヘルスチェックを定期実行する」「Claude CLIのCLAUDE.mdに運用カードを読み込ませて自走度を上げる」あたりが発展ステップになります。tech-picks.netでは引き続き、中小企業向けの実践的なAI活用・自動化ノウハウを発信していきます。