bbizinets.life
n8nでClaudeのSystemプロンプトが拒否される原因と解決法【3つのNG設計】
実践ログ

n8nでClaudeのSystemプロンプトが拒否される原因と解決法【3つのNG設計】

結論:Systemプロンプトが拒否される原因は3つのNG設計です

n8nでClaudeのSystemプロンプトを設定したら、モデルが処理を拒否したり出力が不安定になったりして困っていませんか。

原因はほぼこの3つのどれかです。MCP環境前提の指示が残っている・プレースホルダーが未置換・1つに詰め込みすぎている。

この3つを除去するだけで、拒否エラーはほぼ解消されます。

私が詰まった状況:create-article.txtをそのまま渡したら拒否された

今回のエラーに出会ったのは、bizinets.bizの記事自動化パイプラインをn8nで構築していたときのことです。

もともとClaudeをMCP接続で使っていたときは、記事設計ルールをまとめたcreate-article.txtをSystemプロンプトとして渡すだけで正常に動いていました。同じファイルをn8nのAnthropicノードにそのまま貼り付けたところ、OpenAIモデルが以下のような返答をしてきました。

申し訳ありませんが、特定の設計に基づいて内容を生成することはできませんが、
設計のガイドラインや手順についての質問には対応できます。

正直、最初は何が問題なのか全くわかりませんでした。MCP環境では動いていたのに、なぜn8nでは拒否されるのか。ファイルの中身を読み直してみると、3つの問題が重なっていることがわかりました。

NG①:MCP環境前提の指示をそのまま使う

create-article.txtには、MCPツール経由でのファイル操作指示がそのまま含まれていました。

以下を新規作成する:
1) articles/{DATE}__kw-{NEW_SLUG}/article.md
2) articles/{DATE}__kw-{NEW_SLUG}/meta.json
3) articles/{DATE}__kw-{NEW_SLUG}/assets/(空フォルダ)
internal_links.csv への追記:
- primary_topic を anchor → target_slug={NEW_SLUG}, priority=5

これらはMCP接続時にClaudeがfilesystem:write_filefilesystem:edit_fileを呼び出すことを前提にした指示です。n8nのLLMノードはMCPと接続していないため、Claudeがこれらの操作を実行しようとしても何もできません。

モデルは「実行できない指示が含まれているプロンプト」を受け取ると、処理全体を拒否することがあります。特にファイル操作・外部サービス連携・コマンド実行などの指示は、LLM単体では実行不可能なためNG扱いになります。

判断基準:

  • Systemプロンプトに「ファイルを作成する」「CSVに追記する」「コマンドを実行する」等の動詞が含まれている → n8n環境では全て削除する

NG②:プレースホルダーを残したまま渡す

create-article.txtには、MCP運用時に動的に置き換えられる変数がそのまま残っていました。

キーワード:{{KEYWORD_JA}}
スラッグ:{{SLUG}}
カテゴリ:{{CATEGORY}}

MCP環境では、Claudeがワークフロー実行前にこれらを実際の値に置き換えてから処理を開始します。ところがn8nのLLMノードに渡すSystemプロンプトは静的なテキストです。{{KEYWORD_JA}}という文字列がそのまま渡されると、モデルは「これは何の値を指しているのか」を解釈できず、プロンプト全体の意味が崩れます。

具体的には、私の環境ではこの問題とNG①が重なったことで、モデルが「このプロンプトは処理できない」と判断して拒否するケースが繰り返し発生していました。

判断基準:

  • Systemプロンプトに{{または}}が含まれている → n8nのUserプロンプト側で実値を渡す形に変更する
  • Systemプロンプトは固定ルールのみ・Userプロンプトで動的な値を渡す設計にする

NG③:1つのプロンプトに全情報を詰め込む

3つ目の問題は、プロンプトの長さと役割の混在です。

create-article.txtは私が数か月かけて育ててきた記事制作の正本ルールで、ビジネッツの思想・記事設計ルール・文体DNA・BZタグ仕様・導線ルール・ファイル生成手順・監査基準まで、あらゆる情報が1つのファイルに集約されていました。

これをそのままSystemプロンプトに渡すと、モデルは「何を優先すべきか」を判断できなくなります。記事設計をしているのか、本文生成をしているのか、監査をしているのか、文脈が一切与えられないまま膨大な指示を受け取るからです。

私の場合、このファイルをそのまま渡したとき、OpenAIが一度拒否した後にSystemプロンプトを削除してシンプルな固定文に変えたら即座に動くようになりました。1つのノードが担うべき役割は1つだけという原則を、プロンプト設計でも守る必要があります。

