Why Cellprose
Models read spreadsheets badly when they only see values. CSV hides which numbers are formulas. The raw .xlsx buries them in XML spread over a dozen files. Record formats like TOON drop row and column positions, so a model can no longer say which cell it means.
Cellprose keeps the grid with its addresses, and puts the logic in a short block of fill ranges after it. A model reads what the sheet does instead of reverse-engineering it from numbers, and in the benchmark that showed up as shorter answers: fewer output tokens for the same or better accuracy. See the benchmarks for the numbers, with both repeats, intervals and limitations.
Every Cellprose file is valid GitHub-Flavored Markdown, so a workbook renders as tables on GitHub and a change to one cell is a one-line diff.
# Sheet: Forecast
## A1:N5
|#|A|B|C|D|E|F|…
|-|-|-|-|-|-|-|…
|2|Bookings|100000|104000|108160|112486|117000|…
```formulas
C2:E2 = B2*(1+$B$7)
G2:I2 = F2*(1+$B$7)
```F2 is in neither range: it holds a typed number where a formula belongs. That gap is visible in two lines of text; in CSV it is invisible.
Quick start
From a checkout of the repository, until the first package release:
pip install -e ".[dev]"
cellprose encode model.xlsx # writes model.sheet.md
cellprose decode model.sheet.md # back to .xlsx: values, formulas, formats, merges, names
cellprose check model.sheet.md # validate without writing anything
cellprose stats model.xlsx # size as Cellprose vs CSV and MarkdownFor agents, there is an MCP server and an agent skill:
pip install -e ".[mcp]"
claude mcp add cellprose -- cellprose-mcpOr try it without installing anything: the playground converts an .xlsx in your browser.
What it keeps and what it drops
Cellprose keeps values, formulas, number formats, merges, defined names and sheet structure, and converts back to .xlsx without losing them. It drops styling (fonts, fills, borders), charts, pivot tables, conditional formatting, data validation, macros, comments and images. The specification lists the limits.