SheetShift
Convert and clean tables: CSV, JSON, dedupe, stats. Free.
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": {
"sheet-shift": {
"url": "https://sheet-shift.magicteams.ai/mcp"
}
}
}Remote endpoints
https://sheet-shift.magicteams.ai/mcpstreamable-httpWhat it can do
Tool inventory
Tools (4)
🟢convert_table(data, from_format, to_format)
Convert a table from CSV, TSV or JSON into CSV, TSV, JSON (array of objects) or a Markdown table. Cell values are kept as text. Use when the user wants the same table in another format. Do NOT use to trim, dedupe or drop rows; use clean_table.
Input Schema
{
"type": "object",
"properties": {
"data": {
"type": "string",
"minLength": 1,
"description": "The whole table as text, first row = header. CSV/TSV text (quoted cells allowed), or a JSON array of flat objects, e.g. \"name,age\\nAsha,30\"."
},
"from_format": {
"type": "string",
"enum": [
"csv",
"tsv",
"json"
],
"description": "Format of the input 'data': csv, tsv or json."
},
"to_format": {
"type": "string",
"enum": [
"csv",
"tsv",
"json",
"markdown"
],
"description": "Output format: csv, tsv, json (array of objects keyed by header) or markdown (pipe table)."
}
},
"required": [
"data",
"from_format",
"to_format"
]
}Output Schema
{
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "The converted table as text in to_format."
},
"rows": {
"type": "integer",
"description": "Number of data rows (excluding the header)."
},
"columns": {
"type": "integer",
"description": "Number of columns in the header row."
}
},
"required": [
"text",
"rows",
"columns"
]
}🟢clean_table(data, format, trim, drop_empty_rows, dedupe)
Clean a table: trim whitespace in cells, drop fully empty rows, and optionally remove duplicate rows; returns the table in the same format with before/after row counts. Use when preparing messy pasted data. Do NOT use to change format; use convert_table.
Input Schema
{
"type": "object",
"properties": {
"data": {
"type": "string",
"minLength": 1,
"description": "The whole table as text, first row = header. CSV/TSV text (quoted cells allowed), or a JSON array of flat objects, e.g. \"name,age\\nAsha,30\"."
},
"format": {
"type": "string",
"enum": [
"csv",
"tsv",
"json"
],
"description": "Format of 'data' and of the returned table: csv, tsv or json. Default csv."
},
"trim": {
"type": "boolean",
"description": "Trim leading/trailing whitespace in every cell. Default true."
},
"drop_empty_rows": {
"type": "boolean",
"description": "Remove rows whose cells are all empty. Default true."
},
"dedupe": {
"type": "boolean",
"description": "Remove exact duplicate data rows, keeping the first. Default false."
}
},
"required": [
"data"
]
}Output Schema
{
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "The cleaned table as text in the input format."
},
"rows_before": {
"type": "integer",
"description": "Data rows before cleaning (excluding header)."
},
"rows_after": {
"type": "integer",
"description": "Data rows after cleaning (excluding header)."
}
},
"required": [
"text",
"rows_before",
"rows_after"
]
}🟢column_stats(data, format, column, op)
Compute one statistic over a single column: sum, avg, min or max (numeric, rounded to 2 dp, blanks ignored), count of non-empty cells, or the sorted distinct values. Use for quick answers like 'total of the price column'. Do NOT use to reshape the table; use split_column or convert_table.
Input Schema
{
"type": "object",
"properties": {
"data": {
"type": "string",
"minLength": 1,
"description": "The whole table as text, first row = header. CSV/TSV text (quoted cells allowed), or a JSON array of flat objects, e.g. \"name,age\\nAsha,30\"."
},
"format": {
"type": "string",
"enum": [
"csv",
"tsv",
"json"
],
"description": "Format of 'data' and of the returned table: csv, tsv or json. Default csv."
},
"column": {
"type": "string",
"minLength": 1,
"description": "Column to use: the exact header name (case-sensitive), or a 0-based column index as digits, e.g. \"price\" or \"2\"."
},
"op": {
"type": "string",
"enum": [
"sum",
"avg",
"min",
"max",
"count",
"distinct"
],
"description": "Statistic: sum, avg, min, max (column must be numeric), count (non-empty cells) or distinct (unique values)."
}
},
"required": [
"data",
"column",
"op"
]
}Output Schema
{
"type": "object",
"properties": {
"column": {
"type": "string",
"description": "Header name of the column that was analysed."
},
"op": {
"type": "string",
"description": "The statistic that was computed."
},
"result": {
"description": "Numeric result for sum/avg/min/max/count, or a sorted array of distinct string values for distinct.",
"anyOf": [
{
"type": "number"
},
{
"type": "array",
"items": {
"type": "string"
}
}
]
}
},
"required": [
"column",
"op",
"result"
]
}🟢split_column(data, format, column, delimiter, new_names)
Split one column into several columns on a delimiter (e.g. 'full name' on a space), inserted in place; short rows are padded with empty cells. Returns the table in the same format. Use when one column packs several values. Do NOT use to clean or change format; use clean_table or convert_table.
Input Schema
{
"type": "object",
"properties": {
"data": {
"type": "string",
"minLength": 1,
"description": "The whole table as text, first row = header. CSV/TSV text (quoted cells allowed), or a JSON array of flat objects, e.g. \"name,age\\nAsha,30\"."
},
"format": {
"type": "string",
"enum": [
"csv",
"tsv",
"json"
],
"description": "Format of 'data' and of the returned table: csv, tsv or json. Default csv."
},
"column": {
"type": "string",
"minLength": 1,
"description": "Column to use: the exact header name (case-sensitive), or a 0-based column index as digits, e.g. \"price\" or \"2\"."
},
"delimiter": {
"type": "string",
"minLength": 1,
"description": "Literal text to split on, e.g. \" \", \"-\" or \"|\"."
},
"new_names": {
"type": "array",
"items": {
"type": "string"
},
"description": "Header names for the new columns; count must equal the maximum number of parts. Default <column>_1, <column>_2, ..."
}
},
"required": [
"data",
"column",
"delimiter"
]
}Output Schema
{
"type": "object",
"properties": {
"text": {
"type": "string",
"description": "The resulting table as text in the input format."
},
"parts": {
"type": "integer",
"description": "Number of new columns the split produced."
}
},
"required": [
"text",
"parts"
]
}Community
Evidence