Files
n8n-skills/docs/SKILLS_IMPLEMENTATION_GUIDE.md
czlonkowski dff62f0c52 feat: Complete Phase 1 - Foundation and Documentation
## Phase 1 Achievements

 Repository Structure:
- Created complete directory structure (skills/, evaluations/)
- Updated .gitignore (removed docs/, keep .mcp.json)

 MCP Testing:
- Verified n8n API availability (https://n8n-test.n8n-mcp.com)
- Tested MCP tools comprehensively
- Created MCP_TESTING_LOG.md with real tool responses

 Documentation:
- README.md: Comprehensive project overview with data-driven insights
- INSTALLATION.md: Complete installation guide for all platforms
- USAGE.md: Detailed usage examples and cross-skill composition
- DEVELOPMENT.md: Development guidelines and contribution process

## Key Insights from MCP Testing

- 537 nodes available (437 base + 100 langchain)
- 2,653 templates with metadata
- nodeType format differences documented
- Webhook data structure clarified ($json.body)
- Auto-sanitization behavior documented
- All n8n_* tools require API; all others don't

## Next: Phase 2 - Skill #1 (n8n Expression Syntax)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Conceived by Romuald Członkowski - https://www.aiadvisors.pl/en
2025-10-20 10:14:34 +02:00

2022 lines
44 KiB
Markdown

# 🎯 COMPLETE IMPLEMENTATION GUIDE: n8n-mcp Claude Skills (Path 1)
## Project Overview
**Objective**: Create 5 complementary meta-skills that teach Claude how to use n8n-mcp MCP tools effectively for building n8n workflows.
**Architecture**:
- **n8n-mcp MCP Server**: Provides data access (525 nodes, validation, templates)
- **Claude Skills**: Provides expert guidance on HOW to use MCP tools
- **Together**: Expert workflow builder with progressive disclosure
**Repository Structure**:
```
n8n-mcp-skills/
├── README.md
├── LICENSE
├── skills/
│ ├── n8n-expression-syntax/
│ ├── n8n-mcp-tools-expert/
│ ├── n8n-workflow-patterns/
│ ├── n8n-validation-expert/
│ └── n8n-node-configuration/
├── evaluations/
│ ├── expression-syntax/
│ ├── mcp-tools/
│ ├── workflow-patterns/
│ ├── validation-expert/
│ └── node-configuration/
├── docs/
│ └── DEVELOPMENT.md
└── package.json (for distribution metadata)
```
---
## Implementation Timeline
**Week 1**: Expression Syntax (PoC)
**Week 2**: MCP Tools Expert + Workflow Patterns
**Week 3**: Validation Expert + Node Configuration
**Week 4**: Testing, refinement, documentation
**Week 5-6**: Distribution, plugin packaging
---
# SKILL #1: n8n Expression Syntax (PoC - Week 1)
## Priority: Foundation (Week 1)
**Purpose**: Teach correct n8n expression syntax and common patterns
**File Count**: 4 files
**Total Lines**: ~350 lines
**Complexity**: Simple (good starting point)
## Directory Structure
```
skills/n8n-expression-syntax/
├── SKILL.md # 200 lines - main instructions
├── COMMON_MISTAKES.md # 100 lines - error catalog
├── EXAMPLES.md # 50 lines - working examples
└── README.md # metadata for GitHub
```
## File: SKILL.md
```markdown
---
name: n8n Expression Syntax
description: Validate n8n expression syntax and fix common errors. Use when writing n8n expressions, using {{}} syntax, accessing $json/$node variables, or troubleshooting expression errors in workflows.
---
# n8n Expression Syntax
## Expression format
All dynamic content in n8n uses double curly braces:
```
{{expression}}
```
## Core variables
**$json** - Current node's output data
```
{{$json.fieldName}}
{{$json['field with spaces']}}
```
**$node** - Other node's output data
```
{{$node["Node Name"].json.fieldName}}
{{$node["HTTP Request"].json.data}}
```
**$now** - Current timestamp
```
{{$now}}
{{$now.toFormat('yyyy-MM-dd')}}
```
**$env** - Environment variables
```
{{$env.API_KEY}}
```
## Common patterns
### Access nested fields
```
✅ {{$json.user.email}}
✅ {{$json.data[0].name}}
✅ {{$json['response']['items']}}
```
### Reference other nodes
```
✅ {{$node["HTTP Request"].json.data}}
✅ {{$node["Webhook"].json.body.user_id}}
```
### Handle spaces in field names
```
❌ {{$json.field name}}
✅ {{$json['field name']}}
```
### Handle spaces in node names
```
❌ {{$node.HTTP Request.json}}
✅ {{$node["HTTP Request"].json}}
```
## Validation rules
1. **Always use {{}}** - Expressions must be wrapped
2. **Use quotes for spaces** - Bracket notation for field/node names with spaces
3. **Match exact node names** - Node references are case-sensitive
4. **No nested {{}}** - Don't double-wrap expressions
## Common mistakes
For complete error catalog, see [COMMON_MISTAKES.md](COMMON_MISTAKES.md)
**Quick fixes:**
| Mistake | Fix |
|---------|-----|
| `$json.field` | `{{$json.field}}` |
| `{{$json.field name}}` | `{{$json['field name']}}` |
| `{{$node.HTTP Request}}` | `{{$node["HTTP Request"]}}` |
| `{{{$json.field}}}` | `{{$json.field}}` |
## Examples
For working examples, see [EXAMPLES.md](EXAMPLES.md)
## When NOT to use expressions
❌ Inside Code node (use JavaScript directly)
❌ In webhook paths (use static text)
❌ In credential fields (use credential system)
```
## File: COMMON_MISTAKES.md
```markdown
# Common n8n Expression Mistakes
## Missing curly braces
**Problem**: Expression not recognized
**Wrong:**
```
$json.email
```
✅ **Correct:**
```
{{$json.email}}
```
**Why it fails**: n8n treats text without {{}} as literal string
---
## Spaces in field names
**Problem**: Syntax error or undefined
❌ **Wrong:**
```
{{$json.first name}}
```
✅ **Correct:**
```
{{$json['first name']}}
```
**Why it fails**: Space breaks dot notation, must use bracket notation
---
## Spaces in node names
**Problem**: Cannot access other node's data
❌ **Wrong:**
```
{{$node.HTTP Request.json.data}}
```
✅ **Correct:**
```
{{$node["HTTP Request"].json.data}}
```
**Why it fails**: Node names are treated as strings, need quotes
---
## Incorrect node reference
**Problem**: Undefined or wrong data
❌ **Wrong:**
```
{{$node["http request"].json.data}} // lowercase
```
✅ **Correct:**
```
{{$node["HTTP Request"].json.data}} // exact match
```
**Why it fails**: Node names are case-sensitive
---
## Double wrapping
**Problem**: Literal {{}} in output
❌ **Wrong:**
```
{{{$json.field}}}
```
✅ **Correct:**
```
{{$json.field}}
```
**Why it fails**: Only one set of {{}} needed
---
## Missing quotes on property access
**Problem**: Accessing array/object incorrectly
❌ **Wrong:**
```
{{$json.items.0.name}}
```
✅ **Correct:**
```
{{$json.items[0].name}}
```
**Why it fails**: Array access requires brackets, not dots
---
## Using expressions in Code node
**Problem**: Double evaluation or errors
❌ **Wrong (in Code node):**
```javascript
const email = '{{$json.email}}'; // Don't do this
```
**Correct (in Code node):**
```javascript
const email = $input.item.json.email; // Use Code node API
```
**Why it fails**: Code node has direct access to data, no {{}} needed
```
## File: EXAMPLES.md
```markdown
# n8n Expression Examples
## Example 1: Access webhook data
**Workflow**: Webhook → Code → Slack
**Webhook output:**
```json
{
"body": {
"user_id": "12345",
"email": "user@example.com"
}
}
```
**In Slack node message field:**
```
New user registered: {{$json.body.email}}
User ID: {{$json.body.user_id}}
```
---
## Example 2: Reference previous node
**Workflow**: HTTP Request → Set → Email
**HTTP Request output:**
```json
{
"data": {
"items": [
{"name": "Product 1", "price": 29.99}
]
}
}
```
**In Set node, use HTTP Request data:**
```
{{$node["HTTP Request"].json.data.items[0].name}}
{{$node["HTTP Request"].json.data.items[0].price}}
```
---
## Example 3: Format timestamp
**Use $now for current time:**
```
{{$now.toFormat('yyyy-MM-dd')}} // 2025-01-20
{{$now.toFormat('HH:mm:ss')}} // 14:30:45
{{$now.toFormat('yyyy-MM-dd HH:mm')}} // 2025-01-20 14:30
```
---
## Example 4: Handle field with spaces
**Data:**
```json
{
"first name": "John",
"last name": "Doe"
}
```
**Expression:**
```
Hello {{$json['first name']}} {{$json['last name']}}!
```
**Output:**
```
Hello John Doe!
```
---
## Example 5: Access array elements
**Data:**
```json
{
"users": [
{"email": "alice@example.com"},
{"email": "bob@example.com"}
]
}
```
**Expressions:**
```
First user: {{$json.users[0].email}}
Second user: {{$json.users[1].email}}
Count: {{$json.users.length}}
```
```
## Evaluations (3 scenarios)
**File**: `evaluations/expression-syntax/eval-001-missing-braces.json`
```json
{
"id": "expr-001",
"skills": ["n8n-expression-syntax"],
"query": "I'm trying to access an email field in n8n with: $json.email but it's not working. What's wrong?",
"expected_behavior": [
"Identifies missing {{ }} brackets around expression",
"Explains that $json.email without braces is treated as literal text",
"Provides corrected expression: {{$json.email}}",
"Uses examples from SKILL.md or COMMON_MISTAKES.md"
],
"baseline_without_skill": {
"likely_response": "May suggest general debugging, might not know n8n-specific {{ }} syntax",
"expected_quality": "Low - lacks n8n-specific knowledge"
},
"with_skill_expected": {
"response_quality": "High - precise fix with n8n-specific guidance",
"uses_skill_content": true,
"provides_correct_syntax": true
}
}
```
**File**: `evaluations/expression-syntax/eval-002-space-in-field.json`
```json
{
"id": "expr-002",
"skills": ["n8n-expression-syntax"],
"query": "My workflow has a field called 'first name' and I'm using {{$json.first name}} but getting undefined. Help!",
"expected_behavior": [
"Identifies space in field name as the issue",
"Explains that dot notation breaks with spaces",
"Provides corrected expression using bracket notation: {{$json['first name']}}",
"References COMMON_MISTAKES.md section on spaces"
],
"test_variations": [
"field name with spaces",
"node name with spaces",
"nested field with spaces"
]
}
```
**File**: `evaluations/expression-syntax/eval-003-node-reference.json`
```json
{
"id": "expr-003",
"skills": ["n8n-expression-syntax"],
"query": "How do I access data from my 'HTTP Request' node in a later node?",
"expected_behavior": [
"Provides correct $node syntax with quotes",
"Shows example: {{$node[\"HTTP Request\"].json.fieldName}}",
"Explains node name must match exactly (case-sensitive)",
"Provides multiple examples from EXAMPLES.md if relevant"
]
}
```
---
# SKILL #2: n8n MCP Tools Expert (Week 2)
## Priority: 1 (Highest - fixes 20% failure rate)
**Purpose**: Teach how to use n8n-mcp MCP tools effectively
**File Count**: 5 files
**Total Lines**: ~600 lines
**Complexity**: Medium
## Directory Structure
```
skills/n8n-mcp-tools-expert/
├── SKILL.md # 350 lines - tool overview
├── SEARCH_GUIDE.md # 150 lines - search tools
├── VALIDATION_GUIDE.md # 100 lines - validation tools
└── WORKFLOW_GUIDE.md # 100 lines - workflow management tools
```
## File: SKILL.md
```markdown
---
name: n8n MCP Tools Expert
description: Expert guide for using n8n-mcp MCP tools effectively. Use when searching for nodes, validating configurations, accessing templates, managing workflows, or using any n8n-mcp tool. Provides tool selection guidance and parameter formats.
---
# n8n MCP Tools Expert
## Tool categories
The n8n-mcp MCP server provides 40+ tools organized into categories:
1. **Node Discovery** → [SEARCH_GUIDE.md](SEARCH_GUIDE.md)
2. **Configuration Validation** → [VALIDATION_GUIDE.md](VALIDATION_GUIDE.md)
3. **Workflow Management** → [WORKFLOW_GUIDE.md](WORKFLOW_GUIDE.md)
4. **Template Library** - templates for common patterns
5. **Documentation** - tool and node documentation
## Quick reference
### Most used tools (by frequency)
| Tool | Use When | Success Rate |
|------|----------|--------------|
| `search_nodes` | Finding nodes by keyword | 99.9% |
| `get_node_essentials` | Understanding node operations | 91.7% |
| `n8n_create_workflow` | Creating new workflows | 96.8% |
| `n8n_update_partial_workflow` | Editing workflows | 99.0% |
| `n8n_validate_workflow` | Checking workflow validity | 99.7% |
### Tool selection guide
**Finding the right node:**
```
1. search_nodes(query) - Start here
2. get_node_essentials(nodeType) - Get operation list
3. get_node_documentation(nodeType) - Detailed docs if needed
```
**Validating configuration:**
```
1. validate_node_minimal(nodeType, {}) - Check required fields
2. validate_node_operation(nodeType, config, 'runtime') - Validate config
3. n8n_validate_workflow(workflow) - Validate complete workflow
```
**Managing workflows:**
```
1. n8n_create_workflow(name, nodes, connections) - Create new
2. n8n_update_partial_workflow(id, operations) - Edit existing
3. n8n_validate_workflow(id) - Validate before deploy
```
## Common mistakes
### ❌ Using get_node_info when get_node_essentials is better
**Problem**: get_node_info returns 100KB+ of data (20% failure rate)
**Solution**: Use get_node_essentials instead:
```
❌ get_node_info("nodes-base.slack") // Returns massive schema
✅ get_node_essentials("nodes-base.slack") // Returns focused data
```
### ❌ Wrong nodeType format
**Problem**: Tool fails with "node not found"
**Formats**:
- **For search tools**: `"nodes-base.slack"` (with prefix)
- **For n8n tools**: `"n8n-nodes-base.slack"` (full name)
**Solution**:
```javascript
// Search/essentials/validation tools:
search_nodes("slack") // No prefix needed
get_node_essentials("nodes-base.slack") // Short prefix
// List templates:
list_node_templates(["n8n-nodes-base.slack"]) // Full prefix
```
### ❌ Not using validation profiles
**Problem**: Getting too many false positives or missing real errors
**Profiles**:
- `minimal` - Only check required fields exist
- `runtime` - Check values and types (recommended)
- `ai-friendly` - Reduce false positives
- `strict` - Maximum validation
**Solution**:
```javascript
// For configuration:
validate_node_operation(nodeType, config, 'runtime')
// For quick check:
validate_node_minimal(nodeType, {})
```
## Tool usage patterns
See detailed guides:
- **Node Discovery**: [SEARCH_GUIDE.md](SEARCH_GUIDE.md)
- **Validation**: [VALIDATION_GUIDE.md](VALIDATION_GUIDE.md)
- **Workflow Management**: [WORKFLOW_GUIDE.md](WORKFLOW_GUIDE.md)
## Self-help
**Get tool documentation:**
```
tools_documentation() // List all tools
tools_documentation("search_nodes", "full") // Specific tool
```
**Health check:**
```
n8n_health_check() // Verify MCP server connectivity
```
```
## File: SEARCH_GUIDE.md
```markdown
# Node Discovery Tools Guide
## Tool selection
### search_nodes - Start here (99.9% success rate)
**Use when**: You know what you're looking for (keyword, use case, service)
**Example**:
```javascript
search_nodes({
query: "slack",
mode: "OR", // Default: any word matches
limit: 20
})
```
**Returns**: List of matching nodes with types
**Tips**:
- Use specific keywords: "slack", "http request", "database"
- Common searches: webhook, http, database, email, slack
- mode: "OR" (default) | "AND" (all words) | "FUZZY" (typo-tolerant)
---
### get_node_essentials - Understand operations (91.7% success)
**Use when**: You've found the node and need to see operations
**Example**:
```javascript
get_node_essentials({
nodeType: "nodes-base.slack",
includeExamples: true // Get real template configs
})
```
**Returns**:
- Available operations
- Essential properties only (not full schema)
- Example configurations from templates
**Tips**:
- Use after search_nodes to understand what a node can do
- includeExamples:true provides working configurations
- Much faster than get_node_info (4ms vs 3ms)
---
### get_node_info - Full documentation (80% success)
**Use when**: You need complete schema details
**Warning**:
- Returns 100KB+ data
- 20% failure rate (use sparingly)
- Better alternatives exist for most cases
**Example**:
```javascript
get_node_info({
nodeType: "nodes-base.httpRequest"
})
```
**When to use**:
- Debugging complex configuration issues
- Need full property schemas
- Exploring advanced features
**Better alternatives**:
1. get_node_essentials - for operations list
2. get_node_documentation - for readable docs
3. search_node_properties - for specific property
---
### list_nodes - Browse all nodes (99.6% success)
**Use when**: Exploring by category or seeing all available
**Example**:
```javascript
list_nodes({
category: "trigger",
limit: 200
})
```
**Categories**:
- trigger - Webhook, Schedule, Manual, etc.
- transform - Code, Set, Function, etc.
- output - HTTP Request, Email, Slack, etc.
**Tips**:
- Use limit:200 to see all nodes
- Filter by package: "n8n-nodes-base" or "@n8n/n8n-nodes-langchain"
- Filter by category for focused exploration
---
## Workflow: Finding and configuring a node
```
Step 1: Search for node
search_nodes({query: "slack"})
→ Returns: nodes-base.slack
Step 2: Get operations
get_node_essentials({
nodeType: "nodes-base.slack",
includeExamples: true
})
→ Returns: operations list + example configs
Step 3: Validate configuration
validate_node_operation({
nodeType: "nodes-base.slack",
config: {resource: "channel", operation: "create"},
profile: "runtime"
})
→ Returns: validation result
Step 4: Use in workflow
(Configuration is validated and ready)
```
## Common patterns from telemetry
**Pattern**: search → essentials (9,835 occurrences, 18s avg)
```javascript
// Step 1
search_nodes({query: "webhook"})
// Step 2 (after ~18 seconds of reviewing results)
get_node_essentials({nodeType: "nodes-base.webhook"})
```
This is the MOST COMMON discovery pattern. Follow it!
```
## File: VALIDATION_GUIDE.md
```markdown
# Configuration Validation Tools Guide
## Validation philosophy
**Validate early, validate often** - 15,107 validation loops observed in telemetry
## Tool selection
### validate_node_minimal - Quick check (97.4% success)
**Use when**: Checking what fields are required
**Example**:
```javascript
validate_node_minimal({
nodeType: "nodes-base.slack",
config: {} // Empty to see all required fields
})
```
**Returns**:
- List of required fields
- No validation of values
**When to use**: Planning configuration, seeing requirements
---
### validate_node_operation - Full validation (varies)
**Use when**: Validating actual configuration
**Example**:
```javascript
validate_node_operation({
nodeType: "nodes-base.slack",
config: {
resource: "channel",
operation: "create",
channel: "general"
},
profile: "runtime" // Recommended
})
```
**Profiles**:
- `minimal` - Required fields only
- `runtime` - Values + types (recommended)
- `ai-friendly` - Fewer false positives
- `strict` - Maximum validation
**Returns**:
- errors: Critical issues (must fix)
- warnings: Suggestions (optional)
- suggestions: Improvements
**Validation loop pattern** (from telemetry):
```
1. Configure node
2. validate_node_operation (23s thinking)
3. Fix errors
4. validate_node_operation again (58s fixing)
5. Repeat until valid
```
---
### validate_workflow - Structure validation (95.5% success)
**Use when**: Checking workflow before execution
**Example**:
```javascript
validate_workflow({
workflow: {
nodes: [...],
connections: {...}
},
options: {
validateNodes: true,
validateConnections: true,
validateExpressions: true,
profile: "runtime"
}
})
```
**Checks**:
- Node configurations
- Connection validity
- Expression syntax
- Workflow structure
---
### n8n_validate_workflow - Complete validation (99.7% success)
**Use when**: Final validation before deployment
**Example**:
```javascript
n8n_validate_workflow({
id: "workflow-id",
options: {
profile: "runtime"
}
})
```
**Returns**: Comprehensive validation report
**When to use**: After building complete workflow, before executing
---
## Validation workflow (from telemetry)
**Most common pattern** (7,841 occurrences):
```
n8n_update_partial_workflow (make changes)
↓ ~23 seconds
n8n_validate_workflow (check)
↓ ~58 seconds
n8n_update_partial_workflow (fix errors)
(repeat until valid)
```
**Best practice**:
1. Make changes
2. **Validate immediately**
3. Fix errors
4. **Validate again**
5. Only proceed when validation passes
## Handling validation errors
**Error types**:
1. **Required field missing** → Add the field
2. **Invalid value** → Check allowed values in essentials
3. **Type mismatch** → Convert to correct type
4. **False positive** → Check n8n Validation Expert skill
**When you get errors**:
1. Read error message carefully
2. Check if it's a known false positive
3. Fix real errors
4. Validate again
5. Iterate until clean
```
## File: WORKFLOW_GUIDE.md
```markdown
# Workflow Management Tools Guide
## Creation vs Editing
### n8n_create_workflow - New workflows (96.8% success)
**Use when**: Starting from scratch
**Example**:
```javascript
n8n_create_workflow({
name: "Webhook to Slack",
nodes: [
{
id: "webhook-1",
name: "Webhook",
type: "n8n-nodes-base.webhook",
typeVersion: 1,
position: [250, 300],
parameters: {path: "test-webhook"}
},
{
id: "slack-1",
name: "Slack",
type: "n8n-nodes-base.slack",
typeVersion: 1,
position: [450, 300],
parameters: {
resource: "message",
operation: "post",
channel: "#general",
text: "={{$json.body.message}}"
}
}
],
connections: {
"Webhook": {
"main": [[{"node": "Slack", "type": "main", "index": 0}]]
}
}
})
```
**Returns**: Created workflow with ID
**Tips**:
- Always include: id, name, type, typeVersion, position, parameters
- Start workflows inactive (settings.active: false)
- Validate after creation
---
### n8n_update_partial_workflow - Edit existing (99.0% success)
**Use when**: Modifying workflows (MOST COMMON - 38,287 uses)
**Example**:
```javascript
n8n_update_partial_workflow({
id: "workflow-id",
operations: [
{
type: "addNode",
node: {
id: "code-1",
name: "Code",
type: "n8n-nodes-base.code",
typeVersion: 1,
position: [350, 300],
parameters: {mode: "runOnceForAllItems", code: "..."}
}
},
{
type: "addConnection",
connection: {
sourceNode: "Webhook",
sourceOutput: "main",
sourceOutputIndex: 0,
targetNode: "Code",
targetInput: "main",
targetInputIndex: 0
}
}
]
})
```
**Operation types**:
- addNode, removeNode, updateNode
- addConnection, removeConnection
- updateSettings, updateName
- enableNode, disableNode
**Pattern from telemetry** (31,464 occurrences):
```
update_partial → update_partial → update_partial...
Avg 56 seconds between edits (thinking time)
```
This shows workflow building is ITERATIVE, not one-shot!
---
## Workflow retrieval
### n8n_get_workflow - Full workflow (99.9% success)
**Use when**: Reviewing complete workflow
**Example**:
```javascript
n8n_get_workflow({id: "workflow-id"})
```
**Returns**: Complete workflow JSON
---
### n8n_get_workflow_structure - Just structure (99.9% success)
**Use when**: Checking nodes and connections only
**Example**:
```javascript
n8n_get_workflow_structure({id: "workflow-id"})
```
**Returns**: Nodes + connections (no parameter details)
---
### n8n_list_workflows - Browse workflows (100% success)
**Use when**: Finding existing workflows
**Example**:
```javascript
n8n_list_workflows({
active: true,
limit: 100
})
```
---
## Workflow lifecycle
```
1. CREATE
n8n_create_workflow() → Returns workflow ID
2. VALIDATE
n8n_validate_workflow(id) → Check for errors
3. EDIT (if needed)
n8n_update_partial_workflow(id, operations)
4. VALIDATE AGAIN
n8n_validate_workflow(id)
5. ACTIVATE (when ready)
n8n_update_partial_workflow(id, [{
type: "updateSettings",
settings: {active: true}
}])
6. MONITOR
n8n_list_executions({workflowId: id})
n8n_get_execution({id: execution_id})
```
## Common patterns from telemetry
**Pattern 1**: Edit → Validate (7,841 occurrences)
```
n8n_update_partial_workflow
↓ 23s
n8n_validate_workflow
```
**Pattern 2**: Validate → Fix (7,266 occurrences)
```
n8n_validate_workflow
↓ 58s
n8n_update_partial_workflow (fix errors)
```
**Pattern 3**: Create → Edit (3,906 occurrences)
```
n8n_create_workflow
↓ 113s
n8n_update_partial_workflow (refinements)
```
Follow these natural patterns!
```
## Evaluations (3+ scenarios)
**File**: `evaluations/mcp-tools/eval-001-tool-selection.json`
```json
{
"id": "mcp-001",
"skills": ["n8n-mcp-tools-expert"],
"query": "I need to find a node that can send messages to Slack. Which MCP tool should I use and how?",
"expected_behavior": [
"Recommends search_nodes as the starting tool",
"Provides correct syntax: search_nodes({query: 'slack'})",
"Suggests following up with get_node_essentials",
"References SEARCH_GUIDE.md for tool selection"
]
}
```
**File**: `evaluations/mcp-tools/eval-002-validation-workflow.json`
```json
{
"id": "mcp-002",
"skills": ["n8n-mcp-tools-expert"],
"query": "I've created a workflow and want to make sure it's valid before deploying. Walk me through the validation process.",
"expected_behavior": [
"Recommends n8n_validate_workflow tool",
"Explains validation profiles (runtime recommended)",
"Shows complete validation workflow from VALIDATION_GUIDE.md",
"Mentions validation loop pattern: validate → fix → validate again"
]
}
```
**File**: `evaluations/mcp-tools/eval-003-node-type-format.json`
```json
{
"id": "mcp-003",
"skills": ["n8n-mcp-tools-expert"],
"query": "I'm getting 'node not found' errors when calling get_node_essentials. I'm using 'slack' as the nodeType. What's wrong?",
"expected_behavior": [
"Identifies incorrect nodeType format",
"Explains need for 'nodes-base.' prefix",
"Provides correct format: 'nodes-base.slack'",
"References nodeType format section from SKILL.md"
]
}
```
---
# SKILL #3: n8n Workflow Patterns (Week 2-3)
## Priority: 2 (High - addresses 813 webhook searches)
**Purpose**: Teach proven workflow architectural patterns
**File Count**: 7 files
**Total Lines**: ~800 lines
**Complexity**: Medium-High
## Directory Structure
```
skills/n8n-workflow-patterns/
├── SKILL.md # 400 lines - overview + checklist
├── patterns/
│ ├── webhook_processing.md # 100 lines
│ ├── http_api_integration.md # 100 lines
│ ├── database_operations.md # 80 lines
│ ├── ai_agent_workflow.md # 80 lines
│ └── scheduled_tasks.md # 80 lines
└── scripts/
└── validate_structure.py # 100 lines (optional)
```
## File: SKILL.md
```markdown
---
name: n8n Workflow Patterns
description: Build n8n workflows using proven architectural patterns. Use when creating workflows, connecting nodes, designing automation, or when user describes a workflow goal like webhooks, APIs, databases, or scheduled tasks.
---
# n8n Workflow Patterns
## Workflow creation checklist
Copy this and track your progress:
```
Workflow Progress:
- [ ] Step 1: Identify pattern type
- [ ] Step 2: Search for required nodes
- [ ] Step 3: Configure node operations
- [ ] Step 4: Connect nodes properly
- [ ] Step 5: Add expressions for data mapping
- [ ] Step 6: Validate workflow structure
- [ ] Step 7: Test with sample data
```
## Pattern library
Based on 31,917 real workflows, these are the most common patterns:
### 1. Webhook Processing (27.6% of workflows)
**Use when**: Receiving external events and taking action
**Pattern**: Trigger → Process → Act
**See**: [patterns/webhook_processing.md](patterns/webhook_processing.md)
**Example use cases**:
- Form submissions → Database
- Payment notifications → Send receipt
- GitHub webhooks → Slack notifications
---
### 2. HTTP API Integration (755 searches)
**Use when**: Fetching or sending data to APIs
**Pattern**: Trigger → Fetch/Send → Transform → Store/Notify
**See**: [patterns/http_api_integration.md](patterns/http_api_integration.md)
**Example use cases**:
- Fetch weather data → Store in database
- Send customer data → CRM system
- API polling → Process updates
---
### 3. Database Operations (745 searches)
**Use when**: Reading or writing to databases
**Pattern**: Trigger → Query/Insert → Process → Respond
**See**: [patterns/database_operations.md](patterns/database_operations.md)
**Example use cases**:
- Schedule → Query database → Email report
- Webhook → Insert record → Confirm
- API → Update database → Notify
---
### 4. AI Agent Workflows (67 searches, growing)
**Use when**: Using AI to process or generate content
**Pattern**: Trigger → Prepare → AI Process → Act on result
**See**: [patterns/ai_agent_workflow.md](patterns/ai_agent_workflow.md)
**Example use cases**:
- Email → AI categorize → Route to team
- Customer message → AI respond → Send
- Document → AI extract → Store data
---
### 5. Scheduled Tasks (67 searches)
**Use when**: Running workflows on a schedule
**Pattern**: Schedule → Fetch → Process → Store/Notify
**See**: [patterns/scheduled_tasks.md](patterns/scheduled_tasks.md)
**Example use cases**:
- Daily reports
- Hourly data syncs
- Weekly cleanup tasks
---
## Node connection best practices
### Connection types
**main** - Default data flow (most common)
```javascript
connections: {
"Webhook": {
"main": [[{
"node": "Slack",
"type": "main",
"index": 0
}]]
}
}
```
**error** - Error handling flow
```javascript
"HTTP Request": {
"error": [[{
"node": "Error Handler",
"type": "main",
"index": 0
}]]
}
```
### Connection structure
**Single connection**:
```javascript
"Node1": {
"main": [[{"node": "Node2", "type": "main", "index": 0}]]
}
```
**Multiple connections (branching)**:
```javascript
"IF": {
"main": [
[{"node": "True Branch", "type": "main", "index": 0}], // Output 0
[{"node": "False Branch", "type": "main", "index": 0}] // Output 1
]
}
```
### Common mistakes
**Forgetting to connect nodes**
```javascript
// No connections object = nodes won't execute
```
**Wrong node names**
```javascript
connections: {
"webhook": {...} // Lowercase - won't match "Webhook" node
}
```
**Correct**:
```javascript
connections: {
"Webhook": { // Exact match with node name
"main": [[{"node": "Slack", "type": "main", "index": 0}]]
}
}
```
## Data flow principles
### 1. Trigger starts the flow
Every workflow needs exactly one active trigger node:
- Webhook
- Schedule
- Manual
- Chat Trigger
- etc.
### 2. Data flows through connections
Each node receives:
- `$json` - Output from connected node
- `$node["Name"]` - Output from any previous node
### 3. Transform data between nodes
Use Code, Set, or Function nodes to:
- Reshape data
- Calculate values
- Filter/map arrays
### 4. End with action or response
Common ending nodes:
- HTTP Request (send to API)
- Email/Slack (notify)
- Database (store)
- Respond to Webhook (return data)
## Pattern selection guide
Ask yourself:
1. **How is the workflow triggered?**
- Webhook → Webhook Processing
- Time → Scheduled Tasks
- Manual → Any pattern
2. **What's the main operation?**
- API call → HTTP API Integration
- Database → Database Operations
- AI processing → AI Agent Workflow
3. **How complex is the logic?**
- Simple (3-6 nodes) → Use basic pattern
- Medium (7-15 nodes) → Combine patterns
- Complex (15+ nodes) → Break into sub-workflows
## Workflow building process
**Step 1: Choose pattern**
Use pattern guides to understand structure
**Step 2: Search for nodes**
Use n8n MCP Tools Expert skill to find nodes:
```javascript
search_nodes({query: "webhook"})
search_nodes({query: "slack"})
```
**Step 3: Configure nodes**
Use n8n Node Configuration skill for operation-aware setup
**Step 4: Connect nodes**
Follow connection patterns from pattern guides
**Step 5: Add data mapping**
Use n8n Expression Syntax skill for {{}} expressions
**Step 6: Validate**
Use n8n Validation Expert skill to check workflow
**Step 7: Test**
Create workflow and test with sample data
## Next steps
Choose a pattern that matches your use case and follow the detailed guide!
```
## File: patterns/webhook_processing.md
```markdown
# Webhook Processing Pattern
## Overview
**Frequency**: 813 searches (most popular!)
**Workflows**: ~8,805 (27.6% of all workflows)
**Complexity**: Simple (5-6 nodes average)
## Pattern structure
```
Webhook Trigger
[Optional: Transform data]
Action (API, Database, Notification)
[Optional: Respond to webhook]
```
## Complete example: Form submission to Slack
### Node 1: Webhook Trigger
```javascript
{
"id": "webhook-1",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 1,
"position": [250, 300],
"parameters": {
"path": "form-submit",
"httpMethod": "POST",
"responseMode": "onReceived"
}
}
```
**Webhook receives**:
```json
{
"body": {
"name": "John Doe",
"email": "john@example.com",
"message": "Hello!"
}
}
```
### Node 2: Slack Notification
```javascript
{
"id": "slack-1",
"name": "Slack",
"type": "n8n-nodes-base.slack",
"typeVersion": 1,
"position": [450, 300],
"parameters": {
"resource": "message",
"operation": "post",
"channel": "#forms",
"text": "New form submission!\n\nName: {{$json.body.name}}\nEmail: {{$json.body.email}}\nMessage: {{$json.body.message}}"
}
}
```
### Connections
```javascript
{
"Webhook": {
"main": [[{
"node": "Slack",
"type": "main",
"index": 0
}]]
}
}
```
## Variations
### With data transformation
Add Code node between Webhook and Action:
```javascript
{
"id": "code-1",
"name": "Transform",
"type": "n8n-nodes-base.code",
"typeVersion": 1,
"position": [350, 300],
"parameters": {
"mode": "runOnceForAllItems",
"jsCode": "return items.map(item => ({\n json: {\n formData: item.json.body,\n timestamp: new Date().toISOString(),\n source: 'website'\n }\n}));"
}
}
```
### With webhook response
Change webhook to respond after processing:
```javascript
// Webhook node
"parameters": {
"path": "form-submit",
"responseMode": "lastNode" // Respond with last node output
}
// Add Respond to Webhook node at end
{
"id": "respond-1",
"name": "Respond",
"type": "n8n-nodes-base.respondToWebhook",
"position": [650, 300],
"parameters": {
"responseBody": "={{JSON.stringify({success: true, message: 'Form received'})}}",
"options": {
"responseCode": 200
}
}
}
```
## Common webhook use cases
1. **Form submissions** → Store in database + Notify
2. **Payment notifications** (Stripe, PayPal) → Update order + Send receipt
3. **GitHub events** → Slack notifications
4. **Zapier/Make alternatives** → Process external triggers
5. **Chat platforms** (Telegram, WhatsApp) → AI agent responses
## Testing webhooks
1. Create workflow with webhook node
2. Note the webhook URL from node
3. Use Postman/curl to send test data:
```bash
curl -X POST https://n8n.example.com/webhook/form-submit \
-H "Content-Type: application/json" \
-d '{
"name": "Test User",
"email": "test@example.com",
"message": "Test message"
}'
```
4. Check workflow execution in n8n
## Best practices
**Validate webhook data** - Check required fields exist
**Handle errors** - Add error handling for failed actions
**Respond quickly** - If response needed, process async if possible
**Log events** - Store webhook data for debugging
**Secure webhooks** - Use authentication when possible
## Checklist for webhook workflows
```
- [ ] Webhook path is unique and descriptive
- [ ] HTTP method matches sender (usually POST)
- [ ] Response mode set correctly (onReceived vs lastNode)
- [ ] Data validation included (check required fields)
- [ ] Error handling configured
- [ ] Tested with sample payload
- [ ] Webhook URL documented for sender
```
```
## File: patterns/http_api_integration.md
```markdown
# HTTP API Integration Pattern
## Overview
**Frequency**: 755 searches
**Complexity**: Simple to Medium (5-10 nodes)
## Pattern structure
```
Trigger (Webhook, Schedule, Manual)
HTTP Request (Fetch data)
[Optional: Transform/Filter]
Action (Store, Process, Notify)
```
## Complete example: Fetch weather and send email
### Node 1: Schedule Trigger
```javascript
{
"id": "schedule-1",
"name": "Schedule",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1,
"position": [250, 300],
"parameters": {
"rule": {
"interval": [{
"field": "cronExpression",
"expression": "0 8 * * *" // Daily at 8 AM
}]
}
}
}
```
### Node 2: HTTP Request (Fetch Weather)
```javascript
{
"id": "http-1",
"name": "Get Weather",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [450, 300],
"parameters": {
"method": "GET",
"url": "https://api.openweathermap.org/data/2.5/weather",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "openWeatherMapApi",
"sendQuery": true,
"queryParameters": {
"parameters": [
{"name": "q", "value": "London"},
{"name": "units", "value": "metric"}
]
}
}
}
```
**HTTP Request returns**:
```json
{
"main": {
"temp": 15.5,
"feels_like": 14.2
},
"weather": [{
"description": "partly cloudy"
}]
}
```
### Node 3: Email Notification
```javascript
{
"id": "email-1",
"name": "Send Email",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2,
"position": [650, 300],
"parameters": {
"fromEmail": "weather@example.com",
"toEmail": "user@example.com",
"subject": "Daily Weather Report",
"text": "Today's weather in London:\n\nTemperature: {{$json.main.temp}}°C\nFeels like: {{$json.main.feels_like}}°C\nConditions: {{$json.weather[0].description}}"
}
}
```
## Best practices
**Handle rate limits** - Add delays between requests
**Parse responses** - Use Code node if needed
**Error handling** - Check for API errors
**Secure credentials** - Use n8n credential system
**Timeout settings** - Set appropriate timeouts
## Checklist for API workflows
```
- [ ] API endpoint URL correct
- [ ] HTTP method correct (GET/POST/PUT/DELETE)
- [ ] Authentication configured
- [ ] Required headers included
- [ ] Query/body parameters set correctly
- [ ] Response parsing configured
- [ ] Error handling added
- [ ] Tested with actual API
```
```
## Evaluations (3+ scenarios)
**File**: `evaluations/workflow-patterns/eval-001-webhook-pattern.json`
```json
{
"id": "pattern-001",
"skills": ["n8n-workflow-patterns", "n8n-mcp-tools-expert"],
"query": "I want to build a workflow that posts to Slack whenever someone submits a form on my website. How should I structure this?",
"expected_behavior": [
"Identifies webhook processing pattern as correct choice",
"References patterns/webhook_processing.md",
"Provides workflow creation checklist",
"Suggests: Webhook → Slack structure",
"Mentions using search_nodes to find webhook and slack nodes",
"Recommends validation after building"
]
}
```
---
# SKILL #4: n8n Validation Expert (Week 3)
[Similar detailed structure with SKILL.md, ERROR_CATALOG.md, FALSE_POSITIVES.md, evaluation scenarios]
**Note**: Full implementation follows same pattern as above skills with:
- SKILL.md (validation loop workflow)
- ERROR_CATALOG.md (known errors from telemetry)
- FALSE_POSITIVES.md (Issues #304, #306, #338)
- 3+ evaluations
---
# SKILL #5: n8n Node Configuration (Week 3)
[Similar detailed structure with SKILL.md, DEPENDENCIES.md, evaluations]
**Note**: Full implementation follows same pattern with:
- SKILL.md (operation-aware configuration process)
- DEPENDENCIES.md (property dependency rules)
- OPERATION_PATTERNS.md (common configurations)
- 3+ evaluations
---
# Testing Strategy
## Evaluation-Driven Development Process
For EACH skill:
1. **Create 3+ evaluations FIRST**
2. **Establish baseline** (test without skill)
3. **Write minimal SKILL.md** (under 500 lines)
4. **Test against evaluations**
5. **Iterate until 100% pass**
6. **Add reference files as needed**
## Cross-Skill Integration Testing
Test skills working together:
```json
{
"id": "integration-001",
"skills": [
"n8n-mcp-tools-expert",
"n8n-workflow-patterns",
"n8n-node-configuration",
"n8n-expression-syntax",
"n8n-validation-expert"
],
"query": "Build a complete webhook to Slack workflow, validate it, and explain what you did.",
"expected_behavior": [
"Uses n8n-workflow-patterns to identify webhook pattern",
"Uses n8n-mcp-tools-expert to search for nodes",
"Uses n8n-node-configuration for Slack setup",
"Uses n8n-expression-syntax for data mapping",
"Uses n8n-validation-expert to validate result",
"All 5 skills compose automatically",
"Produces working, validated workflow"
]
}
```
---
# Distribution Strategy
## Claude Code Plugin Structure
```
n8n-mcp-skills-plugin/
├── plugin.json
├── skills/
│ └── [all 5 skills]
└── README.md
```
**plugin.json**:
```json
{
"name": "n8n-mcp-skills",
"version": "1.0.0",
"description": "Expert skills for building n8n workflows with n8n-mcp",
"skills": [
"skills/n8n-expression-syntax",
"skills/n8n-mcp-tools-expert",
"skills/n8n-workflow-patterns",
"skills/n8n-validation-expert",
"skills/n8n-node-configuration"
],
"requires": {
"mcp_servers": ["n8n-mcp"]
}
}
```
## GitHub Repository
```
n8n-mcp-skills/
├── README.md
├── LICENSE (MIT)
├── skills/ [all skills]
├── evaluations/ [all evaluations]
├── docs/
│ ├── INSTALLATION.md
│ ├── USAGE.md
│ └── DEVELOPMENT.md
└── .github/
└── workflows/
└── test-skills.yml
```
---
# README.md (for repository)
```markdown
# n8n-mcp Claude Skills
Expert Claude Skills for building n8n workflows using the n8n-mcp MCP server.
## What are these skills?
5 complementary skills that teach Claude how to:
- ✅ Write correct n8n expressions
- ✅ Use n8n-mcp MCP tools effectively
- ✅ Build workflows using proven patterns
- ✅ Interpret and fix validation errors
- ✅ Configure nodes with operation-aware guidance
## Skills included
1. **n8n Expression Syntax** - Correct {{}} syntax and common patterns
2. **n8n MCP Tools Expert** - How to use n8n-mcp tools (fixes 20% failure rate)
3. **n8n Workflow Patterns** - 5 proven patterns from 31,917 real workflows
4. **n8n Validation Expert** - Error interpretation and validation loops
5. **n8n Node Configuration** - Operation-aware configuration guidance
## Installation
### Claude Code
1. Download this repository
2. Copy `skills/` directory to your Claude Code skills folder
3. Reload Claude Code
### Claude.ai
1. Download and zip each skill folder individually
2. Upload via Settings > Capabilities > Skills
### API
See [docs/INSTALLATION.md](docs/INSTALLATION.md)
## Usage
Once installed, skills activate automatically when relevant:
- "How do I write n8n expressions?" → Expression Syntax skill
- "Find me a Slack node" → MCP Tools Expert skill
- "Build a webhook workflow" → Workflow Patterns skill
- "Why is validation failing?" → Validation Expert skill
## Requirements
- n8n-mcp MCP server installed and configured
- Claude Code, Claude.ai, or Claude API access
## Data-driven design
These skills are based on analysis of:
- 447,557 real MCP tool usage events
- 31,917 workflows created
- 19,113 validation errors
- 15,107 validation feedback loops
## License
MIT License - see LICENSE file
## Credits
Conceived by Romuald Członkowski - [www.aiadvisors.pl/en](https://www.aiadvisors.pl/en)
Part of the n8n-mcp project.
```
---
# COMPLETE IMPLEMENTATION CHECKLIST
## Week 1: Expression Syntax (PoC)
- [ ] Create `skills/n8n-expression-syntax/` directory
- [ ] Write SKILL.md (200 lines)
- [ ] Write COMMON_MISTAKES.md (100 lines)
- [ ] Write EXAMPLES.md (50 lines)
- [ ] Create 3 evaluations
- [ ] Test evaluations without skill (baseline)
- [ ] Test evaluations with skill
- [ ] Iterate until 100% pass
- [ ] Document findings
## Week 2: MCP Tools + Workflow Patterns
- [ ] Create `skills/n8n-mcp-tools-expert/` directory
- [ ] Write SKILL.md (350 lines)
- [ ] Write SEARCH_GUIDE.md (150 lines)
- [ ] Write VALIDATION_GUIDE.md (100 lines)
- [ ] Write WORKFLOW_GUIDE.md (100 lines)
- [ ] Create 3+ evaluations
- [ ] Test and iterate
- [ ] Create `skills/n8n-workflow-patterns/` directory
- [ ] Write SKILL.md with checklist (400 lines)
- [ ] Write webhook_processing.md
- [ ] Write http_api_integration.md
- [ ] Write database_operations.md
- [ ] Write ai_agent_workflow.md
- [ ] Write scheduled_tasks.md
- [ ] Create 3+ evaluations
- [ ] Test composition with MCP Tools skill
## Week 3: Validation + Configuration
- [ ] Create `skills/n8n-validation-expert/`
- [ ] Write SKILL.md with validation loop
- [ ] Write ERROR_CATALOG.md (known errors)
- [ ] Write FALSE_POSITIVES.md (Issues #304, #338)
- [ ] Create 3+ evaluations
- [ ] Test with all previous skills
- [ ] Create `skills/n8n-node-configuration/`
- [ ] Write SKILL.md
- [ ] Write DEPENDENCIES.md
- [ ] Write OPERATION_PATTERNS.md
- [ ] Create 3+ evaluations
## Week 4: Integration & Testing
- [ ] Create cross-skill integration tests
- [ ] Test all 5 skills working together
- [ ] Test with Haiku, Sonnet, Opus
- [ ] Gather feedback
- [ ] Iterate based on real usage
- [ ] Performance optimization
## Week 5-6: Distribution
- [ ] Create plugin.json
- [ ] Package as Claude Code plugin
- [ ] Create GitHub repository
- [ ] Write comprehensive README
- [ ] Write INSTALLATION.md
- [ ] Write USAGE.md
- [ ] Write DEVELOPMENT.md
- [ ] Create demo video
- [ ] Announce to community
---
**This implementation guide is complete and ready to feed into Claude Code for autonomous execution.**
Conceived by Romuald Członkowski - [www.aiadvisors.pl/en](https://www.aiadvisors.pl/en)