Check a spreadsheet for errors before you import it, send it or report from it.
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 check a spreadsheet for errors or validate data before importing or sending it: "check spreadsheet for errors", "data validation excel", "find duplicates in excel", "check this csv for errors", "find invalid dates", "are there bad emails in this list". Attach a CSV, TSV or .xlsx file or paste the table. With no rules it detects column types from the values and checks impossible, ambiguous and mixed-format dates, invalid emails and email typos, phone digit counts, duplicate IDs and duplicate rows, blank cells in mostly filled columns, text in number columns, numbers stored as text, mixed decimal marks, leading/trailing spaces, IDs that lost leading zeros or became 1.2E+15, formula errors and row totals that do not add up. Optional rules: required_columns, unique_columns, allowed_values, ranges, total_rules. Returns each issue with row, column and cell value, counts per check, a column health score, an Excel copy with problem cells highlighted plus an Issues sheet, and an issues CSV. Does not edit or clean the data, does not verify that mailboxes or phone lines exist, and does not compare two files (use a comparison tool for that).
The spreadsheet to check: CSV, TSV or Excel .xlsx, e.g. customers.xlsx.
Sheet name or number in an Excel workbook, e.g. Orders or 2. Default: the first sheet with data.
Only when no file is attached: the table pasted as CSV, tab-separated or a Markdown table with its header row, e.g. "id,date,email\n1,2026-02-30,[email protected]". A list of rows also works.
Numeric limits per column, e.g. {"Age":"0-120","Discount":{"min":0,"max":50}} or "Age: 0-120; Qty: >= 1".
Day/month order for dates like 03/04/2026: auto (default), MDY (US, month first) or DMY (day first).
Only if the headings were detected wrongly: the row number of the header, e.g. 3.
Checks to turn off, e.g. ["extra_spaces"]. Options: impossible_date, mixed_date_order, ambiguous_date, mixed_date_format, implausible_date, not_a_date, invalid_email, email_typo, invalid_phone, duplicate_id, duplicate_row, blank_required, not_a_number, number_as_text, mixed_decimal, extra_spaces, lost_leading_zeros, scientific_notation, total_mismatch, formula_error, inconsistent_spelling, extra_cell, impossible_time, not_allowed, out_of_range.
Totals that must add up, e.g. "Total = Q1 + Q2 + Q3 + Q4" or "Amount = Qty * Price". Default: total columns are detected and checked automatically.
Allowed values per column, e.g. {"Status":["Open","Closed"]} or "Status: Open, Closed; Region: North, South".
Columns whose values must not repeat, e.g. "Order ID". Default: the ID column is detected from its header and values.
Columns that must never be blank, e.g. ["Email","Order ID"] or "Email, Order ID". Default: columns that are almost fully filled are treated as required (blanks reported as warnings).
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http sheet-validate https://sheet-validate.zovo.one/mcp
Use this when the user wants to check a spreadsheet for errors or validate data before importing or sending it: "check spreadsheet for errors", "data validation excel", "find duplicates in excel", "check this csv for errors", "find invalid dates", "are there bad emails in this list". Attach a CSV, TSV or .xlsx file or paste the table. With no rules it detects column types from the values and checks impossible, ambiguous and mixed-format dates, invalid emails and email typos, phone digit counts, duplicate IDs and duplicate rows, blank cells in mostly filled columns, text in number columns, numbers stored as text, mixed decimal marks, leading/trailing spaces, IDs that lost leading zeros or became 1.2E+15, formula errors and row totals that do not add up. Optional rules: required_columns, unique_columns, allowed_values, ranges, total_rules. Returns each issue with row, column and cell value, counts per check, a column health score, an Excel copy with problem cells highlighted plus an Issues sheet, and an issues CSV. Does not edit or clean the data, does not verify that mailboxes or phone lines exist, and does not compare two files (use a comparison tool for that).
| Argument | Type | Description |
|---|---|---|
| file | object | The spreadsheet to check: CSV, TSV or Excel .xlsx, e.g. customers.xlsx. |
| sheet | any | Sheet name or number in an Excel workbook, e.g. Orders or 2. Default: the first sheet with data. |
| table | any | Only when no file is attached: the table pasted as CSV, tab-separated or a Markdown table with its header row, e.g. "id,date,email\n1,2026-02-30,[email protected]". A list of rows also works. |
| ranges | any | Numeric limits per column, e.g. {"Age":"0-120","Discount":{"min":0,"max":50}} or "Age: 0-120; Qty: >= 1". |
| date_order | string | Day/month order for dates like 03/04/2026: auto (default), MDY (US, month first) or DMY (day first). |
| header_row | any | Only if the headings were detected wrongly: the row number of the header, e.g. 3. |
| skip_checks | any | Checks to turn off, e.g. ["extra_spaces"]. Options: impossible_date, mixed_date_order, ambiguous_date, mixed_date_format, implausible_date, not_a_date, invalid_email, email_typo, invalid_phone, duplicate_id, duplicate_row, blank_required, not_a_number, number_as_text, mixed_decimal, extra_spaces, lost_leading_zeros, scientific_notation, total_mismatch, formula_error, inconsistent_spelling, extra_cell, impossible_time, not_allowed, out_of_range. |
| total_rules | any | Totals that must add up, e.g. "Total = Q1 + Q2 + Q3 + Q4" or "Amount = Qty * Price". Default: total columns are detected and checked automatically. |
| allowed_values | any | Allowed values per column, e.g. {"Status":["Open","Closed"]} or "Status: Open, Closed; Region: North, South". |
| unique_columns | any | Columns whose values must not repeat, e.g. "Order ID". Default: the ID column is detected from its header and values. |
| required_columns | any | Columns that must never be blank, e.g. ["Email","Order ID"] or "Email, Order ID". Default: columns that are almost fully filled are treated as required (blanks reported as warnings). |
{
"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 spreadsheet to check: CSV, TSV or Excel .xlsx, e.g. customers.xlsx."
},
"sheet": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "number"
}
],
"description": "Sheet name or number in an Excel workbook, e.g. Orders or 2. Default: the first sheet with data."
},
"table": {
"anyOf": [
{
"type": "string",
"maxLength": 400000
},
{
"type": "array",
"items": {
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"maxItems": 200
},
"maxItems": 5000
},
{
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
]
}
},
"maxItems": 5000
}
],
"description": "Only when no file is attached: the table pasted as CSV, tab-separated or a Markdown table with its header row, e.g. \"id,date,email\\n1,2026-02-30,[email protected]\". A list of rows also works."
},
"ranges": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "number"
},
{
"type": "object",
"properties": {
"max": {
"type": [
"number",
"string"
]
},
"min": {
"type": [
"number",
"string"
]
}
}
}
]
}
}
],
"description": "Numeric limits per column, e.g. {\"Age\":\"0-120\",\"Discount\":{\"min\":0,\"max\":50}} or \"Age: 0-120; Qty: >= 1\"."
},
"date_order": {
"type": "string",
"maxLength": 30,
"description": "Day/month order for dates like 03/04/2026: auto (default), MDY (US, month first) or DMY (day first)."
},
"header_row": {
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 10
}
],
"description": "Only if the headings were detected wrongly: the row number of the header, e.g. 3."
},
"skip_checks": {
"anyOf": [
{
"type": "string",
"maxLength": 4000
},
{
"type": "array",
"items": {
"type": "string",
"maxLength": 200
},
"maxItems": 200
}
],
"description": "Checks to turn off, e.g. [\"extra_spaces\"]. Options: impossible_date, mixed_date_order, ambiguous_date, mixed_date_format, implausible_date, not_a_date, invalid_email, email_typo, invalid_phone, duplicate_id, duplicate_row, blank_required, not_a_number, number_as_text, mixed_decimal, extra_spaces, lost_leading_zeros, scientific_notation, total_mismatch, formula_error, inconsistent_spelling, extra_cell, impossible_time, not_allowed, out_of_range."
},
"total_rules": {
"anyOf": [
{
"type": "string",
"maxLength": 4000
},
{
"type": "array",
"items": {
"type": "string",
"maxLength": 200
},
"maxItems": 200
}
],
"description": "Totals that must add up, e.g. \"Total = Q1 + Q2 + Q3 + Q4\" or \"Amount = Qty * Price\". Default: total columns are detected and checked automatically."
},
"allowed_values": {
"anyOf": [
{
"type": "string",
"maxLength": 4000
},
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"maxLength": 200
},
{
"type": "number"
}
]
},
"maxItems": 500
}
]
}
}
],
"description": "Allowed values per column, e.g. {\"Status\":[\"Open\",\"Closed\"]} or \"Status: Open, Closed; Region: North, South\"."
},
"unique_columns": {
"anyOf": [
{
"type": "string",
"maxLength": 4000
},
{
"type": "array",
"items": {
"type": "string",
"maxLength": 200
},
"maxItems": 200
}
],
"description": "Columns whose values must not repeat, e.g. \"Order ID\". Default: the ID column is detected from its header and values."
},
"required_columns": {
"anyOf": [
{
"type": "string",
"maxLength": 4000
},
{
"type": "array",
"items": {
"type": "string",
"maxLength": 200
},
"maxItems": 200
}
],
"description": "Columns that must never be blank, e.g. [\"Email\",\"Order ID\"] or \"Email, Order ID\". Default: columns that are almost fully filled are treated as required (blanks reported as warnings)."
}
}
}Use this when the user wants to see what is in a spreadsheet before validating it, or asks which columns, types or values it has: "what columns are in this file", "profile this csv", "which column is the ID", "suggest validation rules". Attach a CSV, TSV or .xlsx file or paste the table. Returns each column's letter, name, detected type (date, email, phone, ID, ZIP, number, money, percent, text), filled and blank counts, unique values, examples, min/max for numbers, short value lists, and suggested rules to pass to check_spreadsheet. Does not report errors (use check_spreadsheet) and does not change the file.
| Argument | Type | Description |
|---|---|---|
| file | object | The spreadsheet to check: CSV, TSV or Excel .xlsx, e.g. customers.xlsx. |
| sheet | any | Sheet name or number in an Excel workbook, e.g. Orders or 2. Default: the first sheet with data. |
| table | any | Only when no file is attached: the table pasted as CSV, tab-separated or a Markdown table with its header row, e.g. "id,date,email\n1,2026-02-30,[email protected]". A list of rows also works. |
| header_row | any | Only if the headings were detected wrongly: the row number of the header, e.g. 3. |
{
"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 spreadsheet to check: CSV, TSV or Excel .xlsx, e.g. customers.xlsx."
},
"sheet": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "number"
}
],
"description": "Sheet name or number in an Excel workbook, e.g. Orders or 2. Default: the first sheet with data."
},
"table": {
"anyOf": [
{
"type": "string",
"maxLength": 400000
},
{
"type": "array",
"items": {
"type": "array",
"items": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
]
},
"maxItems": 200
},
"maxItems": 5000
},
{
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
]
}
},
"maxItems": 5000
}
],
"description": "Only when no file is attached: the table pasted as CSV, tab-separated or a Markdown table with its header row, e.g. \"id,date,email\\n1,2026-02-30,[email protected]\". A list of rows also works."
},
"header_row": {
"anyOf": [
{
"type": "number"
},
{
"type": "string",
"maxLength": 10
}
],
"description": "Only if the headings were detected wrongly: the row number of the header, e.g. 3."
}
}
}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.