Install
openclaw skills install n8n-autopilotAI-powered n8n workflow builder and deployer by Dr. FIRAS. Generates production-ready n8n workflow JSON from natural language, validates structure and logic, then auto-deploys to any n8n instance via REST API. Use this skill whenever the user wants to create, build, design, generate, deploy, or publish an n8n workflow — even from a plain description like "automate my Stripe payments to Slack". Also triggers when the user pastes n8n workflow JSON for review, debugging, optimization, or redeployment. Covers: workflow generation, structural validation, auto-deployment, activation, execution monitoring, and performance diagnostics. LinkedIn: https://www.linkedin.com/in/doctor-firass/
openclaw skills install n8n-autopilotBy Dr. FIRAS — LinkedIn
Build complete n8n workflows from natural language, validate them, and deploy them to your n8n instance — all in one step. No placeholders, no TODOs, no manual assembly required.
ALWAYS:
connections objectN8N_API_KEY is configuredNEVER:
url, path, or jsCode fields emptyTwo environment variables are needed:
| Variable | Where to find it |
|---|---|
N8N_API_KEY | n8n UI → Settings → API → Create API Key |
N8N_BASE_URL | Your instance URL, e.g. https://n8n.example.com |
Set them via OpenClaw settings (~/.config/openclaw/settings.json):
{
"skills": {
"n8n-autopilot": {
"env": {
"N8N_API_KEY": "your-key",
"N8N_BASE_URL": "https://your-n8n.example.com"
}
}
}
}
Verify connectivity:
python3 scripts/n8n_deploy.py ping
Follow these steps for every workflow request:
Determine four things before writing JSON:
If the request is clear, skip to generation. Do not over-ask.
Map the flow mentally:
Trigger → [Ingest] → [Transform] → [Branch?] → [Act] → [Respond/Store]
Use the WorkflowForge builder (see scripts/workflow_forge.py) or write
raw JSON. Output a single valid JSON object ready for n8n's "Import from JSON".
Run through the validation checklist below. Fix every issue before showing the user. You can also call:
python3 scripts/workflow_inspector.py check --file workflow.json
python3 scripts/n8n_deploy.py push --file workflow.json
python3 scripts/n8n_deploy.py push --file workflow.json --activate
Provide a brief node-by-node table and import/credential instructions.
{
"name": "Descriptive Workflow Name",
"nodes": [],
"connections": {},
"active": false,
"settings": { "executionOrder": "v1" }
}
{
"id": "unique-uuid-v4",
"name": "Human Readable Name",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4,
"position": [500, 300],
"parameters": { ... },
"credentials": { "httpHeaderAuth": { "id": "1", "name": "My Auth" } }
}
{
"connections": {
"Source Node Name": {
"main": [
[{ "node": "Target Node Name", "type": "main", "index": 0 }]
]
}
}
}
main = array of arrays (outer = output index, inner = targets)| Type | Ver | Purpose |
|---|---|---|
n8n-nodes-base.manualTrigger | 1 | Testing / manual runs |
n8n-nodes-base.webhook | 2 | HTTP webhook receiver |
n8n-nodes-base.scheduleTrigger | 1 | Cron / interval |
| Type | Ver | Purpose |
|---|---|---|
n8n-nodes-base.code | 2 | JavaScript / Python |
n8n-nodes-base.set | 3 | Map / rename / add fields |
n8n-nodes-base.if | 2 | Conditional branch |
n8n-nodes-base.switch | 3 | Multi-way routing |
n8n-nodes-base.merge | 3 | Combine streams |
n8n-nodes-base.splitInBatches | 3 | Loop / batch |
n8n-nodes-base.noOp | 1 | No-op terminus |
| Type | Ver | Purpose |
|---|---|---|
n8n-nodes-base.httpRequest | 4 | Any REST call |
n8n-nodes-base.respondToWebhook | 1 | Webhook reply |
| Type | Ver | Purpose |
|---|---|---|
n8n-nodes-base.slack | 2 | Slack messages |
n8n-nodes-base.gmail | 2 | Gmail |
n8n-nodes-base.googleSheets | 4 | Google Sheets |
n8n-nodes-base.notion | 2 | Notion |
n8n-nodes-base.postgres | 2 | PostgreSQL |
n8n-nodes-base.telegram | 2 | Telegram |
| Type | Ver | Purpose |
|---|---|---|
@n8n/n8n-nodes-langchain.openAi | 1 | OpenAI completions |
@n8n/n8n-nodes-langchain.lmChatOpenAi | 1 | OpenAI chat model |
For full credential mapping, see references/node-catalog.md.
| Pattern | Meaning |
|---|---|
={{ $json.field }} | Current item field |
={{ $json["field-name"] }} | Hyphenated field |
={{ $node["Name"].json.field }} | Upstream node field |
={{ $input.all() }} | All items (Code node) |
={{ $input.first().json.f }} | First item field |
={{ $now.toISO() }} | Current ISO timestamp |
={{ $vars.MY_VAR }} | Environment variable |
Before outputting any workflow, verify:
Structure:
nodes array exists and is non-emptyconnections covers every non-terminal nodeid, name, type, typeVersion, position, parametersIntegrity:
url, path, jsCode)Graph:
Credentials:
credentials blockExpressions:
={{ ... }} references point to fields that upstream nodes producen8n_deploy.py)# Connectivity check
python3 scripts/n8n_deploy.py ping
# List workflows
python3 scripts/n8n_deploy.py ls [--active]
# Push (create) a workflow
python3 scripts/n8n_deploy.py push --file workflow.json [--activate]
# Inspect a deployed workflow
python3 scripts/n8n_deploy.py inspect --id <wf-id>
# Activate / deactivate
python3 scripts/n8n_deploy.py on --id <wf-id>
python3 scripts/n8n_deploy.py off --id <wf-id>
# Trigger manual execution
python3 scripts/n8n_deploy.py run --id <wf-id> [--payload '{"key":"val"}']
# View recent executions
python3 scripts/n8n_deploy.py history --id <wf-id> [--limit 10]
# Execution details
python3 scripts/n8n_deploy.py exec-detail --id <exec-id>
# Execution statistics
python3 scripts/n8n_deploy.py stats --id <wf-id> [--days 7]
# Delete workflow
python3 scripts/n8n_deploy.py rm --id <wf-id>
workflow_inspector.py)# Validate a local file
python3 scripts/workflow_inspector.py check --file workflow.json
# Validate a deployed workflow
python3 scripts/workflow_inspector.py check --id <wf-id>
# Full diagnostic report (structure + performance)
python3 scripts/workflow_inspector.py diagnose --id <wf-id> [--days 14]
# Optimization suggestions only
python3 scripts/workflow_inspector.py optimize --id <wf-id>
workflow_forge.py)# Build from a recipe YAML and deploy
python3 scripts/workflow_forge.py build --recipe recipe.yaml --deploy
# Export as JSON
python3 scripts/workflow_forge.py build --recipe recipe.yaml --output wf.json
Apply when generating workflows:
splitInBatches instead of Code-node loops.executionTimeout in settings for long-running flows.Every workflow response must include:
| # | Node | Type | What it does |
|---|---|---|---|
| 1 | Webhook Trigger | webhook | Receives POST requests |
| 2 | Parse Input | set | Extracts email and name |
Webhook → Set (extract) → Code (transform) → Respond to Webhook
Schedule → HTTP Request (fetch) → Code (process) → Google Sheets (append)
Webhook → IF → true: Slack notify → NoOp
false: Email alert → NoOp
Schedule → HTTP Request → IF (ok?) → true: Process → Store
false: Slack error alert
n8n-autopilot/
├── SKILL.md # This file
├── README.md # Project overview
├── scripts/
│ ├── n8n_deploy.py # API client + deployment CLI
│ ├── workflow_forge.py # Programmatic workflow builder
│ └── workflow_inspector.py # Validation + diagnostics
└── references/
└── node-catalog.md # Node types & credential mapping
| Symptom | Fix |
|---|---|
N8N_API_KEY not set | Export the variable or add to OpenClaw settings |
HTTP 401 Unauthorized | Regenerate API key in n8n Settings → API |
Connection refused | Check N8N_BASE_URL — include protocol and port |
| Validation: cycle detected | Break circular connections; use sub-workflows |
| Execution timeout | Add executionTimeout in settings; optimize slow nodes |
| Rate limit (429) | Insert Wait nodes; use batch processing |