Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

verify-proof

by Fulcrum-Enterprisesversion 0.4.0i★ –iRuns on your computer
Registry nameio.github.csolomon0704-prog/verify-proof

Install

Overview

Description from the maker (original English)

Verify timestamp proofs offline, anchor hashes through ProofLedger, keep agent run receipts.

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Runs on your computer
  • Transport: stdio
  • Category: Other

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 0 of 1 passed
  • Runs on your computer with your user’s permissions (files, network, apps).
  • The registry lists no key to fill in.

You need

  • PyPIPython’s uv installed (for the uvx command)

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "verify-proof": {
      "command": "uvx",
      "args": [
        "verify-proof"
      ]
    }
  }
}

Run this in your terminal

claude mcp add verify-proof -- uvx verify-proof

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "verify-proof": {
      "command": "uvx",
      "args": [
        "verify-proof"
      ]
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "verify-proof": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "verify-proof"
      ]
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.

Your choice stays on this device in a cookie; no account needed.

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

Runs on your computer; the tool list appears in your AI app after you install it.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 8, 2026

  • ! Caution

    Maker matches the repo

    The publisher (csolomon0704-prog) is not the repo owner (Fulcrum-Enterprises); someone else may have listed it

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • – Not applicable

    Endpoint responds

    This one runs on your computer; there is no internet endpoint

  • – Not applicable

    Sign-in with OAuth

    Runs on your computer and uses local settings instead

  • … Not checked yet

    No hidden instructions in tool descriptions

    Runs on your computer; we can only read tool lists from internet endpoints

Compared with others in Otheri

  • More stars than 0% of the other 18372 servers in this category
  • Published to the registry more recently than 69% of the other 18372 servers in this category
  • Basic checks equal to or better than 23% of the other 18372 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is verify-proof safe?

It passed 0 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

The registry does not list a required key, though some servers ask you to sign in on first use.

Does it run on my computer or in the cloud?

It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).

Is it still maintained?

The GitHub repo last changed –, and the latest version (0.4.0) reached the registry 20 days ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Python (uv) on your computer.

What can I use instead?

In the same category: Spec Driven Development, Remote Desktop Commander, A1RO — Irish employment tools

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

Spec Driven Development

by formulahendry

MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.

Runs on your computer★ 440MITUpdated 14 months ago
Install

Remote Desktop Commander

by desktop-commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

Runs in the cloud★ 211Updated 2 days ago
Install

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

verify-proof

Check a blockchain timestamp proof on your own machine, and make one through an API.

verify-proof recomputes a file's SHA-256 hash and checks it against a proof bundle, so you can confirm that this exact file existed by the time it was anchored and has not changed by a single byte since. Verification is pure computation: it needs the file and the bundle, no account and no network call. Creating a proof is the one command that goes online, through ProofLedger's API with a free key. Free, MIT licensed, Python standard library only.

Also available for Node.js: npm install verify-proof, a zero-dependency port sharing the same proof format and semantics, tested against the same fixtures. See js/.

The sections below are the questions people ask, each answered with the shortest code that does it.

  • Install
  • How do I prove a file existed at a certain time, in code?
  • How do I verify a timestamp proof offline, without trusting the service?
  • How do I validate a Merkle proof in code?
  • How do I anchor many files at once, with my own record IDs?
  • How do I get a webhook when the anchor is confirmed?
  • Can I run this against a server I host myself?
  • How do I add a timestamp step to a Zapier, Make or n8n workflow?
  • How do I prove what an AI agent did without storing what it saw?
  • Is there a GitHub Action or GitHub App that timestamps release artifacts?
  • Use it from an AI assistant (MCP server, Claude Code, Cursor)
  • Proof file format
  • What a proof shows, and what it does not

Install

pip install verify-proof

The base install pulls no dependencies (it uses only the Python standard library) and gives you a verify-proof command:

verify-proof --help

To use it as an MCP server for Claude Desktop or Cursor, install the optional extra instead (details below):

pip install "verify-proof[mcp]"

