n8nclaude-codemcpintegratie

n8n + Claude Code MCP integratie

20 januari 202614 min leestijdDoor Albert Barth

n8n + Claude Code MCP Integratie: De Ultieme Gids

Model Context Protocol (MCP) is een van de meest opwindende ontwikkelingen in AI tooling. Het maakt het mogelijk om AI assistenten zoals Claude direct te verbinden met externe tools en services. Door n8n te combineren met Claude Code via MCP, krijg je een krachtige setup waarbij Claude workflows kan triggeren, data kan ophalen en acties kan uitvoeren in de echte wereld.

Wat is Model Context Protocol (MCP)?

MCP is een open protocol ontwikkeld door Anthropic dat AI modellen in staat stelt om veilig te communiceren met externe systemen. Het fungeert als een gestandaardiseerde brug tussen Claude en de buitenwereld.

Kernconcepten van MCP

1. Resources Resources zijn data-endpoints die Claude kan lezen. Denk aan:
  • Bestanden op je computer
  • Database records
  • API responses
  • Real-time data feeds
2. Tools Tools zijn acties die Claude kan uitvoeren:
  • Code executie
  • API calls maken
  • Bestanden aanmaken/wijzigen
  • Workflows triggeren
3. Prompts Voorgedefinieerde prompt templates die Claude kan gebruiken voor specifieke taken.

Waarom MCP + n8n?

De combinatie van MCP en n8n biedt unieke voordelen:
AspectVoordeel
**Bi-directionele communicatie**Claude kan n8n workflows triggeren EN data ontvangen
**Rijke context**n8n kan realtime data leveren aan Claude's beslissingen
**Automatisering**Combineer Claude's redeneerkunst met n8n's 400+ integraties
**Veiligheid**MCP's security model + n8n's access controls
**Schaalbaarheid**n8n handelt de execution af, Claude focust op beslissingen

Prerequisites

Voordat je begint, heb je nodig:
  1. Claude Code (Claude's coding assistant CLI)
  • Installatie: npm install -g @anthropic-ai/claude-code
  • Anthropic API key
  1. n8n Instance
  • Cloud account OF self-hosted installatie
  • Webhook functionaliteit (standaard inbegrepen)
  1. Node.js (versie 18+)
  • Voor het draaien van de MCP server
  1. Basis kennis van:
  • n8n workflow creatie
  • Claude Code gebruik
  • JSON en REST APIs

Stap 1: n8n Webhook Configureren

Eerst maken we een n8n workflow met een webhook endpoint dat Claude kan aanroepen.

1.1 Nieuwe Workflow Aanmaken

  1. Open n8n
  2. Klik op "Add workflow"
  3. Noem het "Claude MCP Integration"

1.2 Webhook Node Toevoegen

Node: Webhook
HTTP Method: POST
Path: /claude-mcp
Authentication: Header Auth
  - Name: X-API-Key
  - Value: [genereer een secure key]
Response: Immediately respond
Response Code: 200

1.3 Request Router Toevoegen

Na de webhook, voeg een Switch node toe om verschillende MCP acties te routeren:
Node: Switch
Routing Key: {{$json.body.action}}

Rules:
1. action === 'query_database' → Database pad
2. action === 'send_email' → Email pad  
3. action === 'create_task' → Task pad
4. action === 'get_status' → Status pad
Default: Error response

1.4 Voorbeeld Database Query Pad

Node: PostgreSQL (of Supabase)
Operation: Execute Query
Query: {{$json.body.query}}

→ Respond to Webhook
Response Body: 
{
  "success": true,
  "data": {{$json.data}},
  "count": {{$json.data.length}}
}

1.5 Voorbeeld Email Pad

Node: Email Send (SendGrid/Mailgun)
To: {{$json.body.to}}
Subject: {{$json.body.subject}}
Body: {{$json.body.message}}

→ Respond to Webhook
Response Body:
{
  "success": true,
  "message_id": "{{$json.id}}"
}

1.6 Activeer de Workflow

  1. Klik op "Active" toggle
  2. Kopieer de Production webhook URL
  3. Test met cURL:
curl -X POST https://your-n8n.com/webhook/claude-mcp \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your-api-key" \
  -d '{"action": "get_status", "data": {}}'

Stap 2: MCP Server voor n8n Maken

Nu maken we een MCP server die Claude Code kan gebruiken om met n8n te communiceren.

2.1 Project Setup

mkdir n8n-mcp-server
cd n8n-mcp-server
npm init -y
npm install @modelcontextprotocol/sdk node-fetch

2.2 MCP Server Code

Maak een bestand server.js:
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';

const N8N_WEBHOOK_URL = process.env.N8N_WEBHOOK_URL;
const N8N_API_KEY = process.env.N8N_API_KEY;

// Helper functie voor n8n calls
async function callN8n(action, data = {}) {
  const response = await fetch(N8N_WEBHOOK_URL, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': N8N_API_KEY
    },
    body: JSON.stringify({ action, ...data })
  });
  
  if (!response.ok) {
    throw new Error(`n8n error: ${response.status}`);
  }
  
  return response.json();
}

