# excel-vision-mcp [Health: Active]

**Category:** 🏢 Workplace & Productivity  
**Repository:** https://github.com/VOYAGER-Inc/excel-vision-mcp  
**GitHub Stars:** 20  
**Views:** 5  
**Installs:** 0  
**Upvotes:** 0  
**Directory Page:** https://allmcps.com/mcp/excel-vision-mcp

## Description
Excel reading MCP with embedded image extraction — AI agents see text and images in xlsx files

## Tools
Capabilities this server exposes over MCP:

- **list_sheets** — 
    List all sheets in an Excel workbook with their dimensions and metadata.

    Returns sheet names, row/column counts, data ranges, merged cell counts,
    and total embedded image count. Use this to understand the structure of
    an Excel file before reading its contents.

    @param file_path: Absolute path to the .xlsx file.
    @return: Formatted text with workbook structure overview.
    
- **read_excel_data** — 
    Read cell data from an Excel sheet with pagination for large files.

    Returns cell values organized by row with coordinate labels and
    formatting markers ([B]=bold, [S]=strikethrough, [HL:color]=highlight,
    [C:color]=font color) that reveal the author's emphasis and status marks.

    Hidden rows/columns are skipped by default — the author hid them for a
    reason — except hidden cells that visible formulas depend on, which are
    kept and marked [HIDDEN-REF].

    @param file_path: Absolute path to the .xlsx file.
    @param sheet_name: Sheet to read. None = first/active sheet.
    @param start_row: Starting row number (1-indexed).
    @param max_rows: Maximum rows to return (default 200).
    @param include_hidden: Set true to also read hidden rows/columns.
    @return: Formatted text table with cell values and formatting markers.
    
- **extract_images** — 
    Extract all embedded images from an Excel file.

    Uses dual extraction strategy: cell-position mapping (primary) and
    ZIP archive scanning (fallback) to ensure no images are missed.
    Returns images as base64-encoded ImageContent that AI can visually analyze.

    @param file_path: Absolute path to the .xlsx file.
    @param sheet_name: Specific sheet, or None for all sheets.
    @param max_width: Max width in pixels for image optimization (default 1024).
    @param max_height: Max height in pixels for image optimization (default 1024).
    @return: Mixed list of TextContent (metadata) and ImageContent (images).
    
- **read_full_content** — 
    Read the FULL content of an Excel file including all text data AND embedded images.

    This is the primary tool for comprehensive document analysis. Returns all sheet
    data as structured text followed by all extracted images with their cell positions.
    Ideal for analyzing documents where both text and diagrams/screenshots are
    essential, such as requirement definitions, reports, or design specs.

    For very large files, data is paginated per sheet. Image extraction uses
    dual strategy (cell-mapping + archive) for maximum coverage. Cell text
    carries formatting markers ([B]=bold, [S]=strikethrough, [HL:color]=
    highlight) so emphasis and status marks survive into the analysis.

    Hidden rows/columns are skipped by default, except hidden cells that
    visible formulas depend on.

    @param file_path: Absolute path to the .xlsx file.
    @param max_rows_per_sheet: Max rows to read per sheet (default 500).
    @param max_image_width: Max width for image optimization (default 1024).
    @param max_image_height: Max height for image optimization (default 1024).
    @param include_hidden: Set true to also read hidden rows/columns.
    @return: Mixed list of TextContent and ImageContent covering entire workbook.
    
- **get_workbook_overview** — 
    Get a quick summary overview of an Excel workbook.

    Returns file metadata, sheet list with dimensions, image count,
    and merged cell information. Use this for a fast assessment
    before deeper analysis.

    @param file_path: Absolute path to the .xlsx file.
    @return: Formatted text summary.
    
- **search_excel** — 
    Search for text content across all cells in an Excel workbook.

    Performs case-insensitive substring search and returns matching cells
    with their coordinates and values. Hidden rows/columns are excluded by
    default. Limited to 100 results.

    @param file_path: Absolute path to the .xlsx file.
    @param query: Text to search for.
    @param sheet_name: Limit to specific sheet, or None for all sheets.
    @param include_hidden: Set true to also search hidden rows/columns.
    @return: Formatted text with search results.
    
- **create_excel_file** — 
    Create a new empty .xlsx workbook.

    @param file_path: Absolute destination path; parent directory must exist.
    @param sheet_names: Sheet names to create in order. None = single "Sheet1".
    @param overwrite: Set true to replace an existing file. Default false.
    @return: Confirmation with the created sheet list.
    
- **add_excel_sheet** — 
    Add a new empty sheet to an existing workbook.

    @param file_path: Absolute path to the .xlsx/.xlsm file.
    @param sheet_name: Name for the new sheet; must not already exist.
    @param position: 0-based index to insert at. None = append at the end.
    @return: Confirmation with the updated sheet list.
    
- **update_excel_cells** — 
    Set individual cells by coordinate, e.g. {"A1": "Title", "B2": 42}.

    String values starting with "=" are written as formulas (e.g. "=SUM(A1:A5)").
    Note: newly written formulas have no calculated value until the file is
    opened in Excel. For cells inside a merged range, write to the range's
    top-left anchor cell.

    The save is atomic — a failed write never corrupts the original file.

    @param file_path: Absolute path to the .xlsx/.xlsm file.
    @param updates: Mapping of cell coordinate to value.
    @param sheet_name: Target sheet. None = first sheet.
    @return: Confirmation with the number of cells written.
    
- **write_excel_rows** — 
    Write a rectangular block of rows starting at start_cell.

    Efficient for tabular data: pass a list of rows, each a list of values.
    Existing cells in the target range are overwritten; cells outside it
    are untouched. The save is atomic.

    @param file_path: Absolute path to the .xlsx/.xlsm file.
    @param rows: List of rows, each a list of cell values.
    @param sheet_name: Target sheet. None = first sheet.
    @param start_cell: Top-left coordinate of the block (default "A1").
    @return: Confirmation with the written range.
    
- **insert_excel_image** — 
    Insert an image from a local file into a workbook, anchored at a cell.

    @param file_path: Absolute path to the .xlsx/.xlsm file.
    @param image_path: Absolute path to the image file (PNG/JPEG/GIF/BMP).
    @param cell: Anchor cell coordinate (e.g. "B2").
    @param sheet_name: Target sheet. None = first sheet.
    @param width: Display width in pixels. None = natural size.
    @param height: Display height in pixels. None = natural size.
    @return: Confirmation with anchor position and display size.
    
- **format_excel_cells** — 
    Apply formatting to a cell range: font, colors, borders, alignment, number format.

    Only the attributes you pass are changed; existing styling is preserved.
    Example — style a header row: cell_range="A1:D1", bold=true,
    font_color="FFFFFF", fill_color="4472C4", horizontal_align="center",
    border_style="thin".

    @param file_path: Absolute path to the .xlsx/.xlsm file.
    @param cell_range: Range like "A1:C10" or a single cell like "B2".
    @param sheet_name: Target sheet. None = first sheet.
    @param font_name: Font family (e.g. "Calibri").
    @param font_size: Font size in points.
    @param bold: Bold on/off.
    @param italic: Italic on/off.
    @param font_color: Text color, RRGGBB hex (e.g. "FFFFFF").
    @param fill_color: Background color, RRGGBB hex (e.g. "4472C4").
    @param border_style: thin, medium, thick, double, dashed, or dotted.
    @param border_edges: "all" = every cell; "outline" = outer edge of range only.
    @param horizontal_align: left, center, right, or justify.
    @param vertical_align: top, center, or bottom.
    @param wrap_text: Enable/disable text wrapping.
    @param number_format: Excel format code (e.g. "#,##0.00", "dd/mm/yyyy", "0%").
    @return: Confirmation with the number of cells formatted.
    
- **set_excel_column_widths** — 
    Set column widths manually and/or auto-fit them to content.

    Auto-fit sizes each column to its longest content (full-width CJK
    characters count double), capped at max_width. Cells longer than the
    cap get wrap_text enabled so long descriptions wrap onto multiple
    lines instead of stretching the column; Excel auto-expands their row
    heights on open. Columns in `widths` are set exactly and skipped by
    auto-fit.

    @param file_path: Absolute path to the .xlsx/.xlsm file.
    @param sheet_name: Target sheet. None = first sheet.
    @param widths: Explicit widths per column letter, e.g. {"A": 12, "B": 35}.
    @param auto_fit: Auto-size all other columns in the used range.
    @param max_width: Width cap for auto-fit in character units (default 60).
    @param wrap_overflow: Wrap cells longer than max_width (default true).
    @return: Confirmation listing each column and the width applied.
    

