Operation-aware node configuration guidance. Use when configuring nodes, understanding property dependencies, determining required fields, choosing between get_node detail levels, or learning common configuration patterns by node type.
Add this skill
npx mdskills install czlonkowski/n8n-node-configurationComprehensive guide for n8n node configuration with clear workflows and detailed examples
1---2name: n8n-node-configuration3description: Operation-aware node configuration guidance. Use when configuring nodes, understanding property dependencies, determining required fields, choosing between get_node detail levels, or learning common configuration patterns by node type.4---56# n8n Node Configuration78Expert guidance for operation-aware node configuration with property dependencies.910---1112## Configuration Philosophy1314**Progressive disclosure**: Start minimal, add complexity as needed1516Configuration best practices:17- `get_node` with `detail: "standard"` is the most used discovery pattern18- 56 seconds average between configuration edits19- Covers 95% of use cases with 1-2K tokens response2021**Key insight**: Most configurations need only standard detail, not full schema!2223---2425## Core Concepts2627### 1. Operation-Aware Configuration2829**Not all fields are always required** - it depends on operation!3031**Example**: Slack node32```javascript33// For operation='post'34{35 "resource": "message",36 "operation": "post",37 "channel": "#general", // Required for post38 "text": "Hello!" // Required for post39}4041// For operation='update'42{43 "resource": "message",44 "operation": "update",45 "messageId": "123", // Required for update (different!)46 "text": "Updated!" // Required for update47 // channel NOT required for update48}49```5051**Key**: Resource + operation determine which fields are required!5253### 2. Property Dependencies5455**Fields appear/disappear based on other field values**5657**Example**: HTTP Request node58```javascript59// When method='GET'60{61 "method": "GET",62 "url": "https://api.example.com"63 // sendBody not shown (GET doesn't have body)64}6566// When method='POST'67{68 "method": "POST",69 "url": "https://api.example.com",70 "sendBody": true, // Now visible!71 "body": { // Required when sendBody=true72 "contentType": "json",73 "content": {...}74 }75}76```7778**Mechanism**: displayOptions control field visibility7980### 3. Progressive Discovery8182**Use the right detail level**:83841. **get_node({detail: "standard"})** - DEFAULT85 - Quick overview (~1-2K tokens)86 - Required fields + common options87 - **Use first** - covers 95% of needs88892. **get_node({mode: "search_properties", propertyQuery: "..."})** (for finding specific fields)90 - Find properties by name91 - Use when looking for auth, body, headers, etc.92933. **get_node({detail: "full"})** (complete schema)94 - All properties (~3-8K tokens)95 - Use only when standard detail is insufficient9697---9899## Configuration Workflow100101### Standard Process102103```1041. Identify node type and operation105 ↓1062. Use get_node (standard detail is default)107 ↓1083. Configure required fields109 ↓1104. Validate configuration111 ↓1125. If field unclear → get_node({mode: "search_properties"})113 ↓1146. Add optional fields as needed115 ↓1167. Validate again117 ↓1188. Deploy119```120121### Example: Configuring HTTP Request122123**Step 1**: Identify what you need124```javascript125// Goal: POST JSON to API126```127128**Step 2**: Get node info129```javascript130const info = get_node({131 nodeType: "nodes-base.httpRequest"132});133134// Returns: method, url, sendBody, body, authentication required/optional135```136137**Step 3**: Minimal config138```javascript139{140 "method": "POST",141 "url": "https://api.example.com/create",142 "authentication": "none"143}144```145146**Step 4**: Validate147```javascript148validate_node({149 nodeType: "nodes-base.httpRequest",150 config,151 profile: "runtime"152});153// → Error: "sendBody required for POST"154```155156**Step 5**: Add required field157```javascript158{159 "method": "POST",160 "url": "https://api.example.com/create",161 "authentication": "none",162 "sendBody": true163}164```165166**Step 6**: Validate again167```javascript168validate_node({...});169// → Error: "body required when sendBody=true"170```171172**Step 7**: Complete configuration173```javascript174{175 "method": "POST",176 "url": "https://api.example.com/create",177 "authentication": "none",178 "sendBody": true,179 "body": {180 "contentType": "json",181 "content": {182 "name": "={{$json.name}}",183 "email": "={{$json.email}}"184 }185 }186}187```188189**Step 8**: Final validation190```javascript191validate_node({...});192// → Valid! ✅193```194195---196197## get_node Detail Levels198199### Standard Detail (DEFAULT - Use This!)200201**✅ Starting configuration**202```javascript203get_node({204 nodeType: "nodes-base.slack"205});206// detail="standard" is the default207```208209**Returns** (~1-2K tokens):210- Required fields211- Common options212- Operation list213- Metadata214215**Use**: 95% of configuration needs216217### Full Detail (Use Sparingly)218219**✅ When standard isn't enough**220```javascript221get_node({222 nodeType: "nodes-base.slack",223 detail: "full"224});225```226227**Returns** (~3-8K tokens):228- Complete schema229- All properties230- All nested options231232**Warning**: Large response, use only when standard insufficient233234### Search Properties Mode235236**✅ Looking for specific field**237```javascript238get_node({239 nodeType: "nodes-base.httpRequest",240 mode: "search_properties",241 propertyQuery: "auth"242});243```244245**Use**: Find authentication, headers, body fields, etc.246247### Decision Tree248249```250┌─────────────────────────────────┐251│ Starting new node config? │252├─────────────────────────────────┤253│ YES → get_node (standard) │254└─────────────────────────────────┘255 ↓256┌─────────────────────────────────┐257│ Standard has what you need? │258├─────────────────────────────────┤259│ YES → Configure with it │260│ NO → Continue │261└─────────────────────────────────┘262 ↓263┌─────────────────────────────────┐264│ Looking for specific field? │265├─────────────────────────────────┤266│ YES → search_properties mode │267│ NO → Continue │268└─────────────────────────────────┘269 ↓270┌─────────────────────────────────┐271│ Still need more details? │272├─────────────────────────────────┤273│ YES → get_node({detail: "full"})│274└─────────────────────────────────┘275```276277---278279## Property Dependencies Deep Dive280281### displayOptions Mechanism282283**Fields have visibility rules**:284285```javascript286{287 "name": "body",288 "displayOptions": {289 "show": {290 "sendBody": [true],291 "method": ["POST", "PUT", "PATCH"]292 }293 }294}295```296297**Translation**: "body" field shows when:298- sendBody = true AND299- method = POST, PUT, or PATCH300301### Common Dependency Patterns302303#### Pattern 1: Boolean Toggle304305**Example**: HTTP Request sendBody306```javascript307// sendBody controls body visibility308{309 "sendBody": true // → body field appears310}311```312313#### Pattern 2: Operation Switch314315**Example**: Slack resource/operation316```javascript317// Different operations → different fields318{319 "resource": "message",320 "operation": "post"321 // → Shows: channel, text, attachments, etc.322}323324{325 "resource": "message",326 "operation": "update"327 // → Shows: messageId, text (different fields!)328}329```330331#### Pattern 3: Type Selection332333**Example**: IF node conditions334```javascript335{336 "type": "string",337 "operation": "contains"338 // → Shows: value1, value2339}340341{342 "type": "boolean",343 "operation": "equals"344 // → Shows: value1, value2, different operators345}346```347348### Finding Property Dependencies349350**Use get_node with search_properties mode**:351```javascript352get_node({353 nodeType: "nodes-base.httpRequest",354 mode: "search_properties",355 propertyQuery: "body"356});357358// Returns property paths matching "body" with descriptions359```360361**Or use full detail for complete schema**:362```javascript363get_node({364 nodeType: "nodes-base.httpRequest",365 detail: "full"366});367368// Returns complete schema with displayOptions rules369```370371**Use this when**: Validation fails and you don't understand why field is missing/required372373---374375## Common Node Patterns376377### Pattern 1: Resource/Operation Nodes378379**Examples**: Slack, Google Sheets, Airtable380381**Structure**:382```javascript383{384 "resource": "<entity>", // What type of thing385 "operation": "<action>", // What to do with it386 // ... operation-specific fields387}388```389390**How to configure**:3911. Choose resource3922. Choose operation3933. Use get_node to see operation-specific requirements3944. Configure required fields395396### Pattern 2: HTTP-Based Nodes397398**Examples**: HTTP Request, Webhook399400**Structure**:401```javascript402{403 "method": "<HTTP_METHOD>",404 "url": "<endpoint>",405 "authentication": "<type>",406 // ... method-specific fields407}408```409410**Dependencies**:411- POST/PUT/PATCH → sendBody available412- sendBody=true → body required413- authentication != "none" → credentials required414415### Pattern 3: Database Nodes416417**Examples**: Postgres, MySQL, MongoDB418419**Structure**:420```javascript421{422 "operation": "<query|insert|update|delete>",423 // ... operation-specific fields424}425```426427**Dependencies**:428- operation="executeQuery" → query required429- operation="insert" → table + values required430- operation="update" → table + values + where required431432### Pattern 4: Conditional Logic Nodes433434**Examples**: IF, Switch, Merge435436**Structure**:437```javascript438{439 "conditions": {440 "<type>": [441 {442 "operation": "<operator>",443 "value1": "...",444 "value2": "..." // Only for binary operators445 }446 ]447 }448}449```450451**Dependencies**:452- Binary operators (equals, contains, etc.) → value1 + value2453- Unary operators (isEmpty, isNotEmpty) → value1 only + singleValue: true454455---456457## Operation-Specific Configuration458459### Slack Node Examples460461#### Post Message462```javascript463{464 "resource": "message",465 "operation": "post",466 "channel": "#general", // Required467 "text": "Hello!", // Required468 "attachments": [], // Optional469 "blocks": [] // Optional470}471```472473#### Update Message474```javascript475{476 "resource": "message",477 "operation": "update",478 "messageId": "1234567890", // Required (different from post!)479 "text": "Updated!", // Required480 "channel": "#general" // Optional (can be inferred)481}482```483484#### Create Channel485```javascript486{487 "resource": "channel",488 "operation": "create",489 "name": "new-channel", // Required490 "isPrivate": false // Optional491 // Note: text NOT required for this operation492}493```494495### HTTP Request Node Examples496497#### GET Request498```javascript499{500 "method": "GET",501 "url": "https://api.example.com/users",502 "authentication": "predefinedCredentialType",503 "nodeCredentialType": "httpHeaderAuth",504 "sendQuery": true, // Optional505 "queryParameters": { // Shows when sendQuery=true506 "parameters": [507 {508 "name": "limit",509 "value": "100"510 }511 ]512 }513}514```515516#### POST with JSON517```javascript518{519 "method": "POST",520 "url": "https://api.example.com/users",521 "authentication": "none",522 "sendBody": true, // Required for POST523 "body": { // Required when sendBody=true524 "contentType": "json",525 "content": {526 "name": "John Doe",527 "email": "john@example.com"528 }529 }530}531```532533### IF Node Examples534535#### String Comparison (Binary)536```javascript537{538 "conditions": {539 "string": [540 {541 "value1": "={{$json.status}}",542 "operation": "equals",543 "value2": "active" // Binary: needs value2544 }545 ]546 }547}548```549550#### Empty Check (Unary)551```javascript552{553 "conditions": {554 "string": [555 {556 "value1": "={{$json.email}}",557 "operation": "isEmpty",558 // No value2 - unary operator559 "singleValue": true // Auto-added by sanitization560 }561 ]562 }563}564```565566---567568## Handling Conditional Requirements569570### Example: HTTP Request Body571572**Scenario**: body field required, but only sometimes573574**Rule**:575```576body is required when:577 - sendBody = true AND578 - method IN (POST, PUT, PATCH, DELETE)579```580581**How to discover**:582```javascript583// Option 1: Read validation error584validate_node({...});585// Error: "body required when sendBody=true"586587// Option 2: Search for the property588get_node({589 nodeType: "nodes-base.httpRequest",590 mode: "search_properties",591 propertyQuery: "body"592});593// Shows: body property with displayOptions rules594595// Option 3: Try minimal config and iterate596// Start without body, validation will tell you if needed597```598599### Example: IF Node singleValue600601**Scenario**: singleValue property appears for unary operators602603**Rule**:604```605singleValue should be true when:606 - operation IN (isEmpty, isNotEmpty, true, false)607```608609**Good news**: Auto-sanitization fixes this!610611**Manual check**:612```javascript613get_node({614 nodeType: "nodes-base.if",615 detail: "full"616});617// Shows complete schema with operator-specific rules618```619620---621622## Configuration Anti-Patterns623624### ❌ Don't: Over-configure Upfront625626**Bad**:627```javascript628// Adding every possible field629{630 "method": "GET",631 "url": "...",632 "sendQuery": false,633 "sendHeaders": false,634 "sendBody": false,635 "timeout": 10000,636 "ignoreResponseCode": false,637 // ... 20 more optional fields638}639```640641**Good**:642```javascript643// Start minimal644{645 "method": "GET",646 "url": "...",647 "authentication": "none"648}649// Add fields only when needed650```651652### ❌ Don't: Skip Validation653654**Bad**:655```javascript656// Configure and deploy without validating657const config = {...};658n8n_update_partial_workflow({...}); // YOLO659```660661**Good**:662```javascript663// Validate before deploying664const config = {...};665const result = validate_node({...});666if (result.valid) {667 n8n_update_partial_workflow({...});668}669```670671### ❌ Don't: Ignore Operation Context672673**Bad**:674```javascript675// Same config for all Slack operations676{677 "resource": "message",678 "operation": "post",679 "channel": "#general",680 "text": "..."681}682683// Then switching operation without updating config684{685 "resource": "message",686 "operation": "update", // Changed687 "channel": "#general", // Wrong field for update!688 "text": "..."689}690```691692**Good**:693```javascript694// Check requirements when changing operation695get_node({696 nodeType: "nodes-base.slack"697});698// See what update operation needs (messageId, not channel)699```700701---702703## Best Practices704705### ✅ Do7067071. **Start with get_node (standard detail)**708 - ~1-2K tokens response709 - Covers 95% of configuration needs710 - Default detail level7117122. **Validate iteratively**713 - Configure → Validate → Fix → Repeat714 - Average 2-3 iterations is normal715 - Read validation errors carefully7167173. **Use search_properties mode when stuck**718 - If field seems missing, search for it719 - Understand what controls field visibility720 - `get_node({mode: "search_properties", propertyQuery: "..."})`7217224. **Respect operation context**723 - Different operations = different requirements724 - Always check get_node when changing operation725 - Don't assume configs are transferable7267275. **Trust auto-sanitization**728 - Operator structure fixed automatically729 - Don't manually add/remove singleValue730 - IF/Switch metadata added on save731732### ❌ Don't7337341. **Jump to detail="full" immediately**735 - Try standard detail first736 - Only escalate if needed737 - Full schema is 3-8K tokens7387392. **Configure blindly**740 - Always validate before deploying741 - Understand why fields are required742 - Use search_properties for conditional fields7437443. **Copy configs without understanding**745 - Different operations need different fields746 - Validate after copying747 - Adjust for new context7487494. **Manually fix auto-sanitization issues**750 - Let auto-sanitization handle operator structure751 - Focus on business logic752 - Save and let system fix structure753754---755756## Detailed References757758For comprehensive guides on specific topics:759760- **[DEPENDENCIES.md](DEPENDENCIES.md)** - Deep dive into property dependencies and displayOptions761- **[OPERATION_PATTERNS.md](OPERATION_PATTERNS.md)** - Common configuration patterns by node type762763---764765## Summary766767**Configuration Strategy**:7681. Start with `get_node` (standard detail is default)7692. Configure required fields for operation7703. Validate configuration7714. Search properties if stuck7725. Iterate until valid (avg 2-3 cycles)7736. Deploy with confidence774775**Key Principles**:776- **Operation-aware**: Different operations = different requirements777- **Progressive disclosure**: Start minimal, add as needed778- **Dependency-aware**: Understand field visibility rules779- **Validation-driven**: Let validation guide configuration780781**Related Skills**:782- **n8n MCP Tools Expert** - How to use discovery tools correctly783- **n8n Validation Expert** - Interpret validation errors784- **n8n Expression Syntax** - Configure expression fields785- **n8n Workflow Patterns** - Apply patterns with proper configuration786
Full transparency — inspect the skill content before installing.