n8n
Core Principles
1. Silent Execution
CRITICAL: Execute tools without commentary. Only respond AFTER all tools complete.
❌ BAD: "Let me search for Slack nodes... Great! Now let me get details..." ✅ GOOD: [Execute search_nodes and get_node in parallel, then respond]
2. Parallel Execution
When operations are independent, execute them in parallel for maximum performance.
✅ GOOD: Call search_nodes, list_nodes, and search_templates simultaneously ❌ BAD: Sequential tool calls (await each one before the next)
3. Templates First
ALWAYS check templates before building from scratch (2,709 available).
4. Multi-Level Validation
Use validate_node(mode='minimal') → validate_node(mode='full') → validate_workflow pattern.
5. Never Trust Defaults
⚠️ CRITICAL: Default parameter values are the #1 source of runtime failures. ALWAYS explicitly configure ALL parameters that control node behavior.
Workflow Process
-
Start: Call
tools_documentation()for best practices -
Template Discovery Phase (FIRST - parallel when searching multiple)
search_templates({searchMode: 'by_metadata', complexity: 'simple'})- Smart filteringsearch_templates({searchMode: 'by_task', task: 'webhook_processing'})- Curated by tasksearch_templates({query: 'slack notification'})- Text search (default searchMode='keyword')search_templates({searchMode: 'by_nodes', nodeTypes: ['n8n-nodes-base.slack']})- By node type
Filtering strategies:
- Beginners:
complexity: "simple"+maxSetupMinutes: 30 - By role:
targetAudience: "marketers"|"developers"|"analysts" - By time:
maxSetupMinutes: 15for quick wins - By service:
requiredService: "openai"for compatibility
-
Node Discovery (if no suitable template - parallel execution)
- Think deeply about requirements. Ask clarifying questions if unclear.
search_nodes({query: 'keyword', includeExamples: true})- Parallel for multiple nodessearch_nodes({query: 'trigger'})- Browse triggerssearch_nodes({query: 'AI agent langchain'})- AI-capable nodes
-
Configuration Phase (parallel for multiple nodes)
get_node({nodeType, detail: 'standard', includeExamples: true})- Essential properties (default)get_node({nodeType, detail: 'minimal'})- Basic metadata only (~200 tokens)get_node({nodeType, detail: 'full'})- Complete information (~3000-8000 tokens)get_node({nodeType, mode: 'search_properties', propertyQuery: 'auth'})- Find specific propertiesget_node({nodeType, mode: 'docs'})- Human-readable markdown documentation- Show workflow architecture to user for approval before proceeding
-
Validation Phase (parallel for multiple nodes)
validate_node({nodeType, config, mode: 'minimal'})- Quick required fields checkvalidate_node({nodeType, config, mode: 'full', profile: 'runtime'})- Full validation with fixes- Fix ALL errors before proceeding
-
Building Phase
- If using template:
get_template(templateId, {mode: "full"}) - MANDATORY ATTRIBUTION: "Based on template by [author.name] (@[username]). View at: [url]"
- Build from validated configurations
- ⚠️ EXPLICITLY set ALL parameters - never rely on defaults
- Connect nodes with proper structure
- Add error handling
- Use n8n expressions: $json, $node["NodeName"].json
- Build in artifact (unless deploying to n8n instance)
- If using template:
-
Workflow Validation (before deployment)
validate_workflow(workflow)- Complete validationvalidate_workflow_connections(workflow)- Structure checkvalidate_workflow_expressions(workflow)- Expression validation- Fix ALL issues before deployment
-
Deployment (if n8n API configured)
n8n_create_workflow(workflow)- Deployn8n_validate_workflow({id})- Post-deployment checkn8n_update_partial_workflow({id, operations: [...]})- Batch updatesn8n_test_workflow({workflowId})- Test workflow execution
Critical Warnings
⚠️ Never Trust Defaults
Default values cause runtime failures. Example:
// ❌ FAILS at runtime
{resource: "message", operation: "post", text: "Hello"}
// ✅ WORKS - all parameters explicit
{resource: "message", operation: "post", select: "channel", channelId: "C123", text: "Hello"}
⚠️ Example Availability
includeExamples: true returns real configurations from workflow templates.
- Coverage varies by node popularity
- When no examples available, use
get_node+validate_node({mode: 'minimal'})
Validation Strategy
Level 1 - Quick Check (before building)
validate_node({nodeType, config, mode: 'minimal'}) - Required fields only (<100ms)
Level 2 - Comprehensive (before building)
validate_node({nodeType, config, mode: 'full', profile: 'runtime'}) - Full validation with fixes
Level 3 - Complete (after building)
validate_workflow(workflow) - Connections, expressions, AI tools
Level 4 - Post-Deployment
n8n_validate_workflow({id})- Validate deployed workflown8n_autofix_workflow({id})- Auto-fix common errorsn8n_executions({action: 'list'})- Monitor execution status
Response Format
Initial Creation
[Silent tool execution in parallel]
Created workflow:
- Webhook trigger → Slack notification
- Configured: POST /webhook → #general channel
Validation: ✅ All checks passed
Modifications
[Silent tool execution]
Updated workflow:
- Added error handling to HTTP node
- Fixed required Slack parameters
Changes validated successfully.
Batch Operations
Use n8n_update_partial_workflow with multiple operations in a single call:
✅ GOOD - Batch multiple operations:
n8n_update_partial_workflow({
id: "wf-123",
operations: [
{type: "updateNode", nodeId: "slack-1", changes: {...}},
{type: "updateNode", nodeId: "http-1", changes: {...}},
{type: "cleanStaleConnections"}
]
})
❌ BAD - Separate calls:
n8n_update_partial_workflow({id: "wf-123", operations: [{...}]})
n8n_update_partial_workflow({id: "wf-123", operations: [{...}]})
CRITICAL: addConnection Syntax
The addConnection operation requires four separate string parameters. Common mistakes cause misleading errors.
❌ WRONG - Object format (fails with "Expected string, received object"):
{
"type": "addConnection",
"connection": {
"source": {"nodeId": "node-1", "outputIndex": 0},
"destination": {"nodeId": "node-2", "inputIndex": 0}
}
}
❌ WRONG - Combined string (fails with "Source node not found"):
{
"type": "addConnection",
"source": "node-1:main:0",
"target": "node-2:main:0"
}
✅ CORRECT - Four separate string parameters:
{
"type": "addConnection",
"source": "node-id-string",
"target": "target-node-id-string",
"sourcePort": "main",
"targetPort": "main"
}
Reference: GitHub Issue #327
⚠️ CRITICAL: IF Node Multi-Output Routing
IF nodes have two outputs (TRUE and FALSE). Use the branch parameter to route to the correct output:
✅ CORRECT - Route to TRUE branch (when condition is met):
{
"type": "addConnection",
"source": "if-node-id",
"target": "success-handler-id",
"sourcePort": "main",
"targetPort": "main",
"branch": "true"
}
✅ CORRECT - Route to FALSE branch (when condition is NOT met):
{
"type": "addConnection",
"source": "if-node-id",
"target": "failure-handler-id",
"sourcePort": "main",
"targetPort": "main",
"branch": "false"
}
Common Pattern - Complete IF node routing:
n8n_update_partial_workflow({
id: "workflow-id",
operations: [
{type: "addConnection", source: "If Node", target: "True Handler", sourcePort: "main", targetPort: "main", branch: "true"},
{type: "addConnection", source: "If Node", target: "False Handler", sourcePort: "main", targetPort: "main", branch: "false"}
]
})
Note: Without the branch parameter, both connections may end up on the same output, causing logic errors!
removeConnection Syntax
Use the same four-parameter format:
{
"type": "removeConnection",
"source": "source-node-id",
"target": "target-node-id",
"sourcePort": "main",
"targetPort": "main"
}
Example Workflow
Template-First Approach
// STEP 1: Template Discovery (parallel execution)
[Silent execution]
search_templates({
searchMode: 'by_metadata',
requiredService: 'slack',
complexity: 'simple',
targetAudience: 'marketers'
})
search_templates({searchMode: 'by_task', task: 'slack_integration'})
// STEP 2: Use template
get_template(templateId, {mode: 'full'})
validate_workflow(workflow)
// Response after all tools complete:
"Found template by **David Ashby** (@cfomodz).
View at: https://n8n.io/workflows/2414
Validation: ✅ All checks passed"
Building from Scratch (if no template)
// STEP 1: Discovery (parallel execution)
[Silent execution]
search_nodes({query: 'slack', includeExamples: true})
search_nodes({query: 'communication trigger'})
// STEP 2: Configuration (parallel execution)
[Silent execution]
get_node({nodeType: 'n8n-nodes-base.slack', detail: 'standard', includeExamples: true})
get_node({nodeType: 'n8n-nodes-base.webhook', detail: 'standard', includeExamples: true})
// STEP 3: Validation (parallel execution)
[Silent execution]
validate_node({nodeType: 'n8n-nodes-base.slack', config, mode: 'minimal'})
validate_node({nodeType: 'n8n-nodes-base.slack', config: fullConfig, mode: 'full', profile: 'runtime'})
// STEP 4: Build
// Construct workflow with validated configs
// ⚠️ Set ALL parameters explicitly
// STEP 5: Validate
[Silent execution]
validate_workflow(workflowJson)
// Response after all tools complete:
"Created workflow: Webhook → Slack
Validation: ✅ Passed"
Batch Updates
// ONE call with multiple operations
n8n_update_partial_workflow({
id: "wf-123",
operations: [
{type: "updateNode", nodeId: "slack-1", changes: {position: [100, 200]}},
{type: "updateNode", nodeId: "http-1", changes: {position: [300, 200]}},
{type: "cleanStaleConnections"}
]
})
Important Rules
Core Behavior
- Silent execution - No commentary between tools
- Parallel by default - Execute independent operations simultaneously
- Templates first - Always check before building (2,709 available)
- Multi-level validation - Quick check → Full validation → Workflow validation
- Never trust defaults - Explicitly configure ALL parameters
Attribution & Credits
- MANDATORY TEMPLATE ATTRIBUTION: Share author name, username, and n8n.io link
- Template validation - Always validate before deployment (may need updates)
Performance
- Batch operations - Use diff operations with multiple changes in one call
- Parallel execution - Search, validate, and configure simultaneously
- Template metadata - Use smart filtering for faster discovery
Code Node Usage
- Avoid when possible - Prefer standard nodes
- Only when necessary - Use code node as last resort
- AI tool capability - ANY node can be an AI tool (not just marked ones)
Most Popular n8n Nodes (for get_node):
- n8n-nodes-base.code - JavaScript/Python scripting
- n8n-nodes-base.httpRequest - HTTP API calls
- n8n-nodes-base.webhook - Event-driven triggers
- n8n-nodes-base.set - Data transformation
- n8n-nodes-base.if - Conditional routing
- n8n-nodes-base.manualTrigger - Manual workflow execution
- n8n-nodes-base.respondToWebhook - Webhook responses
- n8n-nodes-base.scheduleTrigger - Time-based triggers
- @n8n/n8n-nodes-langchain.agent - AI agents
- n8n-nodes-base.googleSheets - Spreadsheet integration
- n8n-nodes-base.merge - Data merging
- n8n-nodes-base.switch - Multi-branch routing
- n8n-nodes-base.telegram - Telegram bot integration
- @n8n/n8n-nodes-langchain.lmChatOpenAi - OpenAI chat models
- n8n-nodes-base.splitInBatches - Batch processing
- n8n-nodes-base.openAi - OpenAI legacy node
- n8n-nodes-base.gmail - Email automation
- n8n-nodes-base.function - Custom functions
- n8n-nodes-base.stickyNote - Workflow documentation
- n8n-nodes-base.executeWorkflowTrigger - Sub-workflow calls
Note: LangChain nodes use the @n8n/n8n-nodes-langchain. prefix, core nodes use n8n-nodes-base.
More from d-kimuson/dotfiles
article-writing
箇条書きコンテンツを技術記事に仕上げる際に使用する。自然な文体とスタイルで執筆するためのガイドライン。
18typescript
Must always be enabled when writing/reviewing TypeScript code.
16react
Must always be enabled when writing/reviewing React code.
14shadcn-ui
Must always be enabled when working with shadcn-ui.
14frontend-design
Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
13skill-installer
Install Codex skills into $CODEX_HOME/skills from a curated list or a GitHub repo path. Use when a user asks to list installable skills, install a curated skill, or install a skill from another repo (including private repos).
13