@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.
Files changed (58) hide show
  1. package/dist/index.js +204 -8
  2. package/package.json +2 -2
  3. package/skill/awesomate-app-builder/SKILL.md +5 -1
  4. package/skill/awesomate-credentials/SKILL.md +1 -1
  5. package/skill/awesomate-hosting/SKILL.md +50 -159
  6. package/skill/awesomate-hosting/references/connect-troubleshooting.md +77 -0
  7. package/skill/awesomate-hosting/references/multi-account.md +33 -0
  8. package/skill/awesomate-hosting/references/rest-fallback.md +30 -0
  9. package/skill/awesomate-hosting/scripts/bootstrap.mjs +27 -7
  10. package/skill/awesomate-n8n/SKILL.md +153 -147
  11. package/skill/awesomate-n8n/evals/ai-agent-build/graders/grader.md +31 -0
  12. package/skill/awesomate-n8n/evals/ai-agent-build/prompt.md +1 -0
  13. package/skill/awesomate-n8n/evals/build-form-email/graders/grader.md +30 -0
  14. package/skill/awesomate-n8n/evals/build-form-email/prompt.md +1 -0
  15. package/skill/awesomate-n8n/evals/datatable-dedupe/graders/grader.md +32 -0
  16. package/skill/awesomate-n8n/evals/datatable-dedupe/prompt.md +2 -0
  17. package/skill/awesomate-n8n/evals/diagnose-failure/graders/grader.md +27 -0
  18. package/skill/awesomate-n8n/evals/diagnose-failure/prompt.md +2 -0
  19. package/skill/awesomate-n8n/evals/essentials-upsell/graders/grader.md +27 -0
  20. package/skill/awesomate-n8n/evals/essentials-upsell/prompt.md +2 -0
  21. package/skill/awesomate-n8n/evals/live-change-promote/graders/grader.md +35 -0
  22. package/skill/awesomate-n8n/evals/live-change-promote/prompt.md +2 -0
  23. package/skill/awesomate-n8n/evals/possibilities-grounded/graders/grader.md +28 -0
  24. package/skill/awesomate-n8n/evals/possibilities-grounded/prompt.md +1 -0
  25. package/skill/awesomate-n8n/evals/validated-not-done/graders/grader.md +27 -0
  26. package/skill/awesomate-n8n/evals/validated-not-done/prompt.md +2 -0
  27. package/skill/awesomate-n8n/evals/vars-not-env/graders/grader.md +26 -0
  28. package/skill/awesomate-n8n/evals/vars-not-env/prompt.md +2 -0
  29. package/skill/awesomate-n8n/evals/webhook-body-fix/graders/grader.md +26 -0
  30. package/skill/awesomate-n8n/evals/webhook-body-fix/prompt.md +3 -0
  31. package/skill/awesomate-n8n/references/ai-agents.md +135 -0
  32. package/skill/awesomate-n8n/references/datatables.md +105 -0
  33. package/skill/awesomate-n8n/references/{node-recipes.md → platform-notes.md} +56 -7
  34. package/skill/awesomate-n8n/references/possibilities.md +83 -0
  35. package/skill/awesomate-n8n/references/testing-policy.md +115 -0
  36. package/skill/awesomate-n8n/references/troubleshooting.md +69 -0
  37. package/skill/awesomate-n8n/references/upgrade-loop.md +98 -0
  38. package/skill/awesomate-n8n/references/vendor/MANIFEST.json +26 -0
  39. package/skill/awesomate-n8n/references/vendor/code-node/BUILTIN_FUNCTIONS.md +779 -0
  40. package/skill/awesomate-n8n/references/vendor/code-node/COMMON_PATTERNS.md +1123 -0
  41. package/skill/awesomate-n8n/references/vendor/code-node/DATA_ACCESS.md +797 -0
  42. package/skill/awesomate-n8n/references/vendor/code-node/ERROR_PATTERNS.md +776 -0
  43. package/skill/awesomate-n8n/references/vendor/code-node/SKILL.md +703 -0
  44. package/skill/awesomate-n8n/references/vendor/expressions/COMMON_MISTAKES.md +406 -0
  45. package/skill/awesomate-n8n/references/vendor/expressions/EXAMPLES.md +496 -0
  46. package/skill/awesomate-n8n/references/vendor/expressions/SKILL.md +525 -0
  47. package/skill/awesomate-n8n/references/vendor/node-configuration/DEPENDENCIES.md +743 -0
  48. package/skill/awesomate-n8n/references/vendor/node-configuration/OPERATION_PATTERNS.md +926 -0
  49. package/skill/awesomate-n8n/references/vendor/node-configuration/SKILL.md +583 -0
  50. package/skill/awesomate-n8n/references/vendor/validation/ERROR_CATALOG.md +781 -0
  51. package/skill/awesomate-n8n/references/vendor/validation/FALSE_POSITIVES.md +695 -0
  52. package/skill/awesomate-n8n/references/vendor/validation/SKILL.md +414 -0
  53. package/skill/awesomate-n8n/references/vendor/workflow-patterns/SKILL.md +413 -0
  54. package/skill/awesomate-n8n/references/vendor/workflow-patterns/ai_agent_workflow.md +797 -0
  55. package/skill/awesomate-n8n/references/vendor/workflow-patterns/database_operations.md +798 -0
  56. package/skill/awesomate-n8n/references/vendor/workflow-patterns/http_api_integration.md +747 -0
  57. package/skill/awesomate-n8n/references/vendor/workflow-patterns/scheduled_tasks.md +786 -0
  58. 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.