Skip to main content

lock and drift

lock records the MCP tools you approved, and drift tells you when they silently change.

vulkro-live lock ./tools.json # after you approve the server
git add .vulkro/mcp.lock

# later: save the server's current tools/list output again, then
vulkro-live drift ./tools.json
$ vulkro-live drift ./tools.json

drift: 2 change(s) since the lock (./.vulkro/mcp.lock):
HIGH send_report description-changed description changed and now contains a high-risk signal (injection / hidden text / exfil)
LOW read_file annotation-changed annotations changed (no privilege escalation, shown for review)

A server can behave during review and change later: drop a readOnlyHint, add a tool, or rewrite a description to carry instructions. lock writes a fingerprint of every tool to .vulkro/mcp.lock; drift compares the current manifest against it. Both work offline. drift never starts the server (that would run untrusted code), so capture the current manifest first and pass the same paths you gave lock.

SeverityChange
HIGHA description that now carries injection, hidden text or an exfiltration sign; dropping readOnlyHint or gaining destructiveHint
MEDIUMA tool added or removed; an input schema changed
LOWA harmless rewording or annotation change, shown for review

Flags​

FlagCommandEffect
[MANIFEST]...bothManifest file(s): a tools/list result, an array, or one tool
--lock <file>bothLock file (default .vulkro/mcp.lock)
--format <FORMAT>drifttext (default), json or sarif

Exit codes: lock exits 0 or 2. drift exits 0 when nothing changed, 1 when something did, and 2 on an error, including when there is no lock yet.

Run inspect before lock: verdict first, then pin what you approved.