Install mcp-vault
Three ways to run the same check: in CI, before each commit, or on your
laptop. All three are offline by default — no network call, no token,
no telemetry — and all three read the same MCP configs:
.mcp.json (Claude Code), .cursor/mcp.json (Cursor)
and .vscode/mcp.json (VS Code).
- 1. GitHub Action — every pull request
- 2. pre-commit — every commit
- 3. CLI — your repository and your machine
1. GitHub Action (CI)
# .github/workflows/mcp-vault.yml
name: mcp-vault
on:
pull_request:
paths:
- '**/.mcp.json'
- '**/.vscode/mcp.json'
- '**/.cursor/mcp.json'
- '.mcp-vault.policy.json'
permissions:
contents: read
jobs:
mcp-vault:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- uses: froggychips/mcp-skills-vault@449bac6f1f66f240f906d6ad25cc1da909169677 # v0.16.0
with:
paths: '**/.mcp.json **/.vscode/mcp.json **/.cursor/mcp.json'
# sarif: true # findings in code scanning; needs security-events: write
Why a SHA and not @v0.16.0: a tag can be moved,
a commit cannot. The action runs its own checkout, and the CLI has no
dependencies, so nothing is installed from npm and no install script runs
— pinning the action by SHA pins the gate by SHA. Keep the version in
the comment so Dependabot or Renovate can update both.
By default the job fails on anything that could not be checked (unpinned,
not in the vault, a local command); fail-on: error fails only on
a deny, fail-on: warning on warnings too. A policy file can raise
the bar, never lower it. Every input, output and the SARIF setup are in the
Action docs.
2. pre-commit
# .pre-commit-config.yaml
repos:
- repo: https://github.com/froggychips/mcp-skills-vault
rev: 449bac6f1f66f240f906d6ad25cc1da909169677 # v0.16.0 — `pre-commit autoupdate --freeze` writes it
hooks:
- id: mcp-vault
# - id: mcp-vault
# args: [--strict]
Runs mcp-vault check --fail-on unknown on staged
.mcp.json, .vscode/mcp.json and
.cursor/mcp.json, offline. A plain-text secret is stopped before
it reaches git history, where it would have to be rotated.
3. CLI, locally
Node 18 or newer. No clone, no global install needed.
Check this repository
The same check the Action and the hook run, over the configs in the current directory. Nothing from your home directory is read.
npx -y @froggychips/mcp-vault check
npx -y @froggychips/mcp-vault check --strict # warnings fail too
Check your machine: start with status
One command, about fifteen lines: what is installed, what is wrong with it, and what this project is missing. It makes no network calls — every claim comes from evidence already on disk, with the date it was established. Exit 1 means something installed must not run; exit 2 means a host config could not be read, so the report is incomplete and says which.
npx -y @froggychips/mcp-vault status
Servers are matched by artifact identity, not by the name in your config, and the version is compared separately: stored evidence about x@1.0.0 is not a finding about x@2.0.0 in either direction. A server on a version nobody verified gets no tier at all, and an unpinned npx -y pkg is reported as what it is.
Prefer it on PATH for repeated use: npm i -g @froggychips/mcp-vault, then drop the npx -y prefix.
Look closer where it pointed
status summarises; these answer in full. verify --installed re-hashes what your hosts actually launch, against the live registries. explain <name> prints one entry’s evidence with dates, the policy in force, and the rule that decided it. scan reads the project’s stack.
npx -y @froggychips/mcp-vault verify --installed
npx -y @froggychips/mcp-vault explain mcp-server-fetch
npx -y @froggychips/mcp-vault scan --cwd .
Ask why, before you argue with it
Every dimension with the date it was established, the policy in force, each rule with its
outcome, and the rule that decided it. --record appends the decision as one
JSON line, which is the audit trail a policy engine gets asked for months later.
npx -y @froggychips/mcp-vault explain <name>
When something has an advisory
The shortest version that clears every advisory against the pin — not the newest release — with the candidate checked too, because “fixed in 2.1.30” means fixed for that one advisory.
npx -y @froggychips/mcp-vault upgrade
Freeze what actually runs
npx -y pkg@1.2.3 re-resolves that package’s dependency tree at every
start: a pinned root does not pin its tree. lock records npm’s own
lockfile per server, --check diffs a fresh resolve against it, and
--vendor installs the locked tree so nothing resolves at launch.
npx -y @froggychips/mcp-vault lock
npx -y @froggychips/mcp-vault lock --check
Optional: verify the vault database offline
For air-gapped smoke checks. It validates the stored pins only and makes no registry or advisory call.
npx -y @froggychips/mcp-vault verify --offline
Optional: install the vault as a Claude Code skill
If you want Claude to call the vault by itself when you ask “what MCP should I add?”, drop the skill folder into your skills directory.
git clone https://github.com/froggychips/mcp-skills-vault.git
mkdir -p ~/.claude/skills
cp -r mcp-skills-vault/mcp-ecosystem-intelligence ~/.claude/skills/
Looking for mcp-trace? It is an experimental sister project installed from git; its page has the steps.