@awesomate/hosting-mcp 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +204 -8
- package/package.json +2 -2
- package/skill/awesomate-app-builder/SKILL.md +5 -1
- package/skill/awesomate-credentials/SKILL.md +1 -1
- package/skill/awesomate-hosting/SKILL.md +50 -159
- package/skill/awesomate-hosting/references/connect-troubleshooting.md +77 -0
- package/skill/awesomate-hosting/references/multi-account.md +33 -0
- package/skill/awesomate-hosting/references/rest-fallback.md +30 -0
- package/skill/awesomate-hosting/scripts/bootstrap.mjs +27 -7
- package/skill/awesomate-n8n/SKILL.md +153 -147
- package/skill/awesomate-n8n/evals/ai-agent-build/graders/grader.md +31 -0
- package/skill/awesomate-n8n/evals/ai-agent-build/prompt.md +1 -0
- package/skill/awesomate-n8n/evals/build-form-email/graders/grader.md +30 -0
- package/skill/awesomate-n8n/evals/build-form-email/prompt.md +1 -0
- package/skill/awesomate-n8n/evals/datatable-dedupe/graders/grader.md +32 -0
- package/skill/awesomate-n8n/evals/datatable-dedupe/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/diagnose-failure/graders/grader.md +27 -0
- package/skill/awesomate-n8n/evals/diagnose-failure/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/essentials-upsell/graders/grader.md +27 -0
- package/skill/awesomate-n8n/evals/essentials-upsell/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/live-change-promote/graders/grader.md +35 -0
- package/skill/awesomate-n8n/evals/live-change-promote/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/possibilities-grounded/graders/grader.md +28 -0
- package/skill/awesomate-n8n/evals/possibilities-grounded/prompt.md +1 -0
- package/skill/awesomate-n8n/evals/validated-not-done/graders/grader.md +27 -0
- package/skill/awesomate-n8n/evals/validated-not-done/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/vars-not-env/graders/grader.md +26 -0
- package/skill/awesomate-n8n/evals/vars-not-env/prompt.md +2 -0
- package/skill/awesomate-n8n/evals/webhook-body-fix/graders/grader.md +26 -0
- package/skill/awesomate-n8n/evals/webhook-body-fix/prompt.md +3 -0
- package/skill/awesomate-n8n/references/ai-agents.md +135 -0
- package/skill/awesomate-n8n/references/datatables.md +105 -0
- package/skill/awesomate-n8n/references/{node-recipes.md → platform-notes.md} +56 -7
- package/skill/awesomate-n8n/references/possibilities.md +83 -0
- package/skill/awesomate-n8n/references/testing-policy.md +115 -0
- package/skill/awesomate-n8n/references/troubleshooting.md +69 -0
- package/skill/awesomate-n8n/references/upgrade-loop.md +98 -0
- package/skill/awesomate-n8n/references/vendor/MANIFEST.json +26 -0
- package/skill/awesomate-n8n/references/vendor/code-node/BUILTIN_FUNCTIONS.md +779 -0
- package/skill/awesomate-n8n/references/vendor/code-node/COMMON_PATTERNS.md +1123 -0
- package/skill/awesomate-n8n/references/vendor/code-node/DATA_ACCESS.md +797 -0
- package/skill/awesomate-n8n/references/vendor/code-node/ERROR_PATTERNS.md +776 -0
- package/skill/awesomate-n8n/references/vendor/code-node/SKILL.md +703 -0
- package/skill/awesomate-n8n/references/vendor/expressions/COMMON_MISTAKES.md +406 -0
- package/skill/awesomate-n8n/references/vendor/expressions/EXAMPLES.md +496 -0
- package/skill/awesomate-n8n/references/vendor/expressions/SKILL.md +525 -0
- package/skill/awesomate-n8n/references/vendor/node-configuration/DEPENDENCIES.md +743 -0
- package/skill/awesomate-n8n/references/vendor/node-configuration/OPERATION_PATTERNS.md +926 -0
- package/skill/awesomate-n8n/references/vendor/node-configuration/SKILL.md +583 -0
- package/skill/awesomate-n8n/references/vendor/validation/ERROR_CATALOG.md +781 -0
- package/skill/awesomate-n8n/references/vendor/validation/FALSE_POSITIVES.md +695 -0
- package/skill/awesomate-n8n/references/vendor/validation/SKILL.md +414 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/SKILL.md +413 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/ai_agent_workflow.md +797 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/database_operations.md +798 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/http_api_integration.md +747 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/scheduled_tasks.md +786 -0
- package/skill/awesomate-n8n/references/vendor/workflow-patterns/webhook_processing.md +558 -0
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
VENDORED from n8n-builder@d293559 (n8n-expression-syntax/EXAMPLES.md) — DO NOT EDIT HERE.
|
|
3
|
+
Edit the source in ~/Projects/n8n-builder, then re-run:
|
|
4
|
+
node mcp/scripts/sync-n8n-references.mjs --write
|
|
5
|
+
|
|
6
|
+
Awesomate platform overrides — where this file conflicts with
|
|
7
|
+
../platform-notes.md, platform-notes wins:
|
|
8
|
+
- $env is BLOCKED fleet-wide → use {{ $vars.key || 'fallback' }}
|
|
9
|
+
- Task runners are ON → no $helpers in Code nodes; use HTTP Request nodes
|
|
10
|
+
- Webhook payloads live at $json.body
|
|
11
|
+
- saveExecutionProgress must stay false
|
|
12
|
+
-->
|
|
13
|
+
|
|
14
|
+
# n8n Expression Examples
|
|
15
|
+
|
|
16
|
+
Real working examples from n8n workflows.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Example 1: Webhook Form Submission
|
|
21
|
+
|
|
22
|
+
**Scenario**: Form submission webhook posts to Slack
|
|
23
|
+
|
|
24
|
+
**Workflow**: Webhook → Slack
|
|
25
|
+
|
|
26
|
+
**Webhook Input** (POST):
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"name": "John Doe",
|
|
30
|
+
"email": "john@example.com",
|
|
31
|
+
"company": "Acme Corp",
|
|
32
|
+
"message": "Interested in your product"
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Webhook Node Output**:
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"headers": {"content-type": "application/json"},
|
|
40
|
+
"params": {},
|
|
41
|
+
"query": {},
|
|
42
|
+
"body": {
|
|
43
|
+
"name": "John Doe",
|
|
44
|
+
"email": "john@example.com",
|
|
45
|
+
"company": "Acme Corp",
|
|
46
|
+
"message": "Interested in your product"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**In Slack Node** (text field):
|
|
52
|
+
```
|
|
53
|
+
New form submission! 📝
|
|
54
|
+
|
|
55
|
+
Name: {{$json.body.name}}
|
|
56
|
+
Email: {{$json.body.email}}
|
|
57
|
+
Company: {{$json.body.company}}
|
|
58
|
+
Message: {{$json.body.message}}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**Output**:
|
|
62
|
+
```
|
|
63
|
+
New form submission! 📝
|
|
64
|
+
|
|
65
|
+
Name: John Doe
|
|
66
|
+
Email: john@example.com
|
|
67
|
+
Company: Acme Corp
|
|
68
|
+
Message: Interested in your product
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Example 2: HTTP API to Database
|
|
74
|
+
|
|
75
|
+
**Scenario**: Fetch user data from API and insert into database
|
|
76
|
+
|
|
77
|
+
**Workflow**: Schedule → HTTP Request → Postgres
|
|
78
|
+
|
|
79
|
+
**HTTP Request Returns**:
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"data": {
|
|
83
|
+
"users": [
|
|
84
|
+
{
|
|
85
|
+
"id": 123,
|
|
86
|
+
"name": "Alice Smith",
|
|
87
|
+
"email": "alice@example.com",
|
|
88
|
+
"role": "admin"
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**In Postgres Node** (INSERT statement):
|
|
96
|
+
```sql
|
|
97
|
+
INSERT INTO users (user_id, name, email, role, synced_at)
|
|
98
|
+
VALUES (
|
|
99
|
+
{{$json.data.users[0].id}},
|
|
100
|
+
'{{$json.data.users[0].name}}',
|
|
101
|
+
'{{$json.data.users[0].email}}',
|
|
102
|
+
'{{$json.data.users[0].role}}',
|
|
103
|
+
'{{$now.toFormat('yyyy-MM-dd HH:mm:ss')}}'
|
|
104
|
+
)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Result**: User inserted with current timestamp
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Example 3: Multi-Node Data Flow
|
|
112
|
+
|
|
113
|
+
**Scenario**: Webhook → HTTP Request → Email
|
|
114
|
+
|
|
115
|
+
**Workflow Structure**:
|
|
116
|
+
1. Webhook receives order ID
|
|
117
|
+
2. HTTP Request fetches order details
|
|
118
|
+
3. Email sends confirmation
|
|
119
|
+
|
|
120
|
+
### Node 1: Webhook
|
|
121
|
+
|
|
122
|
+
**Receives**:
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"body": {
|
|
126
|
+
"order_id": "ORD-12345"
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Node 2: HTTP Request
|
|
132
|
+
|
|
133
|
+
**URL field**:
|
|
134
|
+
```
|
|
135
|
+
https://api.example.com/orders/{{$json.body.order_id}}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**Returns**:
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"order": {
|
|
142
|
+
"id": "ORD-12345",
|
|
143
|
+
"customer": "Bob Jones",
|
|
144
|
+
"total": 99.99,
|
|
145
|
+
"items": ["Widget", "Gadget"]
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Node 3: Email
|
|
151
|
+
|
|
152
|
+
**Subject**:
|
|
153
|
+
```
|
|
154
|
+
Order {{$node["Webhook"].json.body.order_id}} Confirmed
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
**Body**:
|
|
158
|
+
```
|
|
159
|
+
Dear {{$node["HTTP Request"].json.order.customer}},
|
|
160
|
+
|
|
161
|
+
Your order {{$node["Webhook"].json.body.order_id}} has been confirmed!
|
|
162
|
+
|
|
163
|
+
Total: ${{$node["HTTP Request"].json.order.total}}
|
|
164
|
+
Items: {{$node["HTTP Request"].json.order.items.join(', ')}}
|
|
165
|
+
|
|
166
|
+
Thank you for your purchase!
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Email Result**:
|
|
170
|
+
```
|
|
171
|
+
Subject: Order ORD-12345 Confirmed
|
|
172
|
+
|
|
173
|
+
Dear Bob Jones,
|
|
174
|
+
|
|
175
|
+
Your order ORD-12345 has been confirmed!
|
|
176
|
+
|
|
177
|
+
Total: $99.99
|
|
178
|
+
Items: Widget, Gadget
|
|
179
|
+
|
|
180
|
+
Thank you for your purchase!
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Example 4: Date Formatting
|
|
186
|
+
|
|
187
|
+
**Scenario**: Various date format outputs
|
|
188
|
+
|
|
189
|
+
**Current Time**: 2025-10-20 14:30:45
|
|
190
|
+
|
|
191
|
+
### ISO Format
|
|
192
|
+
```javascript
|
|
193
|
+
{{$now.toISO()}}
|
|
194
|
+
```
|
|
195
|
+
**Output**: `2025-10-20T14:30:45.000Z`
|
|
196
|
+
|
|
197
|
+
### Custom Date Format
|
|
198
|
+
```javascript
|
|
199
|
+
{{$now.toFormat('yyyy-MM-dd')}}
|
|
200
|
+
```
|
|
201
|
+
**Output**: `2025-10-20`
|
|
202
|
+
|
|
203
|
+
### Time Only
|
|
204
|
+
```javascript
|
|
205
|
+
{{$now.toFormat('HH:mm:ss')}}
|
|
206
|
+
```
|
|
207
|
+
**Output**: `14:30:45`
|
|
208
|
+
|
|
209
|
+
### Full Readable Format
|
|
210
|
+
```javascript
|
|
211
|
+
{{$now.toFormat('MMMM dd, yyyy')}}
|
|
212
|
+
```
|
|
213
|
+
**Output**: `October 20, 2025`
|
|
214
|
+
|
|
215
|
+
### Date Math - Future
|
|
216
|
+
```javascript
|
|
217
|
+
{{$now.plus({days: 7}).toFormat('yyyy-MM-dd')}}
|
|
218
|
+
```
|
|
219
|
+
**Output**: `2025-10-27`
|
|
220
|
+
|
|
221
|
+
### Date Math - Past
|
|
222
|
+
```javascript
|
|
223
|
+
{{$now.minus({hours: 24}).toFormat('yyyy-MM-dd HH:mm')}}
|
|
224
|
+
```
|
|
225
|
+
**Output**: `2025-10-19 14:30`
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## Example 5: Array Operations
|
|
230
|
+
|
|
231
|
+
**Data**:
|
|
232
|
+
```json
|
|
233
|
+
{
|
|
234
|
+
"users": [
|
|
235
|
+
{"name": "Alice", "email": "alice@example.com"},
|
|
236
|
+
{"name": "Bob", "email": "bob@example.com"},
|
|
237
|
+
{"name": "Charlie", "email": "charlie@example.com"}
|
|
238
|
+
]
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### First User
|
|
243
|
+
```javascript
|
|
244
|
+
{{$json.users[0].name}}
|
|
245
|
+
```
|
|
246
|
+
**Output**: `Alice`
|
|
247
|
+
|
|
248
|
+
### Last User
|
|
249
|
+
```javascript
|
|
250
|
+
{{$json.users[$json.users.length - 1].name}}
|
|
251
|
+
```
|
|
252
|
+
**Output**: `Charlie`
|
|
253
|
+
|
|
254
|
+
### All Emails (Join)
|
|
255
|
+
```javascript
|
|
256
|
+
{{$json.users.map(u => u.email).join(', ')}}
|
|
257
|
+
```
|
|
258
|
+
**Output**: `alice@example.com, bob@example.com, charlie@example.com`
|
|
259
|
+
|
|
260
|
+
### Array Length
|
|
261
|
+
```javascript
|
|
262
|
+
{{$json.users.length}}
|
|
263
|
+
```
|
|
264
|
+
**Output**: `3`
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Example 6: Conditional Logic
|
|
269
|
+
|
|
270
|
+
**Data**:
|
|
271
|
+
```json
|
|
272
|
+
{
|
|
273
|
+
"order": {
|
|
274
|
+
"status": "completed",
|
|
275
|
+
"total": 150
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
### Ternary Operator
|
|
281
|
+
```javascript
|
|
282
|
+
{{$json.order.status === 'completed' ? 'Order Complete ✓' : 'Pending...'}}
|
|
283
|
+
```
|
|
284
|
+
**Output**: `Order Complete ✓`
|
|
285
|
+
|
|
286
|
+
### Default Values
|
|
287
|
+
```javascript
|
|
288
|
+
{{$json.order.notes || 'No notes provided'}}
|
|
289
|
+
```
|
|
290
|
+
**Output**: `No notes provided` (if notes field doesn't exist)
|
|
291
|
+
|
|
292
|
+
### Multiple Conditions
|
|
293
|
+
```javascript
|
|
294
|
+
{{$json.order.total > 100 ? 'Premium Customer' : 'Standard Customer'}}
|
|
295
|
+
```
|
|
296
|
+
**Output**: `Premium Customer`
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Example 7: String Manipulation
|
|
301
|
+
|
|
302
|
+
**Data**:
|
|
303
|
+
```json
|
|
304
|
+
{
|
|
305
|
+
"user": {
|
|
306
|
+
"email": "JOHN@EXAMPLE.COM",
|
|
307
|
+
"message": " Hello World "
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Lowercase
|
|
313
|
+
```javascript
|
|
314
|
+
{{$json.user.email.toLowerCase()}}
|
|
315
|
+
```
|
|
316
|
+
**Output**: `john@example.com`
|
|
317
|
+
|
|
318
|
+
### Uppercase
|
|
319
|
+
```javascript
|
|
320
|
+
{{$json.user.message.toUpperCase()}}
|
|
321
|
+
```
|
|
322
|
+
**Output**: ` HELLO WORLD `
|
|
323
|
+
|
|
324
|
+
### Trim
|
|
325
|
+
```javascript
|
|
326
|
+
{{$json.user.message.trim()}}
|
|
327
|
+
```
|
|
328
|
+
**Output**: `Hello World`
|
|
329
|
+
|
|
330
|
+
### Substring
|
|
331
|
+
```javascript
|
|
332
|
+
{{$json.user.email.substring(0, 4)}}
|
|
333
|
+
```
|
|
334
|
+
**Output**: `JOHN`
|
|
335
|
+
|
|
336
|
+
### Replace
|
|
337
|
+
```javascript
|
|
338
|
+
{{$json.user.message.replace('World', 'n8n')}}
|
|
339
|
+
```
|
|
340
|
+
**Output**: ` Hello n8n `
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Example 8: Fields with Spaces
|
|
345
|
+
|
|
346
|
+
**Data**:
|
|
347
|
+
```json
|
|
348
|
+
{
|
|
349
|
+
"user data": {
|
|
350
|
+
"first name": "Jane",
|
|
351
|
+
"last name": "Doe",
|
|
352
|
+
"phone number": "+1234567890"
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### Bracket Notation
|
|
358
|
+
```javascript
|
|
359
|
+
{{$json['user data']['first name']}}
|
|
360
|
+
```
|
|
361
|
+
**Output**: `Jane`
|
|
362
|
+
|
|
363
|
+
### Combined
|
|
364
|
+
```javascript
|
|
365
|
+
{{$json['user data']['first name']}} {{$json['user data']['last name']}}
|
|
366
|
+
```
|
|
367
|
+
**Output**: `Jane Doe`
|
|
368
|
+
|
|
369
|
+
### Nested Spaces
|
|
370
|
+
```javascript
|
|
371
|
+
Contact: {{$json['user data']['phone number']}}
|
|
372
|
+
```
|
|
373
|
+
**Output**: `Contact: +1234567890`
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
## Example 9: Code Node (Direct Access)
|
|
378
|
+
|
|
379
|
+
**Code Node**: Transform webhook data
|
|
380
|
+
|
|
381
|
+
**Input** (from Webhook node):
|
|
382
|
+
```json
|
|
383
|
+
{
|
|
384
|
+
"body": {
|
|
385
|
+
"items": ["apple", "banana", "cherry"]
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
**Code** (JavaScript):
|
|
391
|
+
```javascript
|
|
392
|
+
// ✅ Direct access (no {{ }})
|
|
393
|
+
const items = $json.body.items;
|
|
394
|
+
|
|
395
|
+
// Transform to uppercase
|
|
396
|
+
const uppercased = items.map(item => item.toUpperCase());
|
|
397
|
+
|
|
398
|
+
// Return in n8n format
|
|
399
|
+
return [{
|
|
400
|
+
json: {
|
|
401
|
+
original: items,
|
|
402
|
+
transformed: uppercased,
|
|
403
|
+
count: items.length
|
|
404
|
+
}
|
|
405
|
+
}];
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
**Output**:
|
|
409
|
+
```json
|
|
410
|
+
{
|
|
411
|
+
"original": ["apple", "banana", "cherry"],
|
|
412
|
+
"transformed": ["APPLE", "BANANA", "CHERRY"],
|
|
413
|
+
"count": 3
|
|
414
|
+
}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
---
|
|
418
|
+
|
|
419
|
+
## Example 10: Environment Variables
|
|
420
|
+
|
|
421
|
+
**Setup**: Environment variable `API_KEY=secret123`
|
|
422
|
+
|
|
423
|
+
### In HTTP Request (Headers)
|
|
424
|
+
```javascript
|
|
425
|
+
Authorization: Bearer {{$env.API_KEY}}
|
|
426
|
+
```
|
|
427
|
+
**Result**: `Authorization: Bearer secret123`
|
|
428
|
+
|
|
429
|
+
### In URL
|
|
430
|
+
```javascript
|
|
431
|
+
https://api.example.com/data?key={{$env.API_KEY}}
|
|
432
|
+
```
|
|
433
|
+
**Result**: `https://api.example.com/data?key=secret123`
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
## Template from Real Workflow
|
|
438
|
+
|
|
439
|
+
**Based on n8n template #2947** (Weather to Slack)
|
|
440
|
+
|
|
441
|
+
### Workflow Structure
|
|
442
|
+
Webhook → OpenStreetMap API → Weather API → Slack
|
|
443
|
+
|
|
444
|
+
### Webhook Slash Command
|
|
445
|
+
**Input**: `/weather London`
|
|
446
|
+
|
|
447
|
+
**Webhook receives**:
|
|
448
|
+
```json
|
|
449
|
+
{
|
|
450
|
+
"body": {
|
|
451
|
+
"text": "London"
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
### OpenStreetMap API
|
|
457
|
+
**URL**:
|
|
458
|
+
```
|
|
459
|
+
https://nominatim.openstreetmap.org/search?q={{$json.body.text}}&format=json
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
### Weather API (NWS)
|
|
463
|
+
**URL**:
|
|
464
|
+
```
|
|
465
|
+
https://api.weather.gov/points/{{$node["OpenStreetMap"].json[0].lat}},{{$node["OpenStreetMap"].json[0].lon}}
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### Slack Message
|
|
469
|
+
```
|
|
470
|
+
Weather for {{$json.body.text}}:
|
|
471
|
+
|
|
472
|
+
Temperature: {{$node["Weather API"].json.properties.temperature.value}}°C
|
|
473
|
+
Conditions: {{$node["Weather API"].json.properties.shortForecast}}
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
---
|
|
477
|
+
|
|
478
|
+
## Summary
|
|
479
|
+
|
|
480
|
+
**Key Patterns**:
|
|
481
|
+
1. Webhook data is under `.body`
|
|
482
|
+
2. Use `{{}}` for expressions (except Code nodes)
|
|
483
|
+
3. Reference other nodes with `$node["Node Name"].json`
|
|
484
|
+
4. Use brackets for field names with spaces
|
|
485
|
+
5. Node names are case-sensitive
|
|
486
|
+
|
|
487
|
+
**Most Common Uses**:
|
|
488
|
+
- `{{$json.body.field}}` - Webhook data
|
|
489
|
+
- `{{$node["Name"].json.field}}` - Other node data
|
|
490
|
+
- `{{$now.toFormat('yyyy-MM-dd')}}` - Timestamps
|
|
491
|
+
- `{{$json.array[0].field}}` - Array access
|
|
492
|
+
- `{{$json.field || 'default'}}` - Default values
|
|
493
|
+
|
|
494
|
+
---
|
|
495
|
+
|
|
496
|
+
**Related**: See [COMMON_MISTAKES.md](COMMON_MISTAKES.md) for error examples and fixes.
|