Hosted OCRmyPDF: add a searchable text layer to scanned PDFs and images, returned as PDF/A.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Your API key; signing in with OAuth works instead
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Check an OCR job you queued with `ocr_pdf`. Returns `job_id` and `status` (`queued`, `running`, `succeeded` or `failed`). A succeeded job includes `download_url`, a link to the searchable PDF that works for 60 minutes without an API key: give it to the user. A failed job includes `error` (one sentence) and `code`. Results are deleted 7 days after submission. Requires an API key. Credits: free. This tool is not metered.
The `job_id` returned by `ocr_pdf`.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http ocrmypdf https://api.pagespool.com/mcp/ocrmypdf/
Headers
X-API-Key (optional, not in the config above): Your API key; signing in with OAuth works insteadCheck an OCR job you queued with `ocr_pdf`. Returns `job_id` and `status` (`queued`, `running`, `succeeded` or `failed`). A succeeded job includes `download_url`, a link to the searchable PDF that works for 60 minutes without an API key: give it to the user. A failed job includes `error` (one sentence) and `code`. Results are deleted 7 days after submission. Requires an API key. Credits: free. This tool is not metered.
| Argument | Type | Description |
|---|---|---|
| job_id* | string | The `job_id` returned by `ocr_pdf`. |
{
"type": "object",
"required": [
"job_id"
],
"properties": {
"job_id": {
"type": "string",
"description": "The `job_id` returned by `ocr_pdf`."
}
},
"additionalProperties": false
}Queue a scanned PDF, PNG or JPEG for OCR with OCRmyPDF and Tesseract. The result is the same document with a searchable text layer, as PDF/A by default. Pass the file as base64 in `content_base64` (up to 4 MB) or as a download link in `file` (up to 25 MB), and its name in `filename`. Up to 200 pages; an image is one page. Returns `job_id`, `status`, `pages` and `credits`. Call `get_ocr_result` with the `job_id` until `status` is `succeeded` or `failed`; a job is stopped after 15 minutes. Requires an API key. Costs 2 credits per page, charged now and refunded if the job fails. The result is kept for 7 days.
| Argument | Type | Description |
|---|---|---|
| file | object | The file as a download link, instead of `content_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL. |
| mode | string | Pages that already have text: skip them (the default), redo an earlier OCR layer, or force OCR on every page as an image. |
| deskew | boolean | Straighten crooked pages. Not with mode=redo. |
| filename* | string | The file name with its extension: .pdf, .png, .jpg or .jpeg. |
| language | string | The document's language: eng, deu, spa or fra. |
| output_type | string | pdfa (PDF/A-2b, the default) or pdf. |
| rotate_pages | boolean | Turn pages that are upside down or sideways. |
| content_base64 | any | The file content, base64-encoded. Up to 4 MB before encoding. |
{
"type": "object",
"required": [
"filename"
],
"properties": {
"file": {
"type": "object",
"default": null,
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "An identifier for the file. ChatGPT sets it; other clients may pass any label, such as the file name."
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string",
"description": "A public https URL of the file."
}
},
"description": "The file as a download link, instead of `content_base64`. In ChatGPT, pass the user's uploaded file here. Other clients can set `download_url` to a public https URL."
},
"mode": {
"enum": [
"skip",
"redo",
"force"
],
"type": "string",
"default": "skip",
"description": "Pages that already have text: skip them (the default), redo an earlier OCR layer, or force OCR on every page as an image."
},
"deskew": {
"type": "boolean",
"default": false,
"description": "Straighten crooked pages. Not with mode=redo."
},
"filename": {
"type": "string",
"description": "The file name with its extension: .pdf, .png, .jpg or .jpeg."
},
"language": {
"enum": [
"eng",
"deu",
"spa",
"fra"
],
"type": "string",
"default": "eng",
"description": "The document's language: eng, deu, spa or fra."
},
"output_type": {
"enum": [
"pdfa",
"pdf"
],
"type": "string",
"default": "pdfa",
"description": "pdfa (PDF/A-2b, the default) or pdf."
},
"rotate_pages": {
"type": "boolean",
"default": false,
"description": "Turn pages that are upside down or sideways."
},
"content_base64": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "The file content, base64-encoded. Up to 4 MB before encoding."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 4, 2026.