Koskamo

theluckystrike MCP PDF Tools

A community MCP server that allows agents to merge, split, rotate, reorder, and stamp PDF pages, as well as extract text from PDF files. It operates without native code dependencies, supporting both local installation via npm and hosted access via a token-based URL.

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.

theluckystrike MCP PDF Tools logo, by theluckystrikeCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by theluckystrike
MCP endpoint (Streamable HTTP)
https://mcp.zovo.one/mcp/pdf
Vendor documentation

What its tools do

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

15 of 15 have a description · 15 of 15 declare behavior hints · 12 of 13 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Merge multiple PDF files into a single document
  • Split a PDF into specific page ranges
  • Rotate specific pages within a PDF
  • Stamp PAID or DRAFT text onto PDF pages

Source and maintenance

Community listingRegistry 0.23.0
Maintenance checked

Protocol and capabilities

Server
mcp-pdf 0.22.6
MCP protocol negotiated in check
2025-11-25
Tools
15 advertised
Resources
2 advertised
Resource templates
0 advertised
Prompts
2 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "prompts": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

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

Work on existing PDF files. It covers page counts, sizes and metadata, merging, splitting, extracting, rotating and reordering pages, PAID or DRAFT stamps, footers with the business name and VAT id from the shared business profile, and best-effort text extraction without OCR. Inputs are never modified. McpStamp's hosted service has no file system, so PDFs arrive as base64 uploads or public URLs, are kept per user account, and results come back as one-hour download links. The free tier allows 5 files per merge and files up to 30 pages. One lifetime key unlocks this server and all 58 others: https://mcp.zovo.one/buy/bundle?src=instr.pdf

Tools

15 advertised

pdf_info — Inspect a PDF
Advertised by the server during the last successful anonymous check.

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.

pdf_info input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "path"
  ],
  "properties": {
    "path": {
      "type": "string",
      "description": "Name of a PDF uploaded with pdf_upload, or one this server wrote earlier"
    }
  },
  "additionalProperties": false
}
pdf_info annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
pdf_count — Count pages in several PDFs
Advertised by the server during the last successful anonymous check.

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.

pdf_count input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "paths"
  ],
  "properties": {
    "paths": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "minItems": 1,
      "description": "Names of PDFs uploaded with pdf_upload"
    }
  },
  "additionalProperties": false
}
pdf_count annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
pdf_merge — Merge PDFs into one file
Advertised by the server during the last successful anonymous check.

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.

pdf_merge input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "paths",
    "out_path"
  ],
  "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"
    }
  },
  "additionalProperties": false
}
pdf_merge annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
pdf_split — Split a PDF into several files
Advertised by the server during the last successful anonymous check.

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.

pdf_split input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "path",
    "ranges",
    "out_path_pattern"
  ],
  "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"
    },
    "overwrite": {
      "type": "boolean",
      "description": "Replace existing outputs. Default false: nothing is overwritten and nothing is written at all if any target exists"
    },
    "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"
    }
  },
  "additionalProperties": false
}
pdf_split annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
pdf_pages — Extract pages into a new PDF
Advertised by the server during the last successful anonymous check.

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.

pdf_pages input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "path",
    "pages",
    "out_path"
  ],
  "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"
    }
  },
  "additionalProperties": false
}
pdf_pages annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
pdf_rotate — Rotate pages
Advertised by the server during the last successful anonymous check.

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.

pdf_rotate input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "path",
    "degrees",
    "out_path"
  ],
  "properties": {
    "path": {
      "type": "string",
      "description": "Name of an uploaded PDF (pdf_upload), or one this server wrote earlier"
    },
    "pages": {
      "type": "string",
      "description": "Which pages to turn, e.g. \"1\" or \"2,4-6\". Omit for every page"
    },
    "degrees": {
      "type": "integer",
      "description": "90, 180, 270 or -90. Positive turns clockwise. Added to the page's existing rotation"
    },
    "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"
    }
  },
  "additionalProperties": false
}
pdf_rotate annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
pdf_stamp — Stamp text on a PDF
Advertised by the server during the last successful anonymous check.

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.