Prefer to run from source? Clone it; the CLI works the same:

git clone https://github.com/Fulcrum-Enterprises/verify-proof.git

cd verify-proof python verify_proof.py --help

How do I prove a file existed at a certain time, in code?

Hash the file locally, anchor the hash in a public blockchain transaction, and keep the record of that transaction next to the file. The transaction's block time is the "no later than" date; the hash ties it to these exact bytes. The file itself never leaves your machine.

This package does the hashing and the verifying; ProofLedger does the anchoring, on Polygon, usually within a minute, with a free API key (100 API proofs a month on the Free plan):

Get a free key at proofledger.io

From the command line:

export PROOFLEDGER_API_KEY=sk_...      # Account > API Keys

verify-proof create contract.pdf verify-proof create contract.pdf --no-filename # send only the hash

Only the 64-character SHA-256 digest leaves your machine, plus the filename unless you pass --no-filename. Then save the proof's bundle next to the file; the offline verify command below works on it from then on, without ProofLedger:

curl -H "Authorization: Bearer $PROOFLEDGER_API_KEY" \

"https://proofledger.io/api/v1/proof/42/bundle?download=1" -o contract.pdf.proof.json

From Python, with the small API client the package carries (standard library only):

from proofledger_api import submit_proof, get_bundle

from verify_proof import hash_file import json

proof = submit_proof(hash_file("contract.pdf"), filename="contract.pdf", external_id="contract-2026-10") # key from PROOFLEDGER_API_KEY print(proof["id"], proof["certificate_url"])

bundle = get_bundle(proof["id"]) # once the anchor has landed json.dump(bundle, open("contract.pdf.proof.json", "w"), indent=2)

From Node.js:

import { hashFile, ProofLedger } from "verify-proof";

const pl = new ProofLedger({ apiKey: process.env.PROOFLEDGER_API_KEY }); const proof = await pl.createProof({ sha256: hashFile("contract.pdf"), externalId: "contract-2026-10" }); const bundle = await pl.getBundle(proof.id); // once the anchor has landed

Or straight at the API: POST https://proofledger.io/api/v1/proof with {"sha256": "<64 hex>"} and a Bearer sk_... header. The API is documented at proofledger.io/api, with an OpenAPI spec at /openapi.json.

external_id is your own record id: sending the same one again returns the existing proof instead of making a new one, so a retried job never double-anchors.

How do I verify a timestamp proof offline, without trusting the service?

verify-proof verify contract.pdf --proof bundle.json

VERIFIED: File matches the proof bundle. The bundle says it was anchored on polygon at 2026-10-15T02:11:09.512Z in transaction 0xabc123.... Look that transaction up on a block explorer to confirm it: https://polygonscan.com/tx/0xabc123...

The check runs locally: it hashes the file, compares the result with the hash in the bundle, computes the Merkle root if the bundle has a path, and reports the transaction to look up on a block explorer. It does not read the chain, so until you look that transaction up, the anchor is what the bundle says. Nothing is sent anywhere, so it works the same whether or not the service that issued the proof still exists.

The same check from Python:

from verify_proof import hash_file, load_proof, verify_proof

result = verify_proof(hash_file("contract.pdf"), load_proof("bundle.json")) print(result["verified"], result["tx_id"], result.get("explorer_url"))

And from Node.js: verifyProof(hashFile("contract.pdf"), loadProof("bundle.json")).

A test you can run on any vendor's proof: block the vendor's domain, then verify. If the check still passes, the proof is yours; if it needs the vendor's server to say "valid", you are relying on them staying in business.

Compute a file's SHA-256 hash
verify-proof hash contract.pdf

SHA256: a1b2c3d4e5f6...

File: contract.pdf

Quiet by default

A successful verify prints one line to stderr saying where to make proofs like it. It is suppressed whenever the output is piped or redirected, so scripts never see it, and stdout is unchanged either way. To silence it everywhere:

export VERIFY_PROOF_NO_HINT=1

How do I validate a Merkle proof in code?

