Add page numbers, Bates numbers or a text watermark to a PDF 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 Bates number a PDF, Bates stamp documents for a legal production, or add sequential document control numbers such as ACME000101 to each page. Takes one attached PDF, a prefix, start number, zero-padding digits (1-10), optional suffix and one of six positions, and returns a new PDF plus a CSV log of page number to Bates number, with the first and last Bates number. Each stamp is checked again in the new file before the link is given. Does not open password-protected PDFs, does not number across several files in one call (pass the next start number yourself), and does not draw non-Latin scripts. Do not use for simple page numbers (use stamp_page_numbers).
The PDF to Bates number, e.g. production-vol1.pdf.
First Bates number, e.g. 101. Default 1.
Zero-pad the number to this many digits, 1 to 10, e.g. 6 gives 000101. Default 6.
Text before the number, e.g. "ACME" or "SMITH-". Default none.
Text after the number, e.g. "-CONF". Default none.
Where the text goes on each page as viewed: top-left, top-center, top-right, bottom-left, bottom-center, bottom-right. Default bottom-right.
Font size in points from 6 to 36, e.g. 10 (default).
Distance from the page edge in points from 6 to 144, e.g. 24 (default).
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http page-numbers https://page-numbers.zovo.one/mcp
Use this when the user wants to Bates number a PDF, Bates stamp documents for a legal production, or add sequential document control numbers such as ACME000101 to each page. Takes one attached PDF, a prefix, start number, zero-padding digits (1-10), optional suffix and one of six positions, and returns a new PDF plus a CSV log of page number to Bates number, with the first and last Bates number. Each stamp is checked again in the new file before the link is given. Does not open password-protected PDFs, does not number across several files in one call (pass the next start number yourself), and does not draw non-Latin scripts. Do not use for simple page numbers (use stamp_page_numbers).
| Argument | Type | Description |
|---|---|---|
| file* | object | The PDF to Bates number, e.g. production-vol1.pdf. |
| start | integer | First Bates number, e.g. 101. Default 1. |
| digits | integer | Zero-pad the number to this many digits, 1 to 10, e.g. 6 gives 000101. Default 6. |
| prefix | string | Text before the number, e.g. "ACME" or "SMITH-". Default none. |
| suffix | string | Text after the number, e.g. "-CONF". Default none. |
| position | string | Where the text goes on each page as viewed: top-left, top-center, top-right, bottom-left, bottom-center, bottom-right. Default bottom-right. |
| font_size | number | Font size in points from 6 to 36, e.g. 10 (default). |
| margin_pt | number | Distance from the page edge in points from 6 to 144, e.g. 24 (default). |
{
"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 Bates number, e.g. production-vol1.pdf."
},
"start": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "First Bates number, e.g. 101. Default 1."
},
"digits": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Zero-pad the number to this many digits, 1 to 10, e.g. 6 gives 000101. Default 6."
},
"prefix": {
"type": "string",
"maxLength": 40,
"description": "Text before the number, e.g. \"ACME\" or \"SMITH-\". Default none."
},
"suffix": {
"type": "string",
"maxLength": 40,
"description": "Text after the number, e.g. \"-CONF\". Default none."
},
"position": {
"enum": [
"top-left",
"top-center",
"top-right",
"bottom-left",
"bottom-center",
"bottom-right"
],
"type": "string",
"description": "Where the text goes on each page as viewed: top-left, top-center, top-right, bottom-left, bottom-center, bottom-right. Default bottom-right."
},
"font_size": {
"type": "number",
"description": "Font size in points from 6 to 36, e.g. 10 (default)."
},
"margin_pt": {
"type": "number",
"description": "Distance from the page edge in points from 6 to 144, e.g. 24 (default)."
}
}
}Use this when the user wants to add page numbers to a PDF, number the pages of a PDF, put "Page 1 of 10" in a footer or header, or skip numbering the cover page. Takes one attached PDF, a format with {n} (this page's number) and optional {total} (the last number), one of six positions, start number, pages to skip at the start, font size and margin, and returns a new PDF. Each stamp is checked again in the new file before the link is given. Does not open password-protected PDFs, does not draw non-Latin scripts or emoji, and does not change the page content under the number. Do not use for Bates numbers (use stamp_bates_numbers).
| Argument | Type | Description |
|---|---|---|
| file* | object | The PDF to number, e.g. report.pdf. |
| format | string | Text with {n} and optional {total}, e.g. "Page {n} of {total}" (default), "{n}", "{n}/{total}" or "- {n} -". |
| position | string | Where the text goes on each page as viewed: top-left, top-center, top-right, bottom-left, bottom-center, bottom-right. Default bottom-center. |
| font_size | number | Font size in points from 6 to 36, e.g. 10 (default). |
| margin_pt | number | Distance from the page edge in points from 6 to 144, e.g. 36 (half an inch, default). |
| skip_first | integer | How many pages at the start get no number, e.g. 1 for a cover page. Default 0. |
Use this when the user wants to add a watermark to a PDF, stamp DRAFT, CONFIDENTIAL, COPY or SAMPLE across the pages, or mark only some pages. Takes one attached PDF, the watermark text (up to 40 characters), opacity from 0.05 to 0.5, angle from -90 to 90 degrees, optional pages such as "1-3, 8" and optional font size, and returns a new PDF with the text centered on each chosen page. Each stamp is checked again in the new file before the link is given. Does not add image or logo watermarks, does not open password-protected PDFs, and the text can be removed with PDF editing software. Do not use for page numbers.
| Argument | Type | Description |
|---|---|---|
| file* | object | The PDF to watermark, e.g. proposal.pdf. |
| text* | string | Watermark text, e.g. "DRAFT" or "CONFIDENTIAL". |
| angle | number | Angle in degrees counter-clockwise, -90 to 90, e.g. 45 (default) or 0 for flat. |
| pages | string | Pages to mark, e.g. "all" (default) or "1-3, 8, 10-end". |
| opacity | number | How strong the text is, 0.05 (faint) to 0.5, e.g. 0.15 (default). |
| font_size | number | Font size in points, 8 to 300, e.g. 72. Default: fit the page. |
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.
| start_number | integer | Number for the first numbered page, e.g. 1 (default). |
{
"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 number, e.g. report.pdf."
},
"format": {
"type": "string",
"maxLength": 80,
"description": "Text with {n} and optional {total}, e.g. \"Page {n} of {total}\" (default), \"{n}\", \"{n}/{total}\" or \"- {n} -\"."
},
"position": {
"enum": [
"top-left",
"top-center",
"top-right",
"bottom-left",
"bottom-center",
"bottom-right"
],
"type": "string",
"description": "Where the text goes on each page as viewed: top-left, top-center, top-right, bottom-left, bottom-center, bottom-right. Default bottom-center."
},
"font_size": {
"type": "number",
"description": "Font size in points from 6 to 36, e.g. 10 (default)."
},
"margin_pt": {
"type": "number",
"description": "Distance from the page edge in points from 6 to 144, e.g. 36 (half an inch, default)."
},
"skip_first": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "How many pages at the start get no number, e.g. 1 for a cover page. Default 0."
},
"start_number": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Number for the first numbered page, e.g. 1 (default)."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"file",
"text"
],
"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 watermark, e.g. proposal.pdf."
},
"text": {
"type": "string",
"maxLength": 80,
"description": "Watermark text, e.g. \"DRAFT\" or \"CONFIDENTIAL\"."
},
"angle": {
"type": "number",
"description": "Angle in degrees counter-clockwise, -90 to 90, e.g. 45 (default) or 0 for flat."
},
"pages": {
"type": "string",
"maxLength": 400,
"description": "Pages to mark, e.g. \"all\" (default) or \"1-3, 8, 10-end\"."
},
"opacity": {
"type": "number",
"description": "How strong the text is, 0.05 (faint) to 0.5, e.g. 0.15 (default)."
},
"font_size": {
"type": "number",
"description": "Font size in points, 8 to 300, e.g. 72. Default: fit the page."
}
}
}