pdf-form-proof
This MCP server lets you inspect, fill, verify, and fingerprint PDF forms, with a focus on proving filled values are visibly rendered.
Inspect fillable AcroForm fields: exact names, types, current values, required flags, and checkbox/radio on-state values.
Fill forms by exact field name into a new PDF without modifying the source or overwriting existing outputs; supports strict unknown-field refusal, optional finalize, and returns the output SHA-256 plus text read-back.
Verify values are legible on the rendered page using OCR, producing verdicts of
VISIBLE,INVISIBLE,RENDER-ONLY, orMISSING, optionally scoped to a page region.Compute a file's SHA-256 digest for recording exactly what was produced.
Report tool failures such as missing poppler/tesseract as
REFUSE, not as document findings.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pdf-form-proof fill the attached W-9 with my business info, then verify it's visible"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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? |
| Lists every fillable field: exact name, type, current value, required flag, and the values that check each checkbox or radio button | No |
| 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 |
| 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 |
| 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.
Related MCP server: JustFill PDF Forms
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 tesseractDebian 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-proofGemini CLI (extension)
gemini extensions install https://github.com/EssenceAlignment/pdf-form-proofCommand 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 correctLimits (read these)
AcroForm forms only. XFA-only forms (Adobe LiveCycle dynamic forms) are detected and refused, not filled.
finalizeremoves 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: each rendered page image is written to a temporary folder under
~/.cache/pdf-form-proofand deleted as soon as the OCR step finishes, including when a step fails. Nothing stays on disk unless you ask for a copy with--keep-render. (Version 0.1.0 kept the last image until the next run; 0.1.1 removes any such leftover on its first run.)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.
Author
Built by Eric Brakebill-Jones, MSW Systems Architect | Clinical Workflow and Grant Data Lineage. GitHub: https://github.com/EssenceAlignment
Changes
0.1.1: the rendered page image is deleted the moment OCR finishes (it was kept until the next run in 0.1.0). Author line added.
0.1.0: first release.
License
MIT. See LICENSE.
Available Tools
4 toolspdf_form_fillFill PDF formA
Fill an AcroForm PDF and write a NEW file (the source is never modified and an existing output is never overwritten). values maps exact field names to values: strings for text fields; an on-state such as "/1" or "/Yes" (or true) to check a box, "" or false to clear it. strict=true refuses the whole fill if any name is unknown. finalize=true removes the XFA packet and NeedAppearances flag so viewers render the values from their own appearance streams (fields stay editable; this is not flattening). Returns the output SHA-256 and a read-back of every text value.
Inputs: values (required), output_path (required), source_pdf_path (required), strict, +1 more. Returns: object
pdf_form_inspectInspect PDF form fieldsARead-only
List every fillable field in a PDF: exact name, type (text, button, choice, signature), current value, required flag, and for checkboxes/radios the on-state values that check them. Use the names exactly as returned when filling.
Inputs: pdf_path (required). Returns: object
pdf_form_verifyVerify filled values are visibleARead-only
Render one page, OCR it, and compare with the PDF text layer. Each value gets a verdict: VISIBLE, INVISIBLE (in the file but not on the page), RENDER-ONLY, or MISSING. region is "page" or "x0,y0,x1,y1" as page fractions; with a region and auto=true every word the text layer places in that region must also be legible. A tool failure (missing poppler or tesseract, render error) returns REFUSE with the reason and makes no finding about the document. Proves legibility only, not correctness.
Inputs: pdf_path (required), dpi, auto, page, +2 more. Returns: object
pdf_sha256SHA-256 of a fileBRead-only
Return the SHA-256 digest of a file so the exact output can be recorded.
Inputs: path (required). Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 4 tools
Each tool targets a distinct verb on the PDF: inspect (read fields), fill (write new file), verify (render+OCR compare), and hash (record output). Boundaries are crisp, with no overlap, and the descriptions explicitly note scope limits (verify proves legibility, not correctness).
Consistent snake_case and a shared pdf_ prefix throughout. Minor deviation: pdf_sha256 breaks the pdf_form_* pattern and is a generic utility rather than a form operation, but it remains predictable and readable.
Four tools is lean but each earns its place in a tight fill-and-proof workflow with no redundancy. Slightly on the thin side for the implied scope, but well-scoped rather than padded.
Covers the full loop: enumerate fields, fill safely to a new file, verify rendering, and record the output digest. Minor gaps like batch/multi-file handling or field validation reporting are absent but workable given the narrow purpose.
Maintenance
Related MCP Connectors
Detect fillable fields in any PDF with AI, scans included, then fill and sign it.
Make any PDF form fillable, fill it from data or documents, read it back, and fax the result.
Detect, review and fill existing PDF forms from JSON or Excel; reuse saved templates
Turn PDFs and photos into typed JSON with your own schema. Missing values come back null.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI clients to create multi-field forms, send approval requests via email, and retrieve structured human responses. It facilitates human-in-the-loop workflows by allowing agents to collect data and check form completion status.2,203 npmMIT
- AlicenseAqualityBmaintenanceFill any PDF form with AI agents — ML field detection on scans, visual review loop, reusable templates, and native AcroForm fill via justfill.app.1448 PyPIMIT
- FlicenseNot gradedqualityCmaintenanceEnables secure web form inspection and autofill using Excel data, Knowledge Packs, and AI, with sensitive field protection and explicit submit confirmation.1-
- AlicenseNot gradedqualityBmaintenanceGives AI agents tools to read PDFs, list form fields, apply operations, highlight, add notes, fill fields, place signatures, list signatures, and flatten PDFs.1AGPL 3.0