@ericrisco/rsc 0.1.37 → 0.1.38

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 (43) hide show
  1. package/README.md +8 -2
  2. package/manifest.json +130 -4
  3. package/package.json +1 -1
  4. package/scripts/lib/domains.js +1 -0
  5. package/scripts/lib/recommend.js +5 -0
  6. package/skills/automation-flows/SKILL.md +1 -1
  7. package/skills/automation-strategy/SKILL.md +131 -0
  8. package/skills/automation-strategy/evals/README.md +16 -0
  9. package/skills/automation-strategy/evals/cases.yaml +48 -0
  10. package/skills/automation-strategy/references/automate-decision-and-roi.md +118 -0
  11. package/skills/automation-strategy/references/orchestration-and-antipatterns.md +107 -0
  12. package/skills/automation-strategy/references/platform-selection-matrix.md +86 -0
  13. package/skills/harness/references/providers.yaml +100 -0
  14. package/skills/make/SKILL.md +255 -0
  15. package/skills/make/evals/README.md +14 -0
  16. package/skills/make/evals/cases.yaml +45 -0
  17. package/skills/make/references/api-v2-cheatsheet.md +114 -0
  18. package/skills/make/references/blueprint-round-trip.md +128 -0
  19. package/skills/make/references/make-mcp-and-auth.md +101 -0
  20. package/skills/n8n/SKILL.md +205 -0
  21. package/skills/n8n/evals/README.md +14 -0
  22. package/skills/n8n/evals/cases.yaml +45 -0
  23. package/skills/n8n/references/auth-and-selfhost.md +62 -0
  24. package/skills/n8n/references/n8n-mcp-tools.md +84 -0
  25. package/skills/n8n/references/rest-api-cheatsheet.md +94 -0
  26. package/skills/power-automate/SKILL.md +169 -0
  27. package/skills/power-automate/evals/README.md +17 -0
  28. package/skills/power-automate/evals/cases.yaml +43 -0
  29. package/skills/power-automate/references/dataverse-web-api.md +187 -0
  30. package/skills/power-automate/references/entra-auth-setup.md +75 -0
  31. package/skills/power-automate/references/flowstudio-mcp-and-limits.md +62 -0
  32. package/skills/roast-me/tools/adapters/__pycache__/__init__.cpython-312.pyc +0 -0
  33. package/skills/roast-me/tools/adapters/__pycache__/base.cpython-312.pyc +0 -0
  34. package/skills/roast-me/tools/adapters/__pycache__/claude.cpython-312.pyc +0 -0
  35. package/skills/roast-me/tools/adapters/__pycache__/codex.cpython-312.pyc +0 -0
  36. package/skills/roast-me/tools/adapters/__pycache__/gemini.cpython-312.pyc +0 -0
  37. package/skills/roast-me/tools/adapters/__pycache__/registry.cpython-312.pyc +0 -0
  38. package/skills/zapier/SKILL.md +145 -0
  39. package/skills/zapier/evals/README.md +5 -0
  40. package/skills/zapier/evals/cases.yaml +50 -0
  41. package/skills/zapier/references/programmatic-limits-and-partner-api.md +48 -0
  42. package/skills/zapier/references/when-to-use-vs-n8n-make.md +44 -0
  43. package/skills/zapier/references/zapier-mcp-tools.md +72 -0
