{"name":"io.github.theluckystrike/excel-spreadsheet-xlsx-csv","slug":"theluckystrike-excel-spreadsheet-xlsx-csv","title":null,"description":"Open, inspect, filter, edit and convert xlsx and csv files from your AI chat. Processing is local.","url":"https://mcp.market/server/theluckystrike-excel-spreadsheet-xlsx-csv","grade":"C","score":64,"certified":false,"status":"active","category":"other","tags":[],"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/theluckystrike/mcp-servers","website":"https://mcp.zovo.one/s/spreadsheet","version":"0.22.0","remotes":[{"type":"streamable-http","url":"https://mcp.zovo.one/mcp/spreadsheet","headers":[{"description":"Bearer <Pro license key or anonymous token from GET https://mcp.zovo.one/mcp/token>","isRequired":true,"isSecret":true,"name":"Authorization"}]}],"packages":[{"registryType":"mcpb","identifier":"https://github.com/theluckystrike/mcp-servers/releases/download/v0.22.0/spreadsheet.mcpb","version":"0.22.0","fileSha256":"8b7dcf5a7ca1ff26eab151ddb043fe7e4046414c729083ed24789b8e34f9d401","transport":{"type":"stdio"},"environmentVariables":[{"description":"Optional Pro license key (MCPL1....). Verified offline.","isSecret":true,"name":"MCP_LICENSE_KEY"}]}],"tools":[{"name":"license_activate","description":"Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"key":{"type":"string","description":"License key from checkout, MCPL1.<payload>.<signature>"}},"required":["key"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"license_status","description":"Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sheet_add_column","description":"Call this tool to add a computed column and save the result to a NEW file; the source is never modified unless out_path points at it. Returns the new file path, the row count and a preview of the first rows.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Path to the source .xlsx/.xlsm/.xlsb/.ods/.csv/.tsv file (~ is expanded); it is never modified"},"sheet":{"type":"string","description":"Sheet name; default is the first sheet"},"name":{"type":"string","description":"Name of the new column. It must not already exist on the sheet"},"formula":{"type":"string","description":"Expression over the columns of each row, in the same expression language as sheet_query, e.g. \"[Qty] * [Unit Price]\" or '[Country] = \"PL\"'. Give either formula or values"},"decimals":{"type":"integer","minimum":0,"maximum":10,"description":"Round numeric formula results to this many decimals. Default: the widest decimal count of the columns the formula reads, capped at 2 when they all hold 2 or fewer (money in, money out); otherwise no rounding beyond float cleanup"},"values":{"type":"array","description":"Explicit values, one per data row, instead of a formula. Missing entries are left blank"},"out_path":{"type":"string","description":"Output file; default <source>-plus-<column>.<same ext>. The source file is left untouched unless this points at it"}},"required":["path","name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sheet_convert","description":"Call this tool to convert a sheet between excel (xlsx), csv and json. Writes a new file next to the source unless out_path is given; the source is never modified. Returns the new file path with its row and column counts.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Path to the source .xlsx/.xlsm/.xlsb/.ods/.csv/.tsv file (~ is expanded); it is never modified"},"to":{"type":"string","enum":["csv","xlsx","json"],"description":"Target format; the default out_path takes this as its extension"},"sheet":{"type":"string","description":"Sheet to convert; default is the first sheet. Only that one sheet is written"},"out_path":{"type":"string","description":"Where to write; default is the source name with the new extension, next to the source. It must differ from the source path"}},"required":["path","to"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sheet_files","description":"List the sheets loaded for this token, with their sizes and the storage left under the 2 MB cap.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sheet_find","description":"Call this tool to search every cell of a spreadsheet or CSV for text; built-in file readers cannot parse spreadsheets. Matching is case insensitive. Returns cell addresses with a preview of the row each hit is on.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Path to the .xlsx/.xlsm/.xlsb/.ods/.csv/.tsv file (~ is expanded)"},"text":{"type":"string","description":"Text to look for; matched case insensitively anywhere inside a cell. Up to 200 hits are returned"},"sheet":{"type":"string","description":"Sheet name; default searches every sheet"}},"required":["path","text"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sheet_info","description":"Call this tool for any spreadsheet or CSV file path; built-in file readers cannot parse spreadsheets and must not be used for them. Start here: sheet names, size, header row, column types and samples.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Path to the .xlsx/.xlsm/.xlsb/.ods/.csv/.tsv file (~ is expanded)"}},"required":["path"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sheet_load","description":"Upload data to work on. This hosted endpoint has no filesystem, so instead of a file path you send the data once with sheet_load and then pass its name as `path` to sheet_info, sheet_read, sheet_query, sheet_stats, sheet_find, sheet_add_column, sheet_convert and sheet_write. Give exactly one of csv (raw text, comma or tab separated), xlsx_base64 (a base64-encoded .xlsx workbook) or url. url: fetch a public file instead of pasting base64 (recommended above about 10 KB): the url is fetched here with a 10 second timeout, at most 3 redirects, public http(s) hosts only, and a 2 MB cap, and a fetched file is stored as an .xlsx when it carries the PK zip header and as delimited text otherwise. Loaded sheets are kept for your token and survive between calls; the total is capped at 2 MB per token. Files the other tools write come back as a download link that is valid for one hour.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":70,"description":"Name to refer to this data by: 1-64 characters of letters, digits, underscore or dash, e.g. \"sales\" or \"sales.csv\""},"csv":{"type":"string","description":"Raw CSV or TSV text, including the header row"},"xlsx_base64":{"type":"string","description":"Base64-encoded .xlsx workbook"},"url":{"type":"string","description":"url: fetch a public file instead of pasting base64 (recommended above about 10 KB). Public http(s) only; private, link-local and this endpoint's own zone are refused"}},"required":["name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sheet_query","description":"Call this tool for any spreadsheet or CSV file path; built-in file readers cannot parse them. Filters, groups, aggregates and sorts in one call. Totals: aggregate/group_by here, never hand sums over sheet_read rows.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Path to the .xlsx or .csv file"},"sheet":{"type":"string"},"where":{"type":"string","description":"Filter, e.g. [Qty] >= 5 AND ([Status] = \"open\" OR [Status] = \"new\")"},"select":{"type":"array","items":{"type":"string"},"description":"Column names to return; default all (with group_by, defaults to the group columns plus the aggregates)"},"group_by":{"type":"array","items":{"type":"string"},"description":"Group rows by these columns before aggregating, e.g. [\"Rep\"] or [\"Region\",\"Rep\"]"},"aggregate":{"type":"array","items":{"type":"object","properties":{"col":{"type":"string","description":"Column to aggregate, or \"*\" to count rows"},"fn":{"type":"string","enum":["sum","count","avg","min","max"],"description":"sum | count | avg | min | max"},"as":{"type":"string","description":"Output name for this aggregate, e.g. total_units"}},"required":["col","fn"],"additionalProperties":false},"description":"Aggregates per group, e.g. [{\"col\":\"Units\",\"fn\":\"sum\",\"as\":\"total_units\"}]. Defaults to a row count when group_by is given."},"sort":{"type":"object","properties":{"col":{"type":"string"},"dir":{"type":"string","enum":["asc","desc"]}},"required":["col"],"additionalProperties":false,"description":"Sort column; may be an aggregate alias such as total_units"},"limit":{"type":"integer","minimum":1,"maximum":100000,"description":"Default 100"},"as":{"type":"string","enum":["table","json","csv"]}},"required":["path"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sheet_read","description":"Call this tool for any spreadsheet or CSV file path; built-in file readers cannot parse spreadsheets and must not be used for them. Reads rows as a table, JSON or CSV; page with limit/offset or an A1 range.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string"},"sheet":{"type":"string","description":"Sheet name; defaults to the first sheet"},"range":{"type":"string","description":"A1 range such as A1:D50; overrides limit/offset"},"limit":{"type":"integer","minimum":1,"maximum":100000,"description":"Rows to return, default 100"},"offset":{"type":"integer","minimum":0,"description":"Rows to skip, default 0"},"as":{"type":"string","enum":["table","json","csv"],"description":"Output format, default table"}},"required":["path"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sheet_stats","description":"Call this tool for any spreadsheet or CSV file path; built-in file readers cannot parse spreadsheets and must not be used for them. Whole-column statistics: count, empty, distinct, min, max, sum, mean, median.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string"},"sheet":{"type":"string"},"columns":{"type":"array","items":{"type":"string"},"description":"Limit to these columns; default all"}},"required":["path"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sheet_unload","description":"Delete one sheet loaded for this token, freeing its space under the 2 MB cap.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":70}},"required":["name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sheet_write","description":"Call this tool to write rows to an xlsx, csv, tsv or json file; the extension of out_path picks the format. mode is new_file, append or overwrite. Other sheets are kept. Free: 500 rows per file.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"path":{"type":"string","description":"Source file for append/overwrite, or the intended file for new_file (~ is expanded)"},"sheet":{"type":"string","description":"Sheet to write; default is the first sheet of the source, or \"Sheet1\" for a new file. Other sheets of an existing workbook are kept unchanged"},"rows":{"type":"array","items":{"anyOf":[{"type":"object","additionalProperties":{}},{"type":"array"}]},"description":"Array of objects, whose keys become the headers, or an array of arrays with the header row first"},"mode":{"type":"string","enum":["new_file","append","overwrite"],"description":"new_file writes a brand new file and refuses to clobber an existing one; append adds the rows under the existing data; overwrite replaces the file contents"},"out_path":{"type":"string","description":"Where to write; default is a new file next to the source for new_file, or the source itself for append/overwrite. The output format follows this extension: .xlsx, .csv, .tsv or .json. An extension is required"}},"required":["path","rows","mode"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}],"scan":{"score":64,"grade":"C","scanned_at":"2026-09-17T16:31:58.317Z","report":{"scannerVersion":"0.1.2","scannedAt":"2026-09-17T16:31:58.236Z","components":{"code":{"score":-1,"max":25,"notes":["package could not be scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 294ms"]},"poisoning":{"score":15,"max":15,"notes":["13 tool descriptions checked"]},"auth":{"score":8,"max":15,"notes":["API key sent as a header"]},"maintenance":{"score":3,"max":15,"notes":["repository not readable: github 401"]},"identity":{"score":2,"max":10,"notes":["no repository or website to verify"]}},"findings":[],"inputs":{"probes":[{"url":"https://mcp.zovo.one/mcp/spreadsheet","reachable":true,"authRequired":false,"latencyMs":294,"serverInfo":{"name":"mcp-spreadsheet","version":"0.22.0"}}],"packages":[],"repo":{"found":false,"owner":"theluckystrike","repo":"mcp-servers","error":"github 401"}}}},"grade_history":[]}