ironcalc-mcp
This MCP server enables creating, loading, editing, and saving Excel (.xlsx) workbooks via the IronCalc engine, allowing direct agent interaction without code generation.
Workbook Management: Create new workbooks with locale, language, and timezone settings; load and save XLSX files; inspect metadata, sheets, and dimensions; set properties; undo/redo actions.
Cell Operations: Read individual cells or ranges (content, formatted value, type); write single cells or batch ranges; set formulas (prefixed with =); apply array formulas; clear ranges; paste tab-delimited CSV data.
Sheet Management: Add, delete, rename, duplicate, move, hide/unhide sheets; set tab colors; toggle gridlines.
Row/Column Operations: Insert, delete, move, auto-fill rows and columns; set widths and heights; hide/unhide ranges; freeze top rows or left columns.
Formatting: Get and set cell styles (font, fill, border, alignment, number format); apply borders to ranges.
Named Styles: List, create, update, delete, and apply named styles.
Conditional Formatting: Manage rules: list, add, update, delete, and reorder.
Defined Names: Create and manage workbook- or sheet-scoped named ranges.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ironcalc-mcp Create a budget with formulas and save it"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ironcalc-mcp
MCP server for the IronCalc spreadsheet engine. Create, read, edit, and save xlsx files through the Model Context Protocol.
Built on the typed high-level API in IronCalc 0.8.3. It exposes workbook editing, formulas, styles, structure, names, conditional formatting, and xlsx persistence through MCP.
Motivation
I was really inspired by paper.design's real-time MCP workflow, where exposing a design tool via MCP enables custom, extensible agent workflows that feel native rather than bolted on.
Current AI-spreadsheet integrations (like Claude's cowork mode for Excel) add an unnecessary layer of abstraction - the agent writes Python code that manipulates Excel, instead of talking to the spreadsheet directly. This MCP server removes that indirection. Agents read cells, write formulas, and get evaluated results in one hop. No codegen middleman, no openpyxl glue scripts.
Huge thanks to the IronCalc contributors - their Python SDK API is so clean that this entire MCP server is basically thin wrappers. The hard work is all theirs.
Current limitation: the server works with an in-memory workbook - load a file, edit it, save it back. There's no real-time streaming to a running IronCalc UI yet. The engine already has a diff queue for syncing, so the plumbing is there. If IronCalc adds a WebSocket bridge to their web app, we can wire up live sync and get a true reactive workflow - agent edits appearing in the browser as they happen.
Related MCP server: Excel MCP Server
Quick start
uvx ironcalc-mcpClaude Code
claude mcp add ironcalc -- uvx ironcalc-mcpClaude Desktop / Cursor
Add to your MCP config:
{
"mcpServers": {
"ironcalc": {
"command": "uvx",
"args": ["ironcalc-mcp"]
}
}
}Examples
Build a spreadsheet from scratch
Create a budget with formulas and save itAudit an existing xlsx for errors
Load quarterly_report.xlsx and find all #NAME?, #REF!, #VALUE! errors. Tell me which formulas are broken and why.Fix broken cross-sheet references
The P&L sheet was renamed but formulas in the DCF sheet still reference the old name. Find and fix all broken references.Build a financial model
Create a 5-year DCF model with revenue assumptions in one sheet, P&L in another, and free cash flow calculation in a third. Use =NPV() and =IRR() for valuation.Analyze and transform data
Load sales_data.xlsx, add a column with running totals, insert a summary row at the bottom, and save.Available tools (56)
Workbook
Tool | Description |
| Create an empty workbook with locale, timezone, and formula language |
| Load an xlsx file |
| Save to xlsx |
| Get metadata, theme, sheets, dimensions, states, and colors |
| Update name, locale, timezone, language, or theme |
| Undo the latest action |
| Redo the latest undone action |
Cells and ranges
Tool | Description |
| Get content, formatted value, and type |
| Read non-empty cells from an inclusive range |
| Set a value or formula |
| Batch-write cells with one evaluation pass |
| Set an array formula over a result area |
| Clear contents, formatting, or everything |
| Paste tab-delimited rows into a range |
Sheets
Tool | Description |
| Create a sheet |
| Delete a sheet |
| Rename a sheet |
| Set the tab color |
| Duplicate a sheet |
| Change sheet visibility |
| Reorder a sheet |
| Show or hide grid lines |
Rows and columns
Tool | Description |
| Insert or delete rows |
| Insert or delete columns |
| Move a contiguous row or column block |
| Size one column or an inclusive range |
| Size one row or an inclusive range |
| Hide or unhide inclusive ranges |
| Set frozen panes |
| Extend values and formulas from a source area |
Formatting
Tool | Description |
| Get font, fill, border, alignment, and number format |
| Update selected style properties on a cell or range |
| Apply inner, outer, side, or full borders |
Named styles and conditional formatting
Tool | Description |
| Inspect named styles |
| Manage named styles |
| Apply a named style to a range |
| List conditional formatting rules |
| Manage rules |
| Reorder rules |
Defined names
Tool | Description |
| List workbook- and sheet-scoped names |
| Create a defined name |
| Rename, re-scope, or update a defined name |
| Delete a defined name |
Contributing
git clone https://github.com/yolonir/ironcalc-mcp
cd ironcalc-mcp
just initjust init syncs the locked environment and installs the deterministic prek commit hook.
just test # Behavioral tests
just quality-check # Ruff, mypy, and ty
just quality-check src/path.py # Targeted quality checks
just precommit # Run all commit-time hooks
just format # Format and apply safe lint fixesPlease create a new branch for your changes and open a focused pull request against main.
License
MIT
Available Tools
21 toolsadd_sheetA
Add a new sheet to the workbook.
Args: name: Optional sheet name. If omitted, auto-named (Sheet2, Sheet3, etc.)
Inputs: name. Returns: result
create_workbookA
Create a new empty workbook.
Args: name: Workbook name locale: Locale code (e.g. en, de, es, fr) timezone: Timezone (e.g. UTC, America/New_York) language: Language code for formulas (e.g. en, es, de)
Inputs: name, locale, timezone, language. Returns: result
delete_columnsB
Delete columns starting at the given position.
Args: sheet: Sheet index (0-based) column: First column to delete (1-based) count: Number of columns to delete
Inputs: sheet (required), column (required), count. Returns: result
delete_rowsB
Delete rows starting at the given position.
Args: sheet: Sheet index (0-based) row: First row to delete (1-based) count: Number of rows to delete
Inputs: sheet (required), row (required), count. Returns: result
delete_sheetB
Delete a sheet by index.
Args: sheet: Sheet index (0-based)
Inputs: sheet (required). Returns: result
get_cellA
Get a single cell's content, formatted value, and type.
Args: sheet: Sheet index (0-based) row: Row number (1-based) column: Column number (1-based)
Inputs: sheet (required), row (required), column (required). Returns: result
get_cellsA
Get cells in a rectangular range.
Args: sheet: Sheet index (0-based) row_start: First row (1-based) col_start: First column (1-based) row_end: Last row (1-based, inclusive) col_end: Last column (1-based, inclusive)
Inputs: sheet (required), row_start (required), col_start (required), row_end (required), +1 more. Returns: result
get_cell_styleA
Get the style (font, fill, border, alignment, number format) of a cell.
Args: sheet: Sheet index (0-based) row: Row number (1-based) column: Column number (1-based)
Inputs: sheet (required), row (required), column (required). Returns: result
get_workbook_infoA
Get information about the current workbook: sheets, dimensions, and metadata.
Inputs: no named parameters. Returns: result
insert_columnsB
Insert columns at the given position.
Args: sheet: Sheet index (0-based) column: Column number where new columns are inserted (1-based) count: Number of columns to insert
Inputs: sheet (required), column (required), count. Returns: result
insert_rowsB
Insert rows at the given position.
Args: sheet: Sheet index (0-based) row: Row number where new rows are inserted (1-based) count: Number of rows to insert
Inputs: sheet (required), row (required), count. Returns: result
load_workbookA
Load a workbook from an xlsx file.
Args: file_path: Absolute path to the .xlsx file locale: Locale code (e.g. en, de, es) timezone: Timezone (e.g. UTC) language: Language code for formulas (e.g. en)
Inputs: file_path (required), locale, timezone, language. Returns: result
rename_sheetA
Rename a sheet.
Args: sheet: Sheet index (0-based) name: New sheet name
Inputs: sheet (required), name (required). Returns: result
save_workbookA
Save the current workbook to an xlsx file.
Args: file_path: Path to save to. If omitted, saves to the path it was loaded from.
Inputs: file_path. Returns: result
set_cellA
Set a single cell's value. Use '=' prefix for formulas.
Args: sheet: Sheet index (0-based) row: Row number (1-based) column: Column number (1-based) value: Cell value (text, number, or formula starting with '=')
Inputs: sheet (required), row (required), column (required), value (required). Returns: result
set_cellsA
Set multiple cells in batch. Each entry needs sheet, row, column, value.
Args: cells: List of {sheet: int, row: int, column: int, value: str}
Inputs: cells (required). Returns: result
set_column_widthB
Set the width of a column.
Args: sheet: Sheet index (0-based) column: Column number (1-based) width: Column width in points
Inputs: sheet (required), column (required), width (required). Returns: result
set_frozen_columnsA
Freeze the left N columns.
Args: sheet: Sheet index (0-based) count: Number of columns to freeze (0 to unfreeze)
Inputs: sheet (required), count (required). Returns: result
set_frozen_rowsA
Freeze the top N rows.
Args: sheet: Sheet index (0-based) count: Number of rows to freeze (0 to unfreeze)
Inputs: sheet (required), count (required). Returns: result
set_row_heightA
Set the height of a row.
Args: sheet: Sheet index (0-based) row: Row number (1-based) height: Row height in points
Inputs: sheet (required), row (required), height (required). Returns: result
set_sheet_colorA
Set the tab color of a sheet.
Args: sheet: Sheet index (0-based) color: Hex color string (e.g. '#FF0000')
Inputs: sheet (required), color (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 21 tools
Each tool targets a distinct action and resource (e.g., get_cell vs get_cells vs get_cell_style, delete_columns vs delete_rows vs delete_sheet). There is no overlap in functionality, and descriptions make the purpose clear.
All tools follow a consistent verb_noun pattern in snake_case (e.g., add_sheet, create_workbook, get_cell). Even compound names like get_cell_style and get_workbook_info adhere to this pattern, maintaining uniformity.
With 21 tools, the count is well-suited for a spreadsheet server, covering workbook lifecycle, sheet management, cell operations, row/column manipulation, and formatting. It is neither too sparse nor overwhelming.
The tool set covers essential CRUD operations for cells, sheets, rows, and columns, plus workbook load/save and basic formatting (column width, row height, freeze panes, sheet color). However, it lacks tools to set cell styles (font, fill, border, alignment) or merge cells, which are notable gaps for a spreadsheet server.
Maintenance
Related MCP Connectors
Let AI agents read, check and edit Excel models. Open a workbook or drop in one MCP config. Either way: typed cells, a formula dependency graph, and a verification certificate. Deterministic — no OCR, no model guessing at your numbers.
Convert, create and edit Word, PowerPoint, Excel and PDF documents from any AI agent.
Every spreadsheet is a table: Excel, CSV, Parquet and JSON as SQL tables for AI agents.
A structured financial modeling layer for AI agents. Build, version, and audit financial models without drift, then export to Excel, from Claude or any MCP client. Learn more: https://layerz.cc/for-agents
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA robust solution that enables AI agents to create, read, modify, and convert Excel files through the Model Context Protocol without requiring Microsoft Office installation.6MIT
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables AI agents to freely operate Excel spreadsheets, providing tools for workbook creation, cell manipulation, formatting, formula handling, and data export.1181 npmISC
- AlicenseAqualityDmaintenanceEnables AI assistants to perform comprehensive Microsoft Excel operations including data analysis, cell editing, advanced formatting, and VBA execution on Windows systems. It provides a structured workflow for managing workbooks and worksheets through a dedicated Model Context Protocol interface.581 npm4MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to automate Microsoft Excel tasks such as reading/writing cells, formatting, creating charts, and managing sheets through natural language using the Model Context Protocol.1Apache 2.0