{"name":"io.github.theluckystrike/pdf-merge-split-stamp-extract-pages","slug":"theluckystrike-pdf-merge-split-stamp-extract-pages","title":null,"description":"Merge, split, extract, rotate, reorder and stamp PDF pages from your AI chat, all offline.","url":"https://mcp.market/server/theluckystrike-pdf-merge-split-stamp-extract-pages","grade":"C","score":64,"certified":false,"status":"active","category":"scraping","tags":["scraping"],"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/theluckystrike/mcp-servers","website":"https://mcp.zovo.one/s/pdf","version":"0.22.0","remotes":[{"type":"streamable-http","url":"https://mcp.zovo.one/mcp/pdf","headers":[{"description":"Bearer <Pro license key or anonymous token from GET https://mcp.zovo.one/mcp/token>","isRequired":true,"isSecret":true,"name":"Authorization"}]}],"packages":[{"registryType":"mcpb","identifier":"https://github.com/theluckystrike/mcp-servers/releases/download/v0.22.0/pdf.mcpb","version":"0.22.0","fileSha256":"6dba36f80f9bb152199ad8405783271cfc83ba4f7fed1defc7536a5a0d460345","transport":{"type":"stdio"},"environmentVariables":[{"description":"Optional Pro license key (MCPL1....). Verified offline.","isSecret":true,"name":"MCP_LICENSE_KEY"}]}],"tools":[{"name":"license_activate","description":"Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"type":"string","description":"License key from checkout, MCPL1.<payload>.<signature>"}},"required":["key"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"license_status","description":"Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"pdf_count","description":"Page count per file plus the total, for any number of PDFs, with how many were readable. A file that cannot be read is reported on its own row and the others still count. Read-only. Free and unlimited.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"paths":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Names of PDFs uploaded with pdf_upload"}},"required":["paths"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"pdf_delete_upload","description":"Delete one PDF stored for your token, uploaded or generated.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":70}},"required":["name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"pdf_files","description":"List the PDFs stored for your token: what you uploaded, and what this server has written, with their sizes.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"pdf_info","description":"Call this tool to inspect a PDF: page count, page sizes in points/mm, paper name, metadata (title, author, producer, dates) and whether it is encrypted. Read-only, never modifies the file. Free tier: unlimited.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Name of a PDF uploaded with pdf_upload, or one this server wrote earlier"}},"required":["path"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"pdf_merge","description":"Call this tool to join several PDFs into one, in the order given. Page sizes are kept as-is, so a merged file may have mixed sizes, and the answer says so. Inputs are never modified. Free tier: up to 5 files per merge.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"paths":{"type":"array","items":{"type":"string"},"minItems":2,"description":"Names of the uploaded PDFs to join, in the order they should appear"},"out_path":{"type":"string","description":"Name for the merged PDF; it comes back as a download link valid for one hour"},"overwrite":{"type":"boolean","description":"Replace out_path if a file is already there. Default false: an existing file is never overwritten"}},"required":["paths","out_path"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"pdf_pages","description":"Call this tool to pull selected pages into one new PDF, in the order written: \"2,4-6\" gives four pages. Asking for a page twice copies it twice. The input is never modified. Free tier: files up to 30 pages.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Name of an uploaded PDF (pdf_upload), or one this server wrote earlier"},"pages":{"type":"string","description":"1-based pages and ranges to keep, in output order, e.g. \"2,4-6\" or \"5,1,1\""},"out_path":{"type":"string","description":"Name for the extracted PDF; it comes back as a download link valid for one hour"},"overwrite":{"type":"boolean","description":"Replace out_path if it exists. Default false"}},"required":["path","pages","out_path"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"pdf_reorder","description":"Call this tool to write a new PDF with pages in the order you give. The order must name every page exactly once, so nothing drops by accident; use pdf_pages for a subset. Pro.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Name of an uploaded PDF (pdf_upload), or one this server wrote earlier"},"order":{"type":"array","items":{"type":"integer","exclusiveMinimum":0},"minItems":1,"description":"The 1-based page numbers in their new order, e.g. [3,1,2] for a three-page file. Every page must appear exactly once"},"out_path":{"type":"string","description":"Name for the reordered PDF; it comes back as a download link valid for one hour"},"overwrite":{"type":"boolean","description":"Replace out_path if it exists. Default false"}},"required":["path","order","out_path"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"pdf_rotate","description":"Call this tool to turn pages by a multiple of 90 degrees, clockwise for positive. Rotation is added to whatever the page already had, for a sideways scan. Writes a new file. Free tier: files up to 30 pages.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Name of an uploaded PDF (pdf_upload), or one this server wrote earlier"},"degrees":{"type":"integer","description":"90, 180, 270 or -90. Positive turns clockwise. Added to the page's existing rotation"},"pages":{"type":"string","description":"Which pages to turn, e.g. \"1\" or \"2,4-6\". Omit for every page"},"out_path":{"type":"string","description":"Name for the rotated PDF; it comes back as a download link valid for one hour"},"overwrite":{"type":"boolean","description":"Replace out_path if it exists. Default false"}},"required":["path","degrees","out_path"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"pdf_split","description":"Call this tool to write one new PDF per range. Ranges are 1-based and may be open-ended: \"1-3,5,7-\" gives pages 1-3, page 5, and 7 to the end. The input is never modified. Free tier: files up to 30 pages.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Name of the uploaded PDF to split"},"ranges":{"type":"string","description":"Comma-separated 1-based page ranges, e.g. \"1-3,5,7-\". An open-ended range runs to the last page"},"out_path_pattern":{"type":"string","description":"Name pattern for the parts: {n} is the part number (1, 2, 3...), {range} is the range itself (e.g. 1-3), {name} is the input name. Example: {name}-{range}.pdf. Each part comes back as a download link valid for one hour"},"overwrite":{"type":"boolean","description":"Replace existing outputs. Default false: nothing is overwritten and nothing is written at all if any target exists"}},"required":["path","ranges","out_path_pattern"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"pdf_stamp","description":"Call this tool to draw a word such as PAID or DRAFT across the pages, in a colour and position you choose. Writes a new file; input untouched. Free tier: the PAID and DRAFT presets in their preset colours.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Name of an uploaded PDF (pdf_upload), or one this server wrote earlier"},"text":{"type":"string","minLength":1,"description":"What to stamp. PAID and DRAFT are presets with their own colour; any other text is Pro"},"position":{"type":"string","enum":["center","top-left","top-center","top-right","middle-left","middle-right","bottom-left","bottom-center","bottom-right"],"description":"Where on the page. Default center, which is drawn on the 45-degree diagonal like a real stamp"},"opacity":{"type":"number","description":"0 to 1. Default 0.35 in the centre, 0.85 in a corner"},"color":{"type":"string","description":"Hex code such as #1b7f3b, or a name: red, green, blue, black, gray, orange, purple. Pro"},"font_size":{"type":"number","description":"Point size. By default the stamp is sized to fit the page width"},"pages":{"type":"string","description":"Which pages to stamp, e.g. \"1\" or \"2,4-6\". Omit for every page"},"out_path":{"type":"string","description":"Name for the stamped PDF; it comes back as a download link valid for one hour"},"overwrite":{"type":"boolean","description":"Replace out_path if it exists. Default false"}},"required":["path","text","out_path"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"pdf_text","description":"Call this tool for best-effort text extraction from standard-font PDFs. Returns nothing for a scan (no OCR), or glyph indices for a custom-encoded font, and says which case applies. Read-only. Free tier: unlimited.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Name of the PDF to read"},"pages":{"type":"string","description":"Which pages, e.g. \"1\" or \"2,4-6\". Omit for every page"}},"required":["path"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"pdf_upload","description":"Send a PDF to this hosted endpoint. There is no filesystem here, so instead of a path you upload the file once with pdf_upload and then pass its name as `path` (or inside `paths`) to pdf_info, pdf_count, pdf_merge, pdf_split, pdf_pages, pdf_rotate, pdf_stamp, pdf_reorder and pdf_text. Give exactly one of pdf_base64 or url. url: fetch a public file instead of pasting base64 (recommended above about 10 KB): pasting a large base64 payload is slow to write out and can stall the turn before the call is ever sent, while a url costs one line and the fetch happens here. Uploads are kept for your token between calls; pdf_files lists them and pdf_delete_upload removes one. A file this server writes is named the same way and comes back as a download link valid for one hour. The request body cap is 256 KB, which is about 190 KB of PDF once base64-encoded; a url is fetched with a 10 second timeout, at most 3 redirects, public http(s) hosts only, and is capped at 2 MB.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":70,"description":"Name to refer to this PDF by: 1-64 characters of letters, digits, underscore or dash, e.g. \"invoice\""},"pdf_base64":{"type":"string","description":"The PDF file, base64-encoded"},"url":{"type":"string","description":"url: fetch a public file instead of pasting base64 (recommended above about 10 KB). Public http(s) only; private, link-local and this endpoint's own zone are refused"}},"required":["name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"pdf_watermark_business","description":"Call this tool to put your business name and VAT id in the footer of every page, from the shared profile mcp-invoice and mcp-docx write. Use it before sending a document out. Pro.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Name of an uploaded PDF (pdf_upload), or one this server wrote earlier"},"out_path":{"type":"string","description":"Name for the footed PDF; it comes back as a download link valid for one hour"},"overwrite":{"type":"boolean","description":"Replace out_path if it exists. Default false"},"pages":{"type":"string","description":"Which pages, e.g. \"1\". Omit for every page"}},"required":["path","out_path"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}],"scan":{"score":64,"grade":"C","scanned_at":"2026-09-17T16:31:50.908Z","report":{"scannerVersion":"0.1.2","scannedAt":"2026-09-17T16:31:50.747Z","components":{"code":{"score":-1,"max":25,"notes":["package could not be scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 958ms"]},"poisoning":{"score":15,"max":15,"notes":["15 tool descriptions checked"]},"auth":{"score":8,"max":15,"notes":["API key sent as a header"]},"maintenance":{"score":3,"max":15,"notes":["repository not readable: github 401"]},"identity":{"score":2,"max":10,"notes":["no repository or website to verify"]}},"findings":[],"inputs":{"probes":[{"url":"https://mcp.zovo.one/mcp/pdf","reachable":true,"authRequired":false,"latencyMs":958,"serverInfo":{"name":"mcp-pdf","version":"0.22.0"}}],"packages":[],"repo":{"found":false,"owner":"theluckystrike","repo":"mcp-servers","error":"github 401"}}}},"grade_history":[]}