Excel (xlsx) file manipulation tool providing workbook, worksheet, data, formatting, chart, pivot table, formula, and validation operations.
Disabled by default - requires explicit enablement:
{
"mcpServers": {
"dev-tools": {
"env": {
"ENABLE_ADDITIONAL_TOOLS": "excel",
"EXCEL_FILES_PATH": "/path/to/excel/files"
}
}
}
}ENABLE_ADDITIONAL_TOOLS- Must includeexcelto enable this toolEXCEL_FILES_PATH- (Only required when running the server is running in HTTP mode) Allows you to set a base directory for Excel files in HTTP mode (default:~/.mcp-devtools/excel/)
- STDIO mode: Use absolute file paths
- HTTP mode: Use relative paths from
EXCEL_FILES_PATH
Create a new Excel workbook.
Parameters:
filepath(required): Path to Excel fileoptions.initial_sheet_name(optional): Initial worksheet name (default: "Sheet1")
Example:
{
"function": "create_workbook",
"filepath": "/path/to/workbook.xlsx",
"options": {
"initial_sheet_name": "Data"
}
}Retrieve workbook information including sheet names, file size, and data ranges.
Parameters:
filepath(required): Path to Excel fileoptions.include_ranges(optional): Include data ranges for each sheet (default: false)
Add a new worksheet to the workbook.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Name for new worksheet
Clone an existing worksheet.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Source worksheet nameoptions.target_name(required): Name for copied worksheet
Remove a worksheet from the workbook.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet name to delete
Note: Cannot delete the last remaining worksheet.
Rename an existing worksheet.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Current worksheet nameoptions.new_name(required): New worksheet name
Read data from a cell range.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.start_cell(optional): Starting cell (e.g., "A1")options.end_cell(optional): Ending cell (e.g., "D10")
Example:
{
"function": "read_data",
"filepath": "/path/to/workbook.xlsx",
"sheet_name": "Sheet1",
"options": {
"start_cell": "A1",
"end_cell": "C10"
}
}Export all data from one or more sheets in AI-agent-friendly format (CSV, TSV, or JSON).
Parameters:
filepath(required): Path to Excel filesheet_name(optional): Single sheet to readoptions.sheet_names(optional): Array of sheet names to readoptions.format(optional): Output format -"csv"(default, token-optimised),"tsv", or"json"options.max_rows(optional): Limit rows per sheet to prevent token overflowoptions.offset(optional): Skip first N rows before reading (for pagination, default: 0)
Note: If neither sheet_name nor options.sheet_names is specified, reads all sheets. All rows are padded to the same length with empty strings for consistency.
Example - Read all sheets as CSV:
{
"function": "read_all_data",
"filepath": "/path/to/workbook.xlsx",
"options": {
"format": "csv"
}
}Example - Read specific sheets with row limit:
{
"function": "read_all_data",
"filepath": "/path/to/large-report.xlsx",
"options": {
"sheet_names": ["Sales", "Expenses"],
"format": "tsv",
"max_rows": 100
}
}Response format:
{
"sheets": [
{
"sheet_name": "Sales",
"format": "csv",
"data": "Month,Revenue,Tax\nJan,5000,1000\nFeb,6500,1300",
"dimensions": {
"total_rows": 3,
"returned_rows": 3,
"start_row": 1,
"end_row": 3,
"remaining_rows": 0,
"columns": 3
}
}
]
}Write data to cells. Formulas can be included directly in the data array.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.start_cell(required): Starting cell for dataoptions.data(required): 2D array of data to write
Formula Support: Any string value starting with = is automatically treated as a formula. Formulas are validated for safety and calculated for Apple Numbers compatibility.
Example with formulas:
{
"function": "write_data",
"filepath": "/path/to/workbook.xlsx",
"sheet_name": "Sheet1",
"options": {
"start_cell": "A1",
"data": [
["Item", "Price", "Quantity", "Total"],
["Apples", 1.50, 10, "=B2*C2"],
["Oranges", 2.00, 5, "=B3*C3"],
["", "", "Grand Total:", "=SUM(D2:D3)"]
]
}
}Basic example:
{
"function": "write_data",
"filepath": "/path/to/workbook.xlsx",
"sheet_name": "Sheet1",
"options": {
"start_cell": "A1",
"data": [
["Name", "Age", "Salary"],
["Alice", 30, 75000],
["Bob", 25, 65000]
]
}
}Read data with validation rules and metadata.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.start_cell(optional): Starting celloptions.end_cell(optional): Ending cell
Returns cell data with validation information including dropdown lists and validation rules.
Apply formatting to cell ranges.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.range(required): Cell range (e.g., "A1:D10")options.font(optional): Font properties (bold, italic, size, colour, family)options.fill(optional): Fill properties (colour, pattern)options.borders(optional): Border properties (style, colour, sides)options.alignment(optional): Alignment properties (horizontal, vertical, wrap_text)options.number_format(optional): Number format string (e.g., "£#,##0.00")options.conditional_format(optional): Conditional formatting rules
Style Merging: When applying formatting to cells that already have styles, the new properties are merged with existing ones. This means you can apply fill and font in one call, then add borders in another call, and both will be preserved.
Colour Format: Both "#4472C4" and "4472C4" formats are accepted for colours (the # prefix is optional and will be stripped automatically).
Font Example:
{
"function": "format_range",
"filepath": "/path/to/workbook.xlsx",
"sheet_name": "Sheet1",
"options": {
"range": "A1:D1",
"font": {
"bold": true,
"size": 14,
"colour": "#FF0000",
"family": "Arial"
},
"fill": {
"colour": "#FFFF00",
"pattern": "solid"
}
}
}Conditional Formatting Example:
{
"function": "format_range",
"filepath": "/path/to/workbook.xlsx",
"sheet_name": "Sheet1",
"options": {
"range": "B2:B10",
"conditional_format": {
"type": "colour_scale",
"rule": {
"min_colour": "#FF0000",
"max_colour": "#00FF00"
}
}
}
}Merge a cell range.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.start_cell(required): Starting celloptions.end_cell(required): Ending cell
Unmerge a cell range.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.start_cell(required): Starting celloptions.end_cell(required): Ending cell
List all merged cell ranges in a worksheet.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet name
Copy cells to another location.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Source worksheet nameoptions.source_range(required): Source range (e.g., "A1:C10")options.target_cell(required): Target starting celloptions.target_sheet(optional): Target worksheet name (defaults to source sheet)
Delete a range and shift cells.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.start_cell(required): Starting celloptions.end_cell(required): Ending celloptions.shift_direction(optional): "up" or "left" (default: "up")
Validate that a range exists.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.start_cell(required): Starting celloptions.end_cell(optional): Ending cell
Insert rows into a worksheet.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.start_row(required): Starting row number (1-based)options.count(optional): Number of rows to insert (default: 1)
Insert columns into a worksheet.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.start_col(required): Starting column number (1-based)options.count(optional): Number of columns to insert (default: 1)
Delete rows from a worksheet.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.start_row(required): Starting row number (1-based)options.count(optional): Number of rows to delete (default: 1)
Delete columns from a worksheet.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.start_col(required): Starting column number (1-based)options.count(optional): Number of columns to delete (default: 1)
Create a chart in the worksheet.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.type(required): Chart type: "line", "bar", "column", "pie", "scatter", "area"options.position(required): Cell position for chart (e.g., "E2")options.title(optional): Chart titleoptions.x_axis_title(optional): X-axis titleoptions.y_axis_title(optional): Y-axis titleoptions.data_range(optional): Simple data rangeoptions.series(optional): Detailed data series configurationoptions.legend(optional): Legend configurationoptions.size(optional): Chart dimensions (width, height)
Simple Example:
{
"function": "create_chart",
"filepath": "/path/to/workbook.xlsx",
"sheet_name": "Sheet1",
"options": {
"type": "column",
"position": "E2",
"title": "Sales by Quarter",
"data_range": "A1:C10"
}
}Advanced Example:
{
"function": "create_chart",
"filepath": "/path/to/workbook.xlsx",
"sheet_name": "Sheet1",
"options": {
"type": "line",
"position": "E2",
"title": "Sales Trends",
"x_axis_title": "Quarter",
"y_axis_title": "Revenue (£)",
"series": [
{
"name": "Product A",
"categories": "A2:A10",
"values": "B2:B10"
},
{
"name": "Product B",
"categories": "A2:A10",
"values": "C2:C10"
}
],
"legend": {
"show": true,
"position": "bottom"
},
"size": {
"width": 640,
"height": 480
}
}
}Create a native Excel pivot table.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Source worksheet nameoptions.source_range(required): Source data range (e.g., "A1:D100")options.row_fields(required): Array of row field namesoptions.data_fields(required): Array of data field configurationsoptions.column_fields(optional): Array of column field namesoptions.filter_fields(optional): Array of filter field namesoptions.destination(optional): Destination sheet and cell (default: new sheet "Pivot1" at A1)options.options(optional): Pivot table options (show_grand_totals, style)
Example:
{
"function": "create_pivot_table",
"filepath": "/path/to/workbook.xlsx",
"sheet_name": "Sheet1",
"options": {
"source_range": "A1:D100",
"row_fields": ["Category", "Product"],
"data_fields": [
{
"field": "Sales",
"function": "sum",
"name": "Total Sales"
},
{
"field": "Units",
"function": "count",
"name": "Units Sold"
}
],
"column_fields": ["Quarter"],
"filter_fields": ["Region"],
"destination": {
"sheet": "Pivot Analysis",
"cell": "A1"
},
"options": {
"show_grand_totals": true,
"style": "PivotStyleMedium9"
}
}
}Aggregation Functions: sum, count, average, min, max, product, stddev, var
Create a native Excel table object.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.range(required): Table range (e.g., "A1:D100")options.name(optional): Table name (auto-generated if not provided)options.style(optional): Table style name (default: "TableStyleMedium9")options.show_header(optional): Show header row (default: true)options.show_totals(optional): Show totals row (default: false)
Example:
{
"function": "create_table",
"filepath": "/path/to/workbook.xlsx",
"sheet_name": "Sheet1",
"options": {
"range": "A1:D100",
"name": "SalesTable",
"style": "TableStyleMedium9",
"show_header": true,
"show_totals": false
}
}Write a formula to a cell. Note that write_data also supports formulas inline - use this function when you need to add formulas to existing data or update individual cells.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.cell(required): Cell reference (e.g., "C1")options.formula(required): Excel formula (with or without leading "=")
Example:
{
"function": "apply_formula",
"filepath": "/path/to/workbook.xlsx",
"sheet_name": "Sheet1",
"options": {
"cell": "D2",
"formula": "=SUM(B2:C2)"
}
}Note: Formulas are automatically calculated and cached for compatibility with Apple Numbers and other spreadsheet applications that don't have full formula calculation engines.
Security: Dangerous functions (INDIRECT, HYPERLINK, WEBSERVICE, DGET, RTD) are blocked for security reasons.
Validate formula syntax without applying it.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet nameoptions.cell(required): Cell referenceoptions.formula(required): Excel formula to validate
Extract all data validation rules from a worksheet.
Parameters:
filepath(required): Path to Excel filesheet_name(required): Worksheet name
Returns validation rules including type, operators, allowed values, prompts, and error messages.
create_workbook- Create the workbookwrite_data- Add data (can include formulas directly)format_range- Apply formattingcreate_chart- Add visualisations
write_data- Write raw datacreate_table- Convert to Excel tablecreate_pivot_table- Create analysis pivot tablecreate_chart- Add charts for visualisation
read_data- Load data from sourcewrite_data- Write to analysis sheet (can include formulas directly in data)apply_formula- Add additional calculations (optional if formulas included in step 2)format_range- Apply conditional formattingcreate_pivot_table- Summarise data
Tool Not Enabled:
excel tool is not enabled. Set ENABLE_ADDITIONAL_TOOLS=excel to enable
Solution: Add excel to ENABLE_ADDITIONAL_TOOLS environment variable.
File Not Found:
workbook error during open on /path/to/file.xlsx: failed to open workbook
Solution: Verify file path is correct and file exists.
Worksheet Not Found:
worksheet error during operation on sheet 'SheetName': worksheet not found
Solution: Check worksheet name spelling and case sensitivity.
Invalid Cell Reference:
validation error for field 'cell' with value 'XYZ': invalid cell reference
Solution: Use valid Excel cell references (e.g., "A1", "B10").
Chart Type Error:
invalid chart type 'xyz', must be one of: line, bar, column, pie, scatter, area
Solution: Use a supported chart type.
- Maximum rows: 1,048,576
- Maximum columns: 16,384 (column XFD)
- Maximum cell value length: 32,767 characters
- Maximum worksheet name length: 31 characters
- Worksheet name restrictions: Cannot contain
:\/?*[]
- Reading 10,000 rows: ~2 seconds
- Writing 10,000 rows: ~3 seconds
- Formatting 1,000 cells: ~1 second
- Creating chart with 100 data points: ~1 second
- Process data in batches for large datasets
- Minimise file open/close operations by grouping operations
- Use absolute file paths in STDIO mode
- Apply formatting after data write operations
- Limit conditional formatting rules for better performance
- Integrated with MCP DevTools security framework
- Respects
FILESYSTEM_TOOL_ALLOWED_DIRSconfiguration - Directory traversal prevention in HTTP mode
- Files created with 0600 permissions
- Dangerous functions blocked: INDIRECT, HYPERLINK, WEBSERVICE, DGET, RTD
- Formula validation before execution
- Clear error messages for blocked functions
Generated Excel files are compatible with:
- Microsoft Excel 2016+
- LibreOffice Calc
- Google Sheets (with some limitations on advanced features)
Excel features fully supported:
- Workbook and worksheet operations
- Data types: string, number, boolean, date, formula
- Cell formatting and conditional formatting
- Charts (line, bar, column, pie, scatter, area)
- Native pivot tables
- Excel tables with styling
- Data validation rules
- Formulas (with security restrictions)