![[AI-Agent] AIエージェントをつくれる自動化ツール「n8n」の使い方](https://humanxai.info/images/uploads/ai-agent-n8n.webp)
1. n8nとは?
n8n(エイトン)は、オープンソースのワークフロー自動化ツールです。
「Zapier」や「Make(旧Integromat)」に近い存在ですが、より柔軟で自由度が高く、自分のPCやサーバーにセルフホストできるのが大きな特徴です。
特に最近は AIエージェント構築 にも活用されており、ChatGPTやClaudeなどと連携して「自分専用の自動化AI」を作れるのが魅力です。

n8n.io - AI workflow automation tool
n8n is a free and source-available workflow automation tool
https://n8n.io/2. n8nの基本イメージ
n8nでは、処理の流れを ノード(Node) という部品のつなぎ合わせで表現します。
それぞれのノードは「ひとつの役割」に特化しており、シンプルに組み合わせることで複雑な自動化も可能になります。
ノードの基本3種類
n8nのノードは、大きく分けると以下の3つの役割に整理できます。
1. トリガー(Trigger)
-
「いつ処理を始めるか」を決めるきっかけ。
-
例:
- Webhookを受けたとき(外部からHTTPアクセスされたとき)
- 特定の時間になったとき(Cronジョブ)
- Gmailで新しいメールを受信したとき
→ スタートボタンのような役割です。
2. アクション(Action / Processing)
-
受け取ったデータを加工したり、他のサービスに送ったりする処理。
-
例:
- 文章を整形する(テキスト置換、フォーマット変更)
- OpenAIやClaudeに質問を送って返答を取得
- データベースに書き込み
→ 処理の中枢で、ここがAIエージェントの「頭脳」部分になります。
3. アウトプット(Output / Destination)
-
処理結果をどこに届けるかを指定する部分。
-
例:
- Slackに通知
- LINEに送信
- Google Sheetsに保存
- Webhookで呼び出し元に返す
→ 出口ドアのような役割です。
ノード同士のつなぎ方
- 各ノードには「入力」と「出力」があり、矢印でつなぐことでデータが流れる仕組みです。
- データは JSON 形式でやり取りされ、どのノードでも
{"key": "value"}
の形で受け渡しできます。
例:Webhook → Function(加工) → Slack
{ "message": "Hello World!" }
イメージ例(簡単なフロー)
例えば「問い合わせをSlackに通知する」流れを作るなら:
- Webhookノード(外部から問い合わせを受信)
- Functionノード(メッセージを整形する)
- Slackノード(整形したテキストを送信)
→ 「問い合わせが届くと、自動でSlackに飛んでくる仕組み」が完成します。
例え話でイメージすると…
- トリガー=インターホンが鳴る
- アクション=対応して、内容をメモに書き直す
- アウトプット=そのメモを誰かに渡す
n8nは、この一連の流れを LEGOブロックを組むように可視化していけるのが最大の特徴です。
ここまで理解できると「ノードをどう選んで組むか」が見えてきます。 次の章(インストールや実際のワークフロー例)に進むとき、頭の中で「ノード=部品、つなぐ=配線」という図が浮かびやすくなるはずです。
3. インストール方法
n8nは クラウド版 と セルフホスト版 の両方があり、用途に合わせて選べます。
今回はローカルPCにインストールして「自分の環境で試す」方法を中心に解説します。
クラウドで試す場合
一番手軽な方法は公式サイトの n8n.io から無料アカウントを作ることです。
ブラウザだけでワークフローを作成・保存できるため、初めて触る方におすすめです。
ただし 無料枠は実行数やノード数に制限があるので、本格的に使う場合はセルフホストがベターです。
ローカル環境にインストールする場合
1. Node.js のインストール
n8nは Node.js 上で動くアプリです。
まずは Node.js 公式サイト から LTS版 をインストールしてください。
確認方法:
node -v
npm -v
バージョンが表示されればOKです。
2. n8n をインストール
npm(Node.jsのパッケージ管理ツール)で n8n をグローバルインストールします。
npm install -g n8n
インストール後、以下で起動できます。
n8n
3. 管理画面にアクセス
起動するとログに http://localhost:5678
と出るので、ブラウザで開きます。
ログイン画面が表示されたら、初回はユーザー名とパスワードを設定して管理画面へ。
4. 永続化(止めても消えない設定)
ローカルでそのまま起動すると、閉じたときに設定が消える場合があります。
環境変数を指定して「ユーザーデータを保存」すると便利です。
例:Linux/Mac
export N8N_USER_FOLDER=~/.n8n
n8n
Windows(PowerShell)
setx N8N_USER_FOLDER "C:\Users\lain\.n8n"
n8n
これでワークフローや認証情報が保存され、次回も同じ環境で使えます。
5. よくあるつまずきポイント
-
ポート競合 他のアプリが 5678 ポートを使っていると起動できない →
--port 5679
のように指定可能n8n --port 5679
-
ファイアウォール Windowsやセキュリティソフトがポートをブロックすることがあるので許可設定が必要
-
権限エラー(EACCES) Linux/Mac で npm -g インストール時に権限エラーが出る →
sudo
ではなく nvm を使うのがおすすめ
Docker で動かす場合(上級者向け)
ローカルで安定運用したい場合は Docker も選択肢です。
docker run -it --rm \
-p 5678:5678 \
-v ~/.n8n:/home/node/.n8n \
n8nio/n8n
-p 5678:5678
→ ポート開放-v ~/.n8n:/home/node/.n8n
→ 設定やデータを永続化
👉 サーバーで24時間稼働させるなら Docker 一択です。
まとめ
- まずは npm install -g n8n → n8n でOK
- http://localhost:5678 にアクセスすれば管理画面が出る
- 設定を永続化したい場合は N8N_USER_FOLDER を指定
- 本格運用なら Docker でホストすると安定
4. 初めてのAIエージェント作成(詳しく)
ここでは「Webhookで質問を受け取り → ChatGPTで回答 → 返す」という最小構成のAIチャットエージェントを作ります。
n8nの強みは、ノードを3つつなぐだけでAIエージェントが完成するところにあります。
ワークフローの流れ
-
Webhookノード
-
外部からの質問を受け取る入り口です。
-
設定画面で以下を指定:
- HTTP Method:
POST
- Path:
/ask
(任意の名前でOK)
- HTTP Method:
これで
http://localhost:5678/webhook/ask
にリクエストを送れるようになります。例:curlで質問を送る
curl -X POST http://localhost:5678/webhook/ask \ -H "Content-Type: application/json" \ -d '{"question": "今日の天気は?"}'
-
-
OpenAIノード
-
Webhookで受け取った「質問」をAIに投げます。
-
事前に OpenAI APIキーを n8n に登録しておきます。
-
設定例:
-
Resource: Chat
-
Operation: Create
-
Model: gpt-3.5-turbo など
-
Message:
{ "role": "user", "content": "{{$json["question"]}}" }
-
(↑ Webhookノードから受け取った
question
をそのまま渡している)
-
-
-
Respond to Webhookノード
-
AIの返答をそのまま呼び出し元に返します。
-
設定で「Response Data」を選択 →
json
に以下を指定:{ "answer": "{{$json["choices"][0]["message"]["content"]}}" }
→ これでエンドポイントにアクセスした人へ、AIの返答が返ります。
-
画面イメージ
ワークフローはこんな感じになります:
📩 Webhook (質問受け取り)
↓
⚙️ OpenAI (AI応答生成)
↓
📤 Respond to Webhook (回答を返す)
動作確認
- ワークフローを 「アクティブ」 にする
- curl などで質問を送信する
- JSON形式で回答が返ってくる
例:
curl -X POST http://localhost:5678/webhook/ask \
-H "Content-Type: application/json" \
-d '{"question": "n8nって何ですか?"}'
レスポンス:
{
"answer": "n8nはオープンソースのワークフロー自動化ツールです..."
}
ポイント
- 最低限3ノードで動く → シンプルなのに「エージェント感」が出る
- Webhookノードは外部アプリ連携の玄関口
- Respond to Webhookで即応答できる → APIサーバーを自作したような感覚になる
5. コードでカスタマイズ
Function ノードは、n8n の中で 受け取った JSON を自在に加工する小さな JavaScript 実行環境 です。 「ノードの間に 1 行差し込むだけで“欲しい形”に整える」用途に最適です。
基本ルール:配列を返す Function ノードの出力は
[{ json: {...} }, { json: {...} }]
のような配列です。
5.1 入力の取り方と出力の基本
- 入力:直前ノードのデータは
{$json}
で参照(式ではなくコード内では$json
) - 出力:
return [{ json: {...} }];
の配列形式で返す
// 受け取ったテキストに前置きを追加
const body = $json.question || $json.body || "";
return [
{
json: {
text: `【AIエージェントの回答】 ${body}`
}
}
];
フィールド名が不確定なことはよくあります。上のように フォールバック を用意しておくと実運用で強いです。
5.2 Function と Function Item の違い(つまずき防止)
- Function:全アイテムまとめて処理(
$items()
を使える) - Function Item:1アイテムずつ処理(シンプルで速い)
大量データの一括変換は Function、1件ごと変換は Function Item が向きます。最初は Function でOK。
5.3 OpenAI ノード前の“前処理”テンプレ
目的:Webhook で受けた JSON を、OpenAI の Chat / messages 形式に整える。
※このノードの次に OpenAI(Chat)を置き、「Messages」に {{$json.messages}}
を渡します。
// 受け取る想定: { question: "n8nって何?", userId: "guest" }
const q = ($json.question || "").toString().trim();
if (!q) {
// 空質問は 400 風のエラーで早期終了(IFノードで分岐しても良い)
throw new Error("質問テキストが空です。question フィールドを入れてください。");
}
// プロンプトの方針(ガードレール)
const system = [
"あなたは親切で簡潔なアシスタントです。",
"専門用語は短い補足を付け、例を1つ示すこと。",
"箇条書きを活用して読みやすく。"
].join(" ");
const user = q;
// OpenAI(Chat) の messages 形式に整形
return [
{
json: {
messages: [
{ role: "system", content: system },
{ role: "user", content: user }
]
}
}
];
こうしておくと、**OpenAIノード側は“データをそのまま受けるだけ”**で済み、再利用・差し替えがラク。
5.4 クレンジング&正規化(実務で効く小ワザ)
function normalize(str = "") {
return String(str)
.replace(/\r\n/g, "\n") // 改行統一
.replace(/\s+\n/g, "\n") // 行末空白削除
.trim();
}
const title = normalize($json.title);
const body = normalize($json.body);
// 長すぎる入力のガード(LLMへの投げ過ぎ防止)
const MAX = 2000;
const safeBody = body.length > MAX ? body.slice(0, MAX) + " …(truncated)" : body;
return [{ json: { title, body: safeBody } }];
- normalize:改行・空白の揺れを吸収
- トークン節約:LLM に渡す前に最大長を切るのは実務で超大事
5.5 条件分岐・コマンド解釈
// 例: "/summary ..." や "/translate ..." などの簡易コマンド
const raw = ($json.question || "").trim();
const m = raw.match(/^\/(\w+)\s+([\s\S]*)$/);
let intent = "chat";
let payload = raw;
if (m) {
intent = m[1].toLowerCase(); // "summary" | "translate" | ...
payload = m[2].trim();
}
return [{ json: { intent, payload } }];
このあと IF ノード で intent
を見て分岐すれば、1 本の Webhook で複数機能を扱えます。
5.6 エラーハンドリングとデバッグ
try {
// 何か処理
const input = $json.input?.trim();
if (!input) throw new Error("input が必要です。");
return [{ json: { ok: true, input } }];
} catch (e) {
// 失敗を「IFノードで拾える形」で返すパターン
return [{ json: { ok: false, error: e.message } }];
// もしくは実行自体を失敗にしたいなら:
// throw e;
}
- throw:その場で実行エラー(上流で失敗扱い)
- ok フラグ:IF ノードで分岐できるソフトエラー方式(ワークフローを止めない)
デバッグしたい時は
console.log()
が有効。実行履歴のノード出力に表示されます。
5.7 複数アイテムを返す(ループ展開)
たとえば RSS の複数記事を 1 件ずつ AI に投げる場合、Function で配列を展開しておくと楽です。
// 入力: { articles: [{title: "...", url: "..."}, ...] }
const items = [];
for (const a of ($json.articles || [])) {
items.push({
json: {
messages: [
{ role: "system", content: "以下の記事を100文字で要約して。" },
{ role: "user", content: `${a.title}\n${a.url}` }
],
meta: a
}
});
}
return items;
この形で出しておくと、OpenAI ノードが自動で N 回ループしてくれます(n8n は配列の各要素を個別アイテムとして流すため)。
5.8 “Set ノードで十分”な場面もある
- 単純なフィールド名の変更や静的値の付与は Set ノードのほうが速く・安全。
- **Function は“最後の手段”**くらいの気持ちで。保守性が上がります。
5.9 ミニ・レートリミット(簡易ウェイト)
API 連打を避けたい時に、Wait ノードの代わりに 1~2 秒の間引きを入れる例。
function sleep(ms){ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms); }
// ※FunctionノードのJSは同期実行。擬似スリープならこの手でOK。
sleep(1200); // 1.2秒ウェイト
return [{ json: $json }];
本格的な制御は Wait ノードや Rate Limit ノードを推奨(見通しが良くなる)。
5.10 よく使う n8n 変数(最小セット)
$json
:現在アイテムの JSON$items()
:上流ノードの出力一覧(Function のみ)$node["ノード名"].json
:別ノードの出力参照(直列より前)$now
:ISO 日付(new Date().toISOString()
相当)$executionId
:実行ID(ログ相関に便利)
まとめ(この章の着地点)
- Function ノードは“前処理・整形・分岐”の即効薬
- OpenAI の messages 構築を Function に寄せると、下流がシンプルになる
- エラー処理・入力クレンジング・長さガードは最初から入れておくと後が楽
- 単純変換は Set ノード、重い・複雑な加工は Function と使い分ける
6. 応用例(できることの幅をもう少し詳しく)
n8n の強みは、さまざまなサービスやAIを「線でつなぐだけ」で連携できるところにあります。
ここでは3つの代表的なシナリオを紹介します。
6.1 Slack通知 → ChatGPTで要約 → 自分にメール送信
用途イメージ:Slackのチャンネルに流れる大量の情報をAIに要約させ、自分だけにメールで届くようにする。
ワークフロー構成
-
Slack Trigger
- 新しいメッセージが投稿されたら起動
- 例:#dev-channel の更新を監視
-
OpenAI(Chat)ノード
- メッセージ内容を要約
system
プロンプト例:「以下のテキストを200字以内で要約してください」
-
Email ノード(GmailやSMTP)
- 要約文を自分のメールに送信
ポイント
- 「要約」→「メール転送」なので情報過多を防ぎ、通知疲れを解消できる
- フィルタノードを挟んで、特定キーワードを含むメッセージだけ処理するのも便利
6.2 RSS記事取得 → LLMで要点抽出 → Twitterに投稿
用途イメージ:ニュースサイトのRSSを自動で監視し、AIに要点を抽出させてTwitterに自動投稿する。
ワークフロー構成
-
RSS Read ノード
- 指定したRSSフィードから最新記事を取得
-
Function ノード(整形)
- タイトル+URL を LLM で扱いやすい形に整形
-
OpenAI(Chat)ノード
- 「この記事の内容を100字程度で要約して、Twitter投稿風にまとめてください」と指示
-
Twitter ノード
- AIの生成したテキストをそのままツイート
ポイント
- Twitter投稿の文字数制限(280文字)を Function ノードでカットしておくと安心
- IFノードを入れて、重複記事や古い記事はスキップする仕組みにできる
6.3 音声入力 → Whisperで文字起こし → ChatGPTに質問
用途イメージ:スマホから音声を送信すると、自動で文字起こしされ、ChatGPTが返答してくれる。
ワークフロー構成
-
Webhook ノード
- 音声ファイル(mp3, wav)を受け取るエンドポイント
-
OpenAI Whisper ノード
- 音声をテキストに変換
- 出力例:
{"text": "明日の天気はどうなる?"}
-
OpenAI(Chat)ノード
- Whisperで変換したテキストを ChatGPT に投げて回答を生成
-
Respond to Webhook ノード
- 返答をユーザーに返す
ポイント
- 音声をそのままAIに渡さず、文字にしてから投げることで誤解を減らせる
- スマホアプリ(ショートカット・Tasker等)からWebhookに音声を送れば、**「しゃべるだけでAIに質問」**が実現できる
- Slack × AI × メール → 情報整理の自動秘書
- RSS × AI × Twitter → 自動ニュース発信Bot
- 音声入力 × Whisper × ChatGPT → 音声対話エージェント
これらが ノーコード/ローコードで作れるのが n8n の強みです。 プログラミング経験が浅くても「部品を組み合わせる」だけで、AIエージェントが現実のタスクを肩代わりしてくれます。
7. まとめ
-
n8nはノーコードで始められる自動化プラットフォーム → ノードをつなげるだけで「AIエージェント」や「業務自動化フロー」を構築できる
-
クラウド版とセルフホスト版が選べる柔軟さ → お試しはクラウド、ガッツリ運用はローカルやDockerで
-
Functionノードでちょっとコードを足せば実用度が一気にアップ → データ整形、前処理、条件分岐など、AI活用がより現実的になる
-
応用範囲が広い → Slack通知やRSS配信から、音声アシスタントまで「自分専用のエージェント」を手軽に作れる
まずは「Webhook → OpenAI → Response」の3ノード構成を試してみましょう。 たったこれだけで、あなたのPC上に「自分だけのAIエージェント」が誕生します。
💬 コメント