From n8n-mcp-skills
Interprets n8n validation errors and warnings, distinguishes false positives from real errors, and guides through the fix loop. Activate on validate_node/validate_workflow failures.
How this skill is triggered — by the user, by Claude, or both
Slash command
/n8n-mcp-skills:n8n-validation-expertThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Expert guide for interpreting and fixing n8n validation errors.
Expert guide for interpreting and fixing n8n validation errors.
Validate early, validate often
Validation is typically iterative:
Key insight: Validation is an iterative process, not one-shot!
Blocks workflow execution - Must be resolved before activation
Types:
missing_required - Required field not providedinvalid_value - Value doesn't match allowed optionstype_mismatch - Wrong data type (string instead of number)invalid_reference - Referenced node doesn't existinvalid_expression - Expression syntax errorExample:
{
"type": "missing_required",
"property": "channel",
"message": "Channel name is required",
"fix": "Provide a channel name (lowercase, no spaces, 1-80 characters)"
}
Doesn't block execution - Workflow can be activated but may have issues
Types:
best_practice - Recommended but not requireddeprecated - Using old API/featureperformance - Potential performance issueExample:
{
"type": "best_practice",
"property": "errorHandling",
"message": "Slack API can have rate limits",
"suggestion": "Add onError: 'continueRegularOutput' with retryOnFail"
}
Nice to have - Improvements that could enhance workflow
Types:
optimization - Could be more efficientalternative - Better way to achieve same result7,841 occurrences of this pattern:
1. Configure node
↓
2. validate_node (23 seconds thinking about errors)
↓
3. Read error messages carefully
↓
4. Fix errors
↓
5. validate_node again (58 seconds fixing)
↓
6. Repeat until valid (usually 2-3 iterations)
// Iteration 1
let config = {
resource: "channel",
operation: "create"
};
const result1 = validate_node({
nodeType: "nodes-base.slack",
config,
profile: "runtime"
});
// → Error: Missing "name"
// ⏱️ 23 seconds thinking...
// Iteration 2
config.name = "general";
const result2 = validate_node({
nodeType: "nodes-base.slack",
config,
profile: "runtime"
});
// → Error: Missing "text"
// ⏱️ 58 seconds fixing...
// Iteration 3
config.text = "Hello!";
const result3 = validate_node({
nodeType: "nodes-base.slack",
config,
profile: "runtime"
});
// → Valid! ✅
This is normal! Don't be discouraged by multiple iterations.
Choose the right profile for your stage:
Use when: Quick checks during editing
Validates:
Pros: Fastest, most permissive Cons: May miss issues
Use when: Pre-deployment validation
Validates:
Pros: Balanced, catches real errors Cons: Some edge cases missed
This is the recommended profile for most use cases
Use when: AI-generated configurations
Validates:
Pros: Less noisy for AI workflows Cons: May allow some questionable configs
Use when: Production deployment, critical workflows
Validates:
Pros: Maximum safety Cons: Many warnings, some false positives
Five core error types, in rough order of frequency:
missing_required — a required field isn't provided. Use get_node to see required fields, then add it.invalid_value — value doesn't match allowed options (enums are case-sensitive). Check the error's allowed list or get_node.type_mismatch — wrong data type (string "100" vs number 100). Convert to the expected type.invalid_expression — expression syntax error (missing {{}}, typos). See the n8n Expression Syntax skill.invalid_reference — referenced node doesn't exist (renamed, deleted, or misspelled). Fix the name or cleanStaleConnections.A sixth class, patchNodeField errors (find-not-found, ambiguous match, invalid/unsafe regex), surfaces when a patchNodeField op fails during n8n_update_partial_workflow — it's strict by design and errors rather than silently continuing.
Every type above has worked examples (broken config → fix) plus the patchNodeField error cases and their fixes in ERROR_CATALOG.md.
Automatically fixes common operator structure issues on ANY workflow update — n8n_create_workflow, n8n_update_partial_workflow, or any save. Trust it; don't hand-fix these.
What it fixes:
singleValue property.singleValue: true.conditions.options metadata for IF v2.2+ and Switch v3.2+.What it CANNOT fix (handle manually): broken connections to non-existent nodes (use cleanStaleConnections), branch-count mismatches (add/remove connections or rules), and paradoxical corrupt states (may need manual DB intervention).
Before/after examples and the full cannot-fix detail are in ERROR_CATALOG.md (Auto-Sanitization sections).
Validation warnings that are technically "wrong" but acceptable in your use case. Not every warning needs a fix — many are context-dependent. Common ones and when each is acceptable vs. worth fixing:
Reduce false positives with the ai-friendly profile (e.g. validate_node({nodeType, config, profile: "ai-friendly"})).
Full per-case guidance, security/credential warnings, known n8n false-positive issues (#304, #306, #338), profile strategies, the "should I fix this?" decision framework, and how to document accepted warnings are in FALSE_POSITIVES.md.
{
"valid": false,
"errors": [
{
"type": "missing_required",
"property": "channel",
"message": "Channel name is required",
"fix": "Provide a channel name (lowercase, no spaces)"
}
],
"warnings": [
{
"type": "best_practice",
"property": "errorHandling",
"message": "Slack API can have rate limits",
"suggestion": "Add onError: 'continueRegularOutput'"
}
],
"suggestions": [
{
"type": "optimization",
"message": "Consider using batch operations for multiple messages"
}
],
"summary": {
"hasErrors": true,
"errorCount": 1,
"warningCount": 1,
"suggestionCount": 1
}
}
valid first — true means the config is valid; false means there are errors to fix before deployment.errors first — each carries a property, message, and fix. These must be resolved.warnings — each has a message and suggestion; decide per-case whether to address it (see False Positives above).suggestions — optional improvements, not required.Validates entire workflow, not just individual nodes
Checks:
Example:
validate_workflow({
workflow: {
nodes: [...],
connections: {...}
},
options: {
validateNodes: true,
validateConnections: true,
validateExpressions: true,
profile: "runtime"
}
})
{
"error": "Connection from 'Transform' to 'NonExistent' - target node not found"
}
Fix: Remove stale connection or create missing node
{
"error": "Circular dependency detected: Node A → Node B → Node A"
}
Fix: Restructure workflow to remove loop
{
"warning": "Multiple trigger nodes found - only one will execute"
}
Fix: Remove extra triggers or split into separate workflows
{
"warning": "Node 'Transform' is not connected to workflow flow"
}
Fix: Connect node or remove if unused
When: Configuration is severely broken
Steps:
get_nodeWhen: Workflow validates but executes incorrectly
Steps:
When: "Node not found" errors
Steps:
n8n_update_partial_workflow({
id: "workflow-id",
operations: [{
type: "cleanStaleConnections"
}]
})
When: Validation errors that can be automatically resolved
Steps:
// Preview fixes (default - doesn't apply)
n8n_autofix_workflow({
id: "workflow-id",
applyFixes: false,
confidenceThreshold: "medium" // high, medium, low
})
// Review fixes, then apply
n8n_autofix_workflow({
id: "workflow-id",
applyFixes: true
})
The n8n_autofix_workflow tool can fix these issue types:
= prefix in expressions (e.g., {{ $json.field }} → ={{ $json.field }})Confidence levels: high (90%+, safe to auto-apply), medium (70-89%, review recommended), low (<70%, manual review required)
// Preview all fixes
n8n_autofix_workflow({id: "workflow-id"})
// Only apply high-confidence fixes
n8n_autofix_workflow({
id: "workflow-id",
applyFixes: true,
confidenceThreshold: "high"
})
// Target specific fix types
n8n_autofix_workflow({
id: "workflow-id",
fixTypes: ["expression-format", "typeversion-upgrade"],
applyFixes: true
})
Post-update guidance: For version upgrades, check the postUpdateGuidance field in the response for step-by-step migration instructions.
runtime profile for pre-deploymentvalid field before assuming successget_node when unclear about requirementsstrict profile during development (too noisy)Validating as you build (the loop above) is for catching schema and shape errors in your own in-progress work. Reviewing an existing workflow — yours or one you've been handed — is a different job: the workflow already passes validate_workflow clean, and you're hunting for the issues validation doesn't see (silent connection bugs, injection-prone queries, dropped-item Switches, Set/Code antipatterns, missing error paths). For that, pull the workflow with n8n_get_workflow and walk REVIEW_CHECKLIST.md — a severity-tiered audit (MUST FIX / SHOULD FIX / NICE TO HAVE) where every item points to the canonical skill for the fix. Run n8n_audit_instance alongside it to surface hardcoded secrets and unauthenticated webhooks across the whole instance.
For comprehensive error catalogs, false positives, and workflow review:
Key Points:
Validation Process:
Related Skills & Tools:
n8n_audit_instance - Proactive security validation (hardcoded secrets, unauthenticated webhooks, missing error handling, data retention)npx claudepluginhub czlonkowski/n8n-skills --plugin n8n-mcp-skillsInterprets n8n validation errors, warnings, and suggestions; guides fixes for node configs, expressions, references, and workflow validation loops.
Interprets and fixes n8n workflow validation errors like missing_required, invalid_value, type_mismatch, and invalid_expression. Guides iterative validate-fix loops with examples.
Systematically debugs n8n workflows by checking common failure causes: parameter misconfig, stale assumptions, miswired paths, upstream data stripping, item context loss, logic errors, and genuine bugs.