factframe
newA free local MCP server, installed with one command

Answers from documents, checkable in one click.

FactFrame turns PDF, DOCX and XLSX into Markdown where every paragraph, table row and figure has a stable id. Each id resolves to a rectangle on a page of the original file, so a cited answer is one you can verify.

curl -LsSf https://factframe.tech/install.sh | sh
macOS and Linux. Windows, Claude Code and other clients.
master-services-agreement.pdf · page 2 · click any block to see it on the page8c21f4 · page 2
question
How much notice is needed to terminate for convenience?
answer · citation verified
Thirty (30) days' written notice.
"thirty (30) days' written notice"
citation rejected · not shown to the user as sourced
The governing law is New York. a91c3e does not exist in this document.
MASTER SERVICES AGREEMENT · PAGE 2
8. Termination
8.1 Either party may terminate this Agreement for convenience by giving the other party thirty (30) days' written notice.
8.2 Either party may terminate this Agreement with immediate effect if the other party commits a material breach and fails to cure it within fourteen (14) days of written notice.
TermValue
Notice for convenience30 days, in writing
Liability cap12 months of Fees
Governing lawEngland and Wales
Page 2 of 3
ANSWER SOURCE
laboratory-report.pdf · page 1 · click any block to see it on the page6f21d8 · page 1
question
Is the fasting glucose within the reference range?
answer · citation verified
No. 112 mg/dL is above the reference range of 70 - 99 mg/dL.
"Glucose, fasting 112 mg/dL, reference 70 - 99"
citation rejected · not shown to the user as sourced
The patient is allergic to penicillin. e41b07 does not exist in this document.
LABORATORY REPORT · CHEMISTRY PANEL
Chemistry panel
Patient A. Example · ID 000-0412 · collected 2026-09-02
Specimen collected after ten hours of fasting. Reference ranges apply to adults.
TestResultReferenceUnit
Glucose, fasting112 H70 - 99mg/dL
Creatinine0.90.6 - 1.2mg/dL
Cholesterol, total214 Hbelow 200mg/dL
Triglycerides148below 150mg/dL
Page 1 of 2
ANSWER SOURCE
statement-of-account.pdf · page 1 · click any block to see it on the page9e63fb · page 1
question
What is the balance due on 31 August?
answer · citation verified
4,820.00 USD.
"Balance due 31 Aug 4,820.00"
citation rejected · not shown to the user as sourced
A 20 percent VAT was applied to INV-1051. 7bd205 does not exist in this document.
STATEMENT OF ACCOUNT · AUGUST 2026
Statement of account
Alder & Finch Ltd to Brightline Trading Ltd
Payment terms: net 30 days from the invoice date. All amounts in USD.
DateDocumentAmountBalance
03 AugINV-10423,200.003,200.00
15 AugPMT-0077-1,500.001,700.00
28 AugINV-10513,120.004,820.00
31 AugBalance due4,820.00
Page 1 of 2
ANSWER SOURCE
SEE IT WORK

Ask, cite, verify. In under fifteen seconds.

1Ask in plain language.
2The answer quotes the sentence it came from.
3Click View, and that paragraph lights up in the original PDF.

Recording of the FactFrame viewer on a sample regulation.

viewer · gdpr-regulation.pdf
viewer · genetic-test-report.pdf
viewer · financial-statement-guide.pdf
THE PROBLEM

A cited answer nobody can check is just a confident guess.

Most document parsers stop at text. Your agent answers from a chunk, but the reader cannot see where in a 300-page contract, lab report or ledger that chunk came from.

So a person re-reads the source to be safe, and the time the assistant saved is spent on checking it. In regulated work, an answer with no traceable source does not ship.

FactFrame keeps the link between every piece of text and its exact place on the page. Then it checks that each citation the model returns really exists.

HOW IT WORKS

Three steps from a file to a verified answer.

01 · CONVERT
Every block gets an id

