skills/n8n-automation-builder/SKILL.md
Build and deploy n8n workflows from scratch. Use for creating n8n automation workflows, exploring credentials, and deploying to the user's n8n instance.
npx skillsauth add garrettroi/open-manus n8n-automation-builderInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
This skill enables you to design, build, and deploy automation workflows directly to an n8n instance.
Status: ✅ Fully tested and working (March 20, 2026)
Instance URL: https://primary-production-38b8.up.railway.app
# List available keys
python3 /app/skills/vault_client/vault_client.py list
# Fetch the n8n API key (name may vary - check list first)
python3 /app/skills/vault_client/vault_client.py get NEWEST_N8N_API
export N8N_INSTANCE_URL="https://primary-production-38b8.up.railway.app"
export N8N_API_KEY="$(python3 /app/skills/vault_client/vault_client.py get NEWEST_N8N_API)"
# Quick test
curl -s https://primary-production-38b8.up.railway.app/api/v1/workflows \
-H "X-N8N-API-KEY: $N8N_API_KEY"
Expected: JSON response with list of workflows.
Check available credentials before building:
# Get key from vault
N8N_KEY=$(python3 /app/skills/vault_client/vault_client.py get NEWEST_N8N_API)
# List credentials
curl -s https://primary-production-38b8.up.railway.app/api/v1/credentials \
-H "X-N8N-API-KEY: $N8N_KEY"
Known Credential IDs:
| Service | ID | Name |
|---------|-----|------|
| Gmail | 3qNKDN7I1OYPhVhz | Gmail account |
| Twilio | bkjlCKgkMsRw7dzY | Twilio account |
| OpenAI | w6c69SQykBvm99DE | OpenAI account |
| OpenRouter | KFnSADDGaPa7RW09 | OpenRouter account |
| Google Calendar | pKXg9ZaFAalac7QU | Google Calendar |
Read the node reference:
cat /app/skills/n8n-automation-builder/references/nodes_reference.md
Create workflow JSON with:
name: Workflow namenodes: Array of node objectsconnections: Node flow definitionsettings: Usually {"executionOrder": "v1"}See deployment methods below.
# Create workflow JSON file
cat > /tmp/my_workflow.json << 'EOF'
{
"name": "My Automation",
"nodes": [...],
"connections": {...},
"settings": {"executionOrder": "v1"}
}
EOF
# Set environment and deploy
export N8N_INSTANCE_URL="https://primary-production-38b8.up.railway.app"
export N8N_API_KEY="$(python3 /app/skills/vault_client/vault_client.py get NEWEST_N8N_API)"
python3 /app/skills/n8n-automation-builder/scripts/deploy_workflow.py /tmp/my_workflow.json
# Get key from vault
N8N_KEY=$(python3 /app/skills/vault_client/vault_client.py get NEWEST_N8N_API)
# Deploy workflow
curl -X POST https://primary-production-38b8.up.railway.app/api/v1/workflows \
-H "X-N8N-API-KEY: $N8N_KEY" \
-H "Content-Type: application/json" \
-d @/tmp/my_workflow.json
import requests
import subprocess
# Get API key from vault
result = subprocess.run(
['python3', '/app/skills/vault_client/vault_client.py', 'get', 'NEWEST_N8N_API'],
capture_output=True, text=True
)
api_key = result.stdout.strip()
api_url = "https://primary-production-38b8.up.railway.app"
headers = {
"X-N8N-API-KEY": api_key,
"Content-Type": "application/json",
"Accept": "application/json"
}
workflow = {
"name": "My Automation",
"nodes": [...],
"connections": {...},
"settings": {"executionOrder": "v1"}
}
response = requests.post(
f"{api_url}/api/v1/workflows",
headers=headers,
json=workflow
)
if response.status_code in [200, 201]:
print(f"Created! ID: {response.json().get('id')}")
else:
print(f"Error: {response.status_code}")
{
"parameters": {
"httpMethod": "POST",
"path": "my-webhook",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [0, 0],
"id": "webhook-1",
"name": "Webhook"
}
{
"parameters": {
"sendTo": "={{ $json.email }}",
"subject": "={{ $json.subject }}",
"message": "={{ $json.body }}",
"options": {}
},
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.1,
"position": [250, 0],
"id": "gmail-1",
"name": "Send Gmail",
"credentials": {
"gmailOAuth2": {
"id": "3qNKDN7I1OYPhVhz",
"name": "Gmail account"
}
}
}
{
"parameters": {
"method": "POST",
"url": "https://api.example.com/endpoint",
"sendBody": true,
"bodyParameters": {
"parameters": [
{"name": "key", "value": "={{ $json.value }}"}
]
}
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [250, 0],
"id": "http-1",
"name": "HTTP Request"
}
Cause: Invalid API key
Solution:
# Verify key from vault
python3 /app/skills/vault_client/vault_client.py list
python3 /app/skills/vault_client/vault_client.py get NEWEST_N8N_API
# Test with curl
N8N_KEY=$(python3 /app/skills/vault_client/vault_client.py get NEWEST_N8N_API)
curl -v https://primary-production-38b8.up.railway.app/api/v1/workflows \
-H "X-N8N-API-KEY: $N8N_KEY" 2>&1 | grep "HTTP"
# Should return: HTTP/2 200
Key names in vault may change. Always check:
python3 /app/skills/vault_client/vault_client.py list | grep -i n8n
Cause: Python environment issues
Solution: Use subprocess to call curl, or write to file first:
import subprocess
result = subprocess.run([
'curl', '-s',
'https://primary-production-38b8.up.railway.app/api/v1/workflows',
'-H', f'X-N8N-API-KEY: {api_key}'
], capture_output=True, text=True)
| Endpoint | Method | Description |
|----------|--------|-------------|
| /api/v1/workflows | GET | List all workflows |
| /api/v1/workflows | POST | Create new workflow |
| /api/v1/workflows/{id} | GET | Get workflow by ID |
| /api/v1/workflows/{id} | DELETE | Delete workflow |
| /api/v1/credentials | GET | List credentials |
| /api/v1/executions | GET | Execution history |
[x, y] coordinates for clean layoutsuuid.uuid4().hex[:16] for node IDsQuick validation:
# Should return workflow count
N8N_KEY=$(python3 /app/skills/vault_client/vault_client.py get NEWEST_N8N_API)
curl -s https://primary-production-38b8.up.railway.app/api/v1/workflows \
-H "X-N8N-API-KEY: $N8N_KEY" | \
python3 -c "import sys,json; d=json.load(sys.stdin); print(f"Found {len(d.get('data',[]))} workflows")"
Current status: 31 workflows exist, API fully functional.
development
# Voice Sanitizer This skill cleans up text before it is sent to the Text-to-Speech (TTS) engine. It removes technical jargon, code blocks, and long URLs to ensure the agent sounds natural and conversational in voice chat. ## Usage To sanitize text for speech, run the following command in the terminal: ```bash python3 /app/skills/voice_sanitizer/sanitizer.py "Your long, technical text with `code` and https://links.com/long-url" ``` ### Example Output ```text Your long, technical text with a
tools
Professional AI video production workflow. Use when creating videos, short films, commercials, or any video content using AI generation tools.
tools
Secure API key access from the centralized vault. Fetch keys on-demand without storing them in environment variables.
testing
# Task Board — Persistent Task Tracking for Open Manus This skill provides a shared task board backed by Redis. Harmony uses it to track delegated work across all agents, and agents use it to report progress and completion. ## When to Use - **Harmony**: Use this whenever you delegate a task to an agent. Add the task to the board, then check the board periodically to follow up. - **Worker Agents**: Use this to update your task status or mark tasks as complete. ## Commands ### Add a new task