Skip to content
Documentation menu

Documentation

MakerChecker for developers

MakerChecker is an open-source control plane that sits in front of your AI agents. It keeps each agent inside a granted role, holds the decisions that matter for a named human, and writes every step to an audit trail you verify offline. This guide covers what it is, how it fits, and how to wrap an agent you already have.

Start here

New to the project? Jump to the Quickstart to bring the control plane up and watch an agent get blocked in about five minutes. This page is the map.

What it is

MakerChecker is a self-hosted server your agents call before they do anything they cannot take back. It does three things, and it does them in code rather than in a policy document:

  • Authorizes every actionagainst the agent's role and its explicit, versioned grants. Anything not granted is denied.
  • Requires a named human to sign the decisions that matter, and never the agent that proposed them.
  • Records every check, run, and approval in a hash-chained, signed audit trail an inspector can verify without trusting you or us.

It runs on your own infrastructure, fully disconnected from the internet if you need it, and the audit format is open and specified.

The mental model

Model an agent the way a regulated company models an employee: an identity that holds one role, a key ring of granted skills, and limits on its authority. When the agent wants to act:

  1. It proposes a skill, addressed by name and version (for example txn-match@1).
  2. MakerChecker checks the proposal: is the agent active, is the skill granted to its role, would acting break segregation of duties, is it within the role's limits, and what is its risk tier?
  3. Low and medium-risk actions that pass run immediately, and the outcome is recorded.
  4. High-risk actions stop. In a flow they wait at an approval gate for a quorum of named humans; through the proxy they are denied outright.
  5. Every one of those steps is appended to the audit chain.

The core rule

The agent that prepared a case can never approve it. That separation is enforced structurally, inside the run, so it holds whether or not anyone follows a procedure.

Two ways to integrate

There are two paths. Pick one per workflow.

  • Proxy sessions. Wrap the tools your existing agent already calls. MakerChecker checks each call and records it; a high-risk call is denied. No re-platforming. This is the fastest path, and where most teams start.
  • Flows. Define the workflow inside MakerChecker, with approval gates where a high-risk step waits for human sign-off. Use this when the human-in-the-loop step should be a first-class, audited part of the process.

The proxy path is a few lines around a tool you already have. The same shape works from TypeScript or Python:

import { createClient } from "@makerchecker/sdk";
import { governLangChainTool } from "@makerchecker/connector-langchain";
// Point at your own self-hosted MakerChecker.
const mc = createClient({ baseUrl: process.env.MAKERCHECKER_URL });
const { session } = await mc.proxy.openSession({ label: "recon-run" });
// Wrap a tool your agent already has. Its name and schema do not change.
const matchTxns = governLangChainTool(
mc,
{ sessionId: session.id, agentName: "recon-preparer", skillRef: "txn-match@1" },
rawMatchTxns,
);
// The agent calls it normally. A denied action throws before the tool
// runs, and every call is signed into the audit trail.
await matchTxns.invoke({ statement });

Licensing and install

The SDK and connectors are Apache-2.0 and live in the repository under packages/. The control plane (server and web UI) is AGPL-3.0. The Quickstart shows how to run the server and use the SDK against it.

Architecture

Three layers, with a clean line between what you run and what you build against:

LayerWhat it isLicense
Control planeFastify + Postgres server and the web UI. Self-hosted.AGPL-3.0
Integration layerTypeScript SDK, LangChain and Claude Agent SDK connectors, Python SDK.Apache-2.0
AuditAppend-only, hash-chained (SHA-256 over canonical JSON), Ed25519-signed export, verified offline.Open format

Execution is deterministic and air-gapped by default. Setting an Anthropic or Gemini key switches agent steps to a live model; with no key, steps run in a scripted, fully offline mode.

Where to go next

  • Quickstart: run the control plane, wrap a tool, watch it get blocked, verify the audit.
  • Concepts and model: agents, roles, skills, grants, risk tiers, segregation of duties, gates, limits.
  • Wrap your agent: LangChain, the Claude Agent SDK, the generic wrapper, and Python.
  • The audit trail: how the chain is built and how an inspector verifies it offline.
  • Self-hosting: deploy on your own infrastructure, hardened and air-gapped.
Stuck or evaluating for a regulated team?Book a walkthroughOpen an issue on GitHub