Koskamo

FixMyScan MCP

An official MCP server that allows AI agents to process scanned book PDFs and DjVu files into clean, searchable, and optimized PDFs suitable for e-readers like Kindle. It handles tasks such as straightening pages, splitting spreads, trimming margins, and performing OCR in 19 languages.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

FixMyScan MCP logo, by FixMyScanVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by FixMyScan
You need:sign in with Google or your emailFree plans can add one custom connector
MCP endpoint (Streamable HTTP)
https://mcp.fixmyscan.com/mcp
Vendor documentation

What its tools do

7 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

7 of 7 have a description · 7 of 7 declare behavior hints · 5 of 5 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to fixmyscan.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Convert scanned book PDFs into searchable text
  • Clean up and straighten scanned pages
  • Split two-page spreads into single pages
  • Optimize PDFs for e-readers like Kindle

Source and maintenance

Vendor evidenceRegistry 1.1.0

Protocol and capabilities

Server
FixMyScan 1.1.0
MCP protocol negotiated in check
2025-11-25
Tools
7 advertised
Resources
1 advertised
Resource templates
0 advertised
Prompts
0 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

FixMyScan turns scanned books (PDF or DjVu) into clean, searchable PDFs for e-readers. Start a book with fix_scan, then poll get_scan_status with its scan_id until it is ready and give the reader the download link. If you cannot pass the reader's file, call create_upload_link first; that includes a file attached in a chat that cannot hand attachments to tools. Files are deleted 24 hours after a book is ready.

Tools

7 advertised

fix_scan — Fix a scanned book
Advertised by the server during the last successful anonymous check.
Open-world

Turn a scanned book (PDF or DjVu, up to 1,000 pages) into a clean, searchable PDF for e-readers: pages cropped to the text, straightened, sharp black and white, two-page spreads split, and searchable text added. Use it when the user wants to fix, clean up, OCR or convert a scan for a Kindle, Kobo, reMarkable or tablet. Give exactly one source: file (a file the user attached here), source_url (a public https link to the file) or upload_id (from create_upload_link, after the user uploaded). It returns a scan_id at once and the book converts in the background; then call get_scan_status until it is ready and give the user the download link.

