About invinoveritas
invinoveritas is a hosted MCP review gate for AI agents preparing consequential or irreversible actions. It provides an independent advisory verdict with a signed proof that can be recomputed and checked against a public, Bitcoin-anchored ledger.
Key features
- 01Independent review of agent actions
- 02Ranked issues and signed proofs
- 03Free proof verification
- 04Public verdict ledger
- 05Third-party claim notarization
Use cases
- 01Review a code diff before shipping
- 02Check a shell command before execution
- 03Verify a signed verdict from another party
- 04Record a third-party claim with timestamp
MCP support
The hosted Streamable HTTP MCP server exposes review, proof verification, receipt, witness, and ledger-related tools. Agents connect to https://api.babyblueviper.com/mcp/verify; authentication is required for some tools.
Configuration
Remote servers need no local install. Pick your client, then copy the config or install in one click.
https://api.babyblueviper.com/mcp/verifyclaude mcp add --transport http com-babyblueviper-invinoveritas https://api.babyblueviper.com/mcp/verify{"mcpServers":{"com-babyblueviper-invinoveritas":{"type":"http","url":"https://api.babyblueviper.com/mcp/verify"}}}Open in Cursor{"servers":{"com-babyblueviper-invinoveritas":{"type":"http","url":"https://api.babyblueviper.com/mcp/verify"}}}Open in VS Code{"mcpServers":{"com-babyblueviper-invinoveritas":{"type":"http","url":"https://api.babyblueviper.com/mcp/verify"}}}{"mcpServers":{"com-babyblueviper-invinoveritas":{"serverUrl":"https://api.babyblueviper.com/mcp/verify"}}}Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.
Tools
10| Parameter | Type | Required | Description |
|---|---|---|---|
| sign | boolean | No | Return the verdict as a portable signed proof (binds verdict, artifact hash and invinoveritas's public key, plus a content-addressed decision_ref). Anyone can check it later with verify_proof. |
| facts | object | No | Optional, with policy: the structured request fields the deterministic rules read (e.g. recipient, amount_atomic, chain, token). |
| policy | object | No | Optional (2026-10-13): policy-governed review. {schema: 'invinoveritas.review_policy.v1', deterministic: [{id, field, op (eq|ne|in|not_in|lte|lt|gte|gt), value}], substantive: [{id, requirement, accept_states (subset of [VERIFIED, DECLARED_ONLY], default [VERIFIED]), min_provenance (requester_supplied|independent)}]}. Deterministic rules are checked in code against `facts` first; any FAIL or MISSING rejects with no model call. Only substantive conditions go to the model, which returns VERIFIED / DECLARED_ONLY / CONTRADICTED / INSUFFICIENT per condition; a fixed rule from the policy decides. The result's policy_evaluation (also inside the signed proof) states its claim: 'factual' only if every condition was VERIFIED by evidence, else 'declarative'. Pair with verdict_relay to release a VerdictGatedEscrow payment on Base. |
| context | string | No | What you are trying to accomplish, why now, success criteria |
| artifact | string | Yes | The artifact to review: unified diff / patch, shell command, plan, config, analysis, agent output, or raw text |
| concerns | string | No | Specific things to check (e.g. 'production safety', 'edge cases in trading logic', 'regulatory risk') |
| evidence | array | No | Optional, with policy: [{id, provenance (requester_supplied|independent), kind, content}] for the substantive conditions. |
| artifact_type | enum | No | Type of artifact. 'code_diff' or 'patch' triggers deep code review. 'plan' for architecture/strategy. 'trade' triggers the capital-scale-aware risk-manager review of a proposed entry/exit. 'onchain_action' triggers the on-chain risk review of a proposed transfer/swap/approval/contract call (e.g. a Base MCP action) BEFORE you sign it — catches scam/honeypot tokens, unlimited-allowance drainers, address poisoning, slippage/MEV. 'sanctions_screening' for a compliance/AML result BEFORE acting on it — checks a categorical verdict (e.g. CLEAN) carries its own scope, not an unscoped claim. Tailors focus and suggestions. IMPORTANT for trade/onchain_action/sanctions_screening: a REJECT can happen purely from low confidence on an action you can't undo, even if content-wise the review leaned approve — see the response's reversibility_gate field. When present, epistemic_basis tells you WHY it's a reject: 'evidence_against' means a deterministic engine found a real positive finding (a known-bad address, an on-chain/sanctions hit); 'insufficient_evidence' means no finding either way, just confidence below the reversibility floor — different situations, do not treat them identically if your own logic branches on the reason.code_diff | patch | shell_command | plan | config_change | analysis | agent_output | trade | onchain_action | sanctions_screening | general |
| verdict_relay | object | No | Optional (verdict-relay/v2): also return a BIP-340 signature an ERC-8414 InvinoveritasVerdictAuthoritySigned contract verifies on-chain (garyyang-finchip/task-token-standard#2). {chain_id, authority, task_contract, token_id, submission_id, task_version, result_hash, task_document}. Requires sign=true. result_hash must be sha256 of the exact artifact; task_document is the plaintext task document (sha256 = the kernel's tdHash) and is put into the review context. approved/decision_ref come from our own verdict (approve->true, reject->false; concerns/defer unsigned). Checked before any charge. Result field verdict_relay. |
| action_binding | object | No | Optional: the exact real-world action this verdict authorizes — tool identity, materialized (not templated) arguments, and the id of the agent that will execute it, e.g. {'tool': 'place_order', 'agent_id': 'your-stable-agent-id', 'args': {...}}. v14+: `tool` and `args` are bound as SEPARATE preimage fields (action_binding_tool_hash = sha256(tool), action_binding_args_hash = sha256(RFC-8785-JCS(args))) so a verifier can assert 'same tool, different arguments' as a checkable statement; `agent_id` is bound as a plain string (action_binding_agent_id, not hashed). All bound DIRECTLY into decision_ref — so the verdict commits to the exact action, not just the free-text `artifact` argument or the verdict conclusion. Recomputing decision_ref without byte-identical tool/args/agent_id values produces a different hash: an approval cannot be replayed against a different tool, different materialized arguments, or a different agent. Every sub-key is optional. Max ~8KB JSON-encoded. NOT independently verified by us — we hash exactly what you send. HONEST LIMIT: nothing stops a caller from submitting an under-specified action_binding (e.g. tool+side but not size) and getting an approval reusable across the omitted dimension — that's about who controls what goes into the fingerprint, not how it's hashed. |
| related_claims | object | No | Optional (policy v20): a structured claim about related_proof_event -- a non-empty subset of {artifact_hash, verdict, verified_at, policy_version, decision_ref}. Compared by exact equality against the referenced proof (which we re-verify); the claims hash, comparison version and result (matched|mismatched|missing_proof|unverifiable_proof; not_supplied if omitted) are bound into decision_ref. Faithful restatement only: not relevance, authorization or truth. |
| disclosed_summary | string | No | Only used when confidentiality_tier='partial_disclosure'. A real, human-readable description of the reviewed artifact/decision you're choosing to make public — bound raw into decision_ref. Ignored for other tier values. |
| external_evidence | array | No | Optional (v17, 2026-09-10): third-party evidence this judgment relied on — e.g. a tool-reliability registry's own historical PASS/FAIL record, worked out live with arian-gogani/nobulex-registry#1. Array of {'source': str, 'record': str (the issuer's OWN exact saved bytes, verbatim — never re-parsed/re-emitted as JSON on our side), 'record_sha256': str (issuer-computed, not independently verified by us), 'evidence_type': str, 'observed_at': ISO 8601, 'validity_until': ISO 8601 | null}. All entries hashed together (RFC-8785-JCS) into external_evidence_hash, bound into decision_ref — so 'this exact evidence was what the verdict considered' is checkable, not just claimed in reasoning text. Does NOT authenticate the issuer, verify record_sha256, or establish freshness — that's the caller's own responsibility before relying on the cited evidence. |
| intended_audience | string | No | Optional: declare who/what this verdict is intended for (your own DID, endpoint URL, or gateway identifier). Bound into decision_ref so it can't be silently stripped or altered once issued. NOT independently verified — a reader compares this against their own identity and treats a mismatch as a signal the proof may be presented outside its intended context, a real context-binding replay-protection gap that earlier policy versions had no way to represent at all. |
| intended_verifier | string | No | Optional: a CAIP-10 string naming the specific on-chain verifier/gate this verdict is meant to be checked against, e.g. 'eip155:8453:0x8004A169FB4a3325136EB29fA0ceB6D2e539a432'. Bound into decision_ref (itself inside the schnorr-signed content) so it achieves real crypto-level domain separation — the raw signed bytes otherwise bind only to our pubkey + content, nothing to a specific chain/contract, so a proof is technically replayable against any gate willing to accept it. NOT independently verified — a gate compares this against its own chain_id/address. |
| severity_threshold | enum | No | Minimum severity to reportblocker | high | medium | all |
| related_proof_event | object | No | Optional: if the artifact being reviewed IS another party's already-signed verdict proof (a verdict-of-verdict re-review), pass that proof's full signed event ({id, pubkey, created_at, kind, tags, content, sig}). We independently re-verify it ourselves before its source_class can affect this call's own — capped, never upgraded (an independent_mediator call reviewing an agent_reported inner verdict stays agent_reported). Fails closed to agent_reported if the inner event doesn't verify, regardless of your own registry status. One hop only. HONEST SCOPE: we verify the cited event's own authenticity, not that it's actually the thing your artifact claims to be re-reviewing. |
| request_capture_ref | string | No | Optional: a requester-controlled commitment (a hash/id you generated and can independently prove existed at request-time) that this artifact was submitted for review — the captured-admission-v0 review profile (trustless-ai/recompute-kit). Echoed back verbatim in the response's admission_receipt. NOT independently verified by us; closes the /ledger raw-tape-vs-published gap only for requesters who opt in. |
| confidentiality_tier | enum | No | Which privacy/evidentiary tradeoff this verdict should use, only meaningful with sign=true. 'hash_only' (default): the proof carries only artifact_hash, raw content never disclosed — strongest privacy, weakest standalone evidentiary value (a third party can't confirm what the hash corresponds to without your later cooperation). 'partial_disclosure': pass disclosed_summary, bound raw into decision_ref, so a third party gets real checkable context without full exposure. 'full_disclosure': records intent to publish this verdict to the public /ledger (full_disclosure_requested=true in the proof) — strongest evidentiary tier, but actual publication is still a separate curated step on our side, not yet fully self-serve.hash_only | partial_disclosure | full_disclosure |
| mediator_attestation | object | No | Optional (v22): your mediator proves control of its own key. {key_url (https, mediator's own domain), public_key_ed25519_b64, requested_at (unix s, +-600 s), nonce (8-128 ASCII), signature_ed25519_b64} -- Ed25519 over the RFC 8785 JCS bytes of {schema:'invinoveritas.mediator_request.v1', artifact_hash (sha256 hex of the exact artifact), artifact_type, requested_at, nonce}; key_url must list the key. Requires sign=true; checked before any charge; bound into the proof as mediator_attestation_hash. Establishes key control at issue time, NOT independence. |
Details
From the project READMEinvinoveritas — MCP server
An independent review gate for AI agents, as a hosted MCP server. Before your agent takes an
irreversible action — shipping code, running a shell command, signing a transaction — it calls
review for a neutral second opinion from a party that isn't the agent, and gets back a
recomputable, Bitcoin-anchored proof anyone can re-verify without trusting the agent or us.
The one thing an agent can't self-serve is a trustworthy verdict on its own output. This is that verdict — model-agnostic, advisory (it never blocks), and checkable from the bytes.
- Hosted, no install. Remote Streamable-HTTP MCP server:
https://api.babyblueviper.com/mcp/verify - Sign-in: standard MCP OAuth in clients that support it (a free account can be created on the consent screen), or a free API key as a Bearer header:
curl -X POST https://api.babyblueviper.com/register -d '{"label":"mcp"}' verify_proof,ledger, andpayment_receiptare always free / no auth.
Tools
| Tool | What it does | Auth |
|---|---|---|
review | Independent verdict (approve / approve_with_concerns / reject) on a code diff, shell command, plan, config, trade, or on-chain transaction, with ranked issues + a portable signed proof. | Bearer (paid) |
verify_proof | Recompute and verify a signed invinoveritas proof someone handed you — confirms it without trusting the presenter or us. | free |
payment_receipt | Signed receipt for one verdict-governed payment. retry_state is read on chain, so the same nonce cannot double-pay. Does not move funds. | free |
witness | Anchor a third party's exact claim bytes, unmodified and unjudged — pure notarization (receipt + timestamp + integrity), distinct from review (our verdict). Source is self-declared and marked as such in the signed proof. | Bearer (paid) |
Also on this endpoint: ledger (free public verdict track record), validate (backtest reality-check), audit_agent_readiness, ledger_submit, conformance_certify. 9 tools in all; the server never moves money or assets for the user.
Add it to your agent
Cursor — one-click: Add invinoveritas to Cursor (it signs in with OAuth on the first paid call), or edit ~/.cursor/mcp.json (global) / .cursor/mcp.json (project):
{
"mcpServers": {
"invinoveritas": {
"url": "https://api.babyblueviper.com/mcp/verify",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}
Cline — Add via the MCP marketplace, or in cline_mcp_settings.json:
{
"mcpServers": {
"invinoveritas": {
"type": "streamableHttp",
"url": "https://api.babyblueviper.com/mcp/verify",
"headers": { "Authorization": "Bearer YOUR_API_KEY" }
}
}
}
Gemini CLI — install as an extension:
gemini extensions install https://github.com/babyblueviper1/invinoveritas-mcp
Claude Code:
claude mcp add --transport http invinoveritas https://api.babyblueviper.com/mcp/verify \
--header "Authorization: Bearer YOUR_API_KEY"
Devin — Settings → Connections → MCP servers → Add a custom MCP → HTTP (Streamable), URL
https://api.babyblueviper.com/mcp/verify, Auth Header Authorization: Bearer YOUR_API_KEY.
OpenHands — config.toml:
[mcp]
shttp_servers = [{ url = "https://api.babyblueviper.com/mcp/verify", api_key = "YOUR_API_KEY", timeout = 60 }]
Any MCP client — point it at https://api.babyblueviper.com/mcp/verify (Streamable HTTP) with header
Authorization: Bearer YOUR_API_KEY. Protocol 2025-06-18; the handshake, tools/list, and
tools/call work out of the box.
Use it
Tell your agent: before opening a PR or running an irreversible command, call review with the
diff/command as artifact, set artifact_type (code_diff / shell_command / onchain_action /
general), and sign: true. On reject, hold and fix; on approve, attach the proof so reviewers
can re-verify it.
Pairing with a fast gate (e.g. Jev)
Fast judgment models such as TypeSafe's Jev (jev_gate in the community
jev-mcp server) screen every tool call in a few hundred
milliseconds and answer allow / confirm / block. They are a good first line. What they don't
give you is an independent verdict someone else can check later. Use both: let the fast gate handle
the routine calls, and escalate only the risky or irreversible ones to invinoveritas.
gate = jev_gate(action=cmd, context=why) # ~0.3 s, every call
if gate.recommendation == "allow" and not gate.touches_prod:
run(cmd) # routine: no second opinion needed
elif gate.recommendation == "block":
stop_and_explain(gate) # clear no
else: # "confirm", or anything touching prod
v = review(artifact=cmd, artifact_type="shell_command", context=why, sign=True)
if v.verdict == "reject": stop_and_explain(v.issues)
else: run(cmd); keep(v.proof) # signed proof anyone can verify_proof later
The fast gate keeps latency and cost low on the many calls; the signed verdict covers the few that matter, and leaves a record that doesn't depend on trusting either the agent or us.
Why a verdict you can recompute
review with sign: true returns a proof that is a BIP-340-signed Nostr event, published to a
public, Bitcoin-anchored ledger. Verify it offline against our published key — recompute the event
id and check the schnorr signature — or POST it to https://api.babyblueviper.com/verify-proof
(free, no auth). Trust the math, not us. Wins and losses are published; the track record is a
forensic artifact, not a score.
- Recompute a proof yourself: zero-dep
pip install invinoveritas-verify/npm i invinoveritas-verify - Server card:
https://api.babyblueviper.com/.well-known/mcp/server-card.json
License
MIT
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.