Skip to main content

pdf-form-proof

Fill a fillable PDF form, then prove every value actually shows on the page.

mcp-name: io.github.EssenceAlignment/pdf-form-proof

A PDF can hold a value in its data while the page a person sees, prints, or uploads shows nothing, or shows it cut off. Most form tools stop at "the field was set." This one keeps going: it renders the page, reads it back with OCR (optical character recognition, software that reads text from an image), and compares that with the text stored in the file. Each value comes back VISIBLE, INVISIBLE, RENDER-ONLY, or MISSING.

It works as an MCP server (MCP, the Model Context Protocol, is the plug-in standard that lets AI apps such as Claude call outside tools), as a Claude plugin, as a Gemini CLI extension, and as plain command-line tools.

What it does

Tool What it does Changes files?
pdf_form_inspect Lists every fillable field: exact name, type, current value, required flag, and the values that check each checkbox or radio button No
pdf_form_fill Fills fields by exact name and writes a new PDF. Refuses the whole fill if any name is not in the form. Never modifies the source, never overwrites an existing file. Returns the new file's SHA-256 and reads every text value back Writes one new file
pdf_form_verify Renders a page, OCRs it, and gives each value a verdict. Can be limited to one region of the page so a copy of the value elsewhere cannot make it pass No
pdf_sha256 SHA-256 fingerprint of a file, for a record of exactly what was produced No

Every tool carries MCP annotations: readOnlyHint and destructiveHint are set on all four.

Who it is for

Anyone who fills the same official PDFs again and again: small nonprofits and community organizations (vendor forms such as the IRS W-9, grant and funder forms, program intake and consent forms), operations staff, and builders who want an AI assistant to fill forms without hiding a partial or invisible fill.

Install

You need Python 3.10 or newer and uv (https://docs.astral.sh/uv/). The verify tool also needs two free programs:

  • macOS: brew install poppler tesseract
  • Debian or Ubuntu: sudo apt install poppler-utils tesseract-ocr

Claude Desktop (MCP server)

Add this to claude_desktop_config.json:

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

Or install the .mcpb file from the latest GitHub release: double-click it, or use Settings > Extensions > Advanced settings > Install Extension.

Claude Code (plugin)

claude plugin marketplace add EssenceAlignment/pdf-form-proof
claude plugin install pdf-form-proof@pdf-form-proof

Gemini CLI (extension)

gemini extensions install https://github.com/EssenceAlignment/pdf-form-proof

Command line

uvx --from pdf-form-proof pdf-form-inspect form.pdf
uvx --from pdf-form-proof pdf-form-fill form.pdf filled.pdf values.json
uvx --from pdf-form-proof pdf-form-verify filled.pdf --require "Sample Community Food Bank"

values.json maps exact field names (from pdf-form-inspect) to values:

{
  "topmostSubform[0].Page1[0].f1_01[0]": "Sample Community Food Bank",
  "topmostSubform[0].Page1[0].Boxes3a-b_ReadOrder[0].c1_1[0]": "/1"
}

Text fields take a string. A checkbox or radio takes one of its on-state values (shown by inspect, for example "/1" or "/Yes"), or an empty string to clear it.

Exit codes: 0 success; 1 a finding (verify found a value that is not visible, or a fill could not be read back); 2 refused (unknown field names, a missing file, an existing output, or a tool such as tesseract failed).

Example

$ pdf-form-verify filled.pdf --require "Sample Community Food Bank" --require "Sample Pantry Program"
PDF FORM PROOF - legibility check  verdict: PASS
  file: filled.pdf  page 1 at 300 dpi  scope: whole page
  VALUE                       SOURCE    TEXT  RENDER  VERDICT
  Sample Community Food Bank  required  yes   yes     VISIBLE
  Sample Pantry Program       required  yes   yes     VISIBLE
  limit: legibility only; says nothing about whether values are correct

Limits (read these)

  • AcroForm forms only. XFA-only forms (Adobe LiveCycle dynamic forms) are detected and refused, not filled.
  • finalize removes the XFA packet and the NeedAppearances flag so viewers draw the values from their own appearance streams. It does not flatten the form; fields stay editable.
  • Verify proves legibility, not correctness. It cannot tell you whether a value is the right answer for the form.
  • OCR can misread small, stylized, or handwritten-style fonts. A REFUSE verdict means "look at the page," not "the file is broken." A tool failure (missing poppler or tesseract, a render error) is reported as a tool failure, never as a finding about your document.
  • Signatures are not created. Signature fields are listed by inspect and left alone.
  • This tool fills forms. It does not give legal, tax, benefits, or other professional advice, and it does not decide what belongs in any field.

Privacy policy

pdf-form-proof runs entirely on your own computer.

  • Data collection: none. It reads only the PDF files you name and writes only the output path you name.
  • Usage and storage: rendered page images are kept in ~/.cache/pdf-form-proof only until the next verify run, which deletes them.
  • Third-party sharing: none. It makes no network calls and sends no telemetry.
  • Retention: nothing is retained beyond the files you create.
  • Contact: open an issue at https://github.com/EssenceAlignment/pdf-form-proof/issues

Origin

The fill engine and the visible-on-the-page check were built for a production document pipeline after a filled form passed every text-based check and was still returned because a value could not be seen on the page. The two rules that came out of that: never hide a partial fill, and check the page a person sees, not only the data in the file.

License

MIT. See LICENSE.

Metadata

Release files for pdf-form-proof 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pdf-form-proof 0.1.0
File Size Uploaded Provenance
pdf_form_proof-0.1.0.tar.gz 17.5 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for pdf-form-proof 0.1.0
File Interpreter ABI Platform
pdf_form_proof-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 35.8 kB

Release files / pdf_form_proof-0.1.0.tar.gz

Download URL pdf_form_proof-0.1.0.tar.gz
Size 17.5 kB
Tags Source
SHA-256 checksum
How to use checksums
cba34056105e1ae65542000e4fd6c15bd97f5fd2ac0503941a8072b7a93064ad
BLAKE2b-256 checksum
How to use checksums
e6ce3b6f633e60e7aad986162b08f39b864a261c18815ea9aa323958dd8618f6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.21 {"installer":{"name":"uv","version":"0.12.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / pdf_form_proof-0.1.0-py3-none-any.whl

Download URL pdf_form_proof-0.1.0-py3-none-any.whl
Size 18.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e0474e2376aac5453cd4e7d3eba06800ef4ae6d60a1690f5d389cb21267f657a
BLAKE2b-256 checksum
How to use checksums
2092a12e42604716f737897cedcbcdbf8d6e6e8ed1bd0020f847830efe14e42a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.12.21 {"installer":{"name":"uv","version":"0.12.21","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for pdf-form-proof 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page