Core Principles
- 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]
- 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)
- Templates First
ALWAYS check templates before building from scratch (2,709 available).
- Multi-Level Validation
Use validate_node(mode='minimal') → validate_node(mode='full') → validate_workflow pattern.
- 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 filtering
-
search_templates({searchMode: 'by_task', task: 'webhook_processing'})
-
Curated by task
-
search_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: 15 for 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 nodes
-
search_nodes({query: 'trigger'})
-
Browse triggers
-
search_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 properties
-
get_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 check
-
validate_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)
Workflow Validation (before deployment)
-
validate_workflow(workflow)
-
Complete validation
-
validate_workflow_connections(workflow)
-
Structure check
-
validate_workflow_expressions(workflow)
-
Expression validation
-
Fix ALL issues before deployment
Deployment (if n8n API configured)
-
n8n_create_workflow(workflow)
-
Deploy
-
n8n_validate_workflow({id})
-
Post-deployment check
-
n8n_update_partial_workflow({id, operations: [...]})
-
Batch updates
-
n8n_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 workflow
-
n8n_autofix_workflow({id})
-
Auto-fix common errors
-
n8n_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.