SheetShift

Convert and clean tables: CSV, JSON, dedupe, stats. Free.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
100%
Naming quality
85%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,510Tokens (tool definitions)
~3.2 KBTypical response size
Moderate attention impact (1.18% of 128k context)

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-http

What it can do

Tool inventory

Tools (4)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded4 tools
verifiedversion not recorded4 tools