How to OCR Scanned PDFs by Asking Claude
Every company has that folder: leases from the nineties, signed contracts that only exist as scans, supplier paperwork someone photographed in a hurry. To a computer they're photos — you can't search them, quote them, or ask about them.
If you already work with Claude, you don't need OCR software for this. Connect it to Apdf over MCP once, and “make this searchable” becomes a sentence — with the follow-up questions answered from the recovered text in the same conversation.
Connect Claude to Apdf
The MCP server lives at a single OAuth-signed endpoint — no API keys, no token files:
https://apdf.io/mcp/main
In Claude Desktop add it under Settings → Connectors → custom connector and sign in when the OAuth window opens. In Claude Code it's a one-liner:
claude mcp add --transport http apdf https://apdf.io/mcp/main
Confirm what you're dealing with
Point Claude at the scan (any publicly reachable URL) and ask. The agent checks the text layer before promising anything:
https://storage.example.com/lease-1997-scan.pdf
The read-pdf-content tool returns the evidence:
{
"pages_total": 2,
"characters_total": 0,
"pages": [
{ "page": 1, "characters": 0, "content": "" },
{ "page": 2, "characters": 0, "content": "" }
]
}
Make it searchable
OCR is heavy work, so the tool runs asynchronously: the agent gets a job id,
polls check-job-status, and comes back with the
result. You just keep talking:
The finished job carries the new file:
{
"id": "01KY70KVEE9KZKHF0WCXJ74R9A",
"created": "2026-07-23T08:14:03.000000Z",
"status": "successful",
"result": {
"file": "https://apdf-files.s3.eu-central-1.amazonaws.com/841339df6a61cd66582fc.pdf",
"size": 118042,
"pages": 2,
"expiration": "2026-07-23T09:14:32.656458Z"
}
}
Ask the document, don't read it
For a whole archive you don't even need the converted files —
search-pdf-content-with-ocr and
read-pdf-content-with-ocr run the OCR pass and
answer directly from the recovered text:
The search result pins the claim to the page and line it came from:
{
"search_text": "renew",
"results_total": 1,
"results_pages": 1,
"results": [
{
"page": "2",
"matched_line": "5. RENEWAL OPTION. Tenant shall have one option to renew for an additional five-year term, with",
"exact_word": "RENEW"
}
]
}
Where to go from here
The same connection carries every PDF operation — and the engagement layer behind them.
Your code made the PDF.
Then it went dark.
Opened, read, re-read, dropped on page 4 — you never see any of it. Share the PDFs you generate through Apdf recipient links, and every signal becomes something you can act on: ping Slack, update the CRM, let an agent follow up. Same account, same API token, one more call.
API · Webhook · MCP