// MCP Server initialiseren
const server = new Server({
  name: 'n8n-integration',
  version: '1.0.0'
}, {
  capabilities: {
    tools: {}
  }
});

// Tool: Database Query
server.setRequestHandler('tools/list', async () => ({
  tools: [
    {
      name: 'query_database',
      description: 'Voer een SQL query uit op de database via n8n',
      inputSchema: {
        type: 'object',
        properties: {
          query: {
            type: 'string',
            description: 'De SQL query om uit te voeren'
          },
          params: {
            type: 'array',
            description: 'Query parameters voor prepared statements'
          }
        },
        required: ['query']
      }
    },
    {
      name: 'send_email',
      description: 'Verstuur een email via n8n',
      inputSchema: {
        type: 'object',
        properties: {
          to: { type: 'string', description: 'Ontvanger email adres' },
          subject: { type: 'string', description: 'Email onderwerp' },
          message: { type: 'string', description: 'Email inhoud' }
        },
        required: ['to', 'subject', 'message']
      }
    },
    {
      name: 'create_task',
      description: 'Maak een nieuwe taak aan in het project management systeem',
      inputSchema: {
        type: 'object',
        properties: {
          title: { type: 'string' },
          description: { type: 'string' },
          assignee: { type: 'string' },
          due_date: { type: 'string', format: 'date' },
          priority: { type: 'string', enum: ['low', 'medium', 'high'] }
        },
        required: ['title']
      }
    },
    {
      name: 'get_workflow_status',
      description: 'Check de status van n8n workflows',
      inputSchema: {
        type: 'object',
        properties: {
          workflow_name: { type: 'string' }
        }
      }
    },
    {
      name: 'trigger_workflow',
      description: 'Trigger een specifieke n8n workflow',
      inputSchema: {
        type: 'object',
        properties: {
          workflow_id: { type: 'string' },
          input_data: { type: 'object' }
        },
        required: ['workflow_id']
      }
    }
  ]
}));

// Tool execution handler
server.setRequestHandler('tools/call', async (request) => {
  const { name, arguments: args } = request.params;
  
  try {
    let result;
    
    switch (name) {
      case 'query_database':
        result = await callN8n('query_database', {
          query: args.query,
          params: args.params || []
        });
        break;
        
      case 'send_email':
        result = await callN8n('send_email', {
          to: args.to,
          subject: args.subject,
          message: args.message
        });
        break;
        
      case 'create_task':
        result = await callN8n('create_task', {
          title: args.title,
          description: args.description || '',
          assignee: args.assignee,
          due_date: args.due_date,
          priority: args.priority || 'medium'
        });
        break;
        
      case 'get_workflow_status':
        result = await callN8n('get_status', {
          workflow_name: args.workflow_name
        });
        break;
        
      case 'trigger_workflow':
        result = await callN8n('trigger_workflow', {
          workflow_id: args.workflow_id,
          input_data: args.input_data || {}
        });
        break;
        
      default:
        throw new Error(`Unknown tool: ${name}`);
    }
    
    return {
      content: [{
        type: 'text',
        text: JSON.stringify(result, null, 2)
      }]
    };
    
  } catch (error) {
    return {
      content: [{
        type: 'text',
        text: `Error: ${error.message}`
      }],
      isError: true
    };
  }
});