## Claude Desktop Quick Installation
Install path detected from listing signals. Uses `uvx` (confidence: high):

```json
"mcpServers": {
  "excel-vision-mcp": {
    "command": "uvx",
    "args": ["excel-vision-mcp"]
  }
}
```

## Documentation

## What excel-vision-mcp MCP server does

The excel-vision-mcp MCP server exposes local `.xlsx` and, for some write operations, `.xlsm` workbooks through MCP tools. It can inspect workbook structure, read cell values, search text across sheets, extract embedded images, and return a combined representation of spreadsheet text and visuals.

Reading preserves context that ordinary cell extraction can lose. Returned cell text may include markers for bold, italic, strikethrough, highlights, font colors, merged cells, and hidden cells referenced by visible formulas. Hidden rows and columns are omitted by default, but callers can request them. Image results include base64-encoded ImageContent and cell-position metadata when available.

The server also provides workbook editing operations. Agents can create workbooks, add sheets, update individual cells, write rectangular row ranges, insert local images, apply formatting, and set or auto-fit column widths. Formula strings beginning with `=` are written as formulas; their calculated values are not available until the workbook is opened in Excel.

## How it works

excel-vision-mcp MCP server uses a dual approach for embedded images. It first maps images to worksheet positions and then scans the `.xlsx` ZIP archive's media directory as a fallback. The `read_full_content` tool combines sheet text and extracted images in one response, while `extract_images` focuses on image retrieval and can target one sheet or the whole workbook.

For large workbooks, reading tools limit rows per request. `read_excel_data` reads a selected row range, and `read_full_content` paginates each sheet according to its configured maximum. `search_excel` performs a case-insensitive substring search and returns up to 100 matching cells, excluding hidden content unless requested.

Write operations save atomically, so a failed update does not corrupt the original file. File access can be restricted to configured directories through `EXCEL_VISION_MCP_ALLOWED_DIRS`; without that setting, the process can access Excel files available to the user account.

## Setup and configuration

The package requires Python 3.11 or newer and can run directly with `uvx excel-vision-mcp`, or be installed with pip and started using the `excel-vision-mcp` executable. The repository also documents running from source with `uv`, and a Docker mode that communicates over stdin/stdout and mounts a spreadsheet directory.

MCP configuration examples are provided for Claude Desktop, Cursor, and Windsurf. Add the server as a local stdio process, then restart the client after changing its configuration. When using Docker, the mounted directory is referenced from inside the container, and the documented image configuration limits access to `/data`.

## Tools and capabilities

The tools cover these workflows:

- Inspect sheet names, dimensions, ranges, merged-cell counts, and image totals.
- Read paginated cell data with coordinates and formatting indicators.
- Extract images from one sheet or all sheets with configurable size limits.
- Retrieve a workbook's text and images together with `read_full_content`.
- Search cell text across a workbook or within a selected sheet.
- Create workbooks and add empty sheets at chosen positions.
- Update individual cells or write rectangular data blocks.
- Insert local PNG, JPEG, GIF, or BMP files at cell anchors.
- Apply fonts, colors, fills, borders, alignment, wrapping, and number formats.
- Set explicit column widths or auto-fit columns with a width cap.

## Limitations and notes

The server operates on local file paths rather than a hosted workbook service. Callers must provide absolute paths, and Docker users must use paths inside the mounted container directory. The default row limits and the 100-result search limit may require multiple calls or narrower queries for large files.

Newly written formulas do not have calculated results until Excel opens the file. Image extraction can resize images using maximum width and height settings. Hidden rows and columns are intentionally skipped unless `include_hidden` is enabled, although hidden cells needed by visible formulas are retained and marked. The documented license is MIT.

_Full upstream README: https://allmcps.com/mcp/excel-vision-mcp/readme_

