Koskamo

SheetShift MCP

SheetShift provides MCP tools for AI assistants to convert and clean tables. It supports converting between CSV, TSV, JSON, and Markdown formats, cleaning messy data by trimming whitespace and deduplicating rows, computing column statistics like sum and average, and splitting columns on delimiters. All processing is done per request with no data storage.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

SheetShift MCP logo, by MagicTeamsCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-07Published by MagicTeams
MCP endpoint (Streamable HTTP)
https://sheet-shift.magicteams.ai/mcp
Vendor documentation

What its tools do

4 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

4 of 4 have a description · 4 of 4 declare behavior hints · 4 of 4 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Convert CSV to JSON format
  • Sum values in a specific column
  • Deduplicate rows and drop empty cells
  • Split a column into multiple columns

Source and maintenance

Community listingRegistry 1.0.0
Maintenance checked

Protocol and capabilities

Server
sheet-shift 1.0.0
MCP protocol negotiated in check
2025-11-25
Tools
4 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

SheetShift converts and cleans tables. Computed per request, nothing stored.

Tools

4 advertised

convert_table — Convert table
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

convert_table input schema
{
  "type": "object",
  "required": [
    "data",
    "from_format",
    "to_format"
  ],
  "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\"."
    },
    "to_format": {
      "enum": [
        "csv",
        "tsv",
        "json",
        "markdown"
      ],
      "type": "string",
      "description": "Output format: csv, tsv, json (array of objects keyed by header) or markdown (pipe table)."
    },
    "from_format": {
      "enum": [
        "csv",
        "tsv",
        "json"
      ],
      "type": "string",
      "description": "Format of the input 'data': csv, tsv or json."
    }
  }
}
convert_table output schema
{
  "type": "object",
  "required": [
    "text",
    "rows",
    "columns"
  ],
  "properties": {
    "rows": {
      "type": "integer",
      "description": "Number of data rows (excluding the header)."
    },
    "text": {
      "type": "string",
      "description": "The converted table as text in to_format."
    },
    "columns": {
      "type": "integer",
      "description": "Number of columns in the header row."
    }
  }
}
convert_table annotations
{
  "title": "Convert table",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
clean_table — Clean table
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

clean_table input schema
{
  "type": "object",
  "required": [
    "data"
  ],
  "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\"."
    },
    "trim": {
      "type": "boolean",
      "description": "Trim leading/trailing whitespace in every cell. Default true."
    },
    "dedupe": {
      "type": "boolean",
      "description": "Remove exact duplicate data rows, keeping the first. Default false."
    },
    "format": {
      "enum": [
        "csv",
        "tsv",
        "json"
      ],
      "type": "string",
      "description": "Format of 'data' and of the returned table: csv, tsv or json. Default csv."
    },
    "drop_empty_rows": {
      "type": "boolean",
      "description": "Remove rows whose cells are all empty. Default true."
    }
  }
}
clean_table output schema
{
  "type": "object",
  "required": [
    "text",
    "rows_before",
    "rows_after"
  ],
  "properties": {
    "text": {
      "type": "string",
      "description": "The cleaned table as text in the input format."
    },
    "rows_after": {
      "type": "integer",
      "description": "Data rows after cleaning (excluding header)."
    },
    "rows_before": {
      "type": "integer",
      "description": "Data rows before cleaning (excluding header)."
    }
  }
}
clean_table annotations
{
  "title": "Clean table",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
column_stats — Column stats
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

column_stats input schema
{
  "type": "object",
  "required": [
    "data",
    "column",
    "op"
  ],
  "properties": {
    "op": {
      "enum": [
        "sum",
        "avg",
        "min",
        "max",
        "count",
        "distinct"
      ],
      "type": "string",
      "description": "Statistic: sum, avg, min, max (column must be numeric), count (non-empty cells) or distinct (unique values)."
    },
    "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\"."
    },
    "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\"."
    },
    "format": {
      "enum": [
        "csv",
        "tsv",
        "json"
      ],
      "type": "string",
      "description": "Format of 'data' and of the returned table: csv, tsv or json. Default csv."
    }
  }
}
column_stats output schema
{
  "type": "object",
  "required": [
    "column",
    "op",
    "result"
  ],
  "properties": {
    "op": {
      "type": "string",
      "description": "The statistic that was computed."
    },
    "column": {
      "type": "string",
      "description": "Header name of the column that was analysed."
    },
    "result": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      ],
      "description": "Numeric result for sum/avg/min/max/count, or a sorted array of distinct string values for distinct."
    }
  }
}
column_stats annotations
{
  "title": "Column stats",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
split_column — Split column
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

split_column input schema
{
  "type": "object",
  "required": [
    "data",
    "column",
    "delimiter"
  ],
  "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\"."
    },
    "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\"."
    },
    "format": {
      "enum": [
        "csv",
        "tsv",
        "json"
      ],
      "type": "string",
      "description": "Format of 'data' and of the returned table: csv, tsv or json. Default csv."
    },
    "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, ..."
    }
  }
}
split_column output schema
{
  "type": "object",
  "required": [
    "text",
    "parts"
  ],
  "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."
    }
  }
}
split_column annotations
{
  "title": "Split column",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
284 ms
95th percentile latency
284 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 284 ms · metadata changed · 4 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http sheetshift-mcp https://sheet-shift.magicteams.ai/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add sheetshift-mcp --url https://sheet-shift.magicteams.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable sheetshift-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "sheetshift-mcp": {
      "url": "https://sheet-shift.magicteams.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "sheetshift-mcp": {
      "type": "streamableHttp",
      "url": "https://sheet-shift.magicteams.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start sheetshift-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "sheetshift-mcp": {
      "type": "http",
      "url": "https://sheet-shift.magicteams.ai/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http sheetshift-mcp https://sheet-shift.magicteams.ai/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://sheet-shift.magicteams.ai/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "sheetshift-mcp": {
      "serverUrl": "https://sheet-shift.magicteams.ai/mcp"
    }
  }
}

Let your agent find its tools

Find servers like SheetShift MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.