@@ -0,0 +1,107 @@
1
+ # Orchestration strategy & anti-patterns — depth for §4–§5
2
+
3
+ Engine-agnostic policy. These are the guarantees you *require of* an automation before it ships and
4
+ the failure modes you audit for when a fleet is breaking. The per-platform **recipes** (which node,
5
+ which toggle, exact retry settings) live in `../../automation-flows/SKILL.md` and each platform skill
6
+ — this file is the discipline, not the wiring.
7
+
8
+ ## The orchestration guarantees
9
+
10
+ ### 1. Idempotency & dedup
11
+
12
+ Event delivery is **at-least-once**: webhooks are re-sent, retries replay, users double-click. Assume
13
+ every event can arrive two or more times. A non-idempotent write executed twice = double charge,
14
+ duplicate row, duplicate email.
15
+
16
+ - Require a **stable dedup key** — the provider's event id or a natural external id, never a
17
+ timestamp or a hash of "roughly the same thing".
18
+ - Check the key **before** any non-idempotent action; record it **after** success.
19
+ - Prefer idempotent operations where the platform/API allows (upsert-by-key beats blind insert;
20
+ idempotency keys on payment APIs).
21
+
22
+ ```text
23
+ Bad: event → create record (re-delivery → two records)
24
+ Good: event → seen(key)? → if new: create → mark key seen
25
+ ```
26
+
27
+ ### 2. Error paths, retries & backoff
28
+
29
+ Every automation has a defined destination for failure. Classify the error first:
30
+
31
+ - **Transient** (network timeout, 429 rate-limit, 5xx) → retry with **exponential backoff + jitter**,
32
+ a **max attempts cap**, and a total time budget. Respect `Retry-After` when present.
33
+ - **Permanent** (400, 401/403 auth, 404, validation) → do **not** retry; retrying just burns runs and
34
+ delays the alert. Route straight to the dead-letter path.
35
+
36
+ Distinguishing the two is the single highest-leverage error decision — blind retry-everything is a
37
+ common cause of both runaway bills and masked auth failures.
38
+
39
+ ### 3. Dead-letter
40
+
41
+ After retries are exhausted, the failed item must land somewhere **durable and inspectable** — a
42
+ queue, a table, the platform's "incomplete executions" store — with enough context (the payload, the
43
+ error, the timestamp) to diagnose and **replay** it. Failures dropped on the floor are silent data
44
+ loss; you find out when a customer does.
45
+
46
+ ### 4. Observability & alerting
47
+
48
+ - Emit **success/failure counts** per automation; a run rate that quietly drops is a signal.
49
+ - **Heartbeat scheduled jobs and alert on silence.** A cron that stops firing produces no error — it
50
+ produces *nothing*, which is the failure you never hear about. Alert when an expected run doesn't
51
+ happen within its window (dead-man's-switch).
52
+ - Route alerts to a **named owner / on-call channel**, not an inbox nobody reads. An alert nobody
53
+ receives is not observability.
54
+
55
+ ### 5. Secrets handling
56
+
57
+ - Store credentials in the **platform credential store or a vault**, referenced by name — never
58
+ pasted inline in a node/step where an export or a screenshot leaks them.
59
+ - **Least privilege** — scope each token to what the automation actually needs.
60
+ - **Rotation plan** — tokens expire; a rotation nobody owns becomes a 2 a.m. outage. Engineering
61
+ detail lives in `../../secure-coding/SKILL.md`.
62
+
63
+ ### 6. Versioning & environments
64
+
65
+ - Separate **dev/staging from prod**. Test against non-prod data; don't debug against live customers.
66
+ - **Export/snapshot before editing** a live automation — editing prod is a production change.
67
+ - Keep a **rollback**: the previous known-good version, and a way to get back to it fast.
68
+
69
+ ### 7. Avoid fan-out storms
70
+
71
+ - **Cap concurrency**, batch where possible, and **rate-limit** outbound calls to respect downstream
72
+ quotas.
73
+ - Watch for **echo loops**: flow A writes a record that triggers flow B that writes a record that
74
+ triggers flow A. Break the cycle with a guard (a marker field, an event-source check).
75
+ - Guard against one event **fanning out into thousands** of downstream calls that trip rate limits or
76
+ detonate the bill. Debounce bursts.
77
+
78
+ ## Anti-patterns — detection & remediation
79
+
80
+ | Anti-pattern | How you notice it | Remediation |
81
+ | --- | --- | --- |
82
+ | **No error path** | first API blip and the run just stops; found out from a customer | define a failure destination + retry policy + alert before shipping |
83
+ | **Silent failure** | dashboards green, but the work isn't happening; false confidence | alert on failure AND on silence (heartbeat / dead-man's-switch) |
84
+ | **No kill-switch** | a misfiring flow floods a downstream system and there's no fast stop | every outward-writing automation gets a documented pause/disable toggle (and whoever's on-call knows where it is) |
85
+ | **Over-automation** | maintenance time exceeds the manual time it replaced | re-run the §1 gate; retire it or revert to a checklist |
86
+ | **Automating a broken process** | the automation "works" but the outputs are still wrong, just faster | stop, standardize the process on paper, then re-encode |
87
+ | **Hidden single point of failure** | it breaks when one person leaves or one personal token expires | service accounts, documented dependencies, no personal-account glue |
88
+ | **No owner** | nobody can say how it works or notices when it breaks | assign an owner + a one-page runbook (what it does, deps, how to pause, how to replay) |
89
+ | **Choosing platform by familiarity** | the bill "exploded"; billing unit mismatched the run shape | re-select by billing unit for the real shape (see platform matrix) |
90
+ | **Retry-everything** | runaway run counts, masked auth failures | classify transient vs permanent; only retry transient, with backoff + cap |
91
+ | **Secrets inline** | credentials visible in an export/screenshot; can't rotate cleanly | move to credential store/vault, reference by name, plan rotation |
92
+
93
+ ## Fleet-health audit ("our automations keep breaking")
94
+
95
+ When someone arrives with a *fleet* that keeps breaking rather than one flow, walk this list — the
96
+ breakage is almost always a missing discipline, not a bad node:
97
+
98
+ 1. **Inventory & ownership** — is there a list of every automation with a named owner? Orphans first.
99
+ 2. **Error paths** — how many have a real failure destination + alert vs die silently?
100
+ 3. **Idempotency** — which do non-idempotent writes with no dedup key? (double-processing symptoms)
101
+ 4. **Observability** — is anything watching run rates and heartbeats, or do you learn from customers?
102
+ 5. **Secrets/expiry** — any recent breaks that trace to an expired token or a personal account?
103
+ 6. **Environments** — are people editing prod directly with no snapshot/rollback?
104
+ 7. **Fan-out / loops** — any echo loops or bursts tripping rate limits?
105
+
106
+ Fix the systemic gap (usually error paths + observability + ownership) rather than patching flows one
107
+ at a time. Then feed the corrected guarantees into the build skill as requirements.
@@ -0,0 +1,86 @@
1
+ # Platform selection matrix — n8n · Make · Zapier · Power Automate
2
+
3
+ Depth for §3. This is a *routing* reference: decide, then hand off to the platform's own skill
4
+ (`../../n8n/`, `../../make/`, `../../zapier/`, `../../power-automate/`) for the live API/MCP work.
5
+ All pricing/version figures move — re-check the vendor page at author time.
6
+
7
+ ## Billing unit is the decision axis
8
+
9
+ Cost at scale is dominated by the unit each platform charges on. The *same* logical flow costs
10
+ wildly different amounts depending on shape (few-long vs many-short) because of this.
11
+
12
+ | Platform | Billing unit | What counts as 1 | Cost shape it favors |
13
+ | --- | --- | --- | --- |
14
+ | **n8n** | execution | one whole workflow run, any number of steps | few, long, complex flows; high volume; self-host = $0 |
15
+ | **Make** | credit | each module action (renamed from "operations" 2025-08-27, converted 1:1) | moderate multi-step flows |
16
+ | **Zapier** | task | each action step that runs | many, short, simple flows |
17
+ | **Power Automate** | seat / flow | per-user or per-flow premium licensing; standard connectors bundled with many M365 plans | teams already paying for Microsoft 365 |
18
+
19
+ **Worked contrast** — a 10-step flow run 10,000×/month:
20
+
21
+ - **n8n:** 10,000 executions regardless of step count; self-hosted = $0 infra-aside.
22
+ - **Make:** ~100,000 credits (10 module actions × 10k).
23
+ - **Zapier:** ~100,000 tasks (10 actions × 10k) — pushed into high tiers fast.
24
+ - **Power Automate:** governed by seat/flow licensing rather than per-action, so the math is about
25
+ who's licensed and premium-connector usage, not run count.
26
+
27
+ For complex high-volume flows, n8n's per-execution model commonly cuts cost 80–90% vs per-task/credit
28
+ platforms. For a Microsoft-centric team, Power Automate can be effectively "free at the margin"
29
+ because it rides existing M365 licenses.
30
+
31
+ ## Full comparison
32
+
33
+ | Axis | n8n | Make | Zapier | Power Automate |
34
+ | --- | --- | --- | --- | --- |
35
+ | Free / entry | self-host free; cloud Starter ≈ €20/mo | ≈ 1,000 credits free; Core ≈ $9/mo | 100 tasks/mo free; Pro ≈ $19.99/mo | bundled in many M365 plans; premium add-ons |
36
+ | App breadth | ~1,000 nodes + generic HTTP + code | ~1,500, often deep per app | ~8,000+ — widest catalog | strong on MS + growing 3rd-party connectors |
37
+ | Self-host / data residency | **yes — your infra** | no (EU/US regions) | no | Microsoft cloud / Dataverse regions |
38
+ | Who runs/maintains it | technical; you run the box | mid; visual but rich | non-technical-friendly | IT/business in a Microsoft shop |
39
+ | Portability | high (export/import JSON) | low (no portable export) | low (no portable export) | low (tied to MS solutions) |
40
+ | Complex logic / code | code nodes, sandboxed by default (n8n 2.0) | functions + routers | limited (Code by Zapier) | expressions + Azure Functions escape hatch |
41
+
42
+ ## Programmatic + MCP maturity (honest)
43
+
44
+ The suite's platform skills drive these; here's the strategy-level read on how far each goes.
45
+
46
+ - **n8n** — public REST API can CRUD and activate workflows programmatically; strongest fit for
47
+ code-driven ops and GitOps-style management. MCP is community-driven and evolving. Best pick when
48
+ you want automations that are themselves managed as code. → `../../n8n/SKILL.md`.
49
+ - **Make** — management API plus maturing MCP / AI-agent support; you can manage scenarios via API to
50
+ a useful degree. → `../../make/SKILL.md`.
51
+ - **Zapier** — rich API for *running actions*, and **Zapier MCP** exposes thousands of app actions to
52
+ AI agents. **Hard limit: there is no public API to create/author a Zap** — Zap building is UI-only.
53
+ You can trigger and act, not construct. → `../../zapier/SKILL.md`.
54
+ - **Power Automate** — Flow *management* APIs, plus solutions/ARM/ALM for deploying flows as packaged
55
+ artifacts. **Hard limit: no clean public API to author an end-user's personal "My flows"**; the
56
+ supported path is solution-based deployment, not arbitrary per-user flow creation. →
57
+ `../../power-automate/SKILL.md`.
58
+
59
+ **Do not build a plan that depends on API-creating a Zap or a personal Power Automate "My flow."**
60
+ Both are UI-authored. If automation-of-the-automation is a requirement, that requirement points at
61
+ **n8n** (and to a lesser extent Make).
62
+
63
+ ## Ecosystem fit — the tie-breaker after billing
64
+
65
+ - **Microsoft 365 shop** (Teams, SharePoint, Outlook, Dataverse, Excel Online) → **Power Automate**.
66
+ The native integration and bundled licensing usually beat everything else on both cost and
67
+ friction. Don't bolt a third-party platform onto a Microsoft estate without a reason.
68
+ - **Data must stay on your own infrastructure** (compliance, residency, air-gapped) → **n8n**
69
+ self-hosted is the only option here that keeps data on your box.
70
+ - **Obscure or long-tail app**, non-technical owner → **Zapier** for catalog breadth.
71
+ - **Deep per-app capability at mid volume** → **Make**.
72
+
73
+ ## Routing summary
74
+
75
+ ```text
76
+ Microsoft 365 estate? → Power Automate
77
+ Data must stay on our infra? → n8n (self-host)
78
+ High volume / complex / code? → n8n
79
+ Need to manage flows as code? → n8n (Make second)
80
+ Widest app catalog / non-tech? → Zapier
81
+ Deep modules, mid volume? → Make
82
+ ```
83
+
84
+ Then route to that platform's skill for the build/operate work. Portability note: n8n's exportable
85
+ JSON makes exit cheap; the other three lock you in more, so weigh that if you expect to outgrow the
86
+ choice.
@@ -3384,6 +3384,106 @@ providers:
3384
3384
  CREDENTIALS.md: |
3385
3385
  Dashboard: https://app.n8n.cloud/settings/api (or self-hosted equivalent).
3386
3386
  `N8N_API_KEY` — secret. Required for all REST API calls.
3387
+ API surface: workflows CRUD + `/activate` `/deactivate` + `/workflows/{id}/execute`
3388
+ (recent; no custom input — use a Webhook trigger for runtime params). See the `n8n` skill.
3389
+
3390
+ - id: MAKE
3391
+ category: automatizacion
3392
+ detectors:
3393
+ imports: []
3394
+ env_vars: ["MAKE_API_TOKEN", "MAKE_ZONE"]
3395
+ deps: []
3396
+ dashboard_url: "https://www.make.com/en/help/tools/api"
3397
+ env_example: |
3398
+ MAKE_ZONE=eu1.make.com # your zone: eu1/eu2/us1/us2 (wrong zone => auth error)
3399
+ MAKE_API_TOKEN= # Profile > API/token; scopes are fixed at creation
3400
+ MAKE_TEAM_ID=
3401
+ files:
3402
+ test_connection.sh: |
3403
+ #!/usr/bin/env bash
3404
+ set -euo pipefail
3405
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
3406
+ set -a; source "$SCRIPT_DIR/.env"; set +a
3407
+ : "${MAKE_ZONE:?MAKE_ZONE not set (e.g. eu1.make.com)}"
3408
+ : "${MAKE_API_TOKEN:?MAKE_API_TOKEN not set}"
3409
+ NAME=$(curl -fsS "https://${MAKE_ZONE%/}/api/v2/users/me" -H "Authorization: Token $MAKE_API_TOKEN" | python3 -c 'import json,sys; print(json.load(sys.stdin)["authUser"]["name"])')
3410
+ echo "OK — Make API reachable on $MAKE_ZONE (user: $NAME)."
3411
+ README.md: |
3412
+ # MAKE
3413
+ Make.com (formerly Integromat). Scenarios via /api/v2; blueprint is a stringified JSON
3414
+ round-trip. Base URL is zone-scoped. See the `make` skill for dynamic create/manage.
3415
+ CREDENTIALS.md: |
3416
+ Dashboard: Profile > API (https://www.make.com/en/help/tools/api).
3417
+ `MAKE_API_TOKEN` — secret; token scopes are immutable after creation. Wrong `MAKE_ZONE`
3418
+ returns an auth error even with a valid token. Endpoints are case-sensitive.
3419
+
3420
+ - id: ZAPIER
3421
+ category: automatizacion
3422
+ detectors:
3423
+ imports: []
3424
+ env_vars: ["ZAPIER_MCP_URL", "ZAPIER_MCP_API_KEY"]
3425
+ deps: []
3426
+ dashboard_url: "https://mcp.zapier.com"
3427
+ env_example: |
3428
+ ZAPIER_MCP_URL=https://mcp.zapier.com/api/v1/connect
3429
+ ZAPIER_MCP_API_KEY= # Bearer key from the Zapier MCP dashboard (2 tasks per call)
3430
+ files:
3431
+ test_connection.sh: |
3432
+ #!/usr/bin/env bash
3433
+ set -euo pipefail
3434
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
3435
+ set -a; source "$SCRIPT_DIR/.env"; set +a
3436
+ : "${ZAPIER_MCP_URL:?ZAPIER_MCP_URL not set}"
3437
+ : "${ZAPIER_MCP_API_KEY:?ZAPIER_MCP_API_KEY not set}"
3438
+ # Zapier exposes no account-CRUD REST API; smoke-test the MCP endpoint with an initialize handshake.
3439
+ CODE=$(curl -s -o /dev/null -w '%{http_code}' -X POST "$ZAPIER_MCP_URL" \
3440
+ -H "Authorization: Bearer $ZAPIER_MCP_API_KEY" -H "Content-Type: application/json" \
3441
+ -H "Accept: application/json, text/event-stream" \
3442
+ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"rsc","version":"1"}}}')
3443
+ case "$CODE" in 2*) echo "OK — Zapier MCP endpoint reachable (HTTP $CODE).";; *) echo "FAIL — HTTP $CODE" >&2; exit 1;; esac
3444
+ README.md: |
3445
+ # ZAPIER
3446
+ Zapier has NO public API for a normal user to create/manage their own Zaps. Programmatic
3447
+ use = Zapier MCP (runs pre-configured actions across 9,000+ apps; does not author Zaps).
3448
+ See the `zapier` skill for the honest boundary and when to use n8n/Make instead.
3449
+ CREDENTIALS.md: |
3450
+ Dashboard: https://mcp.zapier.com — generate an MCP server + Bearer key.
3451
+ `ZAPIER_MCP_API_KEY` — secret (Bearer). Each successful tool call costs 2 Zapier tasks.
3452
+
3453
+ - id: POWER_AUTOMATE
3454
+ category: automatizacion
3455
+ detectors:
3456
+ imports: []
3457
+ env_vars: ["PA_DATAVERSE_URL", "PA_TENANT_ID", "PA_CLIENT_ID", "PA_CLIENT_SECRET"]
3458
+ deps: []
3459
+ dashboard_url: "https://make.powerautomate.com"
3460
+ env_example: |
3461
+ PA_DATAVERSE_URL=https://<org>.crm.dynamics.com # your Dataverse org URL (region domain varies)
3462
+ PA_TENANT_ID= # Entra tenant id
3463
+ PA_CLIENT_ID= # Entra app registration (needs a Dataverse application user)
3464
+ PA_CLIENT_SECRET=
3465
+ files:
3466
+ test_connection.sh: |
3467
+ #!/usr/bin/env bash
3468
+ set -euo pipefail
3469
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
3470
+ set -a; source "$SCRIPT_DIR/.env"; set +a
3471
+ : "${PA_DATAVERSE_URL:?PA_DATAVERSE_URL not set}"
3472
+ : "${PA_TENANT_ID:?PA_TENANT_ID not set}"; : "${PA_CLIENT_ID:?PA_CLIENT_ID not set}"; : "${PA_CLIENT_SECRET:?PA_CLIENT_SECRET not set}"
3473
+ TOKEN=$(curl -fsS "https://login.microsoftonline.com/${PA_TENANT_ID}/oauth2/v2.0/token" \
3474
+ -d "grant_type=client_credentials&client_id=${PA_CLIENT_ID}&client_secret=${PA_CLIENT_SECRET}&scope=${PA_DATAVERSE_URL%/}/.default" \
3475
+ | python3 -c 'import json,sys; print(json.load(sys.stdin)["access_token"])')
3476
+ N=$(curl -fsS "${PA_DATAVERSE_URL%/}/api/data/v9.2/workflows?\$filter=category%20eq%205&\$top=1" \
3477
+ -H "Authorization: Bearer $TOKEN" -H "Accept: application/json" | python3 -c 'import json,sys; print(len(json.load(sys.stdin)["value"]))')
3478
+ echo "OK — Dataverse reachable; cloud-flow query returned $N row(s)."
3479
+ README.md: |
3480
+ # POWER_AUTOMATE
3481
+ Microsoft Power Automate cloud flows via the Dataverse Web API (solution-aware flows only;
3482
+ `api.flow.microsoft.com` is unsupported). Auth is Entra OAuth. See the `power-automate` skill.
3483
+ CREDENTIALS.md: |
3484
+ Register an Entra app; add it as a Dataverse application user with a security role granting
3485
+ Process (workflow) privileges. `PA_CLIENT_SECRET` — secret. Only flows inside a Dataverse
3486
+ solution are code-manageable; personal "My Flows" are not.
3387
3487
 
3388
3488
  # Categories used to group tools in 01-TOOLS/README.md.
3389
3489
  categories:
@@ -0,0 +1,255 @@
1
+ ---
2
+ name: make
3
+ description: "Use when operating Make.com (formerly Integromat) programmatically — driving its REST API v2 or the Make MCP server from code or an agent to create, read, update, activate, run, clone, or delete scenarios, connections, hooks, and data stores. Triggers: 'create a Make scenario via the API', 'export a scenario blueprint, mutate it, and push it back', 'start/stop/run a Make scenario from a script', 'clone this Integromat scenario into another team', 'connect the Make MCP server so an agent runs my scenarios as tools', 'my valid Make API token returns an auth error' (zone trap), 'automatiza escenarios de Make.com desde la API'. NOT designing what the flow should do — trigger, branching, mapping, dedup, error path (automation-flows), NOT choosing Make vs n8n vs Zapier by billing model (automation-strategy), NOT operating n8n / Zapier / Power Automate (their skills), NOT a generic typed REST client with pagination/backoff (api-connector-builder) or an inbound webhook receiver in your own app (webhooks)."
4
+ tags: [make, integromat, automation, scenarios, blueprint, mcp, no-code, api, workflows]
5
+ recommends: [automation-flows, automation-strategy, api-connector-builder, webhooks]
6
+ profiles: [full]
7
+ origin: risco
8
+ ---
9
+
10
+ # Make (Integromat) — operate scenarios by REST API and MCP
11
+
12
+ Drive a live Make.com account from code or an agent: create scenarios from a
13
+ blueprint, activate/run/stop/clone/delete them, and manage the connections,
14
+ hooks, data stores, and teams around them. This skill owns the **operate**
15
+ half — the API v2 calls and the MCP wiring. It does **not** design the flow;
16
+ what a scenario *should do* (trigger, routes, mapping, dedup, error handler)
17
+ lives in [`automation-flows`](../automation-flows/SKILL.md), and the
18
+ Make-vs-n8n-vs-Zapier billing call lives in
19
+ [`automation-strategy`](../automation-strategy/SKILL.md). Bring the design
20
+ here, and this skill turns it into API payloads and MCP tool calls.
21
+
22
+ Reality up top (verify at author time — Make ships fast):
23
+
24
+ - **REST API v2 is GA.** Base URL is **zoned**: `https://{zone}.make.com/api/v2`.
25
+ - **The Make MCP server is GA and free on every plan** — you only pay the
26
+ scenario **credits** a run consumes. Cloud MCP has two tool tiers: run tools
27
+ (all plans) and management tools (paid).
28
+
29
+ ## Connect first — API token vs MCP
30
+
31
+ Two ways in, chosen by *who is driving*:
32
+
33
+ - **REST API v2** — deterministic CRUD from your own scripts/CI. Full control
34
+ of the blueprint. Use for provisioning, bulk edits, activate/stop pipelines.
35
+ - **Make MCP server** — lets an MCP client (Claude, Cursor, ChatGPT) call your
36
+ scenarios and (on paid plans) manage them as tools, no glue code. Use when an
37
+ **agent** is the operator.
38
+
39
+ `.env` (never inline secrets — read from the environment):
40
+
41
+ ```bash
42
+ MAKE_ZONE=eu2.make.com # your org's zone — eu1|eu2|us1|us2 (+ celonis). WRONG ZONE = AUTH ERROR.
43
+ MAKE_API_TOKEN=xxxxxxxx # Profile → API/SDK → API token. Scopes are FIXED at creation.
44
+ MAKE_TEAM_ID=123456 # teamId a scenario is created under (integer)
45
+ MAKE_MCP_TOKEN=yyyyyyyy # separate MCP token, for the token-URL MCP transport
46
+ ```
47
+
48
+ **Auth header (API):** `Authorization: Token {MAKE_API_TOKEN}` — the literal
49
+ word `Token`, a space, then the token. OAuth2 is the alternative for
50
+ multi-user apps. **Scopes are chosen when the token is minted and cannot be
51
+ widened later** — mint with `scenarios:read scenarios:write` (and
52
+ `connections`, `hooks`, `datastores`, `teams` as needed) up front; a
53
+ too-narrow token means re-minting, not patching.
54
+
55
+ ## The scenario model (just enough to build the payload)
56
+
57
+ A **scenario** = exactly one trigger module, then a chain of action modules,
58
+ optionally split by **routers** into branches. Data flows by **mapping**:
59
+ a downstream field references an upstream output as `{{2.email}}` (module 2's
60
+ `email`). The whole thing serializes to a **blueprint** — the JSON you GET, edit,
61
+ and POST back. That is the entire operate-side model you need here.
62
+
63
+ Do **not** design the flow in this skill. Trigger choice (webhook vs polling),
64
+ branch logic, idempotency/dedup on a data store, and the error handler
65
+ (Break → Incomplete Executions, etc.) are all `automation-flows`. Take its
66
+ build sheet, then encode it as a blueprint below.
67
+
68
+ ## API v2 surface
69
+
70
+ | Group | Endpoints (case-sensitive!) | Use |
71
+ |---|---|---|
72
+ | Scenarios | `GET/POST /scenarios`, `GET/PATCH/DELETE /scenarios/{id}`, `.../start`, `.../stop`, `.../run`, `.../clone`, `.../blueprint` | the core |
73
+ | Connections | `GET/POST /connections`, `.../{id}/test` | app auth the modules use |
74
+ | Hooks | `GET/POST /hooks`, `.../{id}/ping`, `.../learn-start` | inbound webhooks/mailhooks |
75
+ | Data stores | `GET/POST /data-stores`, `.../{id}/data` | dedup keys, state |
76
+ | Templates | `GET /templates`, `.../{id}/blueprint` | starting-point blueprints |
77
+ | Teams / Orgs | `GET /teams`, `GET /organizations/{id}` | scoping + rate limit |
78
+
79
+ Two rules that bite: **endpoints and query keys are case-sensitive**, and every
80
+ call is **zoned** — the same token against the wrong `{zone}` returns an auth
81
+ error, not a 404, which sends people chasing a token problem that does not exist.
82
+
83
+ **Rate limits are per plan** (req/min): Core 60 · Pro 120 · Teams 240 ·
84
+ Enterprise 1000. Read your own real ceiling rather than guessing:
85
+
86
+ ```bash
87
+ curl -s -H "Authorization: Token $MAKE_API_TOKEN" \
88
+ "https://$MAKE_ZONE/api/v2/organizations/$ORG_ID" | jq '.organization.license.apiLimit'
89
+ ```
90
+
91
+ ## Dynamic lifecycle — the blueprint round-trip
92
+
93
+ The core technique: **you rarely hand-write a blueprint.** You GET one from a
94
+ template or an existing scenario, mutate the JSON, and POST/PATCH it back **as a
95
+ string**. `blueprint` and `scheduling` are sent as JSON *strings*, not objects.
96
+
97
+ ### 1. Get a starting blueprint
98
+
99
+ ```bash
100
+ # From an existing scenario (or a template: GET /templates/{id}/blueprint)
101
+ curl -s -H "Authorization: Token $MAKE_API_TOKEN" \
102
+ "https://$MAKE_ZONE/api/v2/scenarios/$TEMPLATE_ID/blueprint" \
103
+ | jq '.response.blueprint' > bp.json # wrapper key: verify .response.blueprint at author time
104
+ ```
105
+
106
+ Mutate `bp.json` with your design — module parameters, the `{{n.field}}`
107
+ mappings, router filters. Keep secrets out; wire credentials via a
108
+ **connection id**, never a literal key in the blueprint.
109
+
110
+ ### 2. Create the scenario (blueprint + scheduling as STRINGS)
111
+
112
+ ```bash
113
+ curl -s -X POST -H "Authorization: Token $MAKE_API_TOKEN" \
114
+ -H "Content-Type: application/json" \
115
+ "https://$MAKE_ZONE/api/v2/scenarios" \
116
+ -d "$(jq -n --argjson team "$MAKE_TEAM_ID" \
117
+ --arg bp "$(jq -c . bp.json)" \
118
+ --arg sched '{"type":"on-demand"}' \
119
+ '{teamId:$team, blueprint:$bp, scheduling:$sched}')"
120
+ # scheduling e.g. {"type":"indefinitely","interval":900} (interval seconds) — verify fields at author time.
121
+ # optional: folderId, basedon (template id)
122
+ ```
123
+
124
+ ### 3. Validate
125
+
126
+ The create call itself is the validator — a malformed blueprint returns a 400
127
+ naming the offending module/field. Fix the JSON and re-POST. There is no
128
+ separate schema-lint endpoint; a clean create *is* the pass.
129
+
130
+ ### 4. Dry-run / test before you schedule
131
+
132
+ Run it once, watching one execution, while still `on-demand` (inactive):
133
+
134
+ ```bash
135
+ curl -s -X POST -H "Authorization: Token $MAKE_API_TOKEN" \
136
+ "https://$MAKE_ZONE/api/v2/scenarios/$ID/run" \
137
+ -H "Content-Type: application/json" -d '{"responsive":true}'
138
+ # inspect the returned execution/bundle output before trusting the flow
139
+ ```
140
+
141
+ ### 5. Activate
142
+
143
+ ```bash
144
+ # switch scheduling off on-demand first (PATCH), then start
145
+ curl -s -X POST -H "Authorization: Token $MAKE_API_TOKEN" \
146
+ "https://$MAKE_ZONE/api/v2/scenarios/$ID/start"
147
+ ```
148
+
149
+ ### 6. Manage — patch, stop, clone
150
+
151
+ ```bash
152
+ # Update: same round-trip — GET blueprint, mutate, PATCH back as a string
153
+ curl -s -X PATCH -H "Authorization: Token $MAKE_API_TOKEN" \
154
+ -H "Content-Type: application/json" \
155
+ "https://$MAKE_ZONE/api/v2/scenarios/$ID" \
156
+ -d "$(jq -n --arg bp "$(jq -c . bp.json)" '{blueprint:$bp}')"
157
+
158
+ curl -s -X POST -H "Authorization: Token $MAKE_API_TOKEN" ".../scenarios/$ID/stop"
159
+ curl -s -X POST -H "Authorization: Token $MAKE_API_TOKEN" \
160
+ -H "Content-Type: application/json" ".../scenarios/$ID/clone" \
161
+ -d '{"teamId": 999, "name": "copy"}' # clone into another team
162
+ ```
163
+
164
+ ### 7. Delete — export first (irreversible)
165
+
166
+ `DELETE /scenarios/{id}` is permanent; there is no undo and no trash. **Never
167
+ delete a live scenario without exporting its blueprint first.**
168
+
169
+ ```bash
170
+ curl -s -H "Authorization: Token $MAKE_API_TOKEN" \
171
+ ".../scenarios/$ID/blueprint" | jq '.response.blueprint' > backup-$ID.json # export
172
+ curl -s -X DELETE -H "Authorization: Token $MAKE_API_TOKEN" ".../scenarios/$ID"
173
+ ```
174
+
175
+ ## Make MCP — run and manage scenarios as tools
176
+
177
+ The Make MCP server hands an MCP client your scenarios as callable tools. Two
178
+ transports:
179
+
180
+ - **OAuth (remote):** point the client at `https://mcp.make.com` (or the
181
+ `/stream`, `/sse` variants). Scopes granted at consent decide which tools appear.
182
+ - **MCP token (per-zone):** `https://{zone}.make.com/mcp/u/{MCP_TOKEN}/stateless`
183
+ (also `/stream`, `/sse`). `/stateless` times out at ~60 s; `/stream` and
184
+ `/sse` allow ~5 min — a long scenario needs `/stream` or `/sse`.
185
+
186
+ Tool tiers (exact names move — confirm in the client's tool list at author time):
187
+
188
+ - **Run tools — all plans.** Enumerate on-demand scenarios and execute one with
189
+ inputs, returning its output. This is what lets an agent *use* your automation.
190
+ - **Management tools — paid plans.** View/modify scenarios, connections, hooks,
191
+ data stores, teams, organizations — the CRUD above, surfaced as tools.
192
+
193
+ Client config sketch (token transport):
194
+
195
+ ```json
196
+ { "mcpServers": { "make": {
197
+ "url": "https://eu2.make.com/mcp/u/${MAKE_MCP_TOKEN}/stream"
198
+ } } }
199
+ ```
200
+
201
+ MCP calls consume the scenario's normal **credits** — the server is free, the
202
+ runs are not. **Legacy note:** the local stdio server `integromat/make-mcp-server`
203
+ predates the cloud one and exposes on-demand scenarios as tools over stdio;
204
+ prefer the cloud server unless you specifically need a local process.
205
+
206
+ ## Honesty / gotchas
207
+
208
+ - **Zone trap.** Wrong `{zone}` → auth error with a perfectly valid token. Check
209
+ the zone before you suspect the token.
210
+ - **Case-sensitive paths.** `/scenarios` works, `/Scenarios` does not.
211
+ - **`blueprint` and `scheduling` are strings, not objects** — stringify them or
212
+ the create/update fails.
213
+ - **Token scopes are frozen at creation.** Can't widen later; re-mint instead.
214
+ - **Delete is irreversible** — export the blueprint first, always.
215
+ - **Credits, not operations.** Make's billing unit became **credits** (was
216
+ "operations"); API-triggered and MCP-triggered runs both burn them.
217
+ - **`.run` on an inactive scenario** is your dry run; scheduled execution needs
218
+ `.start` — don't confuse the two.
219
+ - **Don't hand-author blueprints from scratch** — round-trip a template; the
220
+ format is large and undocumented in full.
221
+
222
+ ## Related skills
223
+
224
+ - [`automation-flows`](../automation-flows/SKILL.md) — **design** the flow
225
+ (trigger, routes, mapping, dedup, error path). Build it there, encode the
226
+ blueprint here. Design ↔ operate is the boundary.
227
+ - [`automation-strategy`](../automation-strategy/SKILL.md) — choose Make vs n8n
228
+ vs Zapier by billing model *before* committing to this skill.
229
+ - [`webhooks`](../webhooks/SKILL.md) — building the inbound endpoint that
230
+ *receives* events in your own app (vs Make's `hooks` API here).
231
+ - [`api-connector-builder`](../api-connector-builder/SKILL.md) — a generic typed
232
+ REST client with auth/pagination/backoff, when you outgrow curl.
233
+ - Other platforms: `n8n`, `zapier`, `power-automate` (their own skills).
234
+
235
+ ## Checklist
236
+
237
+ - [ ] `MAKE_ZONE` matches the org's actual zone (ruled out the zone trap).
238
+ - [ ] API token minted with all scopes needed (scenarios + connections/hooks/
239
+ datastores as required) — scopes can't be widened later.
240
+ - [ ] Blueprint obtained by round-trip (template/existing), not hand-written.
241
+ - [ ] `blueprint` and `scheduling` sent as JSON **strings**; `teamId` set.
242
+ - [ ] Credentials referenced by connection id — no secrets in the blueprint.
243
+ - [ ] Dry-ran with `/run` and inspected output before `/start`.
244
+ - [ ] Blueprint exported to a file before any `DELETE`.
245
+ - [ ] For MCP: right transport for run length (`/stream`|`/sse` if >60 s), and
246
+ manager tools confirmed present only if the plan is paid.
247
+
248
+ ## References
249
+
250
+ - `references/api-v2-cheatsheet.md` — endpoints, auth, scopes, rate limits, the
251
+ common response envelope, and error codes.
252
+ - `references/blueprint-round-trip.md` — the GET→mutate→POST recipe in depth,
253
+ blueprint anatomy, and the stringify gotcha.
254
+ - `references/make-mcp-and-auth.md` — MCP transports, tool tiers, client configs,
255
+ and the token-vs-OAuth decision.
@@ -0,0 +1,14 @@
1
+ # Evals — make
2
+
3
+ `cases.yaml` holds three groups scored by an LLM judge against the rendered
4
+ skill. `should_trigger` confirms Make owns programmatic/MCP operation of a
5
+ Make.com account (create/run/clone/activate/delete scenarios, the blueprint
6
+ round-trip, the zone trap). `should_not_trigger` confirms clean deferral to the
7
+ real siblings — `automation-flows` for flow design, `automation-strategy` for
8
+ platform choice, `n8n` for that platform, `api-connector-builder` for generic
9
+ clients, `webhooks` for inbound receivers. The `capability` case checks the body
10
+ carries the load-bearing facts: the zoned/case-sensitive API, the
11
+ string-not-object blueprint/scheduling, the round-trip, run-before-start,
12
+ export-before-delete irreversibility, frozen token scopes, and the Make MCP
13
+ tiers. Run via the repo's eval runner; treat a miss as a cue to sharpen the
14
+ description's triggers/boundary or fill a body gap.
@@ -0,0 +1,45 @@
1
+ skill: make
2
+
3
+ should_trigger:
4
+ - prompt: "Create a Make.com scenario from a blueprint via the API and activate it from my deploy script."
5
+ why: Core operate task — POST /scenarios with a blueprint string, then /start.
6
+ - prompt: "Export a Make scenario blueprint, change the Notion module's mapping, and push it back."
7
+ why: The blueprint round-trip (GET /blueprint → mutate → PATCH as a string) this skill owns.
8
+ - prompt: "My Make API token keeps returning an auth error even though it's valid and the scopes look right."
9
+ why: Classic zone trap — wrong {zone} in the base URL, not a token problem.
10
+ - prompt: "Connect the Make MCP server so Claude can run my scenarios as tools."
11
+ why: MCP transport + tool-tier setup; the agent-operator path.
12
+ - prompt: "Clone this Integromat scenario into another team and stop the original from a cron job."
13
+ why: /clone and /stop lifecycle endpoints driven programmatically.
14
+ - prompt: "Automatiza la creación de escenarios en Make.com desde la API, incluyendo teamId y scheduling."
15
+ why: Spanish phrasing of programmatic scenario creation; required teamId + scheduling string.
16
+ - prompt: "Read my Make org's real API rate limit before I bulk-update 200 scenarios."
17
+ why: GET /organizations/{id} → license.apiLimit, plus rate-limit awareness for API operation.
18
+
19
+ should_not_trigger:
20
+ - prompt: "Design a Make scenario that dedupes Stripe webhooks and has a proper error path before an external call."
21
+ route_to: automation-flows
22
+ why: Flow design (trigger, dedup, error handler) — build it there, then encode the blueprint here.
23
+ - prompt: "Should I use Make, n8n, or Zapier for 80k runs a month given the billing models?"
24
+ route_to: automation-strategy
25
+ why: Platform choice by cost model, not operating a Make account.
26
+ - prompt: "Create and activate an n8n workflow via its REST API."
27
+ route_to: n8n
28
+ why: Different platform; n8n has its own operate skill.
29
+ - prompt: "Build a typed TypeScript client for a REST API with OAuth refresh, pagination, and exponential backoff."
30
+ route_to: api-connector-builder
31
+ why: Generic API-client engineering, not Make-specific operation.
32
+ - prompt: "Verify the HMAC signature on inbound webhooks arriving at my Express endpoint and queue them."
33
+ route_to: webhooks
34
+ why: Inbound receiver in the user's own app, not Make's hooks API.
35
+
36
+ capability:
37
+ - scenario: "Programmatically create a Make scenario from a template blueprint, dry-run it, activate it, and later delete it safely — plus offer the Make MCP path for an agent operator."
38
+ must_include:
39
+ - "Zoned base URL https://{zone}.make.com/api/v2 with header Authorization: Token {token}, and the zone trap (wrong zone → auth error with a valid token)."
40
+ - "POST /scenarios requires teamId, plus blueprint and scheduling sent as JSON STRINGS (not objects)."
41
+ - "Blueprint round-trip: GET /scenarios/{id}/blueprint (or a template), mutate the JSON, send back as a string on create/PATCH."
42
+ - "Dry-run with POST /scenarios/{id}/run and inspect output before POST /scenarios/{id}/start to activate."
43
+ - "Irreversibility rule: export the blueprint to a file before DELETE /scenarios/{id} — deletion is permanent."
44
+ - "Token scopes are fixed at creation and cannot be widened later; endpoints are case-sensitive."
45
+ - "Make MCP server (GA, free; runs cost credits) via OAuth https://mcp.make.com or token URL https://{zone}.make.com/mcp/u/{MCP_TOKEN}/stateless|stream|sse, with run tools (all plans) vs management tools (paid)."