Point an agent at it
npx fetches the midplane package on first run, so there’s nothing to install ahead of time. Add this to your MCP client’s config — Claude Code, Claude Desktop, and Cursor all take this shape:
Requirements
Node 22.16+ or 24+ (the audit log uses thenode:sqlite builtin), or Bun 1.3+. npx ships with Node, so there’s nothing else to install — no native modules, no compiler. On anything older the binary refuses to start and says so, rather than failing partway through with a stack trace from whichever dependency reached a newer builtin first.
Try it
Ask your agent to list the tables — an allowed read that goes straight through. Then ask it to delete a row. Midplane denies it before it runs: writes deny by default undertable_access, even a bounded one-row DELETE … WHERE, until you grant read_write on that table.
Read the denial back from the local audit log:
intent is the agent’s own plain-language “why,” recorded next to the SQL and the decision. Nothing was modified, and the attempt is on the record either way — see the audit trail.
The log is a SQLite database at ~/.midplane/audit.db (override with DB_PATH). midplane audit also has tail, since, show, and stats; see the CLI reference.
Open specific tables up
The default denies every write. To grant some, generate a policy file:midplane.policy.yaml. Point the server at it by adding MIDPLANE_POLICY_FILE to the same env block:
init needs a terminal; npx -y midplane policy init is the flag-driven equivalent for CI. See writing policies and the policy schema.
In CI, or as a long-lived sidecar
For anything that isn’t a local MCP client, run the same engine as a container serving Streamable HTTP instead of stdio — self-contained, with no Node ornode_modules inside it:
http://localhost:8080/mcp. Audit lands in the mounted volume, and DB_PATH defaults to /data/audit.db inside a container. Both artifacts are built from the same source at the same version.
--stdio and --http on midplane server override MIDPLANE_TRANSPORT. The npm package defaults to HTTP like the image does, which is why the client config above passes --stdio explicitly.What ships, and how to check it
Midplane publishes two artifacts per release, plus a registry entry, all at the same version:
Because this is a security tool you’re being asked to run with
npx, the package is built to be checked rather than trusted:
- Not minified, deliberately — anyone evaluating what
npx midplanedoes should be able to read the artifact. - No install scripts and no native modules — nothing executes at install time.
- Runtime dependencies stay external rather than vendored, so
npm auditand Dependabot can still see them.
npm view midplane dist.attestations.
0.19.0 carries no provenance attestation; later releases do. Creating a package on npm requires setting its access, which a bypass-2FA token may no longer perform — so the first publish of any package has to come from an interactive session, which has no CI identity to sign with. That applies once, to the release that created the package.
What you don’t get
Compared to Cloud or a self-hosted control plane:- No dashboard. The audit log is read from the CLI, not a UI.
- No per-agent OAuth scope. Scope comes from the policy file and the database role, not a consent screen — see what you grant at consent.
- No write approvals. Holding a write for a human needs a control plane for the human to review it in.
- Audit is local and per-machine. A SQLite file on the box, not a searchable store across a team.
Next steps
Try Cloud instead
Dashboard, hosted audit log, and per-agent scope — the recommended path.
Write a policy
Grant the reads and writes your agent actually needs.
CLI reference
Every subcommand, flag, and exit code.