Zovo PDF to Spreadsheet
PDF tables into a spreadsheet
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"pdf-to-excel": {
"url": "https://pdf-to-excel.zovo.one/mcp"
}
}
}Remote endpoints
https://pdf-to-excel.zovo.one/mcpstreamable-httpWhat it can do
Tool inventory
Tools (2)
🟢convert_pdf_tables(file, pages, merge_tables, column_types)
Use this when the user wants to convert a PDF to Excel, convert PDF to Excel, extract a table from a PDF, convert PDF table to Excel, PDF to CSV, PDF to XLSX, get a bank statement PDF to Excel, or turn a PDF to spreadsheet. It reads the tables in a text-based PDF and returns an Excel workbook (one sheet per table) and a ZIP of CSV files, with column types and a preview of the first rows. Handles up to 15 MB and 50 pages. Does not read scanned or image-only pages (no OCR), does not edit the PDF, and keeps files for about 1 hour. Do not use for a PDF that is only a form to fill or for reading a PDF as plain text.
Input Schema
{
"type": "object",
"properties": {
"file": {
"type": "object",
"properties": {
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
},
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"mime_type": {
"description": "Media type if known, e.g. application/pdf.",
"type": "string"
},
"file_name": {
"description": "Original file name if known, e.g. statement.pdf.",
"type": "string"
}
},
"required": [
"download_url",
"file_id"
],
"description": "The text-based PDF that holds the tables, e.g. statement.pdf or price-list.pdf."
},
"pages": {
"description": "Pages to read, e.g. 1-3,5. Default: every page (first 50).",
"type": "string",
"maxLength": 200
},
"merge_tables": {
"description": "true (default): join the last table on a page to the first on the next page only when their column count and whitespace-normalized source headers match; drop the repeated header.",
"type": "boolean"
},
"column_types": {
"description": "Force a column type when the detected one is wrong, e.g. [{\"table\":1,\"column\":3,\"type\":\"text\"}]. The widget's type switches send this.",
"maxItems": 200000,
"type": "array",
"items": {
"type": "object",
"properties": {
"table": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "1-based table number shown in the result, e.g. 1."
},
"column": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991,
"description": "1-based column number in that table, e.g. 3."
},
"type": {
"type": "string",
"enum": [
"text",
"number",
"date"
],
"description": "The type to force for that column, e.g. date."
}
},
"required": [
"table",
"column",
"type"
]
}
}
},
"required": [
"file"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"type": "string"
},
"file": {
"type": "string"
},
"page_count": {
"type": "number"
},
"other_text_rows": {
"type": "number"
},
"pages_read": {
"type": "number"
},
"tables": {
"type": "number"
},
"scanned_pages": {
"type": "array",
"items": {
"type": "number"
}
},
"truncated": {
"type": "boolean"
},
"table_details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"sheet": {
"type": "string"
},
"rows": {
"type": "number"
},
"data_rows": {
"type": "number"
},
"columns": {
"type": "number"
},
"header": {
"type": "array",
"items": {
"type": "string"
}
},
"column_types": {
"type": "array",
"items": {
"type": "string"
}
},
"preview": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
}
}
},
"pages": {
"type": "array",
"items": {
"type": "number"
}
}
},
"required": [
"name",
"sheet",
"rows",
"data_rows",
"columns",
"header",
"column_types",
"preview",
"pages"
],
"additionalProperties": false
}
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
},
"downloads": {
"type": "object",
"properties": {
"xlsx": {
"type": "string"
},
"csv_zip": {
"type": "string"
}
},
"required": [
"xlsx",
"csv_zip"
],
"additionalProperties": false
},
"note": {
"type": "string"
}
},
"required": [
"file",
"page_count",
"other_text_rows",
"pages_read",
"tables",
"scanned_pages",
"truncated",
"table_details",
"warnings",
"note"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢list_pdf_tables(file, pages, merge_tables)
Use this when the user wants to extract table from pdf, copy table from pdf, or inspect pdf to spreadsheet tables, before exporting: it shows each table's size, column types and first rows with no download. Does not make Excel or CSV files (use convert_pdf_tables for that), does not read scanned pages (no OCR), and handles up to 15 MB and 50 pages. Do not use for editing a PDF or for a PDF that is not a table.
Input Schema
{
"type": "object",
"properties": {
"file": {
"type": "object",
"properties": {
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
},
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"mime_type": {
"description": "Media type if known, e.g. application/pdf.",
"type": "string"
},
"file_name": {
"description": "Original file name if known, e.g. statement.pdf.",
"type": "string"
}
},
"required": [
"download_url",
"file_id"
],
"description": "The text-based PDF that holds the tables, e.g. report.pdf."
},
"pages": {
"description": "Pages to read, e.g. 1-3,5. Default: every page (first 50).",
"type": "string",
"maxLength": 200
},
"merge_tables": {
"description": "true (default): join the last table on a page to the first on the next page only when their column count and whitespace-normalized source headers match.",
"type": "boolean"
}
},
"required": [
"file"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Output Schema
{
"type": "object",
"properties": {
"status": {
"type": "string"
},
"note": {
"type": "string"
},
"file": {
"type": "string"
},
"page_count": {
"type": "number"
},
"other_text_rows": {
"type": "number"
},
"pages_read": {
"type": "number"
},
"tables": {
"type": "number"
},
"scanned_pages": {
"type": "array",
"items": {
"type": "number"
}
},
"truncated": {
"type": "boolean"
},
"table_details": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"sheet": {
"type": "string"
},
"rows": {
"type": "number"
},
"data_rows": {
"type": "number"
},
"columns": {
"type": "number"
},
"header": {
"type": "array",
"items": {
"type": "string"
}
},
"column_types": {
"type": "array",
"items": {
"type": "string"
}
},
"preview": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "string"
}
}
},
"pages": {
"type": "array",
"items": {
"type": "number"
}
}
},
"required": [
"name",
"sheet",
"rows",
"data_rows",
"columns",
"header",
"column_types",
"preview",
"pages"
],
"additionalProperties": false
}
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"file",
"page_count",
"other_text_rows",
"pages_read",
"tables",
"scanned_pages",
"truncated",
"table_details",
"warnings"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}Community
Evidence