Spreadsheet MCP

MCP server for spreadsheet analysis and editing. Slim, token-efficient tool surface designed for LLM agents.
Why?
Dumping a 50,000-row spreadsheet into an LLM context is expensive and usually unnecessary. Most spreadsheet tasks need surgical access: find a region, profile its structure, read a filtered slice. This server exposes tools that let agents discover → profile → extract without burning tokens on cells they don't need.
- Full support:
.xlsx(viaumya-spreadsheet) - Discovery only:
.xls,.xlsb(enumerated, not parsed)
Architecture

- LRU cache keeps recently-accessed workbooks in memory (configurable capacity)
- Lazy sheet metrics computed once per sheet, reused across tools
- Region detection runs once and caches bounds for
sheet_overview,find_value,read_table,table_profile
Tool Surface
| Tool | Purpose |
|---|---|
list_workbooks, list_sheets |
Discover targets and get sheet summaries |
workbook_summary |
Region counts/kinds, named ranges, suggested entry points |
sheet_overview |
Detected regions (bounds/id/kind/confidence), narrative, key ranges |
find_value |
Value/label-mode lookup with region/table scoping, neighbors, row context |
read_table |
Structured read (range/region/table/named range), headers, filters, sampling |
table_profile |
Lightweight column profiling with samples and inferred types |
range_values |
Minimal range fetch for spot checks |
sheet_page |
Fallback pagination; supports compact/values_only |
formula_trace |
Precedents/dependents with paging |
Write & Recalc Support (Experimental)
Enabled via SPREADSHEET_MCP_RECALC_ENABLED=true (requires spreadsheet-mcp:full image).
| Tool | Purpose |
|---|---|
create_fork |
Create a temporary editable copy for "what-if" analysis |
edit_batch |
Apply values or formulas to cells in a fork |
recalculate |
Trigger LibreOffice to update formula results |
get_changeset |
Diff the fork against the original (cells, tables, named ranges) |
save_fork |
Commit changes to a file (overwrite or new path) |
discard_fork |
Delete the temporary fork |
See docs/RECALC.md for architecture details.
Example
Request: Profile a detected region
Response:
The agent now knows column types, cardinality, and value distributions—without reading 1,247 rows.
Recommended Agent Workflow

list_workbooks→list_sheets→workbook_summaryfor orientationsheet_overviewto getdetected_regions(ids/bounds/kind/confidence)table_profile→read_tablewithregion_id, smalllimit, andsample_mode(distributedpreferred)- Use
find_value(label mode) orrange_valuesfor targeted pulls - Reserve
sheet_pagefor unknown layouts or calculator inspection; prefercompact/values_only - Keep payloads small; page/filter rather than full-sheet reads
Region Detection

Spreadsheets often contain multiple logical tables, parameter blocks, and output areas on a single sheet. The server detects these automatically:
- Gutter detection — Scans for empty rows/columns that separate content blocks
- Recursive splitting — Subdivides large areas along detected gutters
- Border trimming — Removes sparse edges to tighten bounds
- Header detection — Identifies header rows (including multi-row merged headers)
- Classification — Labels each region:
data,parameters,outputs,calculator,metadata - Confidence scoring — Higher scores for well-structured regions with clear headers
Regions are cached per sheet. Tools like read_table accept a region_id to scope reads without manually specifying ranges.
Quick Start
Docker (Recommended)
For stdio mode (e.g., Claude Code):
Cargo Install
Build from Source
Default transport: HTTP streaming at 127.0.0.1:8079. Endpoint: POST /mcp.
Use --transport stdio for CLI pipelines.
Local Development Testing
To test local changes without rebuilding Docker, point your MCP client directly at the cargo build:
Claude Code (Local Build)
Add to ~/.claude.json or project .mcp.json:
Or build once and run the binary directly:
Cursor / VS Code (Local Build)
In .vscode/settings.json or user settings:
Tip: Use cargo build --release first, then point to the binary for faster startup.
MCP Client Configuration
Claude Desktop (Docker)
Add to claude_desktop_config.json:
Claude Desktop (Binary)
Cursor / VS Code (Docker)
Cursor / VS Code (Binary)
HTTP Mode
Connect via POST http://localhost:8079/mcp.
Configuration
| Flag | Env | Description |
|---|---|---|
--workspace-root <DIR> |
SPREADSHEET_MCP_WORKSPACE |
Workspace root to scan (default: cwd) |
--cache-capacity <N> |
SPREADSHEET_MCP_CACHE_CAPACITY |
Workbook cache size (default: 5) |
--extensions <list> |
SPREADSHEET_MCP_EXTENSIONS |
Allowed extensions (default: xlsx,xls,xlsb) |
--workbook <FILE> |
SPREADSHEET_MCP_WORKBOOK |
Single-workbook mode |
--enabled-tools <list> |
SPREADSHEET_MCP_ENABLED_TOOLS |
Whitelist exposed tools |
--transport <http|stdio> |
SPREADSHEET_MCP_TRANSPORT |
Transport selection (default: http) |
--http-bind <ADDR> |
SPREADSHEET_MCP_HTTP_BIND |
Bind address (default: 127.0.0.1:8079) |
Performance
- LRU workbook cache — Recently opened workbooks stay in memory; oldest evicted when capacity exceeded
- Lazy metrics — Sheet metrics computed on first access, cached for subsequent calls
- Region caching — Detection runs once per sheet;
region_idlookups are O(1) - Sampling modes —
distributedsampling reads evenly across rows without loading everything - Compact formats —
values_onlyandcompactoutput modes reduce response size
Testing
Covers: region detection, region-scoped tools, read_table edge cases (merged headers, filters, large sheets), workbook summary.
Behavior & Limits
- Read-only by default; write/recalc features require
SPREADSHEET_MCP_RECALC_ENABLED=true - XLSX supported for write;
.xls/.xlsbare read-only - Bounded in-memory cache honors
cache_capacity - Prefer region-scoped reads and sampling for token/latency efficiency