Home · Guides

Asking a spreadsheet a question

In orders.xlsx, what did each region sell in Q3, totalled, sorted highest first?

Paste this into Claude with the server connected.

That is sheet_query: filters, sorts, group by, and sum, average, min and max per group. No formula written, no pivot table built, and nothing typed into a cell.

Why it is a safe expression language and not eval

The filters and computed columns are parsed and evaluated by the server's own small expression engine. It has no access to the filesystem, the network or the process, because there is no eval and no shell anywhere in the path. A model that decides to filter on something strange produces a wrong answer at worst, not a command that runs.

Column references are bracketed, so [Qty] * [Unit Price] is a computed column and [Status] = "open" and [Qty] > 5 is a filter. That is the whole syntax you ever need to know, and mostly you do not, because you describe what you want and the model writes it.

The check to run first, every time

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 row it guessed. On an export with a title line and a blank row above the real headers, the guess is doing real work, and it is worth seeing what it decided before you build an answer on it. sheet_stats per column is the second check: a numeric column that reports as text is the reason a total came back wrong.

Finding one thing

Find every row in clients.xlsx that mentions Beta GmbH.

Paste this into Claude with the server connected.

sheet_find searches values across the sheet and returns the rows with their numbers, so you can go and look at the source. It searches what is in the cells, not what a formula would have produced elsewhere.

Writing the answer back

sheet_add_column adds a computed column and sheet_write saves to a path you name. The source is not overwritten unless you tell it to be, which is the default that stops a question from destroying the file it was asked about.

Free limits

Read, query, stats and find on files up to 5,000 rows. Writes up to 500 rows, and never a partial file above that: the write is refused rather than truncated. Pro removes both. From data/facts.json.

Nothing is uploaded. The server works on the files you name and stores nothing else, which is the practical difference from pasting a sheet into a chat window.

Questions

Can it read a formula's result?

It reads the cached value the file stores, which is what the formula last computed when the file was saved. It does not recalculate. A file saved by a tool that did not write cached values will read as blank in those cells, and sheet_info plus sheet_stats will show you that before you build on it.

Does it handle multiple sheets?

sheet_info lists them and the read and query tools take a sheet name. Queries run against one sheet at a time; there is no join across sheets, which is a real limitation and not a temporary one.

Is my file uploaded anywhere?

No. The server makes no network call of any kind. It opens the path you gave it, answers, and keeps a recent-files list and nothing else. That list is the only thing it stores.

How big can a file be?

Free reads up to 5,000 rows and refuses above that with the row count rather than answering from a slice. Pro has no row limit, and the practical ceiling becomes memory. A 200,000-row file is a database question rather than a spreadsheet question.

Related

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