「Difyで社内FAQボットを作ったが、社員に使ってもらえない」——よくある話だ。DifyのチャットURLを共有しても、日常的に使うTeamsやSlackから離れてもらうのは思ったよりも高いハードルになる。
n8nと組み合わせると、この問題が消える。社員はいつも通りTeamsに質問を投稿するだけで、n8nがその投稿をDify APIに転送し、AIが生成した回答をスレッドに自動返信する。「AIを使っている感」を意識させないことが、定着率を上げるコツだ。
なぜn8n×Difyなのか
n8nはワークフロー自動化ツール、DifyはRAG・LLMアプリの構築プラットフォームだ。それぞれ単体でも強力だが、組み合わせると「AIが文脈を読んで自動対応する」フローが作れる。
「メールが来たらSlackに転送」「定時にスプレッドシートを更新」など、ルールが決まっている処理は得意。ただし、テキストの意味を読んで判断する能力はない。
社内ドキュメントをRAGで検索し、自然言語の質問に回答するのが得意。チャット画面をURLで共有できる。ただし、自ら外部サービスに通知を送る機能はない。
n8nがトリガーと配送を担当、DifyがAI判断を担当。社員はTeamsやSlackなどいつものツールで質問するだけで、AIが自動回答・自動振り分けを実行する。
準備するもの
この記事では以下が稼働済みの前提で進める。
- n8n — セルフホスト(Docker)または n8n.io クラウドのどちらでも可
- Dify チャットボットアプリ — Cloud(cloud.dify.ai)またはセルフホスト。アプリ種別は「チャットボット」を選ぶこと
- Difyのナレッジベース — FAQ対象の社内ドキュメントを登録済みであること(シナリオAに必要)
- 通知先 Webhook URL(オプション) — Slack を使う場合は Incoming Webhook URL(無料・簡単)。Teams は後述の注意を参照。検証フェーズは通知なしでもOK
- Phase 1(必須・約15分) — Webhook → Dify の 2ノード で動作確認。curl で叩いて Dify の回答が返ってくれば成功
- Phase 2(オプション) — Slack / Teams 通知ノードを追加。Phase 1 が動いてから着手すること
🐝 Difyのアプリ種別について この記事で使うAPIはチャットボット(チャット型)アプリのエンドポイントです。Dify管理画面でアプリを作成するとき「チャットボット」を選んでください。エージェント型・ワークフロー型は別のエンドポイントを使うため設定が異なります。
Dify APIキーの取得と確認
APIキーの発行
- Dify管理画面でチャットボットアプリを開く
- 左サイドバー「APIアクセス」をクリック
- 「APIキー」セクションで「APIキーを作成」
- 生成されたキー(
app-xxxxxxxxxxxxxxxxxx形式)をコピーして保管
- Dify Cloud:
https://api.dify.ai/v1 - セルフホスト:
http://あなたのサーバーIP/v1(デフォルトポート 80)
curlで疎通確認
n8nの設定前にAPIが正常に動作するか確認しておく。以下のコマンドを実行し、answer フィールドにAIの回答が返ってくれば疎通成功だ。
curl -X POST https://api.dify.ai/v1/chat-messages \
-H "Authorization: Bearer app-あなたのAPIキー" \
-H "Content-Type: application/json" \
-d '{"inputs":{},"query":"有給休暇の申請方法を教えてください","response_mode":"blocking","conversation_id":"","user":"test-user"}'
正常なレスポンス例:
{
"answer": "有給休暇の申請は、社内ポータルの「各種申請」から...",
"conversation_id": "abc-123",
"message_id": "msg-456"
}
n8n HTTP Requestの基本設定
n8nでDifyを呼び出す共通設定を押さえておく。すべてのシナリオでこの設定が基本になる。
① 認証情報の登録(一度だけ)
- n8n画面右上の設定 → Credentials → 「Add Credential」
- タイプ: Header Auth
- Name(ヘッダー名):
Authorization - Value:
Bearer app-あなたのAPIキー(Bearerのあとに半角スペースが必要) - 保存名を
Dify API Keyなどに設定して保存
② HTTP Requestノードの設定値
| 設定項目 | 値 |
|---|---|
| Method | POST |
| URL | https://api.dify.ai/v1/chat-messages(セルフホストは自サーバーURL) |
| Authentication | Generic Credential Type → Header Auth → 先ほど登録した認証情報 |
| Send Headers | ON → Content-Type: application/json を追加 |
| Send Body | JSON(下記テンプレート参照) |
③ リクエストボディのテンプレート
response_mode は必ず blocking にすること(streamingはn8nでサポートされていない)。query には前ノードの変数を差し込む。
{
"inputs": {},
"query": "={{ $json.body.question }}",
"response_mode": "blocking",
"conversation_id": "",
"user": "={{ $json.body.user_id || 'anonymous' }}"
}
$json.body.question になる理由- n8n の Webhook ノードは、POSTで受け取ったJSONボディを
$json.body.フィールド名に格納する(直接$json.フィールド名ではない) - “Body Content Type: JSON / Specify Body: Using JSON” モードでは、式の先頭に
=が必要(例:="{{ $json.body.question }}") || ‘anonymous’はフォールバック値。データがない場合に Dify API がuser必須エラーを返すのを防ぐ
④ レスポンスの取り出し方
HTTP Requestノードの次のノードで {{ $json.answer }} を参照するとAIの回答テキストが取得できる。
シナリオA:FAQ自動返答
最もシンプルで即効性が高い構成だ。Webhookでリクエストを受け取り、Difyで回答を生成してTeamsに返信する。
Step 1 — ワークフローの作成とWebhookノードの設定
① ワークフローJSONをインポートする(推奨)
配布しているJSONファイルをn8nに読み込むと、ノード構成が自動で揃います。
- ツールページ から
n8n-dify-faq-v1.jsonをダウンロード - n8n の画面で「Create workflow」ボタンをクリック(新規ワークフローが開く)
- 画面右上の「…(三点メニュー)」をクリック
- メニューから「Import from file…」を選択
🐝 「Import from file」がグレーアウトして選べない場合 画面上部に「Editor」「Executions」「Evaluations」のタブがある場合、「Editor」タブをクリックしてから「…」メニューを開いてください。Executionsタブを開いているとインポートが無効になります。
② 手動でゼロから作る場合
- n8n で「Create workflow」→ 「+ Add first step」→ 検索欄に「Webhook」と入力して選択
- Webhook ノードの設定 — HTTP Method:
POST/ Path:dify-faq(任意) / Respond: When Last Node Finishes - 次に「+」ボタンで HTTP Request ノードを追加 → 前節(n8n HTTP Requestの基本設定)の設定値を入力
③ Webhookをテストモードで待機させる
- Webhook ノードをクリックして開く
- 「Listen for test event」ボタンをクリック → ノードが待機状態(リスニング中)になる
- この状態のまま次の curl を実行する(待機は一定時間でタイムアウトするので素早く実行)
curl -X POST https://your-n8n/webhook-test/dify-faq \
-H "Content-Type: application/json" \
-d '{"question":"有給休暇の申請方法は?","user_id":"tanaka"}'
- n8nをインストールしたサーバー上のターミナルから実行する場合:
http://localhost:5678/webhook-test/dify-faq(Cloudflareなどのトンネルを経由しない直接アクセス) - 外部・別PCから実行する場合:
https://your-n8n.example.com/webhook-test/dify-faq(ドメイン名に置き換え) - Cloudflare Access で保護されている場合: 外部からのcurlはアクセス認証に弾かれます。サーバー自身から
localhost:5678で叩くのが確実です
✅ Phase 1 の成功確認
curl の返り値に “answer”: “…” が含まれていれば、Webhook → Dify の2ノード連携は完成です。この時点でいったん止めて動作を確認しましょう。通知ノード(Phase 2)は次のステップで追加します。
Step 2 — HTTP Requestノード(Dify呼び出し)
前節(n8n HTTP Requestの基本設定)と同じ設定でDify APIを呼び出す。“Body Content Type: JSON / Specify Body: Using JSON” を選び、以下を入力する。
{
"inputs": {},
"query": "={{ $json.body.question }}",
"response_mode": "blocking",
"conversation_id": "",
"user": "={{ $json.body.user_id || 'anonymous' }}"
}
=[object Object]の先頭に=が入っているか確認(忘れると文字列として送信される)- Dify API から
“Arg user must be provided”エラー →userフィールドが空になっている。|| ‘anonymous’フォールバックを確認 - 接続エラー → URLが正しいか確認(セルフホストの場合、n8nコンテナから見たDifyのURLを使う。詳細は後述のトラブルシュートを参照)
Step 3 — 通知ノードの設定
⚠️ Teams通知の現状(2026年7月時点) Teams の旧「Incoming Webhook(コネクタ)」は Microsoft により 2026年5月18〜22日に廃止完了。現在は使用不可(既存の Webhook URL も動作停止)。後継の Workflows(Power Automate)経由の HTTP トリガーは PREMIUMライセンス必須 で設定も複雑。まず Slack または「通知なし」で動作確認することを強く推奨。
選択肢 ①:Slack に通知する(推奨・無料)
- Slack の App管理画面 → 「Create New App」→「From scratch」
- 「Incoming Webhooks」を ON → 「Add New Webhook to Workspace」→ 通知先チャンネルを選択
- 発行された
https://hooks.slack.com/services/…をコピー - n8n に 2つ目の HTTP Request ノードを追加(認証: なし)
- Method: POST / URL: コピーしたSlack Webhook URL
{
"text": "*Q:* {{ $('Webhook').item.json.body.question }}\n\n*A:* {{ $json.answer }}"
}
選択肢 ②:通知ノードを省いて Webhook レスポンスで返す(検証用・最速)
通知先がない検証フェーズでは Step 3 を省略できる。Webhook ノードの Response Mode を「Last Node」にしておけば、Dify API ノードの出力(answerフィールド)がそのまま HTTP レスポンスとして返ってくる。
# curl の返り値に Dify の回答が含まれる(2ノード構成でも動く)
curl -X POST http://localhost:5678/webhook-test/dify-faq \
-H "Content-Type: application/json" \
-d '{"question":"有給休暇の申請方法は?","user_id":"tanaka"}'
🐝 Teams に通知したい場合 旧コネクタ方式(Incoming Webhook)は 2026年5月に廃止済みで現在使用不可。Teams へ通知したい場合、現実的な選択肢は Power Automate Premium(プレミアムプラン必須) のみ:Workflows アプリ → 「HTTP 要求の受信時」トリガーを作成 → 生成された URL を n8n の通知ノードに設定。Microsoft 365 E3/E5 環境では Power Automate Premium が付帯するケースがある。まずライセンスを確認すること。
n8n × Dify FAQ自動返答ワークフロー
シナリオAのn8nワークフローをそのままインポートできるJSONファイル。Webhook → Dify API → Slack/Teams通知の3ノード構成。DifyのAPIキーと通知先Webhook URLを差し替えるだけで動作します(Slack推奨)。
シナリオB:死活監視 + AI通知文の自動生成
定期的にサーバーの死活確認を行い、ダウンを検知したらDifyが過去の障害対応手順書を参照して通知文を自動生成する。情シスが深夜に慌てて通知を書く手間がなくなる。
Step 1 — Schedule Trigger
「Schedule Trigger」ノードを追加 → Mode: Every X Minutes → Interval: 5。
Step 2 — HTTP Requestノード(サーバーPing)
監視対象のURLにGETリクエストを送る。ノードの「On Error」設定を「Continue(Error Output)」にしておくことが重要——失敗してもフローを止めない。
| 設定項目 | 値 |
|---|---|
| Method | GET |
| URL | 監視対象のURL(例: https://your-internal-app.com/health) |
| On Error | Continue(Error Output) |
| Timeout | 10000(10秒) |
Step 3 — IFノード(ダウン判定)
HTTPステータスコードが200以外、またはエラーが発生した場合に「True」ブランチへ進む。IFノードの条件は2つ設定し、「OR」でどちらか一方が真のときに発火させる。
| 条件 | 設定値 |
|---|---|
| 条件1 | statusCode is not equal to 200 |
| 条件2 | error is not empty |
| 組み合わせ | OR(どちらか一方が真) |
Step 4 — Dify(通知文生成)
Trueブランチ(ダウン検知時)のみDifyを呼び出す。ナレッジベースに過去の障害対応手順書を登録しておくと、より具体的な通知文が生成される。
{
"inputs": {},
"query": "【障害発生】サービスがダウンしています。影響範囲の推定と、エンドユーザー向けの暫定案内文を日本語で作成してください。",
"response_mode": "blocking",
"conversation_id": "",
"user": "monitoring-bot"
}
🐝 連続通知を防ぐには ダウンが続く限り5分ごとに同じ通知が飛んでしまう。n8nの「Static Data」ノードや外部KVストアを使って「直前の状態(UP/DOWN)」を記録し、状態が変化したときだけ通知する設計にするとノイズを減らせる。
シナリオC:問い合わせの自動分類と担当者振り分け
フォームやメールで受け付けた問い合わせをDifyに分類させ、カテゴリに応じてn8nが担当者チャンネルへ自動通知する。受付件数が増えるほど効果が大きいシナリオだ。
Step 1 — Difyへの分類依頼プロンプト
「JSON形式のみで返してほしい」と明示することが重要だ。フリーテキストで返ってくると後続のパース処理が壊れる。Difyのシステムプロンプトにも「JSONのみ出力」と追記しておくと安定する。
問い合わせ内容を分類し、JSONのみで回答してください。説明文は不要です。
問い合わせ: ={{ $('Webhook').item.json.body.message }}
出力形式(必ずこのJSONのみ):
{"category":"pc_trouble|network|account|other","urgency":"high|medium|low","summary":"30文字以内の要約"}
Step 2 — Codeノードでレスポンスをパース
DifyのLLMがMarkdownのコードブロックで囲んで返すことがある(例: )。Codeノードで除去してからパースする。json ...
// n8n Codeノード(JavaScript)
const answer = $input.item.json.answer;
// コードブロック記号を除去して純粋なJSONを取り出す
const cleaned = answer
.replace(/```json\n?/g, '')
.replace(/```/g, '')
.trim();
const parsed = JSON.parse(cleaned);
return [{ json: parsed }];
Step 3 — Switchノードで担当者チャンネルに振り分け
| category値 | urgency | 送信先 |
|---|---|---|
pc_trouble | high → 🔴 | Teams「PCトラブル対応」チャンネル |
network | medium → 🟡 | Teams「ネットワーク対応」チャンネル |
account | low → 🟢 | Teams「アカウント管理」チャンネル |
other | — | Teams「情シス全般」チャンネル |
トラブルシュート
まとめ
n8n × Dify 連携の核心は「既存ツールの使い勝手を変えずにAIの判断を注入する」ことだ。社員はTeamsやSlackをいつも通り使い、裏でn8nがDify APIを呼び出してAIが処理する。
✅ まず試すならシナリオAから
ダウンロードできるn8nワークフローJSONをインポートし、DifyのAPIキーを設定するだけで動作確認できます。通知先は Slack Incoming Webhook URL を推奨(Teams は後述の注意あり)。
ツールページでダウンロード →