*[日本語 README](README_ja.md)*
# Excel MCP Server
A cross-platform MCP server for reading, writing, and formatting Excel files. Works with both open Excel workbooks (live) and closed .xlsx files (no Excel needed).
## Two Modes
- **`workbook`** — Operate on an open Excel workbook in real-time via xlwings
- **`path`** — Edit closed .xlsx files directly using pure Python (preserves images, charts, and all embedded content)
## Tools
| Tool | workbook | path | Required |
|------|:--------:|:----:|----------|
| `get_excel_info` | - | - | (none) |
| `read_cells` | OK | OK | range |
| `write_cells` | OK | OK | range, value |
| `format_cells` | OK | OK | range, format |
| `execute_vba` | OK | - | workbook, code |
## Requirements
- **Node.js** 18+
- **Python** 3.8+
- **xlwings** (for live Excel mode — `pip install xlwings`)
- **Microsoft Excel** (only needed for `workbook` mode and `execute_vba`)
Works on **Windows** and **macOS**. The `path` mode also works on Linux.
## Installation
```bash
git clone https://github.com/kousunh/excel-mcp-server.git
cd excel-mcp-server
npm install
pip install -r scripts/requirements.txt
```
### Configure MCP Client
Add to your MCP client config (Claude Desktop, Cursor, etc.):
```json
{
"mcpServers": {
"excel-mcp": {
"command": "node",
"args": ["/path/to/excel-mcp-server/src/index.js"]
}
}
}
```
To use a specific Python executable, set the `EXCEL_MCP_PYTHON` environment variable:
```json
{
"mcpServers": {
"excel-mcp": {
"command": "node",
"args": ["/path/to/excel-mcp-server/src/index.js"],
"env": {
"EXCEL_MCP_PYTHON": "/path/to/python"
}
}
}
}
```
## Usage
### Closed files (path mode)
```
read_cells path="/data/report.xlsx" range="A1:D20" formats=true
write_cells path="/data/report.xlsx" range="A1:C3" value=[["Name","Age","City"],["Alice",30,"NYC"],["Bob",25,"LA"]]
format_cells path="/data/report.xlsx" range="A1:C1" format={"bold":true,"backgroundColor":"#4472C4","fontColor":"#FFFFFF"}
```
No Excel installation required. Images, charts, and shapes are preserved.
### Open workbooks (workbook mode)
```
get_excel_info
read_cells workbook="Sales.xlsx" range="B2:F10"
write_cells workbook="Sales.xlsx" range="G2" value="=SUM(B2:F2)"
execute_vba workbook="Sales.xlsx" code="Range(\"A1:G10\").AutoFilter"
```
Requires Excel to be running with the workbook open.
## License
MIT