// Server starten
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error('n8n MCP Server running...');
}

main().catch(console.error);

2.3 Package.json Configureren

{
  "name": "n8n-mcp-server",
  "version": "1.0.0",
  "type": "module",
  "main": "server.js",
  "bin": {
    "n8n-mcp": "./server.js"
  },
  "dependencies": {
    "@modelcontextprotocol/sdk": "^0.5.0",
    "node-fetch": "^3.3.0"
  }
}

Stap 3: Claude Code Configureren

Nu configureren we Claude Code om de MCP server te gebruiken.

3.1 Claude Code Settings

Open je Claude Code configuratie bestand. De locatie verschilt per OS:
  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Linux: ~/.config/claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

3.2 MCP Server Toevoegen

Voeg de n8n MCP server toe aan je configuratie:
{
  "mcpServers": {
    "n8n": {
      "command": "node",
      "args": ["/path/to/n8n-mcp-server/server.js"],
      "env": {
        "N8N_WEBHOOK_URL": "https://your-n8n.com/webhook/claude-mcp",
        "N8N_API_KEY": "your-secure-api-key"
      }
    }
  }
}

3.3 Herstart Claude Code

Na het aanpassen van de configuratie, herstart Claude Code om de MCP server te laden.

Stap 4: Praktijkvoorbeelden

Nu je setup compleet is, hier zijn praktische voorbeelden van wat je kunt doen.

Voorbeeld 1: Data Ophalen en Analyseren

Claude, haal alle orders op van deze week en geef me een samenvatting.
Achter de schermen:
  1. Claude roept query_database tool aan
  2. n8n voert de query uit op je database
  3. Data wordt teruggestuurd naar Claude
  4. Claude analyseert en vat samen

Voorbeeld 2: Geautomatiseerde Rapportage

Claude, maak een rapport van de verkoopcijfers en email het naar het sales team.
Flow:
  1. query_database → Haal verkoopcijfers op
  2. Claude analyseert en formatteert rapport
  3. send_email → Verstuur naar sales@company.com

Voorbeeld 3: Task Management

Claude, maak een taak aan voor het development team om de bug in de checkout flow te fixen.
Claude roept aan:
{
  "tool": "create_task",
  "arguments": {
    "title": "Fix checkout flow bug",
    "description": "Er is een bug gemeld in de checkout flow die...",
    "assignee": "development-team",
    "priority": "high",
    "due_date": "2024-01-20"
  }
}

Voorbeeld 4: Workflow Orchestratie

Claude, trigger de lead nurturing workflow voor alle nieuwe signups van vandaag.
Flow:
  1. query_database → Haal nieuwe signups op
  2. Voor elke signup: trigger_workflow → Start nurturing sequence
  3. Claude bevestigt aantal gestarte workflows

Advanced: Bi-directionele Communicatie

Tot nu toe hebben we Claude naar n8n laten communiceren. Je kunt ook n8n naar Claude laten communiceren.

n8n naar Claude via API

In n8n kun je de Anthropic API aanroepen:
Node: HTTP Request
Method: POST
URL: https://api.anthropic.com/v1/messages
Headers:
  - x-api-key: {{$env.ANTHROPIC_API_KEY}}
  - anthropic-version: 2023-06-01
  - Content-Type: application/json
Body:
{
  "model": "claude-3-sonnet-20240229",
  "max_tokens": 1024,
  "messages": [{
    "role": "user",
    "content": "Analyseer deze data: {{$json.data}}"
  }]
}

Event-driven Claude Triggers

Je kunt n8n gebruiken om Claude te "wakker maken" wanneer er iets belangrijks gebeurt:
Trigger: Database Trigger (nieuwe klacht)
   ↓
Code Node: Bereid context voor
   ↓
HTTP Request: Anthropic API
   - "Analyseer deze klacht en stel een response voor"
   ↓
IF: Is urgent?
   ├── Ja → Slack alert + Auto-response
   └── Nee → Queue voor review

Security Best Practices

Bij het verbinden van AI met echte systemen is security cruciaal:

1. API Key Management

# Gebruik environment variables, nooit hardcode
export N8N_API_KEY=$(openssl rand -hex 32)

2. Rate Limiting

Voeg rate limiting toe aan je n8n webhook:
// In een Code node aan het begin
const MAX_REQUESTS_PER_MINUTE = 30;
const clientId = $json.headers['x-client-id'] || 'default';

// Check rate limit in Redis/database
const requests = await getRequestCount(clientId, '1m');
if (requests >= MAX_REQUESTS_PER_MINUTE) {
  return [{
    json: { error: 'Rate limit exceeded' }
  }];
}

3. Input Validatie

Valideer alle input voordat je het verwerkt:
// SQL injection preventie
const allowedTables = ['orders', 'products', 'customers'];
const table = $json.body.table;

if (!allowedTables.includes(table)) {
  throw new Error('Invalid table name');
}

// Prepared statements gebruiken
const query = 'SELECT * FROM ?? WHERE id = ?';
const params = [table, $json.body.id];

4. Audit Logging

Log alle acties voor compliance en debugging:
// Log elke MCP actie
const auditLog = {
  timestamp: new Date().toISOString(),
  action: $json.body.action,
  user: $json.headers['x-user-id'],
  input: $json.body,
  result: $json.result,
  ip: $json.headers['x-forwarded-for']
};

// Naar audit database
await supabase.from('mcp_audit_logs').insert(auditLog);

5. Scoped Permissions

Beperk wat Claude kan doen:
// Permission check
const userPermissions = await getUserPermissions($json.userId);
const requiredPermission = actionPermissionMap[$json.action];

if (!userPermissions.includes(requiredPermission)) {
  throw new Error('Permission denied');
}

Troubleshooting

Probleem: MCP Server start niet

Oplossing:
  1. Check Node.js versie: node --version (moet 18+ zijn)
  2. Controleer pad in configuratie
  3. Test server handmatig: node server.js
  4. Check logs: tail -f ~/.claude/logs/mcp.log

Probleem: n8n webhook reageert niet

Oplossing:
  1. Controleer of workflow actief is
  2. Test webhook URL met cURL
  3. Check n8n logs voor errors
  4. Verifieer API key header

Probleem: Claude ziet de tools niet

Oplossing:
  1. Herstart Claude Code volledig
  2. Controleer JSON syntax in config
  3. Check MCP server logs
  4. Verifieer tools/list response

Conclusie

De combinatie van n8n en Claude via MCP opent een wereld van mogelijkheden. Je krijgt Claude's intelligentie en redeneerkunst, gecombineerd met n8n's praktische automatiseringen en 400+ integraties.
De setup kost wat tijd, maar het resultaat is een krachtig systeem waarbij je met natuurlijke taal complexe taken kunt uitvoeren. Van database queries tot email automation tot workflow orchestratie - alles toegankelijk via een gesprek met Claude.
Begin simpel, test grondig, en bouw uit naarmate je meer vertrouwen krijgt in de integratie. De mogelijkheden zijn vrijwel onbeperkt.
Wil je meer leren over n8n of Claude Code? Bekijk onze andere artikelen:

Zelf aan de slag met Vibe Coding?

Leer hoe je met AI-tools werkende apps bouwt. Onze praktische cursussen nemen je stap voor stap mee.

Blijf op de hoogte

Ontvang maandelijks de nieuwste tips over vibe coding, AI tools en exclusieve content.