Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Operation-aware node configuration guidance. Use when configuring nodes, understanding property dependencies, determining required fields, choosing between get_node_essentials and get_node_info, or learning common configuration patterns by node type.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 153% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 524% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 315% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 427% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 358% | 0% |
Expert guidance for operation-aware node configuration with property dependencies.
Progressive disclosure: Start minimal, add complexity as needed
Configuration best practices:
Key insight: Most configurations need only essentials, not full schema!
Not all fields are always required - it depends on operation!
Example: Slack node
javascript// For operation='post' { "resource": "message", "operation": "post", "channel": "#general", // Required for post "text": "Hello!" // Required for post } // For operation='update' { "resource": "message", "operation": "update", "messageId": "123", // Required for update (different!) "text": "Updated!" // Required for update // channel NOT required for update }
Key: Resource + operation determine which fields are required!
Fields appear/disappear based on other field values
Example: HTTP Request node
javascript// When method='GET' { "method": "GET", "url": "https://api.example.com" // sendBody not shown (GET doesn't have body) } // When method='POST' { "method": "POST", "url": "https://api.example.com", "sendBody": true, // Now visible! "body": { // Required when sendBody=true "contentType": "json", "content": {...} } }
Mechanism: displayOptions control field visibility
Use the right tool for the right job:
1. Identify node type and operation
↓
2. Use get_node_essentials
↓
3. Configure required fields
↓
4. Validate configuration
↓
5. If dependencies unclear → get_property_dependencies
↓
6. Add optional fields as needed
↓
7. Validate again
↓
8. DeployStep 1: Identify what you need
javascript// Goal: POST JSON to API
Step 2: Get essentials
javascriptconst info = get_node_essentials({ nodeType: "nodes-base.httpRequest" }); // Returns: method, url, sendBody, body, authentication required/optional
Step 3: Minimal config
javascript{ "method": "POST", "url": "https://api.example.com/create", "authentication": "none" }
Step 4: Validate
javascriptvalidate_node_operation({ nodeType: "nodes-base.httpRequest", config, profile: "runtime" }); // → Error: "sendBody required for POST"
Step 5: Add required field
javascript{ "method": "POST", "url": "https://api.example.com/create", "authentication": "none", "sendBody": true }
Step 6: Validate again
javascriptvalidate_node_operation({...}); // → Error: "body required when sendBody=true"
Step 7: Complete configuration
javascript{ "method": "POST", "url": "https://api.example.com/create", "authentication": "none", "sendBody": true, "body": { "contentType": "json", "content": { "name": "={{$json.name}}", "email": "={{$json.email}}" } } }
Step 8: Final validation
javascriptvalidate_node_operation({...}); // → Valid! ✅
✅ Starting configuration (91.7% success rate)
javascriptget_node_essentials({ nodeType: "nodes-base.slack" });
Returns:
Fast: ~18 seconds average (from search → essentials)
✅ Essentials insufficient
javascriptget_node_info({ nodeType: "nodes-base.slack" });
Returns:
Slower: More data to process
┌─────────────────────────────────┐
│ Starting new node config? │
├─────────────────────────────────┤
│ YES → get_node_essentials │
└─────────────────────────────────┘
↓
┌─────────────────────────────────┐
│ Essentials has what you need? │
├─────────────────────────────────┤
│ YES → Configure with essentials │
│ NO → Continue │
└─────────────────────────────────┘
↓
┌─────────────────────────────────┐
│ Need dependency info? │
├─────────────────────────────────┤
│ YES → get_property_dependencies │
│ NO → Continue │
└─────────────────────────────────┘
↓
┌─────────────────────────────────┐
│ Still need more details? │
├─────────────────────────────────┤
│ YES → get_node_info │
└─────────────────────────────────┘Fields have visibility rules:
javascript{ "name": "body", "displayOptions": { "show": { "sendBody": [true], "method": ["POST", "PUT", "PATCH"] } } }
Translation: "body" field shows when:
Example: HTTP Request sendBody
javascript// sendBody controls body visibility { "sendBody": true // → body field appears }
Example: Slack resource/operation
javascript// Different operations → different fields { "resource": "message", "operation": "post" // → Shows: channel, text, attachments, etc. } { "resource": "message", "operation": "update" // → Shows: messageId, text (different fields!) }
Example: IF node conditions
javascript{ "type": "string", "operation": "contains" // → Shows: value1, value2 } { "type": "boolean", "operation": "equals" // → Shows: value1, value2, different operators }
Example:
javascriptconst deps = get_property_dependencies({ nodeType: "nodes-base.httpRequest" }); // Returns dependency tree { "dependencies": { "body": { "shows_when": { "sendBody": [true], "method": ["POST", "PUT", "PATCH", "DELETE"] } }, "queryParameters": { "shows_when": { "sendQuery": [true] } } } }
Use this when: Validation fails and you don't understand why field is missing/required
Examples: Slack, Google Sheets, Airtable
Structure:
javascript{ "resource": "<entity>", // What type of thing "operation": "<action>", // What to do with it // ... operation-specific fields }
How to configure:
Examples: HTTP Request, Webhook
Structure:
javascript{ "method": "<HTTP_METHOD>", "url": "<endpoint>", "authentication": "<type>", // ... method-specific fields }
Dependencies:
Examples: Postgres, MySQL, MongoDB
Structure:
javascript{ "operation": "<query|insert|update|delete>", // ... operation-specific fields }
Dependencies:
Examples: IF, Switch, Merge
Structure:
javascript{ "conditions": { "<type>": [ { "operation": "<operator>", "value1": "...", "value2": "..." // Only for binary operators } ] } }
Dependencies:
javascript{ "resource": "message", "operation": "post", "channel": "#general", // Required "text": "Hello!", // Required "attachments": [], // Optional "blocks": [] // Optional }
javascript{ "resource": "message", "operation": "update", "messageId": "1234567890", // Required (different from post!) "text": "Updated!", // Required "channel": "#general" // Optional (can be inferred) }
javascript{ "resource": "channel", "operation": "create", "name": "new-channel", // Required "isPrivate": false // Optional // Note: text NOT required for this operation }
javascript{ "method": "GET", "url": "https://api.example.com/users", "authentication": "predefinedCredentialType", "nodeCredentialType": "httpHeaderAuth", "sendQuery": true, // Optional "queryParameters": { // Shows when sendQuery=true "parameters": [ { "name": "limit", "value": "100" } ] } }
javascript{ "method": "POST", "url": "https://api.example.com/users", "authentication": "none", "sendBody": true, // Required for POST "body": { // Required when sendBody=true "contentType": "json", "content": { "name": "John Doe", "email": "john@example.com" } } }
javascript{ "conditions": { "string": [ { "value1": "={{$json.status}}", "operation": "equals", "value2": "active" // Binary: needs value2 } ] } }
javascript{ "conditions": { "string": [ { "value1": "={{$json.email}}", "operation": "isEmpty", // No value2 - unary operator "singleValue": true // Auto-added by sanitization } ] } }
Scenario: body field required, but only sometimes
Rule:
body is required when:
- sendBody = true AND
- method IN (POST, PUT, PATCH, DELETE)How to discover:
javascript// Option 1: Read validation error validate_node_operation({...}); // Error: "body required when sendBody=true" // Option 2: Check dependencies get_property_dependencies({ nodeType: "nodes-base.httpRequest" }); // Shows: body → shows_when: sendBody=[true], method=[POST,PUT,PATCH,DELETE] // Option 3: Try minimal config and iterate // Start without body, validation will tell you if needed
Scenario: singleValue property appears for unary operators
Rule:
singleValue should be true when:
- operation IN (isEmpty, isNotEmpty, true, false)Good news: Auto-sanitization fixes this!
Manual check:
javascriptget_property_dependencies({ nodeType: "nodes-base.if" }); // Shows operator-specific dependencies
Bad:
javascript// Adding every possible field { "method": "GET", "url": "...", "sendQuery": false, "sendHeaders": false, "sendBody": false, "timeout": 10000, "ignoreResponseCode": false, // ... 20 more optional fields }
Good:
javascript// Start minimal { "method": "GET", "url": "...", "authentication": "none" } // Add fields only when needed
Bad:
javascript// Configure and deploy without validating const config = {...}; n8n_update_partial_workflow({...}); // YOLO
Good:
javascript// Validate before deploying const config = {...}; const result = validate_node_operation({...}); if (result.valid) { n8n_update_partial_workflow({...}); }
Bad:
javascript// Same config for all Slack operations { "resource": "message", "operation": "post", "channel": "#general", "text": "..." } // Then switching operation without updating config { "resource": "message", "operation": "update", // Changed "channel": "#general", // Wrong field for update! "text": "..." }
Good:
javascript// Check requirements when changing operation get_node_essentials({ nodeType: "nodes-base.slack" }); // See what update operation needs (messageId, not channel)
For comprehensive guides on specific topics:
Configuration Strategy:
Key Principles:
Related Skills:
Other measured skills in the registry, with their headline benchmark lift.