A Merkle path is the list of sibling hashes between your leaf (the file's hash) and the root that was recorded on chain. Validating it means folding your hash up through the siblings and comparing the result with the root in the transaction. The rule this package uses, in full:

import hashlib

def merkle_root(leaf_hex: str, path: list[dict]) -> str: current = leaf_hex for step in path: # [{"hash": " ", "position": "left" | "right"}, ...] sibling = step["hash"] combined = sibling + current if step.get("position") == "left" else current + sibling current = hashlib.sha256(bytes.fromhex(combined)).hexdigest() return current

Each level concatenates the two hashes as raw bytes, in the order the position says, and hashes the result with SHA-256. verify_proof() runs exactly this when a bundle carries a merkle_path, returns the root as merkle_root, and prints it so you can compare it with the root recorded in the transaction. The comparison with the chain is yours to make: this package never reads the chain.

On Polygon, ProofLedger anchors each proof in its own transaction, so merkle_path is empty and the hash in the transaction is your file's hash directly. Bitcoin-anchored proofs from other services, and the few ProofLedger proofs anchored on Bitcoin before 2026-10-15, carry a path.

How do I anchor many files at once, with my own record IDs?

Up to 100 hashes in one call, each with your own external_id, so a re-run returns the proofs that already exist instead of anchoring twice:

from proofledger_api import submit_batch, get_proof_by_external_id

from verify_proof import hash_file

result = submit_batch([ {"sha256": hash_file("invoice-1001.pdf"), "external_id": "invoice-1001", "filename": "invoice-1001.pdf"}, {"sha256": hash_file("invoice-1002.pdf"), "external_id": "invoice-1002"}, ]) print(result["summary"]) # created / exists / invalid counts for item in result["items"]: print(item["result"], (item.get("proof") or {}).get("id"))

later = get_proof_by_external_id("invoice-1001") # None if you never anchored it

Node.js: await pl.createProofs(items) takes the same list, and pl.getProofByExternalId(id) looks one up. From an AI assistant, the create_proofs_batch MCP tool does this for a list of files, using each file's name as its record id.

Items are checked first and written together; a batch is Polygon only. For plain request retries there is also an optional Idempotency-Key header on the creating endpoints (the same key and body within 24 hours replays the stored response), but external_id is the simpler way to make submissions safe to retry.

How do I get a webhook when the anchor is confirmed?

Register a public https URL once; ProofLedger then POSTs a signed JSON event, proof.polygon.anchored, when a proof's Polygon anchor lands. The event carries the proof's bundle, so your handler can save it next to the file with nothing further to fetch.

import { ProofLedger, verifyWebhookSignature } from "verify-proof";

const pl = new ProofLedger({ apiKey: process.env.PROOFLEDGER_API_KEY }); const hook = await pl.registerWebhook("https://example.com/proofledger", ["proof.polygon.anchored"]); // hook.secret is shown once; keep it for the check below

Check every delivery before trusting it. The header is ProofLedger-Signature: t= ,v1= over t + "." + raw body; pass the body exactly as received:

from proofledger_api import verify_webhook_signature

ok = verify_webhook_signature(secret, request.headers["ProofLedger-Signature"], request.get_data())

Node.js: verifyWebhookSignature(secret, header, rawBody). Both are pure computation, no network. Failed deliveries are retried seven times over almost two days, then the endpoint is switched off and the account emailed. Webhooks fire only for proofs created after the endpoint was registered. Management endpoints: POST /api/v1/webhooks, GET to list, DELETE /api/v1/webhooks/:id, POST /api/v1/webhooks/:id/test.

Can I run this against a server I host myself?

Yes. ProofLedger Community is the same proof core as an open-source (AGPL-3.0) Node + SQLite server you run with your own Polygon key: the same v1 API shapes (single and batch proofs with external_id, bundles, lists, public verify, certificates, signed webhooks, Idempotency-Key, per-key rate limits), writing the same transaction shape as proofledger.io, so this tool checks its bundles the same way.

Only the beginning is shown; read the rest in the repo

Ask PopNx