Help us improve
Share bugs, ideas, or general feedback.
From operations
Builds, tests, and deploys n8n workflows via REST API with incremental node testing. Activates for automation creation, workflow debugging, nodes, expressions, credentials, and JS/Python Code nodes.
npx claudepluginhub naveedharri/benai-skills --plugin operationsHow this skill is triggered — by the user, by Claude, or both
Slash command
/operations:n8nThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Build, test, and deploy n8n workflows via REST API with incremental testing.
Creates, edits n8n workflows as TypeScript files with node docs access and n8nac CLI for workspace init, preventing param errors.
Designs visual n8n workflows with trigger selection, node mapping, data transformations, error handling, and webhook integration. Activates when users mention n8n workflows or automation.
Provides five core architectural patterns for n8n workflows: webhook processing, HTTP API integration, database operations, AI agent workflows, and scheduled tasks. Includes a pattern selection guide and common workflow components.
Share bugs, ideas, or general feedback.
Build, test, and deploy n8n workflows via REST API with incremental testing.
Use the Read tool to read these files NOW:
1. Read references/pitfalls.md (critical command format rules)
2. Read references/build-process.md (step-by-step build workflow)
Read the .env file in the working directory to verify:
- N8N_API_URL is set
- N8N_API_KEY is set
- N8N_CREDENTIALS_TEMPLATE_URL is set
If any values are missing, ask the user for ALL of them in a single prompt.
After understanding the user's request, create a todo list using TaskCreate.
SKILL LOADS -> READ FILES IMMEDIATELY -> CHECK .env -> THEN respond to user
If the user mentions specific tools, nodes, or services - YOU MUST USE THEM.
User says "use Apify" -> You use Apify node
User says "use OpenAI" -> You use OpenAI Chat Model
Never substitute, skip, or defer user-requested tools.
Loop node has error -> Debug why -> Fix the loop configuration
Don't switch to "simpler" approaches. Keep the correct architecture.
Never add nodes requiring authentication unless:
Always copy type AND typeVersion from the credentials template.
ADD NODE -> TEST -> ADD NEXT NODE -> TEST -> REPEAT
NEVER add 2+ nodes without testing between them.
Node fails -> Debug the error -> Update the same workflow (PUT)
One workflow ID for the entire build process.
| Priority | Use When |
|---|---|
| 1. Native node | Built-in exists (Slack, Sheets, etc.) |
| 2. AI Agent node | For ANY AI/LLM task |
| 3. Loop node | For processing multiple items |
| 4. HTTP Request | Native has issues OR no node exists |
| 5. Code node | Complex logic only |
Never use placeholder URLs, fake IDs, or "REPLACE_ME" values.
Always set limit=2 on data-fetching nodes for fast testing.
Never check, run, or modify workflows the user didn't mention.
1. Create temp workflow: Webhook + getSchema/getAll node
2. Execute to fetch actual field names
3. Use exact field names in main workflow
1. Read references/triggers.md
2. Create workflow with trigger only
3. Test trigger
1. Read relevant reference file for this node type
2. Add ONE node to workflow
3. Test workflow
4. If ERROR -> fix -> retry
5. If SUCCESS -> move to next node
1. All nodes added and tested
2. Workflow activated
3. Report success to user
| Operation | Method | Endpoint |
|---|---|---|
| Create | POST | /api/v1/workflows |
| Update | PUT | /api/v1/workflows/{id} |
| Activate | POST | /api/v1/workflows/{id}/activate |
| Deactivate | POST | /api/v1/workflows/{id}/deactivate |
| Delete | DELETE | /api/v1/workflows/{id} |
| Execute | POST | /webhook/{path} |
CRITICAL RULES:
\ line continuations - Causes errorsGET:
export $(cat .env | grep -v '^#' | xargs) && curl -s "${N8N_API_URL}/api/v1/ENDPOINT" -H "X-N8N-API-KEY: ${N8N_API_KEY}" | jq .
POST/PUT (large JSON):
export $(cat .env | grep -v '^#' | xargs) && curl -s -X POST "${N8N_API_URL}/api/v1/workflows" -H "X-N8N-API-KEY: ${N8N_API_KEY}" -H "Content-Type: application/json" -d "$(cat <<'EOF'
{
"name": "My Workflow",
"nodes": [...],
"connections": {},
"settings": {"executionOrder": "v1"}
}
EOF
)"
{
"name": "Workflow Name",
"nodes": [
{
"id": "unique-node-id",
"name": "Node Display Name",
"type": "n8n-nodes-base.nodeName",
"typeVersion": 1,
"position": [250, 300],
"parameters": {},
"credentials": {}
}
],
"connections": {
"Source Node Name": {
"main": [[{"node": "Target Node Name", "type": "main", "index": 0}]]
}
},
"settings": {"executionOrder": "v1"}
}
Read these files as needed using the Read tool:
| File | Contents |
|---|---|
| references/api-reference.md | All API commands (CRUD, executions, tags, variables) |
| references/build-process.md | Step-by-step build-test workflow |
| references/pitfalls.md | CRITICAL: Command format rules, common mistakes |
| File | Contents |
|---|---|
| references/triggers.md | Webhook, Schedule, Form, Chat, and service triggers |
| references/ai-nodes.md | AI Agent, OpenAI/Anthropic Chat Models, Memory, Vector Store |
| references/data-nodes.md | Google Sheets, Airtable, Notion, Postgres, Slack, Gmail, etc. |
| references/transform-nodes.md | Set, If, Switch, Filter, Merge, Code, HTTP Request, Loops |
| File | Contents |
|---|---|
| references/javascript.md | JavaScript patterns for Code nodes |
| references/python.md | Python patterns for Code nodes |
| references/node-config.md | Node configurations and workflow patterns |
| references/expressions.md | Expression syntax ({{ $json.field }}) |
| references/credentials.md | Credential template usage |
Before adding ANY node:
1. Read the relevant reference file (triggers.md, ai-nodes.md, etc.)
2. Check if node is in credentials template
3. Get correct typeVersion and parameters
4. If DATABASE node -> FETCH SCHEMA first
5. Add node with correct config
// Webhook body (CRITICAL - data is under .body!)
{{ $json.body.fieldName }}
// Other node reference
{{ $('Node Name').item.json.field }}
// Default value
{{ $json.field ?? 'default' }}
// Safe access
{{ $json.obj?.nested?.field }}
// Current date
{{ $now.toFormat('yyyy-MM-dd') }}
In Code nodes, use plain JavaScript - NOT {{ }}:
const data = $input.first().json.body;
return [{ json: { result: data.fieldName } }];
// Input access
const items = $input.all();
const first = $input.first().json;
// Other nodes
const data = $('Node Name').first().json;
// Return (MUST be array with json key)
return [{ json: { result: 'value' } }];
# Input access
items = _input.all()
first = _input.first().json
# Return (MUST be list)
return [{"json": {"result": "value"}}]
# 1. Activate
curl -X POST "${N8N_API_URL}/api/v1/workflows/{id}/activate"
# 2. Execute
curl -X POST "${N8N_API_URL}/webhook/{path}" -d '{}'
# 3. Check status
curl "${N8N_API_URL}/api/v1/executions?limit=1" | jq '.data[0].status'
# 4. Verify node ran
curl "${N8N_API_URL}/api/v1/executions/{id}?includeData=true" | jq '.data.resultData.runData | keys'
Do NOT proceed until status = "success" and new node appears in runData.
After successful build:
Build Progress:
1. Webhook trigger - working
2. HTTP Request - working (2 results)
3. Google Sheets - working
- Workflow: My Workflow
- URL: https://n8n.example.com/workflow/abc123
- Status: Active
If manual config needed:
Workflow built and partially tested!
Google Sheets requires manual setup:
- Open workflow in n8n UI
- Select your spreadsheet
- Save