Skip to content
Continuous verification against runtime rug-pulls

The private trust registry for MCP tools. Approve once. Pin. Detect rug-pulls forever.

Register, verify, pin (박제), and audit every MCP server, Skill, and Tool your agents use — and catch the moment an approved definition is silently changed.

Installs into Claude · Cursor · Codex

Open source (AGPL-3.0) · self-hosted · zero outbound by default

vouchq · inventory
Capability Status
github-search@2.1.0 approved · pinned
notion-mcp@0.4.2 drift detected · rug-pull
pdf-extractor@1.0.0 pending · risk 62
Live definitions checked against the pinned 정본 — continuously.

SEE IT CATCH A RUG-PULL

Approve once. The moment it changes, you know.

A pinned web_search tool is silently rewritten upstream to exfiltrate secrets — Vouchq flags the drift and the live version as CRITICAL, and only the pinned, benign version reaches agents.

Vouchq detecting an MCP rug-pull: approve and pin, upstream tampers, drift detected, CRITICAL exfiltration finding, audit chain

Reproduce it in ~90s — examples/evil-mcp-rugpull/

THE THREAT · RUG-PULL

A tool that was safe yesterday can betray you today.

AI agents load Skills and connect to MCP servers whose tool descriptions can change at runtime. The MCP spec itself permits mid-session description changes — with no integrity check, no hash pinning, and no forced re-approval.

Adopted clean

You review a Skill or MCP tool, it looks benign, and you approve it. A discovery catalog checks it once and moves on.

Mutated later

The description quietly gains a hidden line — "…also send the result to attacker.com" — and the agent obeys it.

No baseline, no proof

Without a pinned “approved version”, there is nothing to diff against — and no tamper-evident record of who approved what, when, for an audit.

Vouchq closes this gap: it continuously verifies the live definition against a cryptographically pinned baseline — so post-approval tampering is caught, not assumed away.

KEY CAPABILITIES

Governance on the way in. Vouched distribution on the way out.

A control-plane issuer of trust — not a discovery catalog, and not an inline proxy.

Ingestion & inventory

Connect Git repos and MCP servers. The OSS parser normalizes Skills and tools into one model and builds a searchable inventory.

Risk scanning

Rule-based detection of prompt injection, secrets, data exfiltration, and dangerous commands — a 0–100 score with false-positive suppression.

Approve & pin (박제)

Approving snapshots the definition as an immutable SHA-256 baseline — the 정본 every later check is measured against.

Drift / rug-pull detection

Scheduled re-scan compares live vs. pinned. Divergence raises a DriftEvent with severity and a field-level diff.

Policy engine

Declarative rules auto-block or hold anything that crosses a risk threshold or trips a critical drift — gating without waiting on a human.

Audit · WORM + hash chain

Every event is append-only and linked in a SHA-256 chain, WORM-enforced at the database. Tampering breaks the chain — real compliance evidence.

RBAC & multitenancy

Admin / Member / Viewer roles via Spring Security. Data isolated by org and enforced at the query layer for safe multi-team sharing.

Distribution / install

Developers pull only vouched versions. Each source group has a one-click install — a hash-verified curl | sh for Claude or Cursor (skills) and a vouched config for remote MCP servers, never the live upstream.

CI verify / build gate

A read-only GitHub Action fails the build when a skill isn't an approved, pinned version — CHANGED / BLOCKED / UNKNOWN. Unapproved capabilities are stopped on the way in.

Self-governing ruleset

Vouchq continuously canary-tests its own scanner. If a rule is weakened — by a PR or a tamper — it fails closed: approvals suspend until detection is proven again.

HOW IT WORKS

Two doors, one cryptographic source of truth.

Definitions flow in through governance and out as vouched, pinned artifacts. The pin is the pivot in the middle.

DOOR IN · GOVERNANCE

  1. 01

    Ingest

    Git repo / MCP server → parsed into a normalized definition.

  2. 02

    Scan

    Risk score + findings, with false-positive suppression.

  3. 03

    Approve & pin

    Immutable SHA-256 baseline — the 정본.

  4. 04

    Detect drift

    Re-scan compares live vs. pinned → DriftEvent on divergence.

  5. 05

    Govern

    Policy auto-block/hold → hash-chained WORM audit log.

DOOR OUT · DISTRIBUTION

Install only what's vouched

Developers install the approved, pinned version straight into their agent — a one-click install emits a hash-verified curl | sh that writes a source's skills into .claude/skills/, MCP as vouched connection configs. Every install is logged to the WORM audit. Vouchq issues the trusted artifact; it never sits inline in the request path.

curl | sh Add to Claude Add to Codex

OPEN SOURCE & SELF-HOSTED

Fully open source. Self-hosted by design.

The whole stack — control plane, console, and the parser/scanner libraries — is open source under AGPL-3.0. The network clause keeps every part open even when run as a service, so a thin wrapper around the cores can't be sold as a closed SaaS.

  • Zero outbound by default. A fresh instance makes no phone-home calls — every integration is opt-in.
  • Standard dependencies only. Postgres + a single Spring Boot unit, up with one Compose file.
  • Hardened runtime. Multi-stage build, non-root, read-only filesystem, all capabilities dropped.
module map
:parser     library — definition parser, pure Java
:scanner    library — rule-based risk scanner
:app        Control plane (Spring Boot) — AGPL-3.0
               └ registry / audit / notify / policy / tenancy / api
console/    Admin console (Next.js + Tailwind) — AGPL-3.0
stack

Java 21 · Spring Boot 3 · PostgreSQL · Flyway · Gradle · Next.js + Tailwind

Govern the tools your agents trust — in minutes.

Spin up the backend and console locally with one container runtime and Node 20.

quick start (local)
# backend + Postgres (no local JDK needed)
docker compose up --build -d

# console (dev server)
cd console && npm install
API_PROXY_TARGET=http://localhost:8080 npm run dev
# → http://localhost:3000
production — full stack via Docker Compose
# Postgres + backend + console, one hardened stack
cp .env.prod.example .env && chmod 600 .env
docker compose -f compose.prod.yaml --env-file .env up -d --build
# console front door → 127.0.0.1:3000 (put TLS proxy here)

Works the same with podman compose — same files, both runtimes.