Validates automation workflow JSON before deployment for Power Automate, n8n, Make, Zapier and other platforms. Checks syntax, structure, best practices, and potential issues. Analyzes workflow JSON files for platform compliance, missing error handling, performance issues, and security concerns. Use when user wants to validate, review, or check a workflow before deployment/import.
Validates automation workflow JSON for Power Automate, n8n, Make, and Zapier before deployment. Checks syntax, structure, best practices, security, and data type consistency. Triggers on workflow JSON files or when users request validation, review, or pre-deployment checks.
/plugin marketplace add MacroMan5/AutomationHelper_plugins/plugin install automation-helper@automation-helper-marketplaceThis skill is limited to using the following tools:
Comprehensive pre-deployment validator for automation workflow JSON definitions across multiple platforms.
Validates automation workflows against:
Triggers on:
JSON Structure:
Power Automate Schema:
Structure:
{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"contentVersion": "1.0.0.0",
"parameters": { /* Required */ },
"triggers": { /* Required */ },
"actions": { /* Required */ },
"outputs": {}
},
"schemaVersion": "1.0.0.0"
}
Required Fields:
Common Issues:
Example Check:
// GOOD
"triggers": {
"manual": {
"type": "Request",
"kind": "Button", // Required for manual triggers
"inputs": {
"schema": {}
}
}
}
// BAD - missing kind
"triggers": {
"manual": {
"type": "Request",
"inputs": {}
}
}
Required Fields:
runAfter Chain:
GUID Validation:
Example Check:
// GOOD
"actions": {
"Action_1": {
"type": "Compose",
"inputs": "test",
"runAfter": {} // First action
},
"Action_2": {
"type": "Compose",
"inputs": "test2",
"runAfter": {
"Action_1": ["Succeeded"] // References existing action
}
}
}
// BAD - Action_2 references non-existent action
"actions": {
"Action_2": {
"type": "Compose",
"inputs": "test",
"runAfter": {
"NonExistent": ["Succeeded"]
}
}
}
Common Expression Errors:
Check Patterns:
// GOOD
"@body('Get_Item')?['property']"
"@concat('Hello ', variables('Name'))"
"@if(equals(1, 1), 'true', 'false')"
// BAD
"body('Get_Item')['property']" // Missing @
"@concat(Hello, variables('Name'))" // Unquoted string
"@if(equals(1, 1) 'true', 'false')" // Missing comma
Safe Navigation:
CRITICAL CHECK: Verify data type consistency throughout flow
Array Type Consistency:
item() vs item()?['Property'] usage consistencyitems() usage matches source data structurePattern Detection:
// INCONSISTENT (BUG RISK):
// Filter uses:
"where": "@contains(item(), 'text')" // ← Array of strings
// But loop uses:
"value": "@items('Loop')?['PropertyName']" // ← Accessing property on string = ERROR
// CONSISTENT (CORRECT):
// Filter uses:
"where": "@contains(item(), 'text')" // ← Array of strings
// Loop uses:
"value": "@items('Loop')" // ← Direct string access = CORRECT
Validation Checks:
where uses item() or item()?['Prop']items() access matches source typeCommon Bugs to Detect:
// BUG PATTERN 1: Property access on primitives
{
"Filter": {
"where": "@contains(item(), 'value')" // String array
},
"Loop": {
"foreach": "@body('Filter')",
"actions": {
"BugAction": {
"value": "@items('Loop')?['Nom']" // ❌ ERROR: Can't access property on string
}
}
}
}
// BUG PATTERN 2: Empty Select mapping
{
"Select": {
"select": {
"Nom": "" // ❌ ERROR: Empty mapping creates useless output
}
}
}
// BUG PATTERN 3: Inconsistent data access
{
"Compose1": {
"inputs": "@item()?['Name']" // Expects objects
},
"Compose2": {
"inputs": "@item()" // Treats as primitives
}
// ❌ ERROR: Inconsistent - which is it?
}
Validation Actions:
item() usage is inconsistent across actionsError Handling:
Example:
"Scope_Main": {
"type": "Scope",
"actions": { /* critical actions */ }
},
"Handle_Errors": {
"type": "Compose",
"inputs": "Error occurred",
"runAfter": {
"Scope_Main": ["Failed", "TimedOut"]
}
}
Performance:
Reliability:
Critical Issues:
Check for:
// BAD - hardcoded credentials
"inputs": {
"authentication": {
"password": "MyPassword123", // SECURITY ISSUE
"username": "admin@contoso.com"
}
}
// GOOD - parameterized
"inputs": {
"authentication": {
"password": "@parameters('$connections')['connection']['password']",
"username": "@parameters('$connections')['connection']['username']"
}
}
Injection Risks:
SharePoint:
OneDrive:
HTTP:
Control (Apply to each):
Do Until:
Reference PowerAutomateDocs:
Check against:
# Power Automate Flow Validation Report
## Overall Status: ✅ PASS / ⚠️ WARNINGS / ❌ FAIL
---
## Syntax Validation
**Status**: ✅ Pass
- ✅ Valid JSON syntax
- ✅ Correct Power Automate schema
- ✅ All required root elements present
---
## Structure Validation
**Status**: ✅ Pass
### Triggers
- ✅ 1 trigger defined: "manual"
- ✅ Trigger type valid: Request
- ✅ Required fields present
### Actions
- ✅ 5 actions defined
- ✅ All actions have required fields
- ✅ runAfter chain valid (no orphans)
- ✅ No circular dependencies
---
## Best Practices
**Status**: ⚠️ Warnings
### Error Handling
- ⚠️ **Missing error handling** for "Get_Items" action
- Recommendation: Wrap in Scope with error handler
- Impact: Flow fails completely on error
### Performance
- ✅ Apply to each has concurrency configured
- ⚠️ **No delay in API loop**
- Recommendation: Add 1-second delay after "Get_Items"
- Impact: Risk of throttling (429 errors)
### Reliability
- ✅ Variables initialized
- ✅ Do until has timeout configured
---
## Security
**Status**: ✅ Pass
- ✅ No hardcoded credentials
- ✅ Using connection parameters
- ✅ No SQL injection risks
- ✅ Sensitive data properly handled
---
## Connector-Specific
**Status**: ⚠️ Warnings
### SharePoint (Get Items)
- ⚠️ **Throttling risk**: 100 iterations with no delays
- Limit: 600 calls/60 seconds
- Recommendation: Add 1-second delay or reduce concurrency
- Reference: PowerAutomateDocs/SharePoint/overview.md
- ✅ Attachment size checks present
- ✅ List names valid (no periods)
---
## Critical Issues: 0
## Warnings: 3
## Passed Checks: 28
---
## Recommendations (Priority Order)
### High Priority
1. **Add error handling for Get_Items**
```json
"Scope_GetItems": {
"type": "Scope",
"actions": {
"Get_Items": { /* existing action */ }
}
},
"Handle_Errors": {
"runAfter": {
"Scope_GetItems": ["Failed", "TimedOut"]
}
}
"Delay": {
"type": "Wait",
"inputs": {
"interval": {
"count": 1,
"unit": "Second"
}
},
"runAfter": {
"Get_Items": ["Succeeded"]
}
}
✅ YES - Flow is syntactically valid and can be pasted into Power Automate
⚠️ WITH WARNINGS - Flow will work but has performance/reliability risks
❌ NO - Critical issues must be fixed before deployment
## Validation Levels
### Level 1: Syntax (Blocking)
**Must pass** - Flow won't paste into Power Automate
- Invalid JSON
- Missing required structure
- Invalid schema
### Level 2: Structure (Blocking)
**Must pass** - Flow won't run
- Invalid runAfter chains
- Missing action types
- Invalid expression syntax
### Level 3: Best Practices (Warnings)
**Should fix** - Flow runs but has risks
- Missing error handling
- No throttling mitigation
- Poor performance patterns
### Level 4: Optimization (Suggestions)
**Nice to have** - Improvements
- Better variable naming
- More efficient queries
- Enhanced logging
## Quick Validation Commands
For specific checks without full validation:
### Check Syntax Only
"Validate JSON syntax in workflow JSON"
### Check Best Practices Only
"Review best practices in this flow"
### Check Specific Connector
"Validate SharePoint usage in workflow JSON"
### Security Scan Only
"Security scan this Power Automate flow"
## Integration with Other Skills
**Before using workflow-builder**:
- Validate requirements are complete
- Check for known limitations
**After using automation-debugger**:
- Validate the fixed workflow JSON
- Ensure all issues resolved
- Verify no new issues introduced
**Before deployment**:
- Always run full validation
- Review warnings
- Document any accepted risks
## Common Validation Failures
### 1. Missing runAfter
```json
// FAIL
"actions": {
"Action_2": {
"type": "Compose",
"inputs": "test"
// Missing runAfter
}
}
Fix: Add "runAfter": {} for first action or reference predecessor
// FAIL
"inputs": "@body('Get_Item')['property']" // Will fail if property missing
Fix: "@body('Get_Item')?['property']" with safe navigation
// FAIL
"Get_Items": { /* API call with no error handling */ }
Fix: Wrap in Scope with error handler
// FAIL
"Apply_to_each": {
"foreach": "@range(0, 1000)", // 1000 API calls
"runtimeConfiguration": {
"concurrency": {
"repetitions": 50 // 50 parallel
}
}
}
Fix: Reduce concurrency to 1, add delays
// FAIL
"Do_until": {
"expression": "@equals(variables('Done'), true)"
// No limit
}
Fix: Add "limit": {"count": 60, "timeout": "PT1H"}
Enable strict mode for production flows:
User: "Validate my workflow JSON before I paste it"
Skill Response:
User: "Quick syntax check on my fixed workflow JSON"
Skill Response:
See also:
Version: 1.1 Last Updated: 2025-10-31
Major Improvements:
item() vs item()?['Property'] mismatchesNew Validation Checks:
item() vs item()?['Prop'])Bug Patterns Now Detected:
items('Loop')?['Prop'] on string array)"Nom": "")Impact:
This skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.