Zovo PDF Merge MCP
Merge, reorder, rotate, and split PDF files directly in chat. It combines up to 20 PDFs into one document, handles page ranges, and can split documents into multiple files or a ZIP archive.
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.
https://pdf-merge.zovo.one/mcpWhat its tools do
3 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (3)
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 PDFs into a single document
- Reorder and rotate PDF pages
- Split a PDF into multiple files or a ZIP archive
- Inspect PDF metadata like page count and encryption
Source and maintenance
Protocol and capabilities
- Server
- pdf-merge 1.0.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 3 advertised
- Resources
- 1 advertised
- Resource templates
- 1 advertised
- Prompts
- Not advertised
{
"tools": {
"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.
Tools
3 advertised
merge_pdfs — Merge PDFs
Use this when the user wants to merge PDF files, combine PDFs into one, join PDF pages, reorder PDF pages, take only some pages of each PDF, delete pages from a PDF, or rotate PDF pages. Takes 1 to 20 attached PDFs in attach order and an optional list of parts (file number, page ranges like "1-3, 7, 10-end", pages to skip, rotation 90/180/270), and returns one new PDF with the page plan and a check that the output page count, order, sizes and rotation match the plan. With one file, it can delete, reorder or rotate pages. Does not open password-protected PDFs, does not keep form fields editable (they are flattened), and does not edit text. Do not use for splitting one PDF into several files (use split_pdf).
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"files"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"file_name": {
"type": "string",
"description": "Original file name if known, e.g. statement.pdf."
},
"mime_type": {
"type": "string",
"description": "Media type if known, e.g. application/pdf."
},
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
}
}
},
"maxItems": 20,
"minItems": 1,
"description": "The PDFs to merge, in order, e.g. cover.pdf, report.pdf, appendix.pdf."
},
"parts": {
"type": "array",
"items": {
"type": "object",
"required": [
"file"
],
"properties": {
"file": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "1-based number of the attached file, in attach order, e.g. 2."
},
"skip": {
"type": "string",
"maxLength": 400,
"description": "Pages of that file to leave out (delete), e.g. \"4, 9\". Optional."
},
"pages": {
"type": "string",
"maxLength": 400,
"description": "Pages of that file to take, in order, e.g. \"1-3, 7, 10-end\". Default: all pages."
},
"rotate": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Extra clockwise rotation for these pages: 0, 90, 180 or 270, e.g. 90. Default 0."
}
}
},
"maxItems": 200,
"description": "Optional page plan, in output order, e.g. [{\"file\":2,\"pages\":\"1-3\"},{\"file\":1,\"pages\":\"all\",\"rotate\":90}]. Default: all pages of all files in attach order."
},
"output_name": {
"type": "string",
"maxLength": 120,
"description": "File name for the result, e.g. contract-signed-set.pdf. Default: merged.pdf."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"output_name",
"output_pages",
"output_size_kb",
"files",
"plan",
"check",
"notes",
"downloads",
"expires_in_hours"
],
"properties": {
"plan": {
"type": "array",
"items": {
"type": "object",
"required": [
"out_pages",
"file",
"file_name",
"source_pages",
"count",
"size",
"rotation"
],
"properties": {
"file": {
"type": "number"
},
"size": {
"type": "string"
},
"count": {
"type": "number"
},
"rotation": {
"type": "number"
},
"file_name": {
"type": "string"
},
"out_pages": {
"type": "string"
},
"source_pages": {
"type": "string"
}
},
"additionalProperties": false
}
},
"check": {
"type": "object",
"required": [
"passed",
"what",
"problems"
],
"properties": {
"what": {
"type": "string"
},
"passed": {
"type": "boolean"
},
"problems": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"file",
"name",
"pages",
"size_kb",
"form_fields"
],
"properties": {
"file": {
"type": "number"
},
"name": {
"type": "string"
},
"pages": {
"type": "number"
},
"size_kb": {
"type": "number"
},
"form_fields": {
"type": "number"
}
},
"additionalProperties": false
}
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"downloads": {
"type": "object",
"required": [
"pdf"
],
"properties": {
"pdf": {
"type": "string"
}
},
"additionalProperties": false
},
"plan_count": {
"type": "object",
"required": [
"shown",
"total"
],
"properties": {
"shown": {
"type": "number"
},
"total": {
"type": "number"
}
},
"additionalProperties": false
},
"output_name": {
"type": "string"
},
"output_pages": {
"type": "number"
},
"output_size_kb": {
"type": "number"
},
"expires_in_hours": {
"type": "number"
}
},
"additionalProperties": false
}{
"title": "Merge PDFs",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}split_pdf — Split a PDF
Use this when the user wants to split a PDF into several files, break a PDF into parts, extract page ranges as separate PDFs, split in groups of N pages, or save each page as its own PDF. Takes one attached PDF and one of: ranges (each item becomes one file, e.g. ["1-3", "4-end"]), every_n_pages, or each_page. Returns a ZIP of up to 50 PDFs, plus separate links when there are 10 parts or fewer, and checks each part's page count. Does not open password-protected PDFs and flattens form fields. Do not use for combining several PDFs (use merge_pdfs).
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"file"
],
"properties": {
"file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"file_name": {
"type": "string",
"description": "Original file name if known, e.g. statement.pdf."
},
"mime_type": {
"type": "string",
"description": "Media type if known, e.g. application/pdf."
},
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
}
},
"description": "The PDF to split, e.g. handbook.pdf."
},
"ranges": {
"type": "array",
"items": {
"type": "string",
"maxLength": 400
},
"maxItems": 50,
"description": "One item per output file, e.g. [\"1-4\", \"5-12\", \"13-end\"]. An item may list several ranges: \"1-2, 9\"."
},
"each_page": {
"type": "boolean",
"description": "true: one PDF per page, e.g. true."
},
"every_n_pages": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Make a new file in groups of N pages, e.g. 2."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"file",
"source_pages",
"parts_count",
"parts",
"check",
"notes",
"downloads",
"expires_in_hours"
],
"properties": {
"file": {
"type": "string"
},
"check": {
"type": "object",
"required": [
"passed",
"what",
"problems"
],
"properties": {
"what": {
"type": "string"
},
"passed": {
"type": "boolean"
},
"problems": {
"type": "array",
"items": {
"type": "string"
}
}
},
"additionalProperties": false
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"parts": {
"type": "array",
"items": {
"type": "object",
"required": [
"part",
"name",
"pages",
"page_count",
"checked"
],
"properties": {
"name": {
"type": "string"
},
"part": {
"type": "number"
},
"pages": {
"type": "string"
},
"checked": {
"type": "boolean"
},
"page_count": {
"type": "number"
}
},
"additionalProperties": false
}
},
"downloads": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"parts_count": {
"type": "number"
},
"parts_shown": {
"type": "object",
"required": [
"shown",
"total"
],
"properties": {
"shown": {
"type": "number"
},
"total": {
"type": "number"
}
},
"additionalProperties": false
},
"source_pages": {
"type": "number"
},
"expires_in_hours": {
"type": "number"
}
},
"additionalProperties": false
}{
"title": "Split a PDF",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}inspect_pdf — Inspect a PDF
Use this when the user wants to know how many pages a PDF has, its page sizes (Letter, A4, landscape), which pages are rotated or cropped, whether it is password-protected, whether it has form fields, or whether it has selectable text, before merging or splitting it. Takes one attached PDF and returns these facts with no new file. Does not read or summarize the text, does not run OCR, and does not change the file.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"file"
],
"properties": {
"file": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"file_name": {
"type": "string",
"description": "Original file name if known, e.g. statement.pdf."
},
"mime_type": {
"type": "string",
"description": "Media type if known, e.g. application/pdf."
},
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
}
},
"description": "The PDF to inspect, e.g. contract.pdf."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"file",
"size_mb",
"pages",
"encrypted",
"page_sizes",
"rotated_pages",
"cropped_pages",
"form_fields",
"has_text",
"text_check",
"notes"
],
"properties": {
"file": {
"type": "string"
},
"notes": {
"type": "array",
"items": {
"type": "string"
}
},
"pages": {
"type": "number"
},
"size_mb": {
"type": "number"
},
"has_text": {
"type": "string"
},
"encrypted": {
"type": "boolean"
},
"page_sizes": {
"type": "array",
"items": {
"type": "object",
"required": [
"size",
"width_pt",
"height_pt",
"pages",
"count"
],
"properties": {
"size": {
"type": "string"
},
"count": {
"type": "number"
},
"pages": {
"type": "string"
},
"width_pt": {
"type": "number"
},
"height_pt": {
"type": "number"
}
},
"additionalProperties": false
}
},
"text_check": {
"type": "string"
},
"form_fields": {
"type": "number"
},
"cropped_pages": {
"type": "number"
},
"rotated_pages": {
"type": "array",
"items": {
"type": "object",
"required": [
"pages",
"rotation"
],
"properties": {
"pages": {
"type": "string"
},
"rotation": {
"type": "number"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}{
"title": "Inspect a PDF",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
Not advertised
Resources
1 advertised
pdf-merge-widget — Zovo PDF Merge view
Interactive view for Zovo PDF Merge.
ui://widget/pdf-merge-v1-1.0.0-aae3a8602ed0dc5fc08a5845c60e84268d071c097343a3be6353b0e707d2c509.htmlpdf-merge-widget-legacy — Zovo PDF Merge view (previous versions)
ui://widget/pdf-merge-{version}.html30-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
- 1071 ms
- 95th percentile latency
- 1071 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1071 ms · metadata changed · 3 tool(s), 1 resource(s), 1 resource template(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http zovo-pdf-merge-mcp https://pdf-merge.zovo.one/mcpCodex
codex mcp add zovo-pdf-merge-mcp --url https://pdf-merge.zovo.one/mcpCursor
{
"mcpServers": {
"zovo-pdf-merge-mcp": {
"url": "https://pdf-merge.zovo.one/mcp"
}
}
}Cline
{
"mcpServers": {
"zovo-pdf-merge-mcp": {
"type": "streamableHttp",
"url": "https://pdf-merge.zovo.one/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"zovo-pdf-merge-mcp": {
"type": "http",
"url": "https://pdf-merge.zovo.one/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http zovo-pdf-merge-mcp https://pdf-merge.zovo.one/mcpClaude Desktop
https://pdf-merge.zovo.one/mcpWindsurf
{
"mcpServers": {
"zovo-pdf-merge-mcp": {
"serverUrl": "https://pdf-merge.zovo.one/mcp"
}
}
}Let your agent find its tools
Find servers like Zovo PDF Merge MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.