fix_scan input schema
{
  "type": "object",
  "properties": {
    "file": {
      "type": "object",
      "required": [
        "download_url",
        "file_id"
      ],
      "properties": {
        "file_id": {
          "type": "string",
          "description": "The attachment's id."
        },
        "file_name": {
          "type": "string"
        },
        "mime_type": {
          "type": "string"
        },
        "download_url": {
          "type": "string",
          "description": "Where the attached file can be downloaded."
        }
      },
      "description": "A PDF or DjVu file the user attached in this chat.",
      "additionalProperties": false
    },
    "output": {
      "enum": [
        "bw",
        "grey"
      ],
      "type": "string",
      "default": "bw",
      "description": "bw: sharp black and white, best on e-ink. grey: gentle greyscale."
    },
    "language": {
      "enum": [
        "auto",
        "ara",
        "chi_tra",
        "deu",
        "ell",
        "eng",
        "fra",
        "frk",
        "grc",
        "ita",
        "lat",
        "nld",
        "pol",
        "por",
        "rus",
        "san",
        "spa",
        "swe",
        "tam",
        "ukr"
      ],
      "type": "string",
      "default": "auto",
      "description": "The book's language for searchable text, as a Tesseract code; auto detects it."
    },
    "upload_id": {
      "type": "string",
      "pattern": "^job_[A-Za-z0-9_-]{1,60}$",
      "description": "The upload_id from create_upload_link, once the user has uploaded the file."
    },
    "source_url": {
      "type": "string",
      "format": "uri",
      "pattern": "^https://",
      "description": "A public https link to the PDF or DjVu file."
    },
    "trim_margins": {
      "type": "boolean",
      "default": true,
      "description": "Crop each page to its text block. Covers and picture pages stay whole."
    },
    "split_spreads": {
      "type": "boolean",
      "default": true,
      "description": "Split scans of two facing pages into single pages."
    },
    "idempotency_key": {
      "type": "string",
      "maxLength": 128,
      "description": "Optional. Repeat it on a retry so the same book is not started twice."
    }
  },
  "additionalProperties": false
}
fix_scan annotations
{
  "title": "Fix a scanned book",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
create_upload_link — Get an upload link
Advertised by the server during the last successful anonymous check.

Get a link where the user uploads a scanned PDF or DjVu from their device. Use it when you cannot pass the user's file to fix_scan: no attachment, a file too large to attach, or a file attached in a chat that cannot hand attachments to tools. Show the user the link; when they say it is uploaded, call fix_scan (or preview_scan) with the upload_id. The link works for one hour and one file.

create_upload_link input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
create_upload_link annotations
{
  "title": "Get an upload link",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
preview_scan — Preview a scan
Advertised by the server during the last successful anonymous check.
Open-world

Show what FixMyScan will do before converting: before-and-after images of 3 pages of the user's own book. Use it when the user wants to see the result first. Give the same source as fix_scan, or the scan_id of a book not yet converted. The first call returns at once; call again with the scan_id after about ten seconds for the images. To convert after the preview, call fix_scan with upload_id set to the scan_id.

preview_scan input schema
{
  "type": "object",
  "properties": {
    "file": {
      "type": "object",
      "required": [
        "download_url",
        "file_id"
      ],
      "properties": {
        "file_id": {
          "type": "string",
          "description": "The attachment's id."
        },
        "file_name": {
          "type": "string"
        },
        "mime_type": {
          "type": "string"
        },
        "download_url": {
          "type": "string",
          "description": "Where the attached file can be downloaded."
        }
      },
      "description": "A PDF or DjVu file the user attached in this chat.",
      "additionalProperties": false
    },
    "output": {
      "enum": [
        "bw",
        "grey"
      ],
      "type": "string",
      "default": "bw",
      "description": "bw: sharp black and white, best on e-ink. grey: gentle greyscale."
    },
    "scan_id": {
      "type": "string",
      "pattern": "^job_[A-Za-z0-9_-]{1,60}$",
      "description": "The scan_id fix_scan or list_my_scans gave."
    },
    "upload_id": {
      "type": "string",
      "pattern": "^job_[A-Za-z0-9_-]{1,60}$",
      "description": "The upload_id from create_upload_link, once the user has uploaded the file."
    },
    "source_url": {
      "type": "string",
      "format": "uri",
      "pattern": "^https://",
      "description": "A public https link to the PDF or DjVu file."
    },
    "trim_margins": {
      "type": "boolean",
      "default": true,
      "description": "Crop each page to its text block. Covers and picture pages stay whole."
    },
    "split_spreads": {
      "type": "boolean",
      "default": true,
      "description": "Split scans of two facing pages into single pages."
    }
  },
  "additionalProperties": false
}
preview_scan annotations
{
  "title": "Preview a scan",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": false
}
get_scan_status — Check a book
Advertised by the server during the last successful anonymous check.
Advertised read-only

Check one book: its stage, pages done of the total, and the download link once it is ready. Use it after fix_scan or preview_scan, or when the user asks how their book is doing. While a book is converting, call again every 10 to 20 seconds.

get_scan_status input schema
{
  "type": "object",
  "required": [
    "scan_id"
  ],
  "properties": {
    "scan_id": {
      "type": "string",
      "pattern": "^job_[A-Za-z0-9_-]{1,60}$",
      "description": "The scan_id fix_scan or list_my_scans gave."
    }
  },
  "additionalProperties": false
}
get_scan_status annotations
{
  "title": "Check a book",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_my_scans — List my books
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the user's recent books on FixMyScan with their state, and download links for finished ones. Use it when the user asks about their books or you need a scan_id. Files are deleted 24 hours after a book is ready.

list_my_scans input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
list_my_scans annotations
{
  "title": "List my books",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
cancel_scan — Stop a book
Advertised by the server during the last successful anonymous check.
Advertised destructive

Stop a book that is converting or waiting to start. Use it only when the user asks to stop or cancel it. A cancelled book does not count as used.

cancel_scan input schema
{
  "type": "object",
  "required": [
    "scan_id"
  ],
  "properties": {
    "scan_id": {
      "type": "string",
      "pattern": "^job_[A-Za-z0-9_-]{1,60}$",
      "description": "The scan_id fix_scan or list_my_scans gave."
    }
  },
  "additionalProperties": false
}
cancel_scan annotations
{
  "title": "Stop a book",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
delete_scan — Delete a book
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete a book's upload and finished files from FixMyScan now, rather than after 24 hours. Use it only when the user asks to delete the book. This cannot be undone.

delete_scan input schema
{
  "type": "object",
  "required": [
    "scan_id"
  ],
  "properties": {
    "scan_id": {
      "type": "string",
      "pattern": "^job_[A-Za-z0-9_-]{1,60}$",
      "description": "The scan_id fix_scan or list_my_scans gave."
    }
  },
  "additionalProperties": false
}
delete_scan annotations
{
  "title": "Delete a book",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}

Prompts

0 advertised

No prompt definitions available.

Resources

1 advertised

upload_box — Upload your scan

Advertised by the server during the last successful anonymous check.

A drop box for the scanned PDF or DjVu, inside the chat.

upload_box URI
ui://fixmyscan/upload-box-v2.html

MIME type: text/html;profile=mcp-app

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1559 ms
95th percentile latency
1559 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1559 ms · metadata changed · 7 tool(s), 1 resource(s), 0 resource template(s), 0 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http fixmyscan-mcp https://mcp.fixmyscan.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add fixmyscan-mcp --url https://mcp.fixmyscan.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable fixmyscan-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "fixmyscan-mcp": {
      "url": "https://mcp.fixmyscan.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "fixmyscan-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.fixmyscan.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start fixmyscan-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "fixmyscan-mcp": {
      "type": "http",
      "url": "https://mcp.fixmyscan.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http fixmyscan-mcp https://mcp.fixmyscan.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.fixmyscan.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "fixmyscan-mcp": {
      "serverUrl": "https://mcp.fixmyscan.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like FixMyScan MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run FixMyScan MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing