n8n

n8n est une plateforme d'automatisation de workflows open-source (fair-code), auto-hébergeable. Elle permet de connecter des applications, d'automatiser des tâches répétitives et de construire des agents IA — le tout via une interface visuelle, avec la possibilité d'écrire du code quand nécessaire.

Alternatives comparables : Zapier, Make (ex-Integromat) — mais n8n se distingue par l'auto-hébergement, la flexibilité du code, et les intégrations IA natives.


Installation

Via npm (usage local)

npm install -g n8n
n8n start
# Interface disponible sur http://localhost:5678

Via Docker (recommandé)

docker run -it --rm \
  -p 5678:5678 \
  -v n8n_data:/home/node/.n8n \
  n8nio/n8n

Via Docker Compose (production)

services:
  n8n:
    image: n8nio/n8n
    restart: always
    ports:
      - "5678:5678"
    environment:
      - N8N_HOST=mon-domaine.com
      - N8N_PORT=5678
      - N8N_PROTOCOL=https
      - WEBHOOK_URL=https://mon-domaine.com/
      - N8N_ENCRYPTION_KEY=ma-cle-secrete   # obligatoire en production
    volumes:
      - n8n_data:/home/node/.n8n

volumes:
  n8n_data:

AI Starter Kit (n8n + Ollama + Qdrant)

n8n propose un kit Docker Compose tout-en-un pour les workflows IA locaux :

git clone https://github.com/n8n-io/self-hosted-ai-starter-kit.git
cd self-hosted-ai-starter-kit
docker compose up

Inclut : n8n + Ollama (LLM local) + Qdrant (base vectorielle) + PostgreSQL.


Interface et concepts clés

Vocabulaire

Terme Description
Workflow Séquence de nodes connectés qui automatise une tâche
Node Brique unitaire : effectue une action ou récupère des données
Trigger Node de départ qui déclenche le workflow (webhook, schedule, event…)
Connection Lien entre deux nodes qui transmet les données
Execution Une instance d'exécution d'un workflow
Item Une unité de données qui circule entre les nodes (objet JSON)
Credential Identifiants stockés de façon sécurisée pour accéder à des services

Structure d'un workflow

[Trigger] → [Node 1] → [Node 2] → [Node 3]
                ↓
           [Branch A] → [Node 4]

Chaque node reçoit des items (tableaux d'objets JSON), les transforme, et les transmet au node suivant.

Modes d'exécution

  • Manuel — déclenché depuis l'interface pour tester
  • Actif — le workflow tourne en production, déclenché par un trigger réel
  • Webhook — déclenché par un appel HTTP externe

Nodes essentiels

Nodes de données

Node Usage
HTTP Request Appeler n'importe quelle API REST
Code Exécuter du JavaScript ou Python personnalisé
Set Créer ou modifier des champs dans les items
Edit Fields Interface visuelle pour transformer les données
Function / Function Item Transformer les données avec du JS (legacy)

Nodes de flux

Node Usage
If Condition binaire — sépare le flux en deux branches
Switch Condition multiple — plusieurs branches selon une valeur
Merge Fusionner plusieurs flux en un
Loop Over Items Itérer sur chaque item individuellement
Wait Mettre le workflow en pause (durée fixe ou événement)
Stop and Error Interrompre le workflow avec une erreur personnalisée

Nodes utilitaires

Node Usage
Schedule Trigger Déclenchement récurrent (cron)
Webhook Recevoir des requêtes HTTP entrantes
Email (SMTP/IMAP) Envoyer ou lire des emails
Slack / Discord Envoyer des messages
Google Sheets Lire/écrire des données dans un tableur
Postgres / MySQL Requêtes SQL directes

Triggers et webhooks

Schedule Trigger (cron)

Champs : Seconds / Minutes / Hours / Day of Month / Month / Day of Week
Exemple : "0 9 * * 1-5"  →  tous les jours ouvrés à 9h

Webhook

Le node Webhook expose une URL unique pour recevoir des données HTTP :

URL de test    : http://localhost:5678/webhook-test/<id>
URL production : http://localhost:5678/webhook/<id>

Méthodes supportées : GET, POST, PUT, DELETE, PATCH.

Options utiles : - Respond : Immediately (répond 200 tout de suite) ou Using Respond to Webhook node (contrôle la réponse) - Authentication : Header Auth, Basic Auth, ou JWT

Respond to Webhook

Pour renvoyer une réponse personnalisée à l'appelant :

// Dans le node "Respond to Webhook"
{
  "status": 200,
  "body": {
    "message": "{{ $json.result }}"
  }
}

Expressions et code

Syntaxe des expressions

Les expressions utilisent {{ }} et permettent d'accéder dynamiquement aux données :

// Données du node précédent
{{ $json.email }}
{{ $json.user.name }}

// Données d'un node spécifique
{{ $('HTTP Request').item.json.status }}

// Métadonnées du workflow
{{ $workflow.name }}
{{ $execution.id }}

// Variables d'environnement
{{ $env.API_KEY }}

// Opérations
{{ $json.price * 1.1 }}
{{ $json.email.toLowerCase() }}
{{ $json.status === 'active' ? 'Oui' : 'Non' }}
{{ new Date().toISOString() }}

Variables built-in

Variable Description
$json Données JSON de l'item courant
$binary Données binaires de l'item courant
$('NomDuNode').item.json Données d'un node nommé
$items('NomDuNode') Tous les items d'un node
$workflow Métadonnées du workflow (name, id)
$execution Métadonnées d'exécution (id, mode)
$env Variables d'environnement
$now Date/heure actuelle (objet Luxon)
$today Date du jour (objet Luxon)

Node Code (JavaScript)

// Traiter tous les items
for (const item of $input.all()) {
  item.json.fullName = `${item.json.firstName} ${item.json.lastName}`;
  item.json.timestamp = new Date().toISOString();
}

return $input.all();
// Créer de nouveaux items
const results = [];

for (const item of $input.all()) {
  if (item.json.active) {
    results.push({
      json: {
        id: item.json.id,
        name: item.json.name,
      }
    });
  }
}

return results;

Node Code (Python)

results = []

for item in _input.all():
    if item.json.get('active'):
        results.append({
            'json': {
                'id': item.json['id'],
                'name': item.json['name'],
            }
        })

return results

Credentials

Les credentials stockent de façon chiffrée les clés API, tokens et identifiants nécessaires aux nodes.

Créer des credentials

Settings → Credentials → Add Credential ou directement depuis un node lors de sa configuration.

Types courants

Type Usage
API Key (Header Auth) Clé dans l'en-tête Authorization ou X-API-Key
Basic Auth Username + Password
OAuth2 Flux OAuth (Google, GitHub, Slack…)
Bearer Token Token JWT ou Bearer

Utiliser en expression

// Référencer dynamiquement un credential via une expression (cas avancé)
{{ $json.userCredentials }}

Variables d'environnement comme credentials

Pour éviter de stocker des secrets dans n8n, utiliser des variables d'environnement et les appeler via {{ $env.MA_CLE }}.


Intégrations IA

Connexion à un LLM

n8n intègre nativement LangChain. Les nodes IA se trouvent dans la catégorie AI de l'éditeur.

Nodes LLM disponibles : - OpenAI Chat Model - Anthropic Chat Model (Claude) - Ollama Chat Model (local) - Google Gemini Chat Model - Azure OpenAI

Exemple de chaîne IA basique :

[Chat Trigger] → [AI Agent] → [Respond to Webhook]
                     ↑
              [OpenAI Chat Model]

AI Agent

Le node AI Agent orchestre un LLM avec des outils. Il peut : - Appeler des outils (HTTP, code, recherche web…) - Maintenir une mémoire de conversation - Suivre une chaîne de raisonnement (ReAct)

[AI Agent]
  ├── LLM : Anthropic Chat Model (Claude)
  ├── Memory : Window Buffer Memory
  └── Tools : [HTTP Request Tool] [Code Tool] [Calculator]

Mémoire de conversation

Node mémoire Description
Window Buffer Memory Conserve les N derniers messages
Postgres Chat Memory Persiste la mémoire en base de données
Redis Chat Memory Persiste la mémoire dans Redis

Intégration MCP

n8n peut agir comme serveur MCP (exposer ses workflows à des agents IA externes) ou comme client MCP (consommer des outils MCP).

n8n comme serveur MCP :

[MCP Server Trigger] → [mes nodes n8n] → [réponse]

Accessible sur http://localhost:5678/mcp-server/http avec un token Bearer.

n8n comme client MCP :

Le node MCP Client Tool permet à un AI Agent n8n d'appeler des outils exposés par un serveur MCP externe.

[AI Agent]
  └── Tools : [MCP Client Tool → serveur MCP externe]

Exemple : workflow IA avec webhook

[Webhook POST /chat]
    ↓
[AI Agent]
  ├── LLM : Claude (Anthropic Chat Model)
  ├── Memory : Window Buffer Memory
  └── Tools : [HTTP Request Tool]
    ↓
[Respond to Webhook → réponse JSON]