agent-spreadsheet
MCP serverFiles & storageThis gives your AI the ability to work with Excel workbooks directly. It can read and analyze spreadsheet data, make edits, recalculate formulas, and verify the results. The tools are built to be safe for an AI to use on your files.
Unavailable. This server has no hosted endpoint yet, so ahel can't serve it.
After adding it, give your AI an Excel workbook and ask it to analyze the data or make the changes you need.
What your AI can do with it
- Analyze the data inside Excel workbooks
- Edit spreadsheet contents
- Recalculate formulas and get updated values
- Verify workbook contents and changes
- Work with Excel files using tools designed for safe AI use
From the project's README
As published by psu3d0/agent-spreadsheet in README.md.
agent-spreadsheet is the tool interaction service for agent-based spreadsheet usage.
It gives agents a safe, inspectable, token-efficient way to read, analyze, mutate, verify, and operationalize Excel workbooks without falling back to brittle UI automation.
If you want an agent to work with spreadsheets like a real system instead of a screenshot puppet, this is the stack.
What this project is
agent-spreadsheet ships a unified spreadsheet interaction layer across three surfaces:
| Surface | Binary / Package | Mode | Best for |
|---|---|---|---|
| CLI | agent-spreadsheet / asp | Stateless files + resident sessions | One-shot pipelines or retained multi-turn workbook editing |
| MCP server | agent-spreadsheet-mcp | Stateful | Multi-turn agent sessions, workbook caching, fork/recalc workflows |
| TypeScript SDK | agent-spreadsheet-sdk | Library | App integrations — drives the server's canonical /v1 route, or runs fully in-process via the embedded WASM engine (no server required) |
The WASM build (agent-spreadsheet-wasm) is the SDK's local runtime, not a separate product surface: JS and TypeScript code targets one object model and the execution substrate (server vs embedded engine) is a configuration choice.
In 0.16 these surfaces share the resident Rust document/evaluator runtime and 32-operation registry. Explicit native sessions automatically start a private journal-backed host. SDK/WASM and genuine just-bash sessions retain their history in memory; XLSX export saves a document snapshot, not a restartable session journal. Warm edit/recalculate/read loops avoid XLSX serialization and repeated evaluator ingestion. See runtime guarantees and limits and the SDK/just-bash examples.
Supported workbook modes:
.xlsx/.xlsm— read + write.xls/.xlsb— discovery/read-oriented workflows only
Powered by Formualizer
Default in-process calculation uses Formualizer — a permissively licensed (MIT/Apache-2.0) spreadsheet engine written in Rust: formula parsing, dependency-graph recalculation, 400+ Excel functions, dynamic arrays, and deterministic evaluation built for agents. No Excel COM or headless LibreOffice is required. Optional LibreOffice integration remains available, but Formualizer is the release-critical backend.
That native engine is why this project can offer what most spreadsheet tooling for agents cannot: recalculate the actual workbook, trace which cells changed and why, and prove it — not just read cached values or push blind edits.
Embedding spreadsheet logic in your own product rather than driving workbooks as an agent? Use Formualizer directly (Rust, Python, JS/WASM).
Why agents use agent-spreadsheet
Built for tool use, not just humans
- deterministic JSON contracts
- schema and example discovery from the CLI itself
- explicit pagination and compact output modes
- machine-readable warnings and error envelopes
Safe mutation, not blind mutation
- dry-run first workflows
- stateless output modes and overwrite safety
- event-sourced session editing
- verification surfaces for proving downstream outcomes
- structural impact analysis before risky workbook changes
Spreadsheet-aware, not generic file editing
- region detection
- table and footer-aware append helpers
- template row / row band cloning
- formula-specific replace and diagnostics
- named range CRUD
- recalculation + diff + proof flows
Good agent ergonomics
- nested command groups with legacy alias compatibility
- token-efficient reads
- exact-cell inspection and layout inspection
- workflow helpers for the repetitive parts agents usually get wrong
What is new / what makes this stack different
The current surface is much stronger than a plain “read some cells” tool. Major capabilities now include:
aspas the primary CLI withagent-spreadsheetpreserved as a compatibility alias- grouped verification via
asp verify proofandasp verify diff - preview-first workflow helpers for:
write appendwrite clone-template-rowwrite clone-row-band
- formula-safe batch workflows with parse-policy diagnostics
- cell/layout/export/import inspection surfaces
- named range management (
write name define|update|delete) - formula-only replacement (
write formulas replace) - event-sourced session editing with log, branch, undo/redo, fork, apply, and materialize
- SheetPort manifest lifecycle + execution for contract-driven spreadsheet automation
Install
Shell installer
curl -fsSL https://raw.githubusercontent.com/PSU3D0/agent-spreadsheet/main/install.sh | sh
The installer downloads a prebuilt CLI to ~/.local/bin and creates the asp command. Pin a release with ASP_VERSION=0.16.0, set ASP_INSTALL_DIR to choose another destination, or pass --mcp to install the MCP server too:
curl -fsSL https://raw.githubusercontent.com/PSU3D0/agent-spreadsheet/main/install.sh | sh -s -- --mcp
npm
npm i -g agent-spreadsheet
This installs both asp (the primary command) and agent-spreadsheet (the compatibility alias) from a prebuilt native binary. No Rust toolchain is required.
cargo-binstall
cargo binstall agent-spreadsheet
This installs the prebuilt CLI in seconds.
Cargo
cargo install agent-spreadsheet --features recalc --bin asp --bin agent-spreadsheet
This builds the CLI from source. Formualizer (the native Rust recalc engine) is included by default.
mise
mise use -g "ubi:PSU3D0/agent-spreadsheet[exe=asp]"
# Homebrew
brew install psu3d0/tap/agent-spreadsheet
MCP server
cargo install agent-spreadsheet-mcp
Docker
# Read-only / slim
docker pull ghcr.io/psu3d0/agent-spreadsheet-mcp:latest
# Write + recalc + screenshots
docker pull ghcr.io/psu3d0/agent-spreadsheet-mcp:latest-full
JavaScript SDK
npm i agent-spreadsheet-sdk
Prebuilt binaries
Download raw binaries and archives from GitHub Releases.
Published native assets include:
- Linux x86_64
- Linux arm64
- macOS x86_64
- macOS arm64
- Windows native binaries are not shipped for 0.16; native release validation targets Linux and macOS
Start here: the core workflows
1) Orient the workbook before reading cells
# What sheets are here?
asp read sheets data.xlsx
# What regions/tables/parameter blocks does this sheet contain?
asp read overview data.xlsx "Model"
# What named items are available?
asp read names data.xlsx
# Read a structured region as a table
asp read table data.xlsx --sheet "Model"
2) Inspect exactly what an agent needs
# Raw values for exact ranges
asp read values data.xlsx Model A1:C20
# Detail-view for targeted cells (value / formula / cached / style triage)
asp read cells data.xlsx Model B2 D10:F12
# Layout-aware rendering for a bounded range
asp read layout data.xlsx Model --range A1:H30 --render both
# Export a bounded range to csv or grid json
asp read export data.xlsx Model A1:H30 --format csv --output model.csv
3) Do a safe stateless edit → recalc → proof → diff loop
asp workbook copy data.xlsx /tmp/draft.xlsx
asp write cells /tmp/draft.xlsx Inputs "B2=500" "C2==B2*1.1"
asp workbook recalculate /tmp/draft.xlsx
asp verify proof data.xlsx /tmp/draft.xlsx --targets Summary!B2,Summary!B3 --named-ranges
asp verify diff data.xlsx /tmp/draft.xlsx --details --limit 50
A representative label-mode lookup:
asp analyze find-value data.xlsx "Net Income" --mode label --label-direction below
4) Preview structural risk before mutating the workbook
asp analyze ref-impact data.xlsx --ops @structure_ops.json --show-formula-delta
This is intentionally read-only. It surfaces shifted spans, absolute-reference warnings, token counts, and optional before/after formula samples.
5) Use workflow helpers instead of reinventing row logic
# Stateless batch writes
asp write batch transform data.xlsx --ops @ops.json --dry-run
asp write batch style data.xlsx --ops @style_ops.json --dry-run
# Append rows into a detected region or table, respecting footer rows when present
asp write append data.xlsx --sheet Revenue --table-name RevenueTable --from-csv rows.csv --header --dry-run
# Clone one template row with preview-first planning
asp write clone-template-row data.xlsx --sheet Inputs --source-row 8 --after 8 --count 3 --dry-run
# Clone a contiguous row band repeatedly
asp write clone-row-band data.xlsx --sheet Forecast --source-rows 12:16 --after 16 --repeat 4 --dry-run
6) Use a stateful session when the edit story gets complex
asp session start --base data.xlsx --workspace .
asp session op --session <id> --ops @edit.json --workspace .
asp session apply --session <id> <staged_id> --workspace .
asp session materialize --session <id> --output result.xlsx --workspace .
And when you need proper history and branching:
asp session log --session <id> --workspace .
asp session fork --session <id> scenario-a --workspace .
asp session undo --session <id> --workspace .
asp session redo --session <id> --workspace .
asp session checkout --session <id> <op_id> --workspace .
7) Turn workbook interfaces into contracts with SheetPort
# Discover candidate ports from workbook structure
asp sheetport manifest candidates model.xlsx
# Validate or normalize a manifest
asp sheetport manifest validate manifest.yaml
asp sheetport manifest normalize manifest.yaml
# Bind-check a workbook against a manifest
asp sheetport bind-check model.xlsx manifest.yaml
# Execute the manifest with JSON inputs
asp sheetport run model.xlsx manifest.yaml --inputs @inputs.json
CLI overview
The primary CLI is asp.
agent-spreadsheet remains available as a compatibility alias, so both of these are valid:
asp read sheets data.xlsx
agent-spreadsheet read sheets data.xlsx
Preferred command groups
asp read ...asp analyze ...asp write ...asp workbook ...asp verify ...asp session ...asp sheetport ...
Legacy aliases
Legacy flat commands are still normalized to the new nested surface where practical. That makes migration easier for older prompts, docs, and automation.
Discoverability built into the CLI
When an agent is unsure of payload shape, it can ask the tool directly:
asp operations # CLI-supported runtime subset
asp registry --all # complete host-independent registry + schemas
asp schema read_cells
asp example read_cells
asp schema write batch transform
asp example write batch transform
asp schema session op transform.write_matrix
asp example session op transform.write_matrix
Canonical machine calls use the same registry and dispatcher as other surfaces. asp schema <canonical-op> and asp example <canonical-op> project the native adapter contract: resource_id and, for verification, baseline_resource_id are omitted from required JSON because --bind and --baseline inject ephemeral resources. The host-independent asp registry --all remains unchanged.
asp op read_cells --bind data.xlsx --json '{"sheet_name":"Sheet1","selection":{"kind":"range","ranges":["A1:C10"]}}'
asp op verify_workbook --baseline base.xlsx --bind current.xlsx --json '{}'
echo '{"action":"schema"}' | asp op sheetport_manifest
--bind reads the current workbook, while --baseline supplies the second workbook only for verify_workbook. Canonical mutable CLI calls require exactly one persistence target: --output <path> writes a new file or --in-place atomically replaces the bound file; pure preview persists nothing and accepts neither. Durable fork, checkpoint, stage, and history operations are intentionally absent from stateless CLI discovery. This is a core design principle: the surface should explain itself to the agent.
Command families
read — extraction and inspection
| Command | Purpose |
|---|---|
asp read sheets <file> | List sheets with summary metadata |
asp read overview <file> <sheet> | Detect regions, headers, and orientation |
asp read values <file> <sheet> <range> [range...] | Pull raw values for exact A1 ranges |
asp read export <file> <sheet> <range> | Export a bounded range to csv or grid json |
asp read cells <file> <sheet> <target> [target...] | Inspect exact cells/ranges with value/formula/cached/style snapshots |
asp read page <file> <sheet> ... | Deterministic sheet paging with next_start_row |
asp read table <file> ... | Structured table/region read with deterministic next_offset |
asp read names <file> | Named ranges, named formulas, and table items |
asp read workbook <file> | Workbook-level metadata |
asp read layout <file> <sheet> | Layout-aware rendering with widths, merges, borders, and optional ascii output |
Why these matter for agents
Agents rarely need “the whole spreadsheet.” They need:
- the right region
- the right page
- the right cells
- just enough layout to understand intent
That is why the read surface combines region detection, structured reads, detail inspection, and explicit continuation.
analyze — search, diagnostics, and impact understanding
| Command | Purpose |
|---|---|
asp analyze find-value <file> <query> | Search by value or by label semantics |
asp analyze find-formula <file> <query> | Text search within formulas |
asp analyze formula-map <file> <sheet> | Summarize formulas by complexity/frequency |
asp analyze formula-trace <file> <sheet> <cell> <precedents|dependents> | Dependency tracing with continuation |
asp analyze scan-volatiles <file> | Find volatile formulas |
asp analyze sheet-statistics <file> <sheet> | Density and type statistics |
asp analyze table-profile <file> | Header/type/cardinality profiling |
asp analyze ref-impact <file> --ops @structure_ops.json | Preflight structural edit impact without mutation |
Why this matters
Headless spreadsheet automation wins when it can explain consequences, not just execute mutations. ref-impact, formula-trace, and grouped diagnostics are all part of that story.
write — safe mutations and workflow helpers
| Command | Purpose |
|---|---|
asp write cells <file> <sheet> ... | Direct shorthand cell edits |
asp write import <file> <sheet> ... | Import grid json or csv into a workbook range |
asp write append ... | Footer-aware row append into a region or table |
asp write clone-template-row ... | Clone one template row with preview-first planning |
asp write clone-row-band ... | Clone a multi-row template band repeatedly |
asp write formulas replace ... | Formula-only find/replace on a sheet/range |
| `asp write name define | update |
asp write batch transform ... | Stateless transform pipeline |
asp write batch style ... | Stateless style edits |
asp write batch formula-pattern ... | Autofill-like formula application |
asp write batch structure ... | Rows/cols/sheets/copy/move style mutations |
asp write batch column-size ... | Column width operations |
asp write batch sheet-layout ... | Freeze panes, zoom, page setup, print area |
asp write batch rules ... | Data validation + conditional formatting |
Safety model
Most mutating commands support a strict mode matrix:
--dry-run--in-place--output <PATH>
This matters for agents because it allows:
- dry-run planning
- non-destructive execution
- explicit overwrite control
Formula maintenance
Formula mutation is now a first-class surface:
asp write formulas replace data.xlsx Sheet1 --find '$64' --replace '$65' --dry-run
asp write formulas replace data.xlsx Sheet1 --find 'Sheet1!' --replace 'Sheet2!' --range A1:Z100 --output fixed.xlsx
Named range maintenance
asp write name define data.xlsx RevenueInput 'Inputs!$B$2'
asp write name update data.xlsx RevenueInput 'Inputs!$B$2:$B$4' --in-place
asp write name delete data.xlsx RevenueInput --in-place
workbook — file-level flows
| Command | Purpose |
|---|---|
asp workbook create <path> | Create a new workbook |
asp workbook copy <source> <dest> | Safe copy for edit workflows |
asp workbook recalculate <file> | Recalculate formulas via the configured backend |
verify — proof, not vibes
| Command | Purpose |
|---|---|
asp verify proof <baseline> <current> | Prove target deltas and isolate new/resolved/preexisting errors |
asp verify diff <original> <modified> | Summary-first grouped workbook diff with optional paged details |
Why verification matters
Most spreadsheet automation tools stop at “the edit applied.”
agent-spreadsheet goes further:
- did the target cells change the way we expected?
- did the workbook introduce new errors?
- which changes were direct edits vs recalculation fallout?
- what changed overall, grouped in a way an agent can reason about?
This verification layer is a big part of why this project is a serious agent substrate rather than a utility script.
session — event-sourced stateful editing
The session surface is for workflows that are too complex for a single stateless write.
What sessions give you
- persistent editing state
- staged dry-run operations
- compare-and-swap apply semantics
- logs and replayability
- branch/switch/fork flows
- undo / redo / checkout
- explicit materialization back to a workbook file
Canonical loop
asp session start --base model.xlsx --workspace .
asp session op --session <id> --ops @ops.json --workspace .
asp session apply --session <id> <staged_id> --workspace .
asp session materialize --session <id> --output result.xlsx --workspace .
History and branching
asp session log --session <id> --workspace .
asp session branches --session <id> --workspace .
asp session fork --session <id> experiment-b --workspace .
asp session switch --session <id> experiment-b --workspace .
asp session undo --session <id> --workspace .
asp session redo --session <id> --workspace .
asp session checkout --session <id> <op_id> --workspace .
Use sessions when you want repeatability, auditability, and multi-step safety.
sheetport — spreadsheet interfaces as executable contracts
SheetPort is the workflow surface for turning workbook inputs/outputs into explicit machine contracts.
Manifest lifecycle
asp sheetport manifest candidates model.xlsx
asp sheetport manifest schema
asp sheetport manifest validate manifest.yaml
asp sheetport manifest normalize manifest.yaml
Bind-check + run
asp sheetport bind-check model.xlsx manifest.yaml
asp sheetport run model.xlsx manifest.yaml --inputs @inputs.json --freeze-volatile
Use this when you want a workbook to behave less like an opaque file and more like a declared service interface.
Output contracts for agents
Canonical vs compact shapes
All commands default to JSON. Many also support:
--shape canonical
--shape compact
Policy:
- canonical keeps the full stable schema
- compact removes wrapper noise where the contract allows it while preserving continuation fields and command-specific semantics
Shape policy:
- Canonical (default): preserve the full response schema.
- range-values: returns a stable
values: [...]envelope in both canonical and compact modes. - range-values default encoding: dense JSON (
dense.encoding = "dense_v1") withdictionary+ run-lengthrow_runs. - range-values
--include-formulas: includes sparse formula coordinates in dense mode (dense.formulas), or a matrix in explicitjsonformat. - read-table and sheet-page: compact preserves the active branch and continuation fields (
next_offset,next_start_row). - formula-trace compact: omits per-layer
highlightswhile preservinglayersandnext_cursor.
Deterministic pagination loops
# sheet-page continuation
asp read page data.xlsx Sheet1 --format compact --page-size 200
asp read page data.xlsx Sheet1 --format compact --page-size 200 --start-row 201
# read-table continuation
asp read table data.xlsx --sheet "Sheet1" --table-format values --limit 200 --offset 0
asp read table data.xlsx --sheet "Sheet1" --table-format values --limit 200 --offset 200
sheet-page machine contract
- Inspect top-level
formatbefore reading payload fields. format=full: read top-levelrowsplus optionalheader_rowandnext_start_row.format=compact: readcompact.headers,compact.header_row,compact.rowsplus optionalnext_start_row.format=values_only: readvalues_only.rowsplus optionalnext_start_row.- Continuation is always driven by top-level
next_start_rowwhen present. - Global
--shape compactpreserves the activesheet-pagebranch; it does not flattensheet-pagepayloads.
Machine continuation example:
- Request page 1 without
--start-row. - If
next_start_rowis present, callsheet-pageagain with--start-row <next_start_row>. - Stop when
next_start_rowis omitted.
Self-describing payloads
When the agent is unsure what to send, ask for a schema or example:
asp schema write batch rules
asp example write batch rules
asp schema session op structure.insert_rows
asp example session op structure.insert_rows
Batch payload examples
All batch payloads use a top-level envelope object. Most commands require {"ops":[...]}; column-size-batch prefers {"sheet_name":"...","ops":[...]} and also accepts per-op sheet_name inside {"ops":[...]}.
transform-batch payloads (@transform_ops.json)
- Minimal:
{"ops":[{"kind":"fill_range","sheet_name":"Sheet1","target":{"kind":"range","range":"B2:B4"},"value":"0"}]} - Advanced:
{"ops":[{"kind":"replace_in_range","sheet_name":"Sheet1","target":{"kind":"region","region_id":1},"find":"N/A","replace":"","match_mode":"contains","case_sensitive":false,"include_formulas":true}]}
style-batch payloads (@style_ops.json)
- Minimal:
{"ops":[{"sheet_name":"Sheet1","target":{"kind":"range","range":"B2:B2"},"patch":{"font":{"bold":true}}}]} - Advanced:
{"ops":[{"sheet_name":"Sheet1","target":{"kind":"cells","cells":["B2","B3"]},"patch":{"number_format":"$#,##0.00","alignment":{"horizontal":"right"}},"op_mode":"merge"}]}
write batch formula-pattern payloads (@formula_ops.json)
- Minimal:
{"ops":[{"sheet_name":"Sheet1","target_range":"C2:C4","anchor_cell":"C2","base_formula":"B2*2"}]} - Advanced:
{"ops":[{"sheet_name":"Sheet1","target_range":"C2:E4","anchor_cell":"C2","base_formula":"B2*2","fill_direction":"both","relative_mode":"excel"}]} relative_modevalid values:excel,abs_cols,abs_rows
Shortened here. Read the whole README on GitHub.
Signals
- GitHub stars
- 56
- Forks
- 7
- Last commit
- Sep 2026
Advanced
- Delivery
- agent-spreadsheet MCP server → your ahel gateway (mcp.ahel.ai) → every connected AI client.
- Catalog kind
- mcp-server
- Gateway key
io-github-psu3d0-agent-spreadsheet- Source
- github.com/psu3d0/agent-spreadsheet