axiom
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@axiomCompile the plan in plan.json, run checks, and apply if clean."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Docs · Quickstart · Tools · Architecture · Packages · Contributing
An agent describes a change set as a Plan. AXIOM compiles it to a canonical,
content-addressed Manifest, runs checks over the whole set, and applies it with a
hash-gated two-phase commit that leaves a journal and, optionally, a signed attestation.
It ships as one npm package — @codai/axiom-mcp — that is an MCP server, a CLI, a
PreToolUse hook and a GitHub Action.
Why
Per change set, not per tool call. Harness hooks (Claude Code, Copilot, Cursor) decide one write at a time. A forty-file refactor is forty blind decisions; AXIOM checks the whole manifest first — "if you touch X you must also touch Y", dependency budgets, secrets, paths.
Byte-exact. The manifest is JCS-canonical (RFC 8785) and holds only sha256 digests;
applydemands the digest you inspected (confirmDigest), re-hashes every pre-image at commit, and rolls back to the byte-identical prior tree on any failure — on a tree several agents share.Provable. Every apply leaves a journal keyed by digest. Manifests can be DSSE-signed with pinned Ed25519 keys and anti-rollback counters;
verify --treeproves a tree matches a manifest and emits an in-toto attestation that CI uploads to Sigstore.
Related MCP server: contextos-memory
What it does
flowchart LR
subgraph entry [Entry points]
direction TB
MCP[MCP server<br/>stdio · Streamable HTTP]
CLI[CLI<br/>axiom compile · check · apply]
HOOK[PreToolUse hook<br/>axiom gate --stdin]
GHA[GitHub Action<br/>dragoscv/axiom/action@v2]
end
P[Plan<br/>JSON or .axm] -->|compile| M[Manifest<br/>JCS · sha256 per file<br/>blobs · CAS · ref · patch]
M -->|check| C[CheckReport<br/>pass · fail · error]
C -->|apply · 2PC<br/>confirmDigest| T[Repository tree]
T --> J[Journal · ApplyResult<br/>DSSE signature · in-toto attestation]
J -.->|rollback| T
entry --> PInstall
Channel | Command | Platforms |
Run without installing |
| anywhere with Node ≥ 22.14 |
Global bin ( |
| anywhere with Node ≥ 22.14 |
Standalone binary, no Node (from 2.2.1) |
| linux-x64 · linux-arm64 · darwin-arm64 · darwin-x64 |
Standalone binary, no Node (from 2.2.1) |
| win-x64 |
VS Code |
| VS Code ≥ 1.138 |
GitHub Action |
| ubuntu · macos · windows runners |
MCP Registry |
| any registry-aware MCP client |
Binaries ship with SHA256SUMS and Sigstore provenance; npm packages carry npm provenance.
How to check them: SECURITY.md.
Quickstart (60 s)
1. Point an MCP client at a repo — .vscode/mcp.json (Claude Desktop config is the same
shape, see packages/mcp/README.md):
{
"servers": {
"axiom": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@codai/axiom-mcp", "mcp", "--root", "${workspaceFolder}"]
}
}
}--root is an explicit allowlist and may repeat; there is no cwd or env fallback.
2. Write a Plan — plan.json:
{
"apiVersion": "axiom.dev/v2",
"kind": "Plan",
"name": "hello",
"intent": "Add a greeting module and document it.",
"artifacts": [
{ "path": "src/hello.ts",
"source": { "type": "inline", "content": "export const hi = () => 'hi';\n" } },
{ "path": "README.md", "op": "overwrite",
"source": { "type": "inline", "content": "# hello\n" } }
],
"checks": [{ "id": "no-secrets", "predicate": "content.noSecrets", "params": {} }]
}3. Compile → check → apply from the CLI (the MCP tools do the same):
axiom compile plan.json --root . -o bundle.json # → { manifestDigest: "sha256:…" }
axiom check bundle.json --root . # → CheckReport, verdict pass|fail|error
axiom apply bundle.json --root . --dry-run # unified diff, nothing written
axiom apply bundle.json --root . --confirm sha256:… # two-phase commit, journal under .axiom/
axiom rollback sha256:… --root . # reverse-replay that journal entryPlan fields, sources (inline, cas, ref, patch, template) and the .axm DSL:
docs/reference/plan-format.md · docs/reference/axm-syntax.md.
Use it as a PreToolUse hook
axiom gate --stdin reads one harness payload, checks containment, path.deny/allow,
content.noSecrets and content.maxBytes on the write target, scans shell commands for write
primitives, and answers allow (exit 0) or deny (exit 2, JSON reason). Fail-closed; ~100 ms end
to end. Claude Code:
{ "hooks": { "PreToolUse": [ { "matcher": "Write|Edit|MultiEdit|NotebookEdit",
"hooks": [ { "type": "command", "command": "axiom gate --stdin", "timeout": 5 } ] } ] } }Copilot CLI / VS Code wiring, profile file and the latency budget: docs/getting-started/hooks.md.
Install the global bin for hooks.npx resolution takes seconds even with a warm cache,
the harness times the hook out, and every harness fails open on timeout.
Use it in CI
Fail a pull request whose tree does not match the manifest an agent applied, and optionally upload an in-toto attestation:
- uses: dragoscv/axiom/action@v2
with:
bundle: .axiom/manifests/<hex>.json
root: .
attest: true # needs permissions: id-token: write, attestations: writeScope, --pre mode and how to verify the attestation later: docs/guides/verify-tree.md.
Tools
Seventeen MCP tools, each with annotations and an outputSchema; errors are isError results
carrying a code from the closed ERROR_CODES enum — a handler never throws.
Tool | What it does | Annotations |
| Validate a | read-only |
|
| act |
| Recompute the canonical digest, verify every blob and, with a root, the DSSE signatures | read-only |
| Run a profile of predicates over a bundle; fails closed; verifies | read-only |
| Same as | read-only |
| Poll a task; | read-only |
| Abort a | act |
| Open a chunked plan session for Plans over the 4 MiB call cap | act |
| Append a chunk of | act |
| Compile the assembled Plan through the same path as | act |
| Containment + pre-image check + staging + unified diff; no user files touched | read-only |
| Two-phase commit; requires | destructive |
| Reverse-replay the journal of an applied manifest, scoped to its paths | destructive |
| Added / removed / changed artifacts between two manifests | read-only |
|
| read-only |
| The allowlisted roots | read-only |
| Deterministic, content-addressed inventory of a root ( | read-only |
Inputs, outputs, resources (axiom://…), transports (--wire 2026|2025) and the error
contract: docs/reference/mcp-tools.md. CLI verbs (sign, trust, gc, migrate v1,
snapshot, …): packages/mcp/README.md.
Architecture
flowchart TB
schema["@codai/axiom-schema<br/>Zod v4 · ERROR_CODES · JSON Schema"]
canon["@codai/axiom-canon<br/>JCS · sha256 · in-toto · DSSE"]
plan["@codai/axiom-plan<br/>compile · CAS · ref · patch"]
checks["@codai/axiom-checks<br/>18 predicates · profiles · guards"]
apply["@codai/axiom-apply<br/>containment · 2PC · journal · verify-tree"]
axm["@codai/axiom-axm<br/>.axm parser"]
lsp["@codai/axiom-axm-lsp<br/>language server"]
web["@codai/axiom-emitters-web<br/>template emitter"]
mcp["@codai/axiom-mcp<br/>MCP server · CLI · gate"]
plan --> schema & canon
checks --> schema & canon
apply --> schema & canon
axm --> schema
lsp --> axm & schema
mcp --> plan & checks & apply & axm & web & canon & schemaschema and canon are leaves; plan, checks, apply depend only on those two; axm on
schema; axm-lsp on axm + schema; emitters-web has no workspace deps (the emitter
registry is an interface injected into compilePlan); mcp depends on everything except the
private testkit; nobody depends on mcp. Enforced by check-package-deps.
Invariants (never weakened; PLAN.md §2, design):
ManifestBodyis JCS-canonical;manifestDigest = sha256(JCS(body)); nothing hashed contains a timestamp.Content never lives in the manifest — it travels as
blobs(≤ 256 KiB each, ≤ 4 MiB bundle), CAS (.axiom/cas/sha256/…) or a digest-pinnedref.applyrequiresconfirmDigest === manifestDigest; pre-images are re-verified at commit;.axiom/lock= single writer per root.Error codes are a closed enum; tests and clients branch on
code, never on message text.MCP stdout is JSON-RPC only; logs to stderr at
warn.No shell: child processes get an args array, never
shell: true.A predicate whose fact provider cannot run yields
verdict: "error"— fail closed.Roots are an explicit allowlist (
--root); nocwdfallback.The MCP SDK is reached through one seam (
packages/mcp/src/adapter.ts) and lives in lazy chunks.
Packages
Package | What | npm |
Zod v4 schemas for Plan, Manifest, CheckReport, ApplyResult, Profile, Journal, RepoSnapshot; closed | ||
JCS (RFC 8785), sha256, in-toto Statement v1, DSSE Ed25519 envelopes | ||
Plan → ManifestBundle compiler; inline / CAS / | ||
18 predicates incl. | ||
Containment, staging, two-phase commit, journal, rollback, lock, dry-run diff, PR mode, | ||
| ||
Language server for | ||
Optional | ||
The published bin — MCP server (stdio + Streamable HTTP), CLI, |
Private, not published: testkit (golden fixtures, arbitraries), conformance (MCP
conformance harness), vscode-axm (the .vsix). All nine public packages share one version
(fixed Changesets group) and are released together.
Checks & profiles
A Profile is a list of typed predicates. Built-ins: path.allow / path.deny /
path.reservedNames, content.noSecrets / content.maxBytes / content.encodingUtf8,
manifest.maxArtifacts / manifest.maxTotalBytes / manifest.requireSigned / manifest.noDeletes,
deps.max / deps.deny, repo.noOverwriteOf / repo.requireCompanion, guard.external
(your own scripts/check-*.mjs), expr.cel and expr.cedar (offline policy languages).
Verdict is pass | fail | error; anything that cannot be evaluated is error, which blocks
apply. Catalogue, params and profile authoring: docs/guides/checks.md.
Signing & provenance
axiom keygen → axiom trust add → axiom sign puts a detached DSSE envelope (Ed25519 over
JCS(manifest)) beside the bundle without changing its digest; a profile with
manifest.requireSigned then refuses unsigned, tampered, untrusted or replayed
(antiRollback) bundles. axiom verify --tree [--attest] emits an in-toto Statement
(https://axiom.dev/attestation/apply/v1). Envelope, key ceremony, root binding and limits:
docs/guides/signing.md · docs/guides/verify-tree.md.
Status & roadmap
2.3.x shipped. Plan compiler with every source type, 18 predicates, fail-closed apply with
journal/rollback/PR mode, MCP SDK v2 (2026-07-28 wire, --wire 2025 fallback) over stdio and
HTTP with 17 tools, fail-closed gate, .axm DSL + LSP + VS Code extension, DSSE signing,
verify --tree + attestation + GitHub Action, CI on ubuntu/windows/macos, 18 repo guards.
2.2.1 adds standalone binaries with provenance, the MCP Registry listing, the docs site and
the action@v2 tag. codai's SWE harness routes every write through the gate by default
(docs/integration/codai.md); brivio and metu wirings are in
docs/integration/.
Decisions (D-xx) and stories (S-xxx): PLAN.md · TRACKER.csv ·
MIGRATION.md for 1.x users · docs/reference/versioning.md.
Development
pnpm 12 · Node ≥ 22.14 · TypeScript 7 (tsgo) · tsdown · Biome · Vitest 5 · fast-check · Changesets.
pnpm install --frozen-lockfile
pnpm lint # biome check .
pnpm build # tsdown every package (before typecheck — exports point at dist/)
pnpm typecheck
pnpm test # vitest run
pnpm guards # node scripts/run-guards.mjs — 18 repo invariantsAll five green with output shown, a .changeset/*.md for anything under packages/*/src, and
the ripple closed (tool → docs/reference/mcp-tools.md + packages/mcp/README.md + spec/tools.json;
schema → regenerated schemas/*.json; golden → re-pinned). Details: CONTRIBUTING.md
and .github/instructions/.
Community
Discussions for questions · Issues for bugs and features · SUPPORT.md · SECURITY.md (private reporting) · CODE_OF_CONDUCT.md · CITATION.cff.
License
MIT © Dragos Catalin Vladulescu.
This server cannot be deployed
Maintenance
Related MCP Connectors
Issue & verify signed (ed25519), hash-chained, timestamped provenance receipts for agent actions.
- kanonikOAuthai.kanonik
Governance runtime for compliance: verified, human-approved writes to a tamper-evident record.
Cross-agent artifact workspace with provenance across Claude Code, Codex, Cursor, LangGraph.
- SetForkOAuthcom.setfork
Runnable, versioned lists agents can search, read, create and update. Git under the hood.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceTreats software units as content-addressed contracts, enabling efficient agent regeneration loops with cached verification and tiny context packets.48 PyPI2Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI coding agents to share a local-first, versioned memory of decisions, conventions, tasks, conflicts, and handoffs over MCP and REST.0MIT
- AlicenseBqualityBmaintenanceEnables software agents to maintain a signed, evidence-aware local ledger of claims, with policy-gated proposals, conflict queries, and constitution-pinned access through an MCP stdio server.73Apache 2.0
- FlicenseNot gradedqualityCmaintenanceEnables MCP-capable coding agents to coordinate via authenticated task creation, claiming, messaging, and review approval over a secure local event log.-