# N8n Workflow Builder

> Build n8n automation workflows using MCP tools. Use when creating workflows, configuring nodes, validating configurations, deploying templates, or integrating n8n with Rails apps. Supports Israeli market (Hebrew, WhatsApp Business, NIS payments).

- Skill: `majiayu000/n8n-workflow-builder-2` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add majiayu000/n8n-workflow-builder-2`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/n8n-workflow-builder-2/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/n8n-workflow-builder-2

---


# n8n Workflow Builder

Build production-ready n8n workflows using the available MCP tools.

## MCP Tool Decision Tree

### Discovery Phase
| Need | Tool | Example |
|------|------|---------|
| Find a node | `search_nodes` | `search_nodes({query: "slack"})` |
| Find workflow templates | `search_templates` | `search_templates({searchMode: "by_task", task: "ai_automation"})` |
| Find templates using specific nodes | `search_templates` | `search_templates({searchMode: "by_nodes", nodeTypes: ["n8n-nodes-base.slack"]})` |
| Get a specific template | `get_template` | `get_template({templateId: 123, mode: "full"})` |

### Configuration Phase
| Need | Tool | Example |
|------|------|---------|
| How to configure a node | `get_node` | `get_node({nodeType: "nodes-base.httpRequest", detail: "standard"})` |
| Node documentation | `get_node` | `get_node({nodeType: "nodes-base.slack", mode: "docs"})` |
| Find specific property | `get_node` | `get_node({nodeType: "...", mode: "search_properties", propertyQuery: "auth"})` |
| Real-world examples | `get_node` | `get_node({..., detail: "standard", includeExamples: true})` |

### Validation Phase
| Need | Tool | Example |
|------|------|---------|
| Validate node config | `validate_node` | `validate_node({nodeType: "...", config: {...}, mode: "full"})` |
| Validate full workflow | `validate_workflow` | `validate_workflow({workflow: {...}})` |

### Deployment Phase (requires API)
| Need | Tool |
|------|------|
| Create workflow | `n8n_create_workflow` |
| Update workflow | `n8n_update_partial_workflow` |
| Deploy template | `n8n_deploy_template` |
| Test workflow | `n8n_test_workflow` |
| Get execution results | `n8n_executions` |

## Common Workflow Patterns

### Pattern 1: Webhook -> Process -> Respond
```
Webhook -> Code (validate) -> HTTP Request -> Respond
```
Template: `assets/templates/workflows/webhook-processor.json`

### Pattern 2: Lead Capture -> CRM -> Notify
```
Webhook -> IF (validate) -> CRM -> Slack -> Rails callback
```
Template: `assets/templates/workflows/lead-capture-crm.json`

### Pattern 3: AI Agent with Tools
```
Chat Trigger -> AI Agent <- OpenAI Model
                   ^
                   |- HTTP Request Tool
                   |- Code Tool
```
Template: `assets/templates/workflows/ai-agent-basic.json`

### Pattern 4: WhatsApp Bot (Israeli Market)
```
Webhook -> Code (parse) -> Switch (msg type) -> HTTP Request (WhatsApp API)
```
Template: `assets/templates/workflows/whatsapp-bot.json`

### Pattern 5: Scheduled Reports
```
Schedule Trigger -> HTTP (fetch data) -> Code (format) -> Email/Slack
```
Template: `assets/templates/workflows/scheduled-report.json`

### Pattern 6: Rails Integration
```
Rails App -> Webhook -> Process -> HTTP (callback to Rails)
```
Template: `assets/templates/workflows/rails-webhook-handler.json`

## MCP Tool Usage Examples

### search_nodes - Finding Nodes
```javascript
// Find database nodes
search_nodes({query: "database"})

// Fuzzy search (typo-tolerant)
search_nodes({query: "slak", mode: "FUZZY"})

// With real examples
search_nodes({query: "webhook", includeExamples: true})
```

### get_node - Node Configuration
```javascript
// Standard detail (recommended starting point)
get_node({nodeType: "nodes-base.httpRequest", detail: "standard"})

