Skip to main content

Deterministic numeric & financial verification for AI agents and spreadsheets — thin client for the hosted NumProof API.

Project description

NumProof

ci License: MIT

The deterministic numeric truth layer for AI agents and spreadsheets.

Your agent writes "gross margin improved from 42.1% to 44.8%" or "the workbook is internally consistent" — NumProof tells you, deterministically, whether that number is VERIFY, REFUTE, or ABSTAIN, with a counterexample, cell/formula provenance, and a signed, machine-checkable audit bundle. It's exact arithmetic and symbolic math — not an LLM judging another LLM.

  • ✅ Verify a single math/finance claim, or batch thousands in CI
  • ✅ Audit xlsx/csv rows: footing, cross-footing, balance-sheet ties, margins, formula cells — with provenance
  • ✅ Diff two report versions; evaluate covenant rule packs (DSCR, Debt/EBITDA, current ratio, …)
  • ✅ Signed evidence bundle (JSON + HTML/PDF/ZIP) anyone can re-verify offline
  • ✅ API · CLI · MCP server · optional x402 pay-per-call

This repo is the open-source client (SDK + MCP). The verification engine runs as a hosted service — pip install numproof, point it at the API, done. (Same shape as stripe-python: the SDK is open, the engine is the service.)

Live demo (no key): https://numproof.com · Docs: https://numproof.com/docs


30-second start

pip install numproof
from numproof import NumProof

np = NumProof.from_env()              # NUMPROOF_API_KEY (get a free key: see below)

print(np.verify("120 + 90 + 340 + 15 == 565"))
# {'verdict': 'VERIFY', 'certificate': 'EXACT_ARITHMETIC', ...}

print(np.verify("a 50% loss needs a 100% gain to break even"))   # VERIFY: (1-0.5)*(1+1.0)==1
print(np.verify("two 10% raises equal a 21% total increase"))    # VERIFY
print(np.verify("operating margin is 18% when EBIT is 180 and revenue is 1000"))  # VERIFY

No install? It's just HTTP:

curl -s https://numproof.com/demo -H 'Content-Type: application/json' \
  -d '{"claim":"gross margin is 60% when gross profit is 600 and revenue is 1000"}'

Free API key:

curl -s https://numproof.com/signup -X POST -H 'Content-Type: application/json' -d '{}'

Audit a spreadsheet (with provenance)

rows = [["Revenue", 1000], ["COGS", 400], ["Gross Profit", 600], ["Gross Margin", "60%"]]
print(np.audit_rows(rows)["verdict"])          # PASS  (600/1000 == 60%, footing, ties, ...)

# covenant rule packs: DSCR, Debt/EBITDA, current ratio, custom thresholds
print(np.covenant_rows(
    [["EBITDA", 500], ["Debt Service", 300], ["Debt", 1200]],
    rule_pack="credit_covenants_basic",
)["verdict"])

Every audit/diff/covenant result can be returned as a signed bundle + human-readable HTML/PDF report (format="zip"). Recipients verify it without trusting you or NumProof:

curl -s https://numproof.com/audit/verify -H 'Content-Type: application/json' -d @bundle.json
# {"valid": true, "verdict": "PASS", "signer": "0x...", ...}

Use it from an AI agent (MCP)

NumProof ships an MCP server so Claude / OpenAI-style agents can call it as a tool — gate every numeric claim before it reaches a user, report, or auditor.

python -m numproof.mcp
{ "mcpServers": { "numproof": { "command": "python", "args": ["-m", "numproof.mcp"] } } }

Or point any MCP client at the hosted descriptor: https://numproof.com/mcp.json.

See examples/ for runnable scripts (verify, audit, covenants, agent-gate, MCP).


Independently re-checkable receipts (the part you can't fake)

Any verdict can be returned as a signed Verification Receipt — and you re-check it offline, trusting neither the transport nor NumProof:

pip install "numproof[verify]"
numproof-verify receipt.json --signer 0x<published-NumProof-signer>
# OK   independently re-derived + signature valid

It recovers the EIP-191 signer (tamper-evident) and, for value/agg/identity/sequence claims, independently re-derives the verdict with stdlib Fraction + sympy. A tampered field, a wrong signer, or a verdict that doesn't actually hold all fail loudly — even a receipt NumProof itself mis-signed is caught by the re-derivation. An agent can recompute a number for itself; it cannot issue an independent, signed attestation a second party will accept. That independence — not the arithmetic — is the product. Format + spec: RECEIPT_FORMAT.md.


Why deterministic (and why it matters)

Generic "AI guardrails" use a model to grade a model — probabilistic, and itself can hallucinate. NumProof recomputes the math exactly (rational arithmetic + symbolic identity checking) and returns a reproducible verdict with a trace. When it can't prove something it says ABSTAIN rather than guess. For finance, regulated, and agent workflows, "the number is provably right" beats "another model thinks it looks right." Full table: comparison.md.


Pricing

Plan Price For
Sandbox $0 web demo + free credits
x402 PAYG $0.025 / credit agent-to-tool, no subscription
Builder $29/mo API + MCP + CLI, 2k credits
Pro $99/mo batch, webhooks, CI, signed exports, 10k credits
Finance Team $299/mo 5 seats, version diff, covenant packs, branded exports

What's in this repo

The numproof Python SDK (NumProof client), the MCP server, and runnable examples — all thin HTTP clients to the hosted API. MIT licensed. The verification engine, finance audit logic, formal (Lean) proof tier, and signing are the hosted service and are not in this repo.

Found a wrong verdict? Open an issue with the exact claim — correctness is the whole product.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

numproof-0.1.0.tar.gz (14.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

numproof-0.1.0-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file numproof-0.1.0.tar.gz.

File metadata

  • Download URL: numproof-0.1.0.tar.gz
  • Upload date:
  • Size: 14.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for numproof-0.1.0.tar.gz
Algorithm Hash digest
SHA256 ba9daa7cd8641c8cac736900c5a29db771eccca3fd230ee5a0e1f7f08e3caeac
MD5 7119459f475bf2d9858c72f530800724
BLAKE2b-256 99123f0da321aea0cf3b5541a78a506a23a921b2f8b2ebd3c341976db0bda931

See more details on using hashes here.

File details

Details for the file numproof-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: numproof-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 13.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for numproof-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1e6a866ab39f028aa79c16d226483f1659354e882957379b9fa48c2ed34a202c
MD5 024bd5d72c94137dbbc3ce0dc1c8e24e
BLAKE2b-256 acc46f9f3d19655275554785c724c2c946b2f24414ef29078a1a56f8cf8dbb86

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page