Paragraphs, table rows and figures become Markdown with a content-derived id. Convert the same file again and the ids stay the same.

8c21f4 8.1 Either party may terminate…
b07e33 Liability cap · 12 months of Fees
$ factframe convert agreement.pdf -o out/
02 · ASK
Answers cite ids, not vibes

Your assistant searches and reads the converted documents through MCP and cites the ids it used. From the CLI, every citation is validated before it is trusted.

Thirty (30) days' written notice. Show in document
$ factframe ask out/ \
  "Notice to terminate?"
03 · VERIFY
One click to the source

Open the viewer, click a citation, and the original page scrolls to the highlighted rectangle. Links are shareable and bookmarkable.

$ factframe show out/ 8c21f4
page 2 · bbox 1.00,1.55,7.50,2.40
WHY IT HOLDS UP

Built for people who will be asked, "where did that come from?"

Stable ids

Ids come from content, never from a random generator. Citations you saved last month still resolve after a re-run.

Tables stay tables

Rows and cells carry their own ids, including borderless tables. Spreadsheets open in a sheet viewer with hierarchical search.

Runs on your machine

No account, no key, no per-page cost, and no document leaves your computer. The local reader uses the PDF's own text layer; scanned files need the Azure provider.

Works where your agent lives

One command registers the MCP server with Claude Desktop, Cursor and Windsurf. Claude Code and any other MCP client take one line.
WHERE IT HELPS

Where a wrong number costs more than a slow answer.

A clause someone will quote back

Contracts, policies and regulations. Land on the exact clause, with the sentence the answer was drawn from, not a paragraph pulled out of context.

A value that must sit next to its limits

Lab results, tolerances and thresholds. See the number beside its unit and its reference range, on the page where it was reported.

A figure someone has to sign off

Statements, invoices and reconciliations. Every figure traces to its row and page, so a reviewer can tick it off in seconds.

An agent that has to cite its sources

Give your pipeline clean Markdown and a citation format the UI can turn into a link. Build the "show source" button once.
FAQ

Questions before you install.

Yes, on your own computer, under the Apache-2.0 licence. If your team needs Google Drive or SharePoint connected, or a secured deployment, write to us.

Convert one document. Click one citation.

Free on your own computer. Pick your client:

curl -LsSf https://factframe.tech/install.sh | sh

Installs uv if it is missing, asks which folder to use, then sets up Claude Desktop, Cursor and Windsurf.

Need it for a team? Talk to us
CONTACT

Talk to the people who build it.

Need Google Drive or SharePoint connected, or a secured deployment for your team? Send a note and a person will reply.

What helps us reply faster
  • 01The type of document: contract, lab report, statement, spreadsheet.
  • 02The question you need answered from it.
  • 03Where it should run: a laptop, your servers, or inside your agent.
Prefer email?[email protected]
What is it about? Optional
A few sentences are enough. Please do not paste confidential content.

We use your details only to reply. No newsletter.

factframe

Answers from documents, checkable in one click.

FactFrame turns PDF, DOCX and XLSX into Markdown where every paragraph, table row and figure has a stable id. Each id resolves to a rectangle on the original page.

curl -LsSf https://factframe.tech/install.sh | sh
Free on your own computer. Windows, Claude Code and other clients.
master-services-agreement.pdf · page 2
How much notice is needed to terminate for convenience?
Thirty (30) days' written notice.
"thirty (30) days' written notice"
citation rejected
The governing law is New York. a91c3e does not exist in this document.
MASTER SERVICES AGREEMENT · PAGE 2
8. Termination
8.1 Either party may terminate this Agreement for convenience by giving the other party thirty (30) days' written notice.
8.2 Either party may terminate this Agreement with immediate effect if the other party commits a material breach and fails to cure it within fourteen (14) days of written notice.
ANSWER SOURCE
laboratory-report.pdf · page 1
Is the fasting glucose within the reference range?
No. 112 mg/dL is above the reference range of 70 - 99 mg/dL.
"Glucose, fasting 112 mg/dL, reference 70 - 99"
citation rejected
The patient is allergic to penicillin. e41b07 does not exist in this document.
LABORATORY REPORT · CHEMISTRY PANEL
Chemistry panel
TestResultRef.Unit
Glucose, fasting112 H70 - 99mg/dL
Creatinine0.90.6 - 1.2mg/dL
Cholesterol, total214 H< 200mg/dL
Triglycerides148< 150mg/dL
ANSWER SOURCE
statement-of-account.pdf · page 1
What is the balance due on 31 August?
4,820.00 USD.
"Balance due 31 Aug 4,820.00"
citation rejected
A 20 percent VAT was applied to INV-1051. 7bd205 does not exist in this document.
STATEMENT OF ACCOUNT · AUGUST 2026
Statement of account
DateDocumentAmountBalance
03 AugINV-10423,200.003,200.00
15 AugPMT-0077-1,500.001,700.00
28 AugINV-10513,120.004,820.00
31 AugBalance due4,820.00
ANSWER SOURCE
SEE IT WORK

Ask, cite, verify. In under fifteen seconds.

viewer · gdpr-regulation.pdf
viewer · genetic-test-report.pdf
viewer · financial-statement-guide.pdf
1Ask in plain language.
2The answer quotes the sentence it came from.
3Click View, and that paragraph lights up in the original PDF.
THE PROBLEM

A cited answer nobody can check is just a confident guess.

Your agent answers from a chunk, but the reader cannot see where in a 300-page document that chunk came from. So a person re-reads the source anyway.

FactFrame keeps the link between every piece of text and its place on the page, then checks each citation the model returns.

HOW IT WORKS

Three steps from a file to a verified answer.

01 · CONVERT

Every block gets an id

Paragraphs, rows and figures get content-derived ids that stay the same on re-conversion.
8c21f4 8.1 Either party may terminate…
b07e33 Liability cap · 12 months of Fees
$ factframe convert agreement.pdf -o out/
02 · ASK

Answers cite ids, not vibes

Your assistant searches and reads through MCP and cites ids. The CLI validates every citation.
Thirty (30) days' written notice. Show in document
$ factframe ask out/ "Notice to terminate?"
03 · VERIFY

One click to the source

Click a citation and the original page scrolls to the highlighted rectangle.
$ factframe show out/ 8c21f4
WHY IT HOLDS UP

Built for people who will be asked, "where did that come from?"

Tables stay tables

Rows and cells carry their own ids, including borderless tables and spreadsheets.

Local first

The default provider runs on your machine. No account, no key, no per-page cost.

Works where your agent lives

One command sets up the MCP server for Claude Desktop, Cursor and Windsurf. Claude Code takes one line.

Scans when you need them

The local server has no OCR. Scanned files need the Azure provider.
WHERE IT HELPS

Where a wrong number costs more than a slow answer.

A clause someone will quote back

The exact sentence behind every answer.

A value next to its limits

The number, its unit and its range, on one page.

A figure someone signs off

Every figure traced to its row and page.

An agent that cites sources

Build the "show source" button once.

Questions before you install.

Yes, on your own computer, under the Apache-2.0 licence. For a team setup, write to us.

Convert one document. Click one citation.

Free on your own computer. Pick your client:

curl -LsSf https://factframe.tech/install.sh | sh

Installs uv if it is missing, asks which folder to use, then sets up Claude Desktop, Cursor and Windsurf.

Need it for a team? Talk to us
CONTACT

Talk to the people who build it.

Need Google Drive or SharePoint connected, or a secured deployment for your team? Send a note and a person will reply.

What helps us reply faster
  • 01The type of document: contract, lab report, statement, spreadsheet.
  • 02The question you need answered from it.
  • 03Where it should run: a laptop, your servers, or inside your agent.
Prefer email?[email protected]
What is it about? Optional
A few sentences are enough. Please do not paste confidential content.

We use your details only to reply. No newsletter.