// With real-world examples
get_node({nodeType: "nodes-base.slack", detail: "standard", includeExamples: true})

// Documentation mode
get_node({nodeType: "nodes-base.webhook", mode: "docs"})

// Search specific properties
get_node({nodeType: "nodes-base.httpRequest", mode: "search_properties", propertyQuery: "header"})

// Version comparison
get_node({nodeType: "nodes-base.httpRequest", mode: "compare", fromVersion: "1.0", toVersion: "2.0"})
```

### validate_node - Pre-build Validation
```javascript
// Full validation with suggestions
validate_node({
  nodeType: "nodes-base.slack",
  config: {resource: "channel", operation: "create"},
  mode: "full",
  profile: "strict"
})

// Quick check
validate_node({
  nodeType: "nodes-base.httpRequest",
  config: {method: "POST", url: "https://api.example.com"},
  mode: "minimal"
})
```

### validate_workflow - Full Workflow Validation
```javascript
validate_workflow({
  workflow: myWorkflowJson,
  options: {
    validateNodes: true,
    validateConnections: true,
    validateExpressions: true,
    profile: "strict"
  }
})
```

### search_templates - Finding Templates
```javascript
// By task type
search_templates({searchMode: "by_task", task: "ai_automation"})
search_templates({searchMode: "by_task", task: "webhook_processing"})

// By nodes used
search_templates({searchMode: "by_nodes", nodeTypes: ["n8n-nodes-base.openAi", "n8n-nodes-langchain.agent"]})

// By complexity
search_templates({searchMode: "by_metadata", complexity: "simple", maxSetupMinutes: 15})

// Keyword search
search_templates({query: "slack notification"})
```

## AI Agent Workflows

### Connection Types (CRITICAL)
AI connections flow TO the consumer node:
| Connection Type | From | To | Purpose |
|----------------|------|------|---------|
| `ai_languageModel` | Language Model | AI Agent | REQUIRED - provides LLM |
| `ai_tool` | Tool Node | AI Agent | Gives agent capabilities |
| `ai_memory` | Memory Node | AI Agent | Conversation history |
| `ai_outputParser` | Parser | Chain | Structured output |

### Minimal AI Agent Setup
1. Add **Chat Trigger** (or Manual Trigger)
2. Add **Language Model** (OpenAI Chat Model / Anthropic)
3. Add **AI Agent**
4. Connect: `Chat Trigger -> AI Agent` (main connection)
5. Connect: `Language Model -> AI Agent` (ai_languageModel type)

### Adding Tools to Agent
```javascript
// HTTP Request Tool - for API calls
{
  "name": "Call API Tool",
  "type": "@n8n/n8n-nodes-langchain.toolHttpRequest",
  "parameters": {
    "description": "Calls external API to fetch data"  // REQUIRED: 15+ chars
  }
}
// Connect: HTTP Tool -> AI Agent (ai_tool type)
```

### Tool Description Requirements
- Minimum 15 characters
- Must clearly describe what the tool does
- Agent uses this to decide when to use the tool

See `references/ai-agents-guide.md` for advanced patterns.

## Israeli Market Integration

### WhatsApp Business API
```javascript
// Send text message
{
  "method": "POST",
  "url": "https://graph.facebook.com/v18.0/{{PHONE_ID}}/messages",
  "headers": {"Authorization": "Bearer {{ACCESS_TOKEN}}"},
  "body": {
    "messaging_product": "whatsapp",
    "to": "972501234567",
    "type": "text",
    "text": {"body": "\u200F" + hebrewText}  // RTL marker for Hebrew
  }
}
```

### Hebrew RTL Handling
```javascript
// Add RTL marker for Hebrew text
const rtlText = "\u200F" + hebrewContent;  // Right-to-Left Mark

