Talks to Excel through COM automation instead of reading xlsx files directly, which means it works with DRM-protected workbooks and live sessions that openpyxl can't touch. You get 11 tools covering the usual suspects like read_data and write_data, plus Excel-specific stuff like run_macro for VBA execution, get_active_workbook to see what the user has selected, and manage_sheets for inserting rows or copying sheets. The read_data tool handles merged cells properly and can batch-read all sheets with sheet="*". Useful when you're dealing with enterprise Excel files that have protection or when you need to interact with formulas and macros in a running instance. Windows only since it requires Excel's COM interface.
MCP server for Excel automation via xlwings COM. Works with DRM-protected files.
Libraries like openpyxl or pandas read .xlsx files directly from disk. This fails when:
mcp-server-xlwings uses COM automation to talk to the running Excel process, so it can read and write any file that Excel itself can open -- including DRM-protected documents.
These features are impossible with file-based libraries like openpyxl:
uvx mcp-server-xlwings
pip install mcp-server-xlwings
Add to %APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"xlwings": {
"command": "uvx",
"args": ["mcp-server-xlwings"]
}
}
}
claude mcp add xlwings -- uvx mcp-server-xlwings
Add to Roo Code MCP settings or create <project-root>/.roo/mcp.json:
{
"mcpServers": {
"xlwings": {
"command": "uvx",
"args": ["mcp-server-xlwings"]
}
}
}
Add to %USERPROFILE%\.cursor\mcp.json:
{
"mcpServers": {
"xlwings": {
"command": "uvx",
"args": ["mcp-server-xlwings"]
}
}
}
Add to %USERPROFILE%\.codeium\windsurf\mcp_config.json:
{
"mcpServers": {
"xlwings": {
"command": "uvx",
"args": ["mcp-server-xlwings"]
}
}
}
Add to ~/.continue/config.yaml:
mcpServers:
- name: xlwings
command: uvx
args:
- mcp-server-xlwings
All tools default to the active workbook when workbook is omitted.
| Tool | Description |
|---|---|
get_active_workbook | Get active workbook info, sheets, and current selection with data |
manage_workbooks | List, open, save, close, or recalculate workbooks |
read_data | Read a range with merge_info, header_row, sheet="*" batch read, and detail mode |
write_data | Write a 2D array (data) or a single-cell formula (formula) |
manage_sheets | List, add, delete, rename, copy, activate sheets. Insert/delete rows and columns |
find_replace | Search for text, optionally replace it |
format_range | Apply formatting (bold, italic, color, borders, alignment, number format, etc.) |
run_macro | Execute a VBA macro and get its return value |
get_formulas | Get all formulas in a range with optional calculated values |
get_cell_styles | Get formatting/style info (bold, colors, borders, etc.) for cells in a range |
get_objects | List charts, images, and shapes on a sheet |
"What's in the spreadsheet I have open?"
The agent calls get_active_workbook() to get the workbook name, sheets, and selection data, then read_data() to fetch the full sheet.
"Summarize the data I've selected"
The agent calls get_active_workbook() -- the response includes the selection data directly.
"Run the UpdateReport macro"
The agent calls run_macro(macro_name="UpdateReport") and returns the result.
"Add a SUM formula in C10 that totals C2:C9"
The agent calls write_data(start_cell="C10", formula="=SUM(C2:C9)") and gets back the calculated value.
"Make row 1 bold and centered with a yellow background"
The agent calls format_range(cell_range="A1:D1", bold=true, alignment="center", bg_color="#FFFF00").
"Give me a summary of every sheet"
The agent calls read_data(sheet="*") -- returns all sheet summaries in a single call.
"Read B6:C20 and fill in merged cell values"
The agent calls read_data(cell_range="B6:C20", merge_info=true). Merged cells return the parent value instead of null.
"Show me all formulas in this sheet"
The agent calls get_formulas(cell_range="A1:Z100", values_too=true) and gets every formula with its calculated value.
"Insert 3 blank rows at row 5"
The agent calls manage_sheets(action="insert_rows", position=5, count=3).
MIT
makafeli/n8n-workflow-builder
danishashko/make-mcp
lukisch/n8n-manager-mcp
io.github.us-all/airflow
io.github.infoinlet-marketplace/mcp-workflow