pdf_stamp input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "path",
    "text",
    "out_path"
  ],
  "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"
    },
    "color": {
      "type": "string",
      "description": "Hex code such as #1b7f3b, or a name: red, green, blue, black, gray, orange, purple. Pro"
    },
    "pages": {
      "type": "string",
      "description": "Which pages to stamp, e.g. \"1\" or \"2,4-6\". Omit for every page"
    },
    "opacity": {
      "type": "number",
      "description": "0 to 1. Default 0.35 in the centre, 0.85 in a corner"
    },
    "out_path": {
      "type": "string",
      "description": "Name for the stamped PDF; it comes back as a download link valid for one hour"
    },
    "position": {
      "enum": [
        "center",
        "top-left",
        "top-center",
        "top-right",
        "middle-left",
        "middle-right",
        "bottom-left",
        "bottom-center",
        "bottom-right"
      ],
      "type": "string",
      "description": "Where on the page. Default center, which is drawn on the 45-degree diagonal like a real stamp"
    },
    "font_size": {
      "type": "number",
      "description": "Point size. By default the stamp is sized to fit the page width"
    },
    "overwrite": {
      "type": "boolean",
      "description": "Replace out_path if it exists. Default false"
    }
  },
  "additionalProperties": false
}
pdf_stamp annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
pdf_watermark_business — Stamp your business details in the footer
Advertised by the server during the last successful anonymous check.

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.

pdf_watermark_business input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "path",
    "out_path"
  ],
  "properties": {
    "path": {
      "type": "string",
      "description": "Name of an uploaded PDF (pdf_upload), or one this server wrote earlier"
    },
    "pages": {
      "type": "string",
      "description": "Which pages, e.g. \"1\". Omit for every page"
    },
    "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"
    }
  },
  "additionalProperties": false
}
pdf_watermark_business annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
pdf_reorder — Reorder the pages of a PDF
Advertised by the server during the last successful anonymous check.

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.

pdf_reorder input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "path",
    "order",
    "out_path"
  ],
  "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"
    }
  },
  "additionalProperties": false
}
pdf_reorder annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
pdf_text — Read the text of a PDF
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

pdf_text input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "path"
  ],
  "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"
    }
  },
  "additionalProperties": false
}
pdf_text annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
license_status — License status
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

license_status input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
license_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
license_activate — Activate license
Advertised by the server during the last successful anonymous check.

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.

license_activate input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "key"
  ],
  "properties": {
    "key": {
      "type": "string",
      "description": "License key from checkout, MCPL1.<payload>.<signature>"
    }
  },
  "additionalProperties": false
}
license_activate annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
pdf_upload — Upload a PDF to work on
Advertised by the server during the last successful anonymous check.
Advertised destructive

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.

pdf_upload input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "name"
  ],
  "properties": {
    "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"
    },
    "name": {
      "type": "string",
      "maxLength": 70,
      "minLength": 1,
      "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"
    }
  },
  "additionalProperties": false
}
pdf_upload annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
pdf_files — List uploaded and generated PDFs
Advertised by the server during the last successful anonymous check.
Advertised read-only

List the PDFs stored for your token: what you uploaded, and what this server has written, with their sizes.

pdf_files input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
pdf_files annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
pdf_delete_upload — Delete a stored PDF
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete one PDF stored for your token, uploaded or generated.

pdf_delete_upload input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 70,
      "minLength": 1
    }
  },
  "additionalProperties": false
}
pdf_delete_upload annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": true
}

Prompts

2 advertised

mark_invoice_paid — Mark an invoice PDF as PAID

Advertised by the server during the last successful anonymous check.

Find an invoice, stamp PAID across it and save the stamped copy beside the original.

reference
The invoice reference, e.g. INV-2026-0007 (required)
path
The invoice PDF, if you already know where it is
upgrade_to_pro — Explain the upgrade

Advertised by the server during the last successful anonymous check.

Explain what Pro on the pdf server costs and exactly what the user has to do, without leaving the conversation.

feature
The capped feature that prompted this, if there was one

Resources

2 advertised

recent-operations — Recent PDF operations

Advertised by the server during the last successful anonymous check.

What this server has done, newest first: the operation, the input files, the files written and when.

recent-operations URI
pdf://recent

MIME type: application/json

pricing — Pricing and upgrade

Advertised by the server during the last successful anonymous check.

What pdf costs, what Pro unlocks, the checkout link that carries this connection's token, and the one step a person has to take. Machine-readable; read it before telling a user how to lift a free-tier cap.

pricing URI
pricing://pdf

MIME type: application/json

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
1683 ms
95th percentile latency
1683 ms

Maintenance history

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

  • · probe · passed · 1683 ms · metadata changed · 15 tool(s), 2 resource(s), 0 resource template(s), 2 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 mcp-pdf-tools https://mcp.zovo.one/mcp/pdf

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 mcp-pdf-tools --url https://mcp.zovo.one/mcp/pdf

Cursor

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

Cline

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

VS Code

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

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 mcp-pdf-tools https://mcp.zovo.one/mcp/pdf

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.zovo.one/mcp/pdf

Windsurf

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

Let your agent find its tools

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