PDF tables into a spreadsheet
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 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.
The text-based PDF that holds the tables, e.g. statement.pdf or price-list.pdf.
Pages to read, e.g. 1-3,5. Default: every page (first 50).
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.
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.
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.
| Argument | Type | Description |
|---|---|---|
| file* | object | The text-based PDF that holds the tables, e.g. statement.pdf or price-list.pdf. |
| pages | string | Pages to read, e.g. 1-3,5. Default: every page (first 50). |
| column_types | array | 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. |
| merge_tables | boolean | 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": "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 text-based PDF that holds the tables, e.g. statement.pdf or price-list.pdf."
},
"pages": {
"type": "string",
"maxLength": 200,
"description": "Pages to read, e.g. 1-3,5. Default: every page (first 50)."
},
"column_types": {
"type": "array",
"items": {
"type": "object",
"required": [
"table",
"column",
"type"
],
"properties": {
"type": {
"enum": [
"text",
"number",
"date"
],
"type": "string",
"description": "The type to force for that column, e.g. date."
},
"table": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based table number shown in the result, e.g. 1."
},
"column": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 1,
"description": "1-based column number in that table, e.g. 3."
}
}
},
"maxItems": 200000,
"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."
},
"merge_tables": {
"type": "boolean",
"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."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| file* | object | The text-based PDF that holds the tables, e.g. report.pdf. |
| pages | string | Pages to read, e.g. 1-3,5. Default: every page (first 50). |
| merge_tables | boolean | 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": "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 text-based PDF that holds the tables, e.g. report.pdf."
},
"pages": {
"type": "string",
"maxLength": 200,
"description": "Pages to read, e.g. 1-3,5. Default: every page (first 50)."
},
"merge_tables": {
"type": "boolean",
"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."
}
}
}