判断基準:

  • Systemプロンプトが1000文字を超えている → 用途別に分割する
  • 「設計」「生成」「監査」が同じプロンプトに混在している → ノードごとに分割する

解決方法:MCP指示削除・プレースホルダー置換・用途別分割

3つのNGを解消するための具体的な手順を説明します。

対策①:MCP操作指示を全て削除する

Systemプロンプトから以下に該当する文章を全て削除します。

  • filesystem:write_filefilesystem:edit_file等のMCPツール呼び出し
  • 「ファイルを作成する」「CSVに追記する」「フォルダを作成する」等の操作指示
  • 「完了後に〜を実行する」等の外部処理への言及

削除した後、残るのは「LLMが判断・生成するための純粋なルール」だけになります。これがSystemプロンプトとして機能する内容です。

対策②:プレースホルダーをUserプロンプト側に移す

{{KEYWORD_JA}}等の動的な値はSystemプロンプトから取り除き、Userプロンプト側でn8nの変数として渡します。

# Userプロンプトの例
## キーワード
{{ $json.keyword }}

## スラッグ
{{ $json.slug }}

Systemプロンプトは「変わらないルール」、Userプロンプトは「毎回変わる実値」と役割を分けるだけです。

対策③:ノードの役割に合わせて分割する

私のパイプラインでは、最終的に以下のように分割しました。

ノード | Systemプロンプトの内容
--- | ---
01記事設計 | カテゴリ別記事タイプ・H2構造ルール・出力形式
02本文生成 | 文体ルール・BZタグ仕様・品質要件
03自己監査 | 監査の3問・文体チェック・出力形式

分割前は1ファイルに全部入っていたものが、各ノードの役割に対して必要なルールだけに絞られます。副産物として、各LLMノードへの入力トークンが減り、APIのクレジット消費も最適化できました。

この後どうなったか

3つの対策を実施した後、どうなったか気になりませんか。01〜03の全ノードが正常に動作するようになりました。特に分割の効果が大きく、各ノードが意図した通りの出力を返すようになったのが正直嬉しかったです。

クレジット消費も体感で3割程度削減できました。長いSystemプロンプトを毎回全ノードに渡していたときと比べると、各ノードの入力トークン数が大幅に下がったからだと思います。

よくある質問

Systemプロンプト設計でよく受ける質問をまとめました。あなたの環境にも当てはまる内容がありますか?

Q. Systemプロンプトは長い方が精度が上がりませんか?

長い方が精度が上がるとは限りません。関係ない情報が含まれているほど、モデルは優先順位を判断しにくくなります。「そのノードが担う1つの役割に必要なルールだけ」に絞ることが、精度とコスト両方に効きます。

Q. n8nのAnthropicノードにSystemプロンプト欄がない場合はどうすればいいですか?

n8nのAnthropicノードはUser/Assistantのみでやり取りする形式です。Systemプロンプトに当たる内容はUserメッセージの1番目に配置してください。2番目のUserメッセージに実値(キーワード・スラッグ等)を渡す形で同じ効果が得られます。

Q. OpenAIとClaudeで拒否のパターンに違いはありますか?

あります。OpenAIは「処理できない指示が含まれている」と判断した場合に曖昧な拒否文を返すことが多いです。Claudeは比較的柔軟に処理しようとしますが、プレースホルダーが多数残っていると出力が不安定になりやすいです。どちらも対策は同じです。

まとめ

Systemプロンプトが拒否される根本原因は「LLM単体では実行できない指示を渡していること」です。

  • MCP操作指示が含まれている → 全て削除する
  • プレースホルダーが残っている → Userプロンプト側で実値を渡す
  • 全情報を詰め込んでいる → ノードの役割に合わせて分割する

今日できる一歩: 現在使っているSystemプロンプトを開いて、「ファイル操作」「{{変数}}」「複数の役割」が含まれていないか確認してみてください。この3つが除去されるだけで、安定性は大きく変わります。

今回の失敗は「何をLLMに任せて何をn8nで処理するか」という設計判断がなかったことが根本にありました。この判断軸を体系的に整理したい方は、bizinets.bizの判断軸ページが参考になると思います。

ここまでの内容で、Systemプロンプト拒否の原因と対処の方向性は整理できたと思います。
ただし、このままだと自分のパイプライン全体でLLMとノードの役割をどう切り分けるかは判断できません
なぜなら、「何をLLMに任せて何をn8nノードに任せるか」という設計の判断軸が、まだ整理されていないからです。

判断軸の整理はこちら

bizinets.biz

記事を読んで「もっと知りたい」と思ったあなたへ

bizinets.biz では、ビジネスの仕組みづくりを体系的に学べるコンテンツを用意しています。まずは一度、覗いてみてください。

bizinets.biz へ行く →

関連記事