Microsoft & Azure intelligence →
Association is based on retained identity fields; it does not by itself prove first-party publication.
Enables AI clients to read, write, and manage Excel workbooks (.xlsx/.xlsm) directly via openpyxl, with comprehensive tools for data, formatting, formulas, charts, and more
Detailed security scan evidence is not public for this MCP yet. Public identity, registry metadata, and independently observed protocol inventory remain available.
Installation and connection instructions are shown only when supported by retained package, repository, or endpoint evidence.
No verified installation or connection method is available in the retained evidence yet.
| Canonical slug | excel-mcp-39ba34e0 | Deployment | Local Only |
|---|---|---|---|
| Canonical package | — | Repository | ShubhamDbug/Excel-MCP |
| First published | — | Latest release | — |
| Last security verification | — | Classification confidence | 90% |
| Publication | Draft | Official distribution | Not verified |
| Channel | Identifier | Current version | Versions | Source |
|---|---|---|---|---|
| source_git | shubhamdbug/excel-mcp | ce6ab4fbde238529832d5aa7105bd7bc75660b54 | 1 | Repository |
| Package | Version | Published / observed | Inventory | Security scan |
|---|---|---|---|---|
| source_gitshubhamdbug/excel-mcp | ce6ab4fbde238529832d5aa7105bd7bc75660b54Current | Aug 31, 2026 | 74 toolsSucceeded · 0 resources · 0 prompts | Evidence restricted |
Independently scan the exact version your agents use, receive alerts when its risk changes, and investigate every finding with retained version evidence.
No public current-version evidence is available yet.
| Tool | Category | Annotations | Risk |
|---|---|---|---|
add_chartEmbed a chart in a sheet.
chart_type: bar, bar_horizontal, line, pie, scatter, area.
data_range holds the value column(s); with data_includes_headers=true
(default) the first row provides the series names. categories_range is the
label column/row for the axis (or the slice labels for pie). For scatter,
categories_range is required and supplies the shared x-values (no header);
each data_range column becomes one y-series.
position is the cell of the chart's top-left corner (e.g. 'E2'); it
defaults to two columns right of the data. Data and chart may be on
different sheets ('Summary!E2'). width_cm/height_cm default to 15 x 7.5.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"chart_type": {
"title": "Chart Type",
"type": "string"
},
"data_range": {
"title": "Data Range",
"type": "string"
},
"categories_range": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Categories Range"
},
"position": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Position"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Title"
},
"x_title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "X Title"
},
"y_title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Y Title"
},
"data_includes_headers": {
"default": true,
"title": "Data Includes Headers",
"type": "boolean"
},
"width_cm": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Width Cm"
},
"height_cm": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Height Cm"
}
},
"required": [
"session_id",
"chart_type",
"data_range"
],
"title": "add_chartArguments",
"type": "object"
} | — | — | |
add_commentAttach a comment (note) to a cell. Replaces any existing comment.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"cell": {
"title": "Cell",
"type": "string"
},
"text": {
"title": "Text",
"type": "string"
},
"author": {
"default": "Excel MCP",
"title": "Author",
"type": "string"
}
},
"required": [
"session_id",
"cell",
"text"
],
"title": "add_commentArguments",
"type": "object"
} | — | — | |
add_data_validationAdd a data-validation input rule to a range.
validation_type:
- 'list': in-cell dropdown; pass options=["Yes","No"] (literal values) or
formula='=$F$1:$F$5' to source the choices from cells.
- 'whole', 'decimal', 'date', 'text_length': pass operator (between,
notBetween, equal, notEqual, greaterThan, greaterThanOrEqual, lessThan,
lessThanOrEqual) and values (two for between/notBetween, otherwise one).
Dates are ISO strings like '2026-01-31'.
- 'custom': pass formula, e.g. '=ISNUMBER(A2)'.
error_message customizes the rejection dialog; prompt shows a tooltip when
the cell is selected. Rules take effect when the file is used in Excel.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"validation_type": {
"title": "Validation Type",
"type": "string"
},
"options": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Options"
},
"operator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Operator"
},
"values": {
"anyOf": [
{
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
},
{
"type": "number"
}
]
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Values"
},
"formula": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Formula"
},
"allow_blank": {
"default": true,
"title": "Allow Blank",
"type": "boolean"
},
"error_message": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Error Message"
},
"prompt": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Prompt"
}
},
"required": [
"session_id",
"range",
"validation_type"
],
"title": "add_data_validationArguments",
"type": "object"
} | — | — | |
add_sheetAdd a new empty sheet. index 0 puts it first; omit to append at the end.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
},
"index": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Index"
}
},
"required": [
"session_id",
"name"
],
"title": "add_sheetArguments",
"type": "object"
} | — | — | |
append_rowsAppend rows after the last used row of a sheet (like adding to a table).
values is a list of rows. Omit sheet to use the active sheet.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"values": {
"items": {
"items": {},
"type": "array"
},
"title": "Values",
"type": "array"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id",
"values"
],
"title": "append_rowsArguments",
"type": "object"
} | — | — | |
apply_conditional_formattingAdd a conditional formatting rule to a range.
rule_type:
- 'color_scale': gradient by value; colors = 2 or 3 hex/named colors
(default red-yellow-green).
- 'data_bar': in-cell bars; colors = [bar_color] (default blue).
- 'cell_value': highlight cells matching operator (greaterThan, lessThan,
equal, notEqual, between, notBetween, greaterThanOrEqual,
lessThanOrEqual) against values (two values for between); uses
fill_color/font_color.
- 'formula': highlight where an Excel formula (relative to the range's
top-left cell) is TRUE, e.g. 'ISBLANK(A2)'; uses fill_color/font_color.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"rule_type": {
"title": "Rule Type",
"type": "string"
},
"colors": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Colors"
},
"operator": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Operator"
},
"values": {
"anyOf": [
{
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
},
{
"type": "number"
}
]
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Values"
},
"formula": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Formula"
},
"fill_color": {
"default": "light_red",
"title": "Fill Color",
"type": "string"
},
"font_color": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Font Color"
}
},
"required": [
"session_id",
"range",
"rule_type"
],
"title": "apply_conditional_formattingArguments",
"type": "object"
} | — | — | |
apply_style_presetApply a common style in one call.
Presets: header (bold white on dark blue, centered), title (large bold),
zebra (banded rows, first row skipped), currency, percent,
highlight (yellow fill), total_row (bold, double top border).
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"preset": {
"title": "Preset",
"type": "string"
}
},
"required": [
"session_id",
"range",
"preset"
],
"title": "apply_style_presetArguments",
"type": "object"
} | — | — | |
auto_fit_columnsApproximate Excel's auto-fit: size each column to its longest value.
columns like 'A:F'; omit to fit every used column. Widths are clamped
to the 8-80 range.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"columns": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Columns"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id"
],
"title": "auto_fit_columnsArguments",
"type": "object"
} | — | — | |
clear_rangeClear values (not formatting) from every cell in a range.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
}
},
"required": [
"session_id",
"range"
],
"title": "clear_rangeArguments",
"type": "object"
} | — | — | |
close_workbookClose a workbook session and free its memory.
Refuses to close if there are unsaved changes, unless discard_changes=True.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"discard_changes": {
"default": false,
"title": "Discard Changes",
"type": "boolean"
}
},
"required": [
"session_id"
],
"title": "close_workbookArguments",
"type": "object"
} | — | — | |
copy_sheetDuplicate a sheet within the workbook, including values and formatting.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
},
"new_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "New Name"
}
},
"required": [
"session_id",
"name"
],
"title": "copy_sheetArguments",
"type": "object"
} | — | — | |
create_workbookCreate a new Excel workbook at the given absolute path.
The file is not written to disk until save_workbook. Fails if the file
already exists unless overwrite=True. Returns a session_id for editing.
Input schema{
"properties": {
"path": {
"title": "Path",
"type": "string"
},
"overwrite": {
"default": false,
"title": "Overwrite",
"type": "boolean"
}
},
"required": [
"path"
],
"title": "create_workbookArguments",
"type": "object"
} | — | — | |
define_named_rangeCreate a workbook-level named range, e.g. 'SalesData' for
'Sheet1!A1:C10'. The name can then be used in formulas: '=SUM(SalesData)'.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
}
},
"required": [
"session_id",
"name",
"range"
],
"title": "define_named_rangeArguments",
"type": "object"
} | — | — | |
delete_chartDelete a chart by its index (see list_charts). The data is unaffected.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"chart_index": {
"title": "Chart Index",
"type": "integer"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id",
"chart_index"
],
"title": "delete_chartArguments",
"type": "object"
} | — | — | |
delete_columnsDelete columns starting at the given column ('B' or 1-based index).Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"column": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"title": "Column"
},
"count": {
"default": 1,
"title": "Count",
"type": "integer"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id",
"column"
],
"title": "delete_columnsArguments",
"type": "object"
} | — | — | |
delete_commentRemove the comment from a cell.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"cell": {
"title": "Cell",
"type": "string"
}
},
"required": [
"session_id",
"cell"
],
"title": "delete_commentArguments",
"type": "object"
} | — | — | |
delete_imageDelete an embedded picture by its index (see list_images).Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"image_index": {
"title": "Image Index",
"type": "integer"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id",
"image_index"
],
"title": "delete_imageArguments",
"type": "object"
} | — | — | |
delete_named_rangeDelete a defined name. The cells it referred to are unaffected.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
}
},
"required": [
"session_id",
"name"
],
"title": "delete_named_rangeArguments",
"type": "object"
} | — | — | |
delete_rowsDelete rows starting at the given 1-based row number. Rows below shift up.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"row": {
"title": "Row",
"type": "integer"
},
"count": {
"default": 1,
"title": "Count",
"type": "integer"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id",
"row"
],
"title": "delete_rowsArguments",
"type": "object"
} | — | — | |
delete_sheetDelete a sheet and all its data. A workbook must keep at least one sheet.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
}
},
"required": [
"session_id",
"name"
],
"title": "delete_sheetArguments",
"type": "object"
} | — | — | |
export_csvExport a range (or a sheet's whole used range) to a CSV file.
Formula cells export their formula text; run recalculate_workbook and
read from read_calculated_range if you need computed values instead.
Dates become ISO strings, empty cells become empty fields.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"csv_path": {
"title": "Csv Path",
"type": "string"
},
"range": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Range"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
},
"delimiter": {
"default": ",",
"title": "Delimiter",
"type": "string"
},
"overwrite": {
"default": false,
"title": "Overwrite",
"type": "boolean"
}
},
"required": [
"session_id",
"csv_path"
],
"title": "export_csvArguments",
"type": "object"
} | — | — | |
export_jsonExport a range (or a sheet's whole used range) to a JSON file.
With first_row_is_header=true (default) the output is a list of objects
keyed by the header row; otherwise a list of row arrays.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"json_path": {
"title": "Json Path",
"type": "string"
},
"range": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Range"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
},
"first_row_is_header": {
"default": true,
"title": "First Row Is Header",
"type": "boolean"
},
"overwrite": {
"default": false,
"title": "Overwrite",
"type": "boolean"
}
},
"required": [
"session_id",
"json_path"
],
"title": "export_jsonArguments",
"type": "object"
} | — | — | |
export_pdfExport the workbook (or one sheet) to a PDF file via Excel.
Saves the session first. Requires Microsoft Excel on Windows
(uv sync --extra com).
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"pdf_path": {
"title": "Pdf Path",
"type": "string"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
},
"overwrite": {
"default": false,
"title": "Overwrite",
"type": "boolean"
}
},
"required": [
"session_id",
"pdf_path"
],
"title": "export_pdfArguments",
"type": "object"
} | — | — | |
fill_formulaFill a range with a formula, adjusting relative references like Excel's
fill handle.
The formula is written as given to the range's top-left cell and
translated for the rest: '=B2*2' filled into C2:C4 becomes '=B3*2' in C3
and '=B4*2' in C4. Use $ to pin references ('=$B$1*B2').
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"formula": {
"title": "Formula",
"type": "string"
}
},
"required": [
"session_id",
"range",
"formula"
],
"title": "fill_formulaArguments",
"type": "object"
} | — | — | |
find_in_workbookFind cells whose value contains the query text (or matches the regex).
Searches one sheet if given, otherwise the whole workbook. Values are
matched against their string form; formulas match on formula text.
Returns up to 500 matches with their cell addresses.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"query": {
"title": "Query",
"type": "string"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
},
"regex": {
"default": false,
"title": "Regex",
"type": "boolean"
},
"match_case": {
"default": false,
"title": "Match Case",
"type": "boolean"
}
},
"required": [
"session_id",
"query"
],
"title": "find_in_workbookArguments",
"type": "object"
} | — | — | |
format_as_tableConvert a range into a native Excel table with a built-in style.
The first row of the range must be unique, non-empty headers. Styles are
Excel's built-ins: TableStyleLight1-21, TableStyleMedium1-28, TableStyleDark1-11.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"style": {
"default": "TableStyleMedium9",
"title": "Style",
"type": "string"
},
"table_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Table Name"
},
"banded_rows": {
"default": true,
"title": "Banded Rows",
"type": "boolean"
}
},
"required": [
"session_id",
"range"
],
"title": "format_as_tableArguments",
"type": "object"
} | — | — | |
freeze_panesFreeze rows above and columns left of the given cell.
'A2' freezes row 1; 'B1' freezes column A; 'B2' freezes both. Omit cell
(or pass 'A1') to unfreeze.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"cell": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Cell"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id"
],
"title": "freeze_panesArguments",
"type": "object"
} | — | — | |
get_cell_formatInspect a cell's formatting: font, fill, alignment, borders, number
format, dimensions, and merge status.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"cell": {
"title": "Cell",
"type": "string"
}
},
"required": [
"session_id",
"cell"
],
"title": "get_cell_formatArguments",
"type": "object"
} | — | — | |
get_commentsList all comments on a sheet with their cells, text, and authors.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id"
],
"title": "get_commentsArguments",
"type": "object"
} | — | — | |
get_formulaRead the formula stored in a cell. formula is null when the cell holds
a plain value instead of a formula.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"cell": {
"title": "Cell",
"type": "string"
}
},
"required": [
"session_id",
"cell"
],
"title": "get_formulaArguments",
"type": "object"
} | — | — | |
get_used_rangeGet the bounding range of used cells on a sheet, e.g. 'A1:F120'.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id"
],
"title": "get_used_rangeArguments",
"type": "object"
} | — | — | |
get_workbook_infoGet workbook details: sheet names plus each sheet's used-range dimensions.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
}
},
"required": [
"session_id"
],
"title": "get_workbook_infoArguments",
"type": "object"
} | — | — | |
import_csvImport a CSV file into a sheet, starting at start_cell.
With detect_types=true (default), numeric fields become numbers and empty
fields become empty cells; otherwise everything is written as text.
Existing cells in the target area are overwritten.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"csv_path": {
"title": "Csv Path",
"type": "string"
},
"start_cell": {
"default": "A1",
"title": "Start Cell",
"type": "string"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
},
"delimiter": {
"default": ",",
"title": "Delimiter",
"type": "string"
},
"encoding": {
"default": "utf-8-sig",
"title": "Encoding",
"type": "string"
},
"detect_types": {
"default": true,
"title": "Detect Types",
"type": "boolean"
}
},
"required": [
"session_id",
"csv_path"
],
"title": "import_csvArguments",
"type": "object"
} | — | — | |
insert_columnsInsert empty columns before the given column ('B' or 1-based index).
Columns at and right of it shift right. Note: formulas are not re-adjusted.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"column": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
],
"title": "Column"
},
"count": {
"default": 1,
"title": "Count",
"type": "integer"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id",
"column"
],
"title": "insert_columnsArguments",
"type": "object"
} | — | — | |
insert_imageInsert a picture with its top-left corner at the given cell.
Supports png, jpg, gif, bmp. Give width_px and/or height_px to resize;
a single dimension scales proportionally. The image file is embedded in
the workbook, so the source file is not needed afterwards.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"image_path": {
"title": "Image Path",
"type": "string"
},
"cell": {
"title": "Cell",
"type": "string"
},
"width_px": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Width Px"
},
"height_px": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Height Px"
}
},
"required": [
"session_id",
"image_path",
"cell"
],
"title": "insert_imageArguments",
"type": "object"
} | — | — | |
insert_rowsInsert empty rows before the given 1-based row number.
Rows at and below `row` shift down. Note: formulas are not re-adjusted.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"row": {
"title": "Row",
"type": "integer"
},
"count": {
"default": 1,
"title": "Count",
"type": "integer"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id",
"row"
],
"title": "insert_rowsArguments",
"type": "object"
} | — | — | |
list_chartsList the charts embedded in a sheet, with the index used by delete_chart.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id"
],
"title": "list_chartsArguments",
"type": "object"
} | — | — | |
list_imagesList the pictures embedded in a sheet, with the index used by delete_image.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id"
],
"title": "list_imagesArguments",
"type": "object"
} | — | — | |
list_named_rangesList the workbook's defined names and the ranges they refer to.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
}
},
"required": [
"session_id"
],
"title": "list_named_rangesArguments",
"type": "object"
} | — | — | |
list_open_workbooksList all currently open workbook sessions with their session_ids.Input schema{
"properties": {},
"title": "list_open_workbooksArguments",
"type": "object"
}Output schema{
"properties": {
"result": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Result",
"type": "array"
}
},
"required": [
"result"
],
"title": "list_open_workbooksOutput",
"type": "object"
} | — | — | |
list_sheetsList all sheets in the workbook, in tab order.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
}
},
"required": [
"session_id"
],
"title": "list_sheetsArguments",
"type": "object"
}Output schema{
"properties": {
"result": {
"items": {
"additionalProperties": true,
"type": "object"
},
"title": "Result",
"type": "array"
}
},
"required": [
"result"
],
"title": "list_sheetsOutput",
"type": "object"
} | — | — | |
merge_cellsMerge a range into one cell. Only the top-left value is kept.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
}
},
"required": [
"session_id",
"range"
],
"title": "merge_cellsArguments",
"type": "object"
} | — | — | |
open_in_excelOpen the workbook in a visible Excel window for the user to see.
Saves the session first so Excel shows the latest edits. Edits the user
then makes in Excel do NOT flow back into this session — to continue
editing here afterwards, have the user save and close Excel, then
close_workbook and open_workbook again to reload.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
}
},
"required": [
"session_id"
],
"title": "open_in_excelArguments",
"type": "object"
} | — | — | |
open_workbookOpen an existing Excel file (.xlsx or .xlsm) for reading and editing.
Returns a session_id that every other tool requires. Changes are kept in
memory until save_workbook is called. Use an absolute file path.
Input schema{
"properties": {
"path": {
"title": "Path",
"type": "string"
}
},
"required": [
"path"
],
"title": "open_workbookArguments",
"type": "object"
} | — | — | |
protect_sheetProtect a sheet so locked cells cannot be edited in Excel.
All cells are locked by default — use set_cell_locked(range, locked=false)
BEFORE protecting to keep specific cells editable. The allow_* flags let
users still format, sort, or filter while protected. A password (optional)
is required to unprotect in Excel; note this is Excel's standard sheet
protection, a deterrent rather than encryption.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
},
"password": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Password"
},
"allow_select_locked_cells": {
"default": true,
"title": "Allow Select Locked Cells",
"type": "boolean"
},
"allow_formatting": {
"default": false,
"title": "Allow Formatting",
"type": "boolean"
},
"allow_sorting": {
"default": false,
"title": "Allow Sorting",
"type": "boolean"
},
"allow_filtering": {
"default": false,
"title": "Allow Filtering",
"type": "boolean"
}
},
"required": [
"session_id"
],
"title": "protect_sheetArguments",
"type": "object"
} | — | — | |
read_calculated_rangeRead computed formula results (cached values) from the saved file.
Reads the last saved copy on disk, so run recalculate_workbook first —
formula cells that were never calculated come back null with a hint.
Non-formula cells return their stored values as usual. Truncates at
10,000 cells with a next_range cursor, like read_range.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
}
},
"required": [
"session_id",
"range"
],
"title": "read_calculated_rangeArguments",
"type": "object"
} | — | — | |
read_cellRead one cell's value. cell is A1 notation, e.g. 'B2' or 'Sheet1!B2'.
Returns the stored value; for formula cells this is the formula text
(e.g. '=SUM(A1:A5)'), since files edited outside Excel hold no cached result.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"cell": {
"title": "Cell",
"type": "string"
}
},
"required": [
"session_id",
"cell"
],
"title": "read_cellArguments",
"type": "object"
} | — | — | |
read_rangeRead a rectangular range as a 2D array (rows of cell values).
Large ranges are truncated at 10,000 cells; the response then includes
truncated=true and next_range to continue reading from.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
}
},
"required": [
"session_id",
"range"
],
"title": "read_rangeArguments",
"type": "object"
} | — | — | |
read_sheetRead a whole sheet's used range. Omit sheet to read the active sheet.
With first_row_is_header=true, returns records as a list of dicts keyed by
the header row. Truncates at 10,000 cells like read_range.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
},
"first_row_is_header": {
"default": false,
"title": "First Row Is Header",
"type": "boolean"
}
},
"required": [
"session_id"
],
"title": "read_sheetArguments",
"type": "object"
} | — | — | |
recalculate_workbookRecalculate all formulas using a hidden desktop Excel instance and
cache the results in the file, so read_calculated_range can return
computed values.
Saves the session to disk first (flushing pending edits), then opens the
file invisibly in Excel, recalculates, and saves. The in-memory session
keeps formulas as text; only the file on disk gains cached results.
Requires Microsoft Excel on Windows (uv sync --extra com).
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
}
},
"required": [
"session_id"
],
"title": "recalculate_workbookArguments",
"type": "object"
} | — | — | |
remove_duplicatesDelete duplicate rows within a range, keeping each first occurrence.
columns lists the sheet column letters that decide uniqueness, e.g.
["A","C"] (each must fall inside the range); omit to compare whole rows.
Text comparison ignores case, like Excel's Remove Duplicates. Set
has_header=true to leave the range's first row in place. Remaining rows
shift up and the freed rows at the bottom are cleared. Only values are
compared and moved, not formatting.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"columns": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Columns"
},
"has_header": {
"default": false,
"title": "Has Header",
"type": "boolean"
}
},
"required": [
"session_id",
"range"
],
"title": "remove_duplicatesArguments",
"type": "object"
} | — | — | |
remove_hyperlinkRemove the hyperlink from a cell. The cell value and formatting stay.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"cell": {
"title": "Cell",
"type": "string"
}
},
"required": [
"session_id",
"cell"
],
"title": "remove_hyperlinkArguments",
"type": "object"
} | — | — | |
rename_sheetRename a sheet. Note: formulas referencing the old name are not rewritten.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
},
"new_name": {
"title": "New Name",
"type": "string"
}
},
"required": [
"session_id",
"name",
"new_name"
],
"title": "rename_sheetArguments",
"type": "object"
} | — | — | |
replace_in_rangeReplace text in every matching cell within a range.
Only text (string) cells are modified; numbers, dates, and formulas are
left untouched. With regex=True, `replace` may use groups like \1.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"find": {
"title": "Find",
"type": "string"
},
"replace": {
"title": "Replace",
"type": "string"
},
"regex": {
"default": false,
"title": "Regex",
"type": "boolean"
},
"match_case": {
"default": false,
"title": "Match Case",
"type": "boolean"
}
},
"required": [
"session_id",
"range",
"find",
"replace"
],
"title": "replace_in_rangeArguments",
"type": "object"
} | — | — | |
run_macroRun a VBA macro in the workbook via Excel, then reload the session so
changes the macro made are visible to the other tools.
Only .xlsm workbooks can hold macros. macro_name is the procedure name
(e.g. 'FormatReport' or 'Module1.FormatReport'); args are passed through.
The workbook is saved after the macro runs. Requires Microsoft Excel on
Windows (uv sync --extra com), and macros must be trusted for automation.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"macro_name": {
"title": "Macro Name",
"type": "string"
},
"args": {
"anyOf": [
{
"items": {},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Args"
}
},
"required": [
"session_id",
"macro_name"
],
"title": "run_macroArguments",
"type": "object"
} | — | — | |
save_workbookWrite the workbook's in-memory changes to its file on disk.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
}
},
"required": [
"session_id"
],
"title": "save_workbookArguments",
"type": "object"
} | — | — | |
save_workbook_asSave the workbook to a new absolute path; the session then points at that file.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"new_path": {
"title": "New Path",
"type": "string"
}
},
"required": [
"session_id",
"new_path"
],
"title": "save_workbook_asArguments",
"type": "object"
} | — | — | |
set_active_sheetSet which sheet unqualified ranges like 'A1:C10' refer to.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"name": {
"title": "Name",
"type": "string"
}
},
"required": [
"session_id",
"name"
],
"title": "set_active_sheetArguments",
"type": "object"
} | — | — | |
set_alignmentSet text alignment on a range.
horizontal: left, center, right, justify. vertical: top, center, bottom.
text_rotation: degrees 0-180.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"horizontal": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Horizontal"
},
"vertical": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Vertical"
},
"wrap_text": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"title": "Wrap Text"
},
"text_rotation": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Text Rotation"
}
},
"required": [
"session_id",
"range"
],
"title": "set_alignmentArguments",
"type": "object"
} | — | — | |
set_auto_filterAdd Excel's filter dropdowns to a data range (one filter per sheet).
range should cover the header row plus data, e.g. 'A1:D50'; omit it to
use the sheet's whole used range. Pass remove=true to clear the sheet's
filter. This adds the filter UI — choosing filter values happens in Excel.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Range"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
},
"remove": {
"default": false,
"title": "Remove",
"type": "boolean"
}
},
"required": [
"session_id"
],
"title": "set_auto_filterArguments",
"type": "object"
} | — | — | |
set_bordersDraw borders on a range.
edges: ["all"] (default) borders every cell on all sides, ["outline"] only
the range perimeter, or any of ["top","bottom","left","right"] applied to
every cell. style: thin, medium, thick, double, dashed, dotted, hair.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"style": {
"default": "thin",
"title": "Style",
"type": "string"
},
"color": {
"default": "black",
"title": "Color",
"type": "string"
},
"edges": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Edges"
}
},
"required": [
"session_id",
"range"
],
"title": "set_bordersArguments",
"type": "object"
} | — | — | |
set_cell_lockedMark cells as locked or unlocked. Takes effect only while the sheet is
protected (protect_sheet); all cells start locked, so unlock the cells
users should edit, then protect the sheet.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"locked": {
"title": "Locked",
"type": "boolean"
}
},
"required": [
"session_id",
"range",
"locked"
],
"title": "set_cell_lockedArguments",
"type": "object"
} | — | — | |
set_column_widthSet the width of one column ('B') or a span ('B:D'). Width is in
Excel character units (default column width is about 8.4).Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"columns": {
"title": "Columns",
"type": "string"
},
"width": {
"title": "Width",
"type": "number"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id",
"columns",
"width"
],
"title": "set_column_widthArguments",
"type": "object"
} | — | — | |
set_fill_colorSet a solid background fill on every cell in a range.
color accepts hex ('#FFFF00') or names like yellow, light_blue, light_gray.
Pass 'none' to remove the fill.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"color": {
"title": "Color",
"type": "string"
}
},
"required": [
"session_id",
"range",
"color"
],
"title": "set_fill_colorArguments",
"type": "object"
} | — | — | |
set_fontSet font properties on every cell in a range. Only the properties you
pass are changed; others are preserved.
color accepts hex ('#FF0000') or names like red, blue, white, dark_blue.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"bold": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"title": "Bold"
},
"italic": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"title": "Italic"
},
"underline": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"title": "Underline"
},
"strikethrough": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"title": "Strikethrough"
},
"size": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Size"
},
"color": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Color"
},
"font_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Font Name"
}
},
"required": [
"session_id",
"range"
],
"title": "set_fontArguments",
"type": "object"
} | — | — | |
set_formulaWrite an Excel formula to one cell, e.g. 'SUM(B2:B10)' (leading '='
optional).
Formulas are stored, not calculated — Excel evaluates them when the file
is next opened. Reading the cell back returns the formula text.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"cell": {
"title": "Cell",
"type": "string"
},
"formula": {
"title": "Formula",
"type": "string"
}
},
"required": [
"session_id",
"cell",
"formula"
],
"title": "set_formulaArguments",
"type": "object"
} | — | — | |
set_hyperlinkTurn a cell into a hyperlink.
url can be external ('https://example.com', 'mailto:a@b.com') or internal
to the workbook with a '#' prefix ('#Sheet2!A1'). display sets the cell
text; if omitted, an empty cell shows the url. The cell is styled as a
link (blue, underlined).
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"cell": {
"title": "Cell",
"type": "string"
},
"url": {
"title": "Url",
"type": "string"
},
"display": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Display"
}
},
"required": [
"session_id",
"cell",
"url"
],
"title": "set_hyperlinkArguments",
"type": "object"
} | — | — | |
set_number_formatSet the number format for a range.
Accepts an alias — general, integer, decimal, currency, percent, date,
datetime, time, text, scientific — or any Excel format code like
'#,##0.00 "kg"' or '€#,##0.00'.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"number_format": {
"title": "Number Format",
"type": "string"
}
},
"required": [
"session_id",
"range",
"number_format"
],
"title": "set_number_formatArguments",
"type": "object"
} | — | — | |
set_row_heightSet the height of one row ('2') or a span ('2:5'), in points.Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"rows": {
"title": "Rows",
"type": "string"
},
"height": {
"title": "Height",
"type": "number"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id",
"rows",
"height"
],
"title": "set_row_heightArguments",
"type": "object"
} | — | — | |
sort_rangeSort the rows of a range by one column's values.
by_column is the sheet column letter (e.g. 'B') and must fall inside the
range. Set has_header=true if the range's first row is a header to keep in
place. Numbers and dates sort before text; blank cells always sort last.
Only values move — formatting stays put, and formulas move as text (their
relative references are NOT adjusted). For multi-key sorts, call once per
key from least to most significant column (the sort is stable).
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
},
"by_column": {
"title": "By Column",
"type": "string"
},
"descending": {
"default": false,
"title": "Descending",
"type": "boolean"
},
"has_header": {
"default": false,
"title": "Has Header",
"type": "boolean"
}
},
"required": [
"session_id",
"range",
"by_column"
],
"title": "sort_rangeArguments",
"type": "object"
} | — | — | |
unmerge_cellsUnmerge a previously merged range (must match the merged area exactly).Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"range": {
"title": "Range",
"type": "string"
}
},
"required": [
"session_id",
"range"
],
"title": "unmerge_cellsArguments",
"type": "object"
} | — | — | |
unprotect_sheetRemove sheet protection (no password needed here — this edits the file
directly, unlike Excel's UI).Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"sheet": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Sheet"
}
},
"required": [
"session_id"
],
"title": "unprotect_sheetArguments",
"type": "object"
} | — | — | |
write_cellWrite a value to one cell. Strings starting with '=' are stored as formulas.
Pass null to clear the cell. Dates should be ISO strings; they are stored
as text unless the cell already has a date number format.
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"cell": {
"title": "Cell",
"type": "string"
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
],
"title": "Value"
}
},
"required": [
"session_id",
"cell",
"value"
],
"title": "write_cellArguments",
"type": "object"
} | — | — | |
write_rangeWrite a 2D array of values starting at start_cell (top-left corner).
values is a list of rows, e.g. [["Name","Age"],["Ana",31]]. Strings starting
with '=' are stored as formulas. null leaves a gap (clears that cell).
Input schema{
"properties": {
"session_id": {
"title": "Session Id",
"type": "string"
},
"start_cell": {
"title": "Start Cell",
"type": "string"
},
"values": {
"items": {
"items": {},
"type": "array"
},
"title": "Values",
"type": "array"
}
},
"required": [
"session_id",
"start_cell",
"values"
],
"title": "write_rangeArguments",
"type": "object"
} | — | — |
| Endpoint | Transport | Authentication | Health | Observed |
|---|---|---|---|---|
| No verified remote endpoint is linked. | ||||
No verified package installation command is available in the retained catalog evidence.
Excel MCP Server exposed 74 tools during independent protocol observation, including add_chart, add_comment, add_data_validation, add_sheet, append_rows, apply_conditional_formatting, apply_style_preset, auto_fit_columns, and others.
The selected current version does not yet have completed public verification. Unknown does not mean clean or vulnerable.
These internal links are derived from strong identity fields such as the implementation name, package, repository, vendor, and listing name—not generic description prose.
Association is based on retained identity fields; it does not by itself prove first-party publication.
Curated product and capability guides containing this catalog record.