VITNA
A containment layer for AI agents that go rogue.
Agents go rogue through their tools. VITNA sits on the tools you put behind it.
Calls to the tools you mark as risky wait for a person. No answer, no run.
No API key can decide a hold, including the agent's own. Claimed accounts get
signed records you can check offline.
Try the demo: a labelled simulation in
your browser. A scripted agent on pretend files reaches for risky tools, and you
decide its held calls. No install, nothing stored.
Try it in 60 seconds
npx -y @costrinity/vitna-compliance-mcp guard -- <your stdio MCP server command>
To see a hold, give the guard a policy file that lists the tools to hold. The
reference filesystem server has no delete tool: it destroys a file by
overwriting or moving it, so this policy.json holds those calls and allows
the rest:
{ "allowed_actions": ["*"], "hold_actions": ["write_file", "edit_file", "move_file"] }
VITNA_GUARD_POLICY=/path/to/policy.json npx -y @costrinity/vitna-compliance-mcp guard -- npx -y @modelcontextprotocol/server-filesystem /path/to/test-folder
In an MCP client config, put VITNA_GUARD_POLICY under env (see
Guard mode).
Every tools/call is checked by VITNA before it reaches the server. Anything not
allowed is refused with a tool error that says why. With no credentials you get a
trial key: a risky call is held, and with nobody able to approve it yet, it's
blocked when the window ends. To approve or deny holds and keep signed records,
claim the account with GitHub or a passkey, then decide holds in the
Aquarium on your dashboard. The claim link is printed in your MCP
server log and never sent to the agent; VITNA_OPEN_CLAIM=1 opens it in your
browser.
Try it on a test agent first.
Scope
VITNA sees only the servers it wraps. A built-in shell or an unwrapped server is
outside it, so turn those off if you want every action to go through the guard.
The session record lists what you declared as unwrapped. The remote endpoint offers
the same checks as tools an agent calls itself; that's cooperative, not containment.
Detection is heuristic pattern matching, not a sandbox.
What it doesn't do · Guard mode · Verify a record
Agent setups
The guard wraps stdio MCP servers, so it can sit in front of a client or SDK that launches stdio MCP servers. A setup is listed as tested only after we have run it with the guard.
The config for each is on Connect your agent; Compatibility says which are tested.
- Claude Desktop: documented, not yet tested; a hold waits for the decision.
- Claude Code: tested 2026-10-14, version 2.1.299; a hold waits for the decision.
- Codex CLI: documented, not yet tested; a hold waits for the decision.
- Gemini CLI: documented, not yet tested; a hold waits for the decision.
- Cursor: documented, not yet tested; a hold is answered "held, not run", and a retry of the same call runs once after an approval.
- VS Code (Copilot): documented, not yet tested; a hold waits for the decision.
- Cline: documented, not yet tested; a hold waits for the decision.
- Continue: documented, not yet tested; a hold waits for the decision.
- Zed: documented, not yet tested; a hold waits for the decision.
- Goose: documented, not yet tested; a hold waits for the decision.
- Windsurf / Devin Desktop: documented, not yet tested; a hold is answered "held, not run", and a retry of the same call runs once after an approval.
- OpenClaw (VITNA plugin): documented, not yet tested; a hold waits for the decision.
- OpenClaw (MCP servers): documented, not yet tested; a hold waits for the decision.
- OpenAI Agents SDK (Python): documented, not yet tested; a hold waits for the decision.
- OpenAI Agents SDK (JS): documented, not yet tested; a hold waits for the decision.
- Google ADK (Python): documented, not yet tested; a hold waits for the decision.
- LangChain MCP adapters: documented, not yet tested; a hold is answered "held, not run", and a retry of the same call runs once after an approval.
- CrewAI: documented, not yet tested; a hold is answered "held, not run", and a retry of the same call runs once after an approval.
- AutoGen: documented, not yet tested; a hold waits for the decision.
- Microsoft Agent Framework (Python): documented, not yet tested; a hold is answered "held, not run", and a retry of the same call runs once after an approval.
- LlamaIndex: documented, not yet tested; a hold waits for the decision.
- Mastra: documented, not yet tested; a hold waits for the decision.
- Vercel AI SDK: documented, not yet tested; a hold waits for the decision.
Not supported:
- n8n (MCP Client Tool): Its MCP Client Tool connects over SSE and HTTP only, not stdio, so the guard cannot sit in front of it. A remote VITNA gateway is planned.
Renamed from VIGIL
This package was formerly published as
@costrinity/vigil-compliance-mcp and this repo was formerly
COSTRINITY/vigil-compliance-mcp. The old package is still on npm at
0.2.4, deprecated with the message "Renamed: use
@costrinity/vitna-compliance-mcp". It gets no updates and has no guard
mode, so anything still pointing at it installs that old version. Directory
listings that show the VIGIL name are stale snapshots of this repo.
Current package: @costrinity/vitna-compliance-mcp
Registry entry: xyz.costrinity/vitna-compliance-preflight
Site: https://vitna.costrinity.xyz
Also included
The same package carries VITNA's compliance checks: 23 MCP tools across 24
named statutes in 13 jurisdictions, for an agent to call itself before it acts.
Decision support, not legal advice; scorecards are not certifications.
Most compliance servers answer questions about regulations. This one answers one question about the action your agent is holding right now: may it run? Your agent calls a check, gets allowed / blocked / flagged back synchronously, and decides. VITNA evaluates and records; your system enforces.
The package
One package to install. This is the server your agent calls before it acts.
| Package | What it does | When you want it | Install |
|---|
@costrinity/vitna-compliance-mcp (this one) | Your agent asks before it acts. Returns allow / block / flag on a proposed action, and records a signed evidence record of the decision. | You want a guardrail your agent calls, and provable receipts that it did. | npx @costrinity/vitna-compliance-mcp — no credentials needed to start |
A passive observer that records existing MCP traffic without deciding anything
is built in this repo but is not published to npm, so it is not documented
here yet. Nothing above depends on it.
Coverage
| |
|---|
| 24 named statutes | across 13 jurisdictions |
| EU AI Act (Reg 2024/1689) | risk-tier classification before you build or ship |
| GDPR + UK GDPR | DPIA thresholds, breach reportability, ROPA |
| DPDP (India, 2023) | §16 cross-border status, §8 breach path |
| LGPD · PDPA-SG · APPI · PIPEDA + Law 25 · PIPL · PIPA-KR · NDPA · APP-AU · CPRA | jurisdiction packs |
| HIPAA · GLBA · COPPA · FERPA · FCRA · SOX | US federal sectoral applicability |
| RBI · SEBI · IRDAI · TRAI/DoT · PFRDA | Indian sectoral regulators |
| 16 US state privacy laws | plus breach deadlines for 21 states |
| 23 MCP tools | 6 identifier validators, 15 stateless helpers |
Readiness scorecards (pre-audit, not certifications) additionally cover NIST Privacy Framework, SOC 2, ISO/IEC 27001 and PCI DSS v4.0.
Every count above is derived from the code and enforced by a build gate — if an implementation is removed, the build fails before the number can go stale. See "Honest limits" below for what these numbers do not mean.
VITNA's detection is heuristic, and those limits are documented publicly. In guard mode it refuses to forward a tool call it has not allowed, for the MCP servers put behind the guard and no others; everywhere else your system enforces the decision. Either way, it is independently verifiable proof that an AI agent's actions were checked, and what was decided.
Free checkers — no install, no account
Two questions people usually have to answer before they need any of this. Both
run entirely in the browser, take a few questions, and store nothing.
Both are scoping tools, not legal advice, and neither issues a score or a
pass/fail. They cite the article and the Official Journal text behind every
date they state.
Verify VITNA evidence yourself
Every decision on a claimed account also produces an Ed25519-signed evidence record that anyone can verify offline, with no account of their own and no trust in VITNA's servers. The public key is published, the verifier is open source, and the three commands below prove it in about a minute.