What changed
The Verfy CLI and website, newest first. Update with verfy update or pip install -U verfy. Signed release files are on GitHub.
0.9.0 (2026-11-04)
- Salted hashes in receipts. Receipts hold a hash of a call's arguments and result, not the values, and that is what reaches Verfy Cloud. A plain SHA-256 of a short argument such as
{"command": "ls"}can be guessed by hashing likely values, so anyone with the database could have read it back. From this version the hash is SHA-256 of the value together with a secret salt that stays in~/.verfy/key.json, so it says nothing without that file. The format is unchanged (args_sha256andresult_sha256, stillsha256:…), signatures and chains work as before, and a key file without a salt gets one the first time it signs. Receipts written before this version keep their plain hashes. Hashes sent to the approval queue are salted too. verfy ledger hash JSONprints the hash this machine records for a value, so you can still match known arguments to a receipt. Someone without yourkey.jsoncannot.
0.8.1 (2026-11-04)
- The website moved to https://verfy.dev.
verfy update, the installers, the package links and the docs use it. The old address leads there, and Verfy Cloud's API still answers at it, so devices enrolled there keep working.
0.8.0 (2026-11-01)
- Set up a machine with one command.
verfy init --url … --code …creates the signing key and policy as before, prints one line about the MCP servers in your Claude Code, Cursor and Claude Desktop configs (it reads the files and starts nothing), offers to add the Claude Code hook when Claude Code is installed and you are in a terminal (--hook/--no-hook; never added without asking), and connects the machine to Verfy Cloud. Until now this tookverfy init,verfy hook install --write,verfy team enrolland averfy syncafter every session. - Receipts upload on their own. On a device enrolled with this version, after the hook or the gateway writes a receipt, Verfy starts
verfy syncas a separate background process, at most every five minutes; the hook itself still never goes online, and a failed upload never affects the guard. What happened goes to~/.verfy/sync.log.verfy team auto-sync offgoes back to uploading only withverfy sync; devices enrolled before this version stay that way untilverfy team auto-sync on.verfy team statusshows which. - The guard denies
verfy team enroll,verfy initwith--urlor--code, andverfy team auto-sync offwhen the agent runs them, so an agent cannot send this device's receipts to another Verfy Cloud or stop them from reaching your team. Five new cases, shared by both engines.
0.7.0 (2026-10-28)
- Remote MCP servers.
verfy lock checkandverfy scan --livenow read the tools of remote servers (aurlin the config) over Streamable HTTP instead of skipping them, so a CI check covers hosted servers too. Headers come from the config:headers(Claude Code, Cursor, VS Code and others) or Codex CLI'shttp_headers,env_http_headersandbearer_token_env_var, with${VAR}and${VAR:-default}filled in from the environment, so a key can come from a CI secret. A missing variable fails the check and names the variable, never a value. Verfy does not follow redirects, so a key only goes to the address in the config. Servers that only speak the older SSE transport are reported, not supported yet. The MCP gateway still runs in front of stdio servers only. - Tested with a local fake server (sessions, server-sent events, pages of tools, a refused key, a redirect, a missing variable) and by hand against two public remote servers, DeepWiki and Context7.
- Fixed: inside GitHub Actions,
verfy lock check --jsonprinted annotations after the JSON, so the output did not parse. With--jsonthere are no annotations now; the step summary is still written. - The GitHub Action works again now that the source repository is public:
uses: anvarbekovjavohir277-dot/verfy@cli-v0.7.0. It checks remote servers too.
0.6.3 (2026-10-26)
- Security: the agent can no longer read Verfy's signing key or device token. Up to 0.6.2 an agent could read
~/.verfy/key.json(for example withcator Claude Code's Read tool), and with it sign receipts of its own, or read the device token in~/.verfy/team.json. Now reading either file, listing, searching or copying~/.verfy, or naming the folder and one of those files in one command is denied (VFY-SELF-006), including$HOME,%USERPROFILE%, quoted, globbed andcd-then-read forms; archiving, copying or searching a folder that holds it, such as the home folder, or looking for files with those names needs approval (VFY-SELF-007). Both engines (Python and JavaScript) share the 26 new test cases. A program the agent writes and runs can still read the file: see [SECURITY_LIMITATIONS.md](docs/SECURITY_LIMITATIONS.md). If an agent may have read your key, create a new one yourself withverfy init --force(it starts a new receipt chain) and, with Verfy Cloud, revoke the device and enroll it again. Found while reviewing a contribution. - The end-to-end test also checks that the hook denies reading the signing key with
catand with the Read tool. - Website (27 October): Verfy Advisories have
VERFY-YYYY-NNNNids. The old ids (such as ATLS-2025-0001) stay inaliases, and links to them lead to the new pages. - [verfy-releases](https://github.com/anvarbekovjavohir277-dot/verfy-releases) is the home for installing Verfy: the standalone builds, the Claude Code plugin (
claude plugin marketplace add anvarbekovjavohir277-dot/verfy-releases, thenclaude plugin install verfy@verfy), the security policy (report vulnerabilities and bypasses there), the advisories, the research and this changelog. The source is in anvarbekovjavohir277-dot/verfy, under the MIT license. The GitHub Action is replaced by two steps,pip install "verfy==0.6.3"andverfy lock check, with the same annotations and step summary.
0.6.2 (2026-10-26)
- Verfy Registry sends only pins.
verfy team registry reportnow sends only the SHA-256 pin of each locked tool definition, no longer the local server and tool names, which can be private. Verfy Cloud stores only the pins and when each was reported, and no longer has a place for names. Owners and admins can delete all of their team's pins in Dashboard → Locks, and a pin not reported for 180 days stops counting and is deleted. What is sent and what is not: https://verfy-tech.vercel.app/docs#registry - End-to-end test before every release. The built wheel is installed on clean Linux, macOS and Windows runners and
scripts/e2e.pyrunsverfy init,lock files,lock check(a changed CLAUDE.md and a rug pull must fail it), Snyk and Cisco imports, the Claude Code hook and the Claude Code plugin. Nothing goes to PyPI unless it passes; it also runs on every push. - The GitHub Action example in the README pins this release (
@cli-v0.6.2).python scripts/bump.py X.Y.Zsets the version in every file that carries it, and a test fails when one of them falls behind.
0.6.1 (2026-10-26)
- Verfy Registry (Verfy Cloud):
verfy team registry reportshares the pins in yourverfy.lock(server name, tool name and SHA-256; never definitions), andverfy team registry lookupshows how many teams reported each pin, including a changed definition you have not approved yet. A change that few other teams have seen can be very new, or served only to you. Counts are shown only when at least 3 organizations reported a pin. - Verfy Cloud (website): Dashboard → Reports, a compliance summary for a date range (checked calls by verdict, the rules behind denied and asked calls, lock and approval decisions, policy versions, devices, audit activity) with the SOC 2 and ISO/IEC 42001 controls it relates to. It points an auditor to the evidence; it does not certify anything.
0.6.0 (2026-10-26)
- Lock explains what changed.
verfy lock check,lock diff,lock approveandlock check --updatenow say in words what changed in a tool and how risky it looks (low, medium or high): a new sentence that orders the model to send data somewhere, a new link, a new or newly required parameter, a new hidden-instruction pattern, or only a rewording. The GitHub annotations and step summary carry the same explanation. It is deterministic; no model is involved. On the 342 real tool changes from our October research it rated none high. - Lock the files an agent loads, not only MCP tools.
verfy lock filespins CLAUDE.md, AGENTS.md, GEMINI.md, Cursor and Windsurf rules,.claudeskills, agents, commands and hook settings, and MCP configs in thefilessection ofverfy.lock;verfy lock checkthen fails CI when one changes without a reviewed lock update.verfy lock files --userdoes the same for user-level instructions, skills and installed Claude Code plugins on your machine (~/.verfy/agent-files.lock). - Claude Code plugin. This repository is now a plugin marketplace:
claude plugin marketplace add anvarbekovjavohir277-dot/verfyandclaude plugin install verfy@verfyinstall the guard hook and a skill for checking locks. It needs the CLI (pip install verfy). - More agents.
verfy scan --discoveralso reads Codex CLI (~/.codex/config.toml, Python 3.11+), Gemini CLI (.gemini/settings.json), VS Code (.vscode/mcp.jsonand the usermcp.json) and Windsurf (~/.codeium/windsurf/mcp_config.json). - Import other scanners' findings.
verfy import FILEreads Snyk Agent Scan (--json) and Cisco MCP Scanner (--format raw) output. With--save, the Verfy gateway hides the tools they rate high and denies calls to them (VFY-IMP-001). - Self-protection: an agent may not run
verfy lock files --updateorverfy import --save, or edit~/.verfy/agent-files.lock,~/.verfy/imported/or the installed Verfy plugin.
0.5.5 (2026-10-25)
- The hosted service has one name, Verfy Cloud:
verfy teamandverfy syncsay so in their help. The commands are unchanged. - This repository is now the MIT CLI only; the website and the dashboard are developed separately as Verfy Cloud. The CLI is MIT and will stay MIT.
- Verfy Advisories are open data in `advisories/`: anyone can add a public, sourced advisory by pull request, checked by
node advisories/validate.mjs. - Contributors sign the CLA once, by commenting on their first pull request.
- There is no 0.5.4: that tag was never published, because the package metadata still said 0.5.3 and PyPI refused it. A test and the release workflow now check that both version numbers match.
0.5.3 (2026-10-24)
- One tag now does the whole release in one workflow: tests, PyPI with attestations, then the GitHub release from this changelog with the same files, SHA256SUMS and Sigstore signatures. Only the newest version is marked "Latest".
- PyPI page links: Repository, Changelog and Releases.
- Verfy Cloud (website): Slack and Telegram notifications for calls that wait for approval, changed tool definitions, denied calls and devices that stop uploading receipts for a day (Dashboard → Notifications).
0.5.2 (2026-10-24)
Scanner fixes, found by scanning the newest releases of 34 popular MCP servers (the research). Version 0.5.1 raised 163 high or critical findings there, all false alarms; 0.5.2 raises none.
- A tool that mentions another tool on the same server is no longer flagged as tool shadowing.
- A match right after a negation ("Do not include API keys") is skipped. Before, this hid tools from Context7, Apify and Sentry behind the gateway.
- "tokens" and "conversation" only count in their sensitive senses (access tokens, the conversation history).
- "silently" no longer counts as "secretly"; mentioning a file such as
.envis medium instead of high.
0.5.1 (2026-10-24)
Fixes found while scanning public .mcp.json files and recording the demo video.
verfy lock checkand the gateway no longer crash with a traceback when a server's command cannot be started (for example an empty command). They report it and exit 3 (lock check) or 126 (gateway).- Config scan: an unpinned package launched through
cmd /corsh -cis now reported. - Config scan:
npxof a package declared in thepackage.jsonnext to the config is no longer reported, because the lockfile pins it. - Config scan: VFY-CFG-007 (a remote server without credentials in the config) is now
info. The client signs in with OAuth when the server asks, so a missing header is not a weakness.
0.5.0 (2026-10-24)
- Approval queue for teams. With
"on_ask": "team", a gateway call that needs approval waits in Dashboard → Approvals until an owner or admin decides, for up toapproval_timeoutseconds. Only the SHA-256 of the arguments leaves the machine.
0.4.0 (2026-10-24)
- The gateway replaces API keys, tokens and private keys in MCP tool results with
[REDACTED:<rule>]before the agent reads them. Turn it off with"redact_output": false. - Policy templates:
verfy policy use strict | read-only | ci, andverfy init --template. - Fixed: redaction of stored arguments hid only the first secret of each kind.
- Website: Next.js 16.4.3, which fixes two critical advisories.
0.3.0 (2026-10-22)
- Self-protection: the agent cannot switch Verfy off with its own tools (VFY-SELF-001 to 005).
verfy update, and a choice between manual and automatic updates atverfy init.- Windows paths are compared without regard to case, in the
/c/...form. - One-line installers that need no Python (standalone builds for Windows, macOS and Linux, checked against SHA256SUMS).
0.2.0 (2026-10-21)
- First release on PyPI as
verfy: the Claude Code hook, the MCP gateway,verfy scan,verfy lock(includinglock checkand the GitHub Action for CI), signed receipts and SCITT export.
Before PyPI (2026-10-14 to 2026-10-20)
- 2026-10-18: the website leads with Verfy Lock, with a rug-pull demo you can run in the browser.
- 2026-10-15: the project got its name, Verfy; Google and GitHub sign-in.
- 2026-10-14: first version of the guard, scanner, lock, signed receipts and the Team web app.