overview
Workbook overview
Map a spreadsheet file (or list the spreadsheets in a folder; no path lists all allowed folders): sheets, used ranges, header row, columns and types. Call this first.
path
io.github.j4flmaoPublished by GitHub account j4flmaov0.1.0Updated Oct 30, 2026
Spreadsheet MCP for any agent: reads xlsx/xls/ods/csv, SQL, cleaning, formulas, safe edits
Local MCP server that lets an assistant read, query, clean, edit and format spreadsheet files (xlsx, xls, ods, csv and more) and build branded dashboards.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Follow the launch instructions in the repository.
A spreadsheet MCP server that small local models can actually use. It reads
xlsx xlsm xltx xltm xlsb xls ods numbers csv tsv parquet json locally (no Office, no network),
keeps every response under a token budget, and gives agents SQL, cleaning, anomaly detection, a
formula copilot, Excel-correct editing and one-call branded dashboards — through 8, 18 or 30 tools
depending on how capable the model is.
Works with Claude Desktop / Claude Code (Free or Pro), OpenCode, Codex, Cursor, Cline, Continue, LM Studio, Ollama (via mcpo or Open WebUI) — and as a plain CLI for agents without MCP.
Host configuration for every client (Claude, Cursor, OpenCode, Codex, LM Studio, Ollama/mcpo, Open WebUI, Cline, Continue) is in docs/hosts.md.
Pick exact tools with SLIM_SHEET_TOOLS=overview,read,query.
The model names what to show; slim-sheet decides how it looks — layout, colours, fonts, number formats, chart type, sort order and an insight title — from a brand. One call:
gives a one-page dashboard: KPI tiles with live formulas (7.1m · 20.4% · 144), a line titled "Revenue rose 58% from
2025-01 to 2025-12", a sorted bar with the leader highlighted, a labelled doughnut, a source footer.
style_sheet(path, sheet, preset="report") does the same for any table and reports the number formats it inferred.
Your company's look, set once. Built-in brands: slim (default), office, modern (Aptos), mono (IBCS-style),
gov (UK government statistics style). Or point SLIM_SHEET_BRAND at a JSON file — only name is required:
Every workbook then carries the brand as a real Office theme, so Excel's own table and chart styles follow it too. Rules behind the defaults (IBCS, finance colour coding, UK spreadsheet accessibility guidance, chart-choice tables): PLAN.md §16.
.xls, .xlsb, .ods, Apple Numbers and password-protected xlsx.next cursors to continue."Report.2").<name>.slim.xlsx unless overwrite=true, writes are atomic, every replaced file
is journaled, and undo steps back.anomalies scope='formulas' finds hardcoded numbers, broken patterns, double counting and
where an error starts; describe_cell trace= follows formulas across sheets; what_if runs delta, goal seek
and sensitivity grids without touching the file.XLOOKUP in Excel 2016 → suggests INDEX/MATCH), offline
evaluation with dependency chasing.read sheet='#vba' shows VBA source, anomalies scope='macros' rates risk, and agents redo
a macro's job with tools (prompt replace_macro). slim-sheet never runs macros._xlfn. prefixes and spilling formulas as real
dynamic arrays, with a warning when something blocks the spill..ssh and non-spreadsheet files are refused. Read-only SQL with file access locked, no model-written code is executed, no network.Extras: formula (offline evaluate and what_if), crypto (encrypted xlsx), numbers (Apple Numbers), images (insert pictures with annotate), all.
Ready-made, data-agnostic prompts — a shared CORE method, thirteen ROLES (nine analyst roles: sales, finance, marketing, customer, operations, HR, reconciliation, data quality, general; plus model auditor, workbook editor, macro migrator and file reviewer) and eight OUTPUT patterns (dashboard, dashboard pack, report workbook, clean dataset, reconciliation report, quick answer, audit report, edited workbook), with filled-in example sets, about 50 one-paste task recipes in 8 packs (finance, sales, HR, operations, data prep, Excel tasks, reporting, Vietnam) and compact blocks for small local models: docs/prompts.
skills/building-client-reports turns the tools into
client-ready reports: a report brief, role presets (CFO, board, sales, marketing, operations,
HR, market research), a standards checklist and evals. Copy it into ~/.claude/skills/ or
attach it to any agent (skills/README.md).
Issues and pull requests use the templates in .github/; security reports go through
SECURITY.md.
Design and roadmap: PLAN.md · agent rules: AGENTS.md · MIT licensed.
Source: README.md at commit c9e9976
Workbook overview
Map a spreadsheet file (or list the spreadsheets in a folder; no path lists all allowed folders): sheets, used ranges, header row, columns and types. Call this first.
pathRead cells
Read cells as a table with A1 coordinates (sheet, range 'A1:F50', cursor). sheet='#vba' lists macros; range='Module1' shows its code.
pathrequiredrangesheetcursorformatmax_tokensFind cells
Find cells containing text (or a regex) across sheets; returns Sheet!A1 addresses. Example: find(path='sales.xlsx', text='refund')
pathrequiredtextrequiredregexsheetmax_resultsSQL query
Run one read-only SQL SELECT; tables are sheet names, quote names with spaces. Example: sql='SELECT "Region", sum("Total") FROM "Orders" GROUP BY 1'
sqlrequiredpathrequiredoffsetmax_tokensProfile columns
Column statistics for a sheet: type, nulls, distinct, min, max, mean, median, top values. Optional columns list.
pathrequiredsheetcolumnsWrite cells
Write a 2-D values array starting at range's top-left cell, e.g. values=[['Total', 120]]. Saves to <name>.slim.xlsx unless overwrite=true.
pathrequiredrangerequiredsheetrequiredvaluesrequiredout_pathoverwriteExplain formula
Explain and check an Excel formula: steps, references, syntax/arity errors. Pass formula='=...' or path plus cell like 'Sheet1!C7'.
cellpathsheetformulaBuild dashboard
Build a branded, print-ready dashboard from a data sheet. Example: kpis=['Revenue=sum:Rev 2025|vs:Rev 2024:2024'], charts=['trend:Month:Total','table:Region:Total'], messages=['finding']
kpispathrequiredbrandsheettitlerequiredchartsmessagesout_pathsubtitleoverwritedata_sheetrequiredClean table
Clean a table: ops from trim, collapse_spaces, remove_nonprintable, unify_null, numbers_from_text, normalize_dates, drop_empty_rows, drop_empty_cols, dedupe. Previews unless apply=true.
opsrequiredkeyspathrequiredapplysheetout_pathoverwriteFind anomalies
Find suspicious cells (duplicates, types, outliers, typos); scope='formulas' audits models; scope='macros' rates VBA risks; scope='client' checks readiness for clients.
pathrequiredscopesheetcolumnsmax_resultsJoin or reconcile tables
Join two tables on keys (how=left|inner|full|anti), or how=reconcile to label rows matched/different/only_left/only_right. keys=['ID'] or ['ID=Order No'].
howkeysrequiredpathrequiredsheetcompareout_pathoverwritetolerancemax_tokensother_pathrequiredother_sheetConvert or split
Convert to xlsx/csv/tsv/parquet/json by out_path extension; CSV: delimiter=';', encoding='cp1252', decimal=','. split_by='Region' splits; a folder exports VBA.
modepathrequiredsheetdecimalencodingout_pathsplit_bydelimiteroverwriteCompare files
Compare two files cell by cell, or row by row with key='ID'. Example: diff(path='a.xlsx', other_path='a.slim.xlsx')
keypathrequiredsheetother_pathrequiredmax_resultsUndo last write
Undo the last slim-sheet write to a file (every editing tool is journaled).
pathrequiredEvaluate or check formula
Calculate a formula offline, or check it with check_only=true (target='2016'). Example: evaluate(path='x.xlsx', cell='Calc!C7')
cellpathsheettargetformulacheck_onlyDescribe and trace cell
Everything about one cell: value, formula, format, note, validation; trace='precedents' or 'dependents' follows formulas across sheets.
cellrequiredpathrequireddepthsheettraceStyle table
Make a table look professional in one call: header, number formats, totals, widths, print setup, and restyles the sheet's charts. preset=report|data|finance|striped|minimal|charts.
pathrequiredbrandrangesheetrequiredpresetout_pathoverwritetotal_rownumber_formatWhat-if analysis
Change inputs in memory and see outputs move: op=delta|goal_seek|grid. Example: inputs=['Inputs!B3=8%'], outputs=['Model!B20']. Never writes.
oppathrequiredsheetinputsrequiredtargetoutputsrequiredCreate workbook
Create a new empty branded .xlsx with the given sheet names. Example: create_workbook(path='out.xlsx', sheets=['Data','Summary'])
pathrequiredbrandsheetsoverwriteSheet operations
Add, rename, delete, copy, move, hide or unhide a sheet (op=...). Renames also fix formulas that point to the sheet.
oprequiredpathrequiredsheetrequirednew_nameout_pathpositionoverwriteRange operations
Edit a block: op=fill|copy|move|transpose|sort|replace|insert|delete|clear|split. Example: op='fill', range='D2:D200'. where="Status='Closed'" filters rows.
byoprequiredtodescfindpathrequiredwhatrangesheetrequiredwhereheaderreplace+5 moreDefined names
List, add or delete defined names. Example: name_ops(path, op='add', name='TaxRate', ref='Rates!B2')
oprequiredrefnamepathrequiredout_pathoverwriteFormat cells
Style a range: role ('title','header','total'...), bold, colors, number_format ('percent','m'...), align, border, merge, autofit.
boldpathrequiredrolewrapalignmergerangerequiredsheetrequiredborderitalicvalignautofit+6 moreExcel table
Turn a range with a header row into a named Excel table; same name again resizes it. Example: set_table(path, sheet='Data', range='A1:D50', name='Sales', totals=true)
namerequiredpathrequiredrangerequiredsheetrequiredstyletotalsout_pathoverwriteValidation and highlight rules
Add a dropdown/input rule (kind=list|whole|decimal|date|text_length|custom) or highlight rule (greater_than|between|duplicates|top_n|color_scale|data_bar|formula...).
kindrequiredpathrequiredrangerequiredsheetrequiredvaluevalue2valuesformulamessageout_pathoverwritefill_color+2 moreAdd chart
Insert a clean branded chart (type=auto picks one) from data_range: header row + category column + series columns. Optional highlight='North'; replace=true swaps the chart at anchor.
pathrequiredtyperequiredbrandsheetrequiredtitleanchorreplacex_titley_titleout_pathhighlightoverwrite+1 morePivot summary
Summarise a table: rows=['Region'], values=['Total'], agg=sum|count|avg|min|max, columns='Month'. to_sheet saves it; native=true makes a real Excel PivotTable.
aggpathrequiredrowsrequiredsheetnativevaluesrequiredcolumnsout_pathto_sheetoverwritemax_tokensRecalculate
Recalculate every formula with LibreOffice so cached values are fresh (needs LibreOffice installed).
pathrequiredout_pathoverwriteSheet layout
Set how a sheet looks and prints: freeze, widths=['A=14'], heights, filter_range, hide, gridlines, zoom, print_area, landscape, fit_width, protect; workbook: calc_mode, protect_structure.
hidepathrequiredzoomsheetrequiredfreezeunhidewidthsheightsprotectout_pathcalc_modefit_width+6 moreNotes, links, images
Add a note, hyperlink or image to a cell, or remove objects: op=note|link|image|remove. Example: op='link', cell='B2', url='https://...'
oprequiredurlcellrequiredpathrequiredtextsheetrequiredtargetout_pathoverwriteimage_path90% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
uvx slim-sheet mcp # MCP server over stdiouvx slim-sheet overview sales.xlsx # or use any tool from the shelluvx --from "slim-sheet[all]" slim-sheet mcp # + offline formula engine, encrypted files, Apple Numbers{ "mcpServers": { "slim-sheet": { "command": "uvx", "args": ["slim-sheet", "mcp"], "env": { "SLIM_SHEET_TIER": "lite", "SLIM_SHEET_ROOTS": "/path/to/your/data" } } }}build_report(path="sales.xlsx", data_sheet="Sales", title="Sales performance 2025", kpis=["Revenue=sum:Revenue", "Margin=ratio:Profit/Revenue", "Orders=count"], charts=["trend:Month:Revenue", "rank:Region:Revenue", "share:Product:Revenue"]){ "name": "Acme", "primary": "#C8102E", "body_font": "Arial", "currency": "$", "profile": "finance" }slim-sheet schema --format openai --tier lite # function-calling schemas for any OpenAI-compatible APIslim-sheet schema --format anthropic --tier full # Messages API tool definitionsSLIM_SHEET_TOKEN=... slim-sheet mcp --transport streamable-http --host 0.0.0.0 --port 8765uv sync --all-extrasuv run pre-commit install # ruff, mypy, manifests, commit-message rule, tests on pushuv run python scripts/make_demo.py # sample workbooks in ~/Documents/slim-sheet-demouv run ruff check . && uv run ruff format --check . && uv run mypy src && uv run pytest -q