Merge PDF files into one document right in the chat.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
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.
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.
The PDF to inspect, e.g. contract.pdf.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http pdf-merge https://pdf-merge.zovo.one/mcp
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.
| Argument | Type | Description |
|---|---|---|
| file* | object | The PDF to inspect, e.g. contract.pdf. |
{
"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."
}
}
}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).
| Argument | Type | Description |
|---|---|---|
| files* | array | The PDFs to merge, in order, e.g. cover.pdf, report.pdf, appendix.pdf. |
| parts | array | 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 | string | 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": [
"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."
}
}
}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).
| Argument | Type | Description |
|---|---|---|
| file* | object | The PDF to split, e.g. handbook.pdf. |
| ranges | array | One item per output file, e.g. ["1-4", "5-12", "13-end"]. An item may list several ranges: "1-2, 9". |
| each_page | boolean | true: one PDF per page, e.g. true. |
| every_n_pages | integer | Make a new file in groups of N pages, e.g. 2. |
{
"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."
}
}
}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 8, 2026.