// Mixed content
const mixed = `\u200F${hebrewPart}\u200E${englishPart}`;  // LTR mark for English
```

### Rate Limits by Tier
| Tier | Messages/day | Messages/sec |
|------|--------------|--------------|
| Unverified | 250 | 80 |
| Verified | 1,000 | 80 |
| Business | 10,000+ | 80 |

See `references/israeli-market-integrations.md` for WhatsApp templates and payment patterns.

## Rails Integration

### Triggering n8n from Rails
```ruby
# app/services/n8n_service.rb
def trigger_webhook(webhook_url, payload)
  HTTParty.post(webhook_url, {
    body: payload.to_json,
    headers: {'Content-Type' => 'application/json', 'X-Webhook-Secret' => ENV['N8N_SECRET']}
  })
end
```

### Receiving n8n Callbacks
```ruby
# Verify signature
signature = request.headers['X-N8N-Signature']
expected = OpenSSL::HMAC.hexdigest('sha256', ENV['N8N_SECRET'], request.raw_post)
unless ActiveSupport::SecurityUtils.secure_compare(signature.to_s, expected)
  render json: {error: 'Unauthorized'}, status: 401
end
```

### Selling Automations
- Automation model with `workflow_json`, `price`, `demo_webhook_url`
- Purchase model with Stripe integration
- Delivery: JSON download, hosted deploy, or embedded viewer

See `references/rails-integration-patterns.md` for full implementation.

## Validation Checklist

### Before Building
- [ ] Run `search_nodes` to find correct node type
- [ ] Run `get_node` with `detail: "standard"` to understand config
- [ ] Check for required credentials

### Node Level
- [ ] `validate_node({..., mode: "full"})` passes
- [ ] All required fields populated
- [ ] Credentials configured (not hardcoded)
- [ ] Error handling configured

### Workflow Level
- [ ] `validate_workflow({...})` passes
- [ ] All nodes connected (no orphans)
- [ ] Error Trigger node present
- [ ] Webhook paths unique

### AI Workflows
- [ ] Language model connected BEFORE AI Agent
- [ ] All tools have descriptions (15+ chars)
- [ ] Memory node if conversation history needed
- [ ] Streaming: no main outputs from AI Agent

### Pre-Deployment
- [ ] Test with sample data
- [ ] Environment variables for sensitive data
- [ ] Rate limiting considered

## Workflow JSON Structure

```json
{
  "name": "Workflow Name",
  "nodes": [
    {
      "id": "uuid",
      "name": "Node Name",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [250, 300],
      "parameters": {}
    }
  ],
  "connections": {
    "Node Name": {
      "main": [[{"node": "Next Node", "type": "main", "index": 0}]]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}
```

## Scripts

### Validate Before Deploy
```bash
python scripts/validate_before_deploy.py workflow.json
```

### Generate Workflow Skeleton
```bash
python scripts/generate_workflow_skeleton.py --type webhook --name "My Workflow"
python scripts/generate_workflow_skeleton.py --type ai-agent --name "Support Bot"
```

## References

| Topic | File |
|-------|------|
| MCP Tools (all 19) | `references/mcp-tools-guide.md` |
| AI Agent Patterns | `references/ai-agents-guide.md` |
| Rails Integration | `references/rails-integration-patterns.md` |
| Israeli Market | `references/israeli-market-integrations.md` |
| Node Configs | `references/node-configuration-patterns.md` |
| Code Patterns | `references/code-node-patterns.md` |
| Validation | `references/validation-checklist.md` |

## Templates

### Workflows
- `assets/templates/workflows/webhook-processor.json`
- `assets/templates/workflows/lead-capture-crm.json`
- `assets/templates/workflows/whatsapp-bot.json`
- `assets/templates/workflows/ai-agent-basic.json`
- `assets/templates/workflows/scheduled-report.json`
- `assets/templates/workflows/rails-webhook-handler.json`

### Nodes
- `assets/templates/nodes/webhook-trigger.json`
- `assets/templates/nodes/http-request-auth.json`
- `assets/templates/nodes/code-transform.json`
- `assets/templates/nodes/if-conditions.json`
- `assets/templates/nodes/error-handler.json`

### Israeli Market
- `assets/templates/israel/whatsapp-message-types.json`
- `assets/templates/israel/hebrew-templates.json`
- `assets/templates/israel/payment-webhook.json`

