Turn a CSV or Excel sheet into a clean, print-ready PDF table 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 asks what sheets or columns a spreadsheet has, how many rows it has, or how many pages it would print before making a PDF. Takes the same file or CSV text, sheet, columns and layout options as sheet_to_pdf and returns the sheets (with hidden ones marked), the header row, row and column counts, empty and widest columns, formula cells without a saved result, a 5-row preview and the page estimate for the chosen layout. Does not make a file and does not change the sheet.
The sheet to print: a CSV, TSV or Excel .xlsx file, e.g. inventory.xlsx or contacts.csv.
Paper size, e.g. a4. Default letter.
For .xlsx: the sheet name to print, e.g. "Q3 Sales". Default: the first visible sheet.
Optional title above the table on page 1, up to 120 characters, e.g. "Inventory, November 2026".
Print only these columns, in this order, by header name or column letter, e.g. ["Name", "Email", "Total"]. Default: all columns.
Instead of a file: the table as CSV text with a header row, e.g. "Name,Qty\nApples,3\nPears,5". Use either file or csv_text.
For CSV text: the separator, e.g. semicolon. Default: detected from the file.
true (default): when columns are too wide, the font gets smaller (down to 7 pt) before cells wrap. false: keep font_size and wrap cell text.
Font size in points from 7 to 12, e.g. 9 (default).
true (default): the first non-empty row is the header row (one-cell title rows above it are printed as the title). false: columns are named Column A, Column B, ...
The sheet row (or CSV line) number that holds the header, e.g. 3 when rows 1-2 hold a title. Rows above it are left out. Default: detected.
Page orientation, e.g. landscape. auto (default) picks portrait when the columns fit, else landscape.
true adds a # column with row numbers 1, 2, 3. Default false.
true (default) prints Page 1 of N in each page footer.
For .xlsx: true also prints hidden rows and columns. Default false (as Excel prints).
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http sheet-to-pdf https://sheet-to-pdf.zovo.one/mcp
Use this when the user asks what sheets or columns a spreadsheet has, how many rows it has, or how many pages it would print before making a PDF. Takes the same file or CSV text, sheet, columns and layout options as sheet_to_pdf and returns the sheets (with hidden ones marked), the header row, row and column counts, empty and widest columns, formula cells without a saved result, a 5-row preview and the page estimate for the chosen layout. Does not make a file and does not change the sheet.
| Argument | Type | Description |
|---|---|---|
| file | object | The sheet to print: a CSV, TSV or Excel .xlsx file, e.g. inventory.xlsx or contacts.csv. |
| paper | string | Paper size, e.g. a4. Default letter. |
| sheet | string | For .xlsx: the sheet name to print, e.g. "Q3 Sales". Default: the first visible sheet. |
| title | string | Optional title above the table on page 1, up to 120 characters, e.g. "Inventory, November 2026". |
| columns | array | Print only these columns, in this order, by header name or column letter, e.g. ["Name", "Email", "Total"]. Default: all columns. |
| csv_text | string | Instead of a file: the table as CSV text with a header row, e.g. "Name,Qty\nApples,3\nPears,5". Use either file or csv_text. |
| delimiter | string | For CSV text: the separator, e.g. semicolon. Default: detected from the file. |
| fit_width | boolean | true (default): when columns are too wide, the font gets smaller (down to 7 pt) before cells wrap. false: keep font_size and wrap cell text. |
| font_size | number | Font size in points from 7 to 12, e.g. 9 (default). |
| has_header | boolean | true (default): the first non-empty row is the header row (one-cell title rows above it are printed as the title). false: columns are named Column A, Column B, ... |
| header_row | integer | The sheet row (or CSV line) number that holds the header, e.g. 3 when rows 1-2 hold a title. Rows above it are left out. Default: detected. |
| orientation | string | Page orientation, e.g. landscape. auto (default) picks portrait when the columns fit, else landscape. |
| row_numbers | boolean | true adds a # column with row numbers 1, 2, 3. Default false. |
| page_numbers | boolean | true (default) prints Page 1 of N in each page footer. |
| include_hidden | boolean | For .xlsx: true also prints hidden rows and columns. Default false (as Excel prints). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"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 sheet to print: a CSV, TSV or Excel .xlsx file, e.g. inventory.xlsx or contacts.csv."
},
"paper": {
"enum": [
"letter",
"a4",
"legal",
"a3"
],
"type": "string",
"description": "Paper size, e.g. a4. Default letter."
},
"sheet": {
"type": "string",
"maxLength": 200,
"description": "For .xlsx: the sheet name to print, e.g. \"Q3 Sales\". Default: the first visible sheet."
},
"title": {
"type": "string",
"maxLength": 500,
"description": "Optional title above the table on page 1, up to 120 characters, e.g. \"Inventory, November 2026\"."
},
"columns": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200
},
"maxItems": 60,
"description": "Print only these columns, in this order, by header name or column letter, e.g. [\"Name\", \"Email\", \"Total\"]. Default: all columns."
},
"csv_text": {
"type": "string",
"maxLength": 100000,
"description": "Instead of a file: the table as CSV text with a header row, e.g. \"Name,Qty\\nApples,3\\nPears,5\". Use either file or csv_text."
},
"delimiter": {
"enum": [
"comma",
"semicolon",
"tab",
"pipe"
],
"type": "string",
"description": "For CSV text: the separator, e.g. semicolon. Default: detected from the file."
},
"fit_width": {
"type": "boolean",
"description": "true (default): when columns are too wide, the font gets smaller (down to 7 pt) before cells wrap. false: keep font_size and wrap cell text."
},
"font_size": {
"type": "number",
"description": "Font size in points from 7 to 12, e.g. 9 (default)."
},
"has_header": {
"type": "boolean",
"description": "true (default): the first non-empty row is the header row (one-cell title rows above it are printed as the title). false: columns are named Column A, Column B, ..."
},
"header_row": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The sheet row (or CSV line) number that holds the header, e.g. 3 when rows 1-2 hold a title. Rows above it are left out. Default: detected."
},
"orientation": {
"enum": [
"auto",
"portrait",
"landscape"
],
"type": "string",
"description": "Page orientation, e.g. landscape. auto (default) picks portrait when the columns fit, else landscape."
},
"row_numbers": {
"type": "boolean",
"description": "true adds a # column with row numbers 1, 2, 3. Default false."
},
"page_numbers": {
"type": "boolean",
"description": "true (default) prints Page 1 of N in each page footer."
},
"include_hidden": {
"type": "boolean",
"description": "For .xlsx: true also prints hidden rows and columns. Default false (as Excel prints)."
}
}
}Use this when the user wants to turn a spreadsheet, CSV or Excel sheet into a PDF, print a table with the header row on each page, or fit a wide sheet on one page width. Takes one attached CSV, TSV or .xlsx file (or CSV text), an optional sheet name and column list, paper (letter, a4, legal, a3), orientation, font size 7-12, row numbers, page numbers and a title, and returns a PDF download with the page count and a check that each printed cell was found again in the new PDF. Excel values print as displayed. Does not print charts, images, cell colors or merged-cell layouts, and does not open legacy .xls files. Do not use for PDF to Excel conversion.
| Argument | Type | Description |
|---|---|---|
| file | object | The sheet to print: a CSV, TSV or Excel .xlsx file, e.g. inventory.xlsx or contacts.csv. |
| paper | string | Paper size, e.g. a4. Default letter. |
| sheet | string | For .xlsx: the sheet name to print, e.g. "Q3 Sales". Default: the first visible sheet. |
| title | string | Optional title above the table on page 1, up to 120 characters, e.g. "Inventory, November 2026". |
| columns | array | Print only these columns, in this order, by header name or column letter, e.g. ["Name", "Email", "Total"]. Default: all columns. |
| csv_text | string | Instead of a file: the table as CSV text with a header row, e.g. "Name,Qty\nApples,3\nPears,5". Use either file or csv_text. |
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.
| delimiter | string | For CSV text: the separator, e.g. semicolon. Default: detected from the file. |
| fit_width | boolean | true (default): when columns are too wide, the font gets smaller (down to 7 pt) before cells wrap. false: keep font_size and wrap cell text. |
| font_size | number | Font size in points from 7 to 12, e.g. 9 (default). |
| has_header | boolean | true (default): the first non-empty row is the header row (one-cell title rows above it are printed as the title). false: columns are named Column A, Column B, ... |
| header_row | integer | The sheet row (or CSV line) number that holds the header, e.g. 3 when rows 1-2 hold a title. Rows above it are left out. Default: detected. |
| orientation | string | Page orientation, e.g. landscape. auto (default) picks portrait when the columns fit, else landscape. |
| row_numbers | boolean | true adds a # column with row numbers 1, 2, 3. Default false. |
| page_numbers | boolean | true (default) prints Page 1 of N in each page footer. |
| include_hidden | boolean | For .xlsx: true also prints hidden rows and columns. Default false (as Excel prints). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"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 sheet to print: a CSV, TSV or Excel .xlsx file, e.g. inventory.xlsx or contacts.csv."
},
"paper": {
"enum": [
"letter",
"a4",
"legal",
"a3"
],
"type": "string",
"description": "Paper size, e.g. a4. Default letter."
},
"sheet": {
"type": "string",
"maxLength": 200,
"description": "For .xlsx: the sheet name to print, e.g. \"Q3 Sales\". Default: the first visible sheet."
},
"title": {
"type": "string",
"maxLength": 500,
"description": "Optional title above the table on page 1, up to 120 characters, e.g. \"Inventory, November 2026\"."
},
"columns": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200
},
"maxItems": 60,
"description": "Print only these columns, in this order, by header name or column letter, e.g. [\"Name\", \"Email\", \"Total\"]. Default: all columns."
},
"csv_text": {
"type": "string",
"maxLength": 100000,
"description": "Instead of a file: the table as CSV text with a header row, e.g. \"Name,Qty\\nApples,3\\nPears,5\". Use either file or csv_text."
},
"delimiter": {
"enum": [
"comma",
"semicolon",
"tab",
"pipe"
],
"type": "string",
"description": "For CSV text: the separator, e.g. semicolon. Default: detected from the file."
},
"fit_width": {
"type": "boolean",
"description": "true (default): when columns are too wide, the font gets smaller (down to 7 pt) before cells wrap. false: keep font_size and wrap cell text."
},
"font_size": {
"type": "number",
"description": "Font size in points from 7 to 12, e.g. 9 (default)."
},
"has_header": {
"type": "boolean",
"description": "true (default): the first non-empty row is the header row (one-cell title rows above it are printed as the title). false: columns are named Column A, Column B, ..."
},
"header_row": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "The sheet row (or CSV line) number that holds the header, e.g. 3 when rows 1-2 hold a title. Rows above it are left out. Default: detected."
},
"orientation": {
"enum": [
"auto",
"portrait",
"landscape"
],
"type": "string",
"description": "Page orientation, e.g. landscape. auto (default) picks portrait when the columns fit, else landscape."
},
"row_numbers": {
"type": "boolean",
"description": "true adds a # column with row numbers 1, 2, 3. Default false."
},
"page_numbers": {
"type": "boolean",
"description": "true (default) prints Page 1 of N in each page footer."
},
"include_hidden": {
"type": "boolean",
"description": "For .xlsx: true also prints hidden rows and columns. Default false (as Excel prints)."
}
}
}