open source · MIT · Node ≥ 18

Test Make.com scenarios
like they're real code.

Run your exported blueprint JSON through an engine that reproduces Make's execution and failure semantics — offline, no account, no network. Assert behavior in CI before a dropped guard or a typo'd mapper ships.

The problem

Make scenarios are software with no tests.

Filters, routers, iterators, aggregators, IML formulas, error routes — all the logic of a real program, living in a web UI with no unit tests and no diff. Edit a scenario, drop a dedup filter or fat-finger a {{...}} mapper, and it ships silently. You find out when leads get double-pushed or an email goes out blank. make-testkit gives that logic a test harness.

Three layers

An engine, an MCP server, and a Claude Code plugin.
@make-testkit/engine

The engine

IML evaluator, filter + Airtable-formula operators, a blueprint interpreter modeling routers/aggregators/iterators and the five error directives, plus a linter and a config-drift contract checker.

@make-testkit/mcp

The MCP server

Four tools over stdio — eval_iml, simulate_blueprint, lint_blueprint, run_testsuite — for any MCP client.

claude code plugin

The plugin

Slash commands /make-iml, /make-simulate, /make-lint, /make-test wired straight to the server.

Quickstart

Clone, build, test.
# get it
git clone https://github.com/SaharBarak/make-testkit
cd make-testkit && npm install && npm run build

# run the engine + example suites
npm test

Simulate a blueprint, lint it, and pin its behavior:

import { runBlueprint, lintBlueprint, checkContracts } from "@make-testkit/engine";
import { makeState, handlers, contracts } from "./examples/handlers.mjs";
import bp from "./examples/blueprints/lead-sync.json" with { type: "json" };

const ctx = { state: makeState(), handlers };
const res = await runBlueprint(bp, ctx);
res.status;          // "success" | "warning" | "error"
ctx.state.pushed;    // what the scenario actually did

lintBlueprint(bp);              // unresolved refs, duplicate ids, …
checkContracts(bp, contracts); // { ok, results } — config-drift guards

MCP tools

What the server exposes.
eval_iml
Render an IML {{...}} expression against a bundle context. Debug a mapper without a run.
simulate_blueprint
Execute a blueprint offline; return status, error, dead-letter executions, and a step-by-step trace.
lint_blueprint
Static analysis (unresolved refs, duplicate ids, dangling error routes…) plus optional contract checks.
run_testsuite
Run a project's node --test suite and summarize pass/fail with failing names.

Use it in Claude Code

Install the plugin, lint a scenario in one line.
# add the marketplace + install
/plugin marketplace add SaharBarak/make-testkit
/plugin install make-testkit@make-testkit

# then, against your blueprints
/make-lint ./scenarios/lead-sync.json ./scenarios/contracts.mjs
/make-simulate ./scenarios/lead-sync.json ./scenarios/handlers.mjs
/make-iml {{lower(trim(1.Email))}}
Faithful subset, fails loud. The engine covers the module types and IML functions real scenarios use, and throws on anything it doesn't model rather than guessing. Extend it with registerFunction, registerOperator, and your own module handlers.