n8n-agents
Design n8n AI agents the right way. Use when building or editing any @n8n/n8n-nodes-langchain.* AI node — an AI Agent, LLM chain,…
Validate n8n expression syntax and fix common errors. Use when writing n8n expressions, using {{}} syntax, accessing $json/$node variables, troubleshooting expression errors, mapping data between nodes, or referencing webhook data in workflows. Use this skill whenever
Claude Code
$ npx -y skills add czlonkowski/n8n-skills --skill n8n-expression-syntax --agent claude-code
Codex
$ npx skills add czlonkowski/n8n-skills --skill n8n-expression-syntax -a codex -y
Cursor
$ npx skills add czlonkowski/n8n-skills --skill n8n-expression-syntax -a cursor -y
Gemini CLI
$ npx skills add czlonkowski/n8n-skills --skill n8n-expression-syntax -a gemini-cli -y
GitHub Copilot
$ npx skills add czlonkowski/n8n-skills --skill n8n-expression-syntax -a github-copilot -y
OpenCode
$ npx skills add czlonkowski/n8n-skills --skill n8n-expression-syntax -a opencode -y
Windsurf
$ npx skills add czlonkowski/n8n-skills --skill n8n-expression-syntax -a windsurf -y
name: n8n-expression-syntax
description: Validate n8n expression syntax and fix common errors. Use when writing n8n expressions, using {{}} syntax, accessing $json/$node variables, troubleshooting expression errors, mapping data between nodes, or referencing webhook data in workflows. Use this skill whenever configuring node fields that reference data from previous nodes — expressions are how n8n passes data between nodes, and getting the syntax wrong is the most common source of workflow errors. Also use when asked whether a complex expression hurts performance.Expert guide for writing correct n8n expressions in workflows.
---
All dynamic content in n8n uses **double curly braces**:
{{expression}}**Examples**:
✅ {{$json.email}}
✅ {{$json.body.name}}
✅ {{$node["HTTP Request"].json.data}}
❌ $json.email (no braces - treated as literal text)
❌ {$json.email} (single braces - invalid)---
Access data from the current node:
{{$json.fieldName}}
{{$json['field with spaces']}}
{{$json.nested.property}}
{{$json.items[0].name}}Access data from any previous node:
{{$node["Node Name"].json.fieldName}}
{{$node["HTTP Request"].json.data}}
{{$node["Webhook"].json.body.email}}**Important**:
Access current date/time:
{{$now}}
{{$now.toFormat('yyyy-MM-dd')}}
{{$now.toFormat('HH:mm:ss')}}
{{$now.plus({days: 7})}}Access environment variables:
{{$env.API_KEY}}
{{$env.DATABASE_URL}}**Warning**: Some n8n instances have `N8N_BLOCK_ENV_ACCESS_IN_NODE` enabled, which blocks `$env` access entirely. If `$env` returns errors, use alternative approaches:
---
**Most Common Mistake**: Webhook data is **NOT** at the root!
{
"headers": {...},
"params": {...},
"query": {...},
"body": { // ⚠️ USER DATA IS HERE!
"name": "John",
"email": "john@example.com",
"message": "Hello"
}
}❌ WRONG: {{$json.name}}
❌ WRONG: {{$json.email}}
✅ CORRECT: {{$json.body.name}}
✅ CORRECT: {{$json.body.email}}
✅ CORRECT: {{$json.body.message}}**Why**: Webhook node wraps incoming data under `.body` property to preserve headers, params, and query parameters.
---
// Simple nesting
{{$json.user.email}}
// Array access
{{$json.data[0].name}}
{{$json.items[0].id}}
// Bracket notation for spaces
{{$json['field name']}}
{{$json['user data']['first name']}}// Node without spaces
{{$node["Set"].json.value}}
// Node with spaces (common!)
{{$node["HTTP Request"].json.data}}
{{$node["Respond to Webhook"].json.message}}
// Webhook node
{{$node["Webhook"].json.body.email}}// Concatenation (automatic)
Hello {{$json.body.name}}!
// In URLs
https://api.example.com/users/{{$json.body.user_id}}
// In object properties
{
"name": "={{$json.body.name}}",
"email": "={{$json.body.email}}"
}---
Code nodes use **direct JavaScript access**, NOT expressions!
// ❌ WRONG in Code node
const email = '={{$json.email}}';
const name = '{{$json.body.name}}';
// ✅ CORRECT in Code node
const email = $json.email;
const name = $json.body.name;
// Or using Code node API
const email = $input.item.json.email;
const allItems = $input.all();// ❌ WRONG
path: "{{$json.user_id}}/webhook"
// ✅ CORRECT
path: "user-webhook" // Static paths only// ❌ WRONG
apiKey: "={{$env.API_KEY}}"
// ✅ CORRECT
Use n8n credential system, not expressions---
Before you add a node — or write any code — to transform data, walk this order and stop at the first that fits:
1. **The service's own node** does it in its own fields: a CRM node's field slots, the Slack node's Blocks field, a Data Table insert's per-column slots. HTTP Request only when no node covers the operation. 2. **A native node for the job.** Filter, IF / Switch, Summarize, Aggregate, Split Out, Merge, Compare Datasets, Remove Duplicates, Sort + Limit, Date & Time, XML / HTML / Extract From File, HTTP Request pagination, Crypto. The job-to-node table in `using-n8n-mcp-skills` maps jobs to nodes; their configs are in `n8n-node-configuration` → NATIVE_NODES.md. 3. **A short expression** (`{{ ... }}`) inside that node's field. Property access, method chains (`.map().filter().join()`), a ternary, string building, Luxon date math, the helper functions below — "take A, produce B" in one expression, without intermediate variables.
(rules below). When downstream needs one item per element, use Split Out / Filter / Aggregate instead. 4. **Code node**, only for the closed list: loops or recursion no node expresses, state across runs, parsing no node handles, an allowlisted library, heavy all-items work (thousands of items, stated or measured), or one short Code node (~15 lines) replacing 4+ glue nodes. Give it a `Why Code:` note. See `n8n-code-javascript`.
**A function body is code.** When the logic needs `const`, `if`, `return` or several statements — an `(() => { ... })()` wrapped in `{{ }}` — it has outgrown an expression. Split i
Expert Claude Code skills for building flawless n8n workflows using the n8n-mcp MCP server
Design n8n AI agents the right way. Use when building or editing any @n8n/n8n-nodes-langchain.* AI node — an AI Agent, LLM chain,…
Handle files and binary data in n8n correctly. Use when working with files, images, PDFs, attachments, uploads or downloads,…
Write, review, or debug JavaScript in an n8n Code node. Use when a Code node is already in the workflow (editing it, fixing an…
Write Python in n8n Code nodes (native Python, `language` pythonNative, n8n 2.x). Use when the user explicitly wants Python in a…
Write JavaScript or Python for the n8n Custom Code Tool (@n8n/n8n-nodes-langchain.toolCode) — the AI-agent-callable tool, NOT the…
Wire n8n error handling so failures are loud, structured, and recoverable. Use when building any webhook/API workflow, a…
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling…