Home · Guides

CSV to xlsx and back, in one call

Convert ~/Downloads/orders.csv to xlsx and save it next to the original.

Paste this into Claude with the server connected.

sheet_convert. It reads xlsx, xlsm, xlsb, ods, csv and tsv, and writes the format you ask for. The source is never overwritten unless you say so.

The other direction is the same call with the formats swapped, and it is the one that usually matters, because most tools that want a data file want CSV and most people are sent xlsx.

What survives, and what does not

Survives CSV to xlsxLost going xlsx to CSV
Every value, as text or numberFormulas, which become their last computed value
The header rowFormatting, colours, column widths
Row and column orderEvery sheet but the one you converted
Unicode, including names with accentsMerged cells, which flatten

None of that is a defect in the converter. CSV is a text format with no concept of a formula, a second sheet or a colour, and a converter that pretended otherwise would be inventing data.

The part that handles real exports

Exports out of accounting software and bank portals are rarely clean. Two behaviours cover most of it. The delimiter is sniffed, so a semicolon-separated European export is read correctly rather than landing in one column. The header row is guessed, so a file with a title line, a blank line and then the real headers is read from the right row instead of treating "Sales report Q3" as a column name.

Check what it found before you trust it:

Open orders.xlsx and tell me what is in it.

Paste this into Claude with the server connected.

sheet_info returns the sheets, the dimensions and the header it detected. Thirty seconds here saves a conversion that silently offset every row by one.

Doing work in between

Converting is rarely the actual goal. sheet_query filters, sorts and groups with a safe expression language that does no eval, sheet_add_column writes a computed column such as [Qty] * [Unit Price], and sheet_write saves the result wherever you name.

In orders.xlsx keep the open orders over 5 units, add a Total column of Qty times Unit Price, sort by Total descending and save it as orders-open.csv.

Paste this into Claude with the server connected.

Free limits, and the one that matters

Reading, querying, stats and find work on files up to 5,000 rows. Writes go up to 500 rows, and never a partial file above that: a write that would exceed the limit is refused rather than producing a truncated file that looks complete. That refusal is the important half. A silently truncated spreadsheet is the kind of error that gets discovered by an accountant three months later.

Pro removes both limits. Figures from data/facts.json; there are 7 tools on this server, counted from data/tools.json.

Questions

Does it need Excel or LibreOffice installed?

No. It parses and writes the formats directly in JavaScript. Nothing is launched, nothing is uploaded, and it runs the same on a machine that has never had an office suite on it.

Can it write multiple sheets into one xlsx?

A conversion produces one sheet from one source. To assemble several, write each and combine them in a tool that does workbooks. What the server does well is the single-table case, which is what almost every data export actually is.

My CSV has European decimal commas.

The delimiter sniffing handles the column separator. Decimal commas inside values are a separate question and depend on the file: check with sheet_info and a small sheet_read before converting a large file, because a value read as text rather than a number will sort and sum wrongly rather than error.

What happens to a file bigger than 5,000 rows on the free tier?

The read is refused with the row count, rather than answering from the first 5,000. Refusing is the honest behaviour: an answer computed from part of a file is worse than no answer, because you cannot tell by looking that it happened.

Related

All MCP servers and prices · All guides · Buy the bundle $39