Skip to main content
Glama

graph-excel-mcp

Read and edit Excel workbooks on SharePoint and OneDrive from AI agents — without overwriting anyone’s edits.

npm downloads CI provenance license

npm · Claude Desktop extension · Releases

MCP server for reading and editing Excel workbooks on SharePoint, OneDrive or Teams through Microsoft Graph, without a browser. It is written in TypeScript, has no runtime dependencies, and runs on Node 18 or later.

It is built for workbooks that several people edit at once:

  • Every write starts as a dry run.

  • Before writing, it checks the cells' current content against the version you read, so it won't overwrite someone else's edit.

  • After writing, it reads the cells back to confirm the change.

Install

Claude Code / any MCP host (stdio):

claude mcp add --scope user graph-excel -- npx -y graph-excel-mcp
{ "mcpServers": { "graph-excel": { "command": "npx", "args": ["-y", "graph-excel-mcp"] } } }

Claude Desktop extension: download graph-excel-mcp-<version>.mcpb from the latest release and open it. One install covers both Chat and Cowork in Claude Desktop.

Claude plugin (Cowork, Claude Code): install the plugin/ folder of this repo. It contains the server and a graph-excel skill.

Related MCP server: excel-o365

Sign in

Call the login_status tool, or run npx graph-excel-mcp login, then enter the code it shows at https://login.microsoft.com/device. The refresh token is saved in ~/.graph-excel/token.json with mode 600. Set GRAPH_EXCEL_HOME to keep it somewhere else.

Sign-in uses the Microsoft Graph PowerShell public client with the delegated scope Files.ReadWrite.All, so you don't need to register an app. If your tenant blocks user consent, an admin has to approve that client once.

Workbook aliases

Instead of pasting the SharePoint URL every time, you can add aliases to ~/.graph-excel/workbooks.json (see workbooks.example.json). The resolve tool returns the driveId and itemId you need for an alias.

Tools

Tool

What it does

login_status

Checks the token, or starts a device code login

resolve

Returns drive/item ids, last modified, and the sheets with their used ranges

read_range

Returns values plus a sha256: hash per cell, and fills on request

write_values

Writes blocks of values with a base check (expected) and read-back verification

append_update

Adds or replaces a 「-----update-----」 section under a cell's existing text, keeping the original part byte-identical, and can fill the row with a color

set_fill

Sets or clears the fill color of one or more ranges in a single batch

find

Searches cell text across all sheets (or one), substring or regex, and returns addresses with hashes

add_sheet

Adds an empty sheet (Excel name rules, no duplicates), optionally at a position

rename_sheet

Renames a sheet

insert_rows

Inserts empty rows above a row and verifies the shifted row moved intact

append_rows

Appends rows below the last used row; the target cells must still be empty

set_format

Bold, italic, font color and size, wrap, alignment and number format for one or more ranges

Every tool that changes the workbook is a dry run until send: true. Nothing deletes sheets, rows or cells.

Notes

  • Every call runs inside a workbook session. Sessionless calls on large workbooks can time out with a 504 even though the write was applied.

  • Line breaks are sent as \n, which Excel stores as \r\n. If you write \r\n directly, the cell ends up with a stray _x000D_.

Development

Development needs Node 22.18 or later, which runs the .ts sources directly.

Command

What it does

npm run mcp / npm run login

Runs the server or the terminal sign-in from src/

npm run typecheck

Runs tsc in strict mode with no emit

npm test

Runs offline tests: range parsing, update composition, and the MCP handshake on src/ and dist/

npm run build

Compiles src/ to dist/, which is what npm, the .mcpb and the plugin run

npm run pack

Builds, then writes build/*.mcpb (gitignored) and plugin/ (committed)

Layout:

Path

Contents

src/graph.ts

Auth and the Graph client

src/excel.ts

Workbook operations

src/mcp.ts

Tools and the JSON-RPC server

src/cli.ts

Entry point

Release

Bump version in package.json, run npm run pack, commit, then push a matching tag:

git tag v0.3.1 && git push origin v0.3.1

The Publish workflow runs the tests, publishes to npm through trusted publishing (no token or OTP; provenance attached) and creates a GitHub release with the .mcpb attached.

Privacy

graph-excel-mcp has no server of its own and collects nothing. It signs in to Microsoft with a device code and keeps the refresh token only in ~/.graph-excel/token.json (mode 600) on your computer. It talks to Microsoft only — login.microsoftonline.com to sign in and graph.microsoft.com to read and write the workbooks you point it at. Cell contents go to Claude only when you ask for them, and are then handled under your Claude plan's terms. No telemetry, no third-party services.

Support

If graph-excel-mcp saves you time, you can support its development through GitHub Sponsors. Bug reports and pull requests are just as welcome.

License

MIT

Available Tools

12 tools
add_sheetA

Add an empty worksheet (Excel name rules, no duplicate names), optionally at position (0 = first). Verified by listing the sheets afterwards.

Inputs: file (required), name (required), send, position.

append_rowsA

Append rows below the last used row of a sheet, starting at column (default A). values is a 2D array, one array per row. Base check: the target cells must still be empty; read back and verified like write_values.

Inputs: file (required), sheet (required), values (required), send, +1 more.

append_updateA
Destructive

Write the 「-----update-----」 part of cells in one row (e.g. H/I/J) and keep the original part byte-identical. No separator yet: appends blank line + separator + text. Separator present: mode=replace (default) swaps the update part, mode=append adds after it. Pass expected per column (sha256 from read_range) as the base check. After writing it verifies the original part is intact, then fills fillRange (default the updated columns of that row) with fill (default #FFFF00; null = no fill).

Inputs: row (required), file (required), sheet (required), update (required), +5 more.

findA
Read-only

Search cell text across every sheet (or one sheet): case-insensitive substring by default, regex=true for a JavaScript regular expression. Returns sheet, address, a preview and the sha256 hash per hit (≤ limit, default 50, max 500).

Inputs: file (required), text (required), limit, regex, +2 more.

insert_rowsA

Insert count empty rows above row; everything from row down shifts down. The dry run shows the row that will move. Verified afterwards: that row is found at row+count and the new rows are empty.

Inputs: row (required), file (required), sheet (required), send, +1 more.

login_statusA
Read-only

Check the Microsoft Graph sign-in. If not signed in, starts a device code login and returns the URL + code: give them to the user (never sign in for them), then call login_status again once they say they're done.

Inputs: no named parameters.

read_rangeA
Read-only

Read one contiguous range (e.g. H60:J60). Each cell comes with sha256: to pass back as expected when writing. fills=true adds each cell's fill color (≤400 cells). hashOnly=true omits the text (just hash + length).

Inputs: file (required), range (required), sheet (required), fills, +1 more.

rename_sheetA
Destructive

Rename a worksheet (Excel name rules, no duplicate names). Formulas that refer to it follow the new name. Verified by listing the sheets afterwards.

Inputs: file (required), sheet (required), newName (required), send.

resolveB
Read-only

Workbook info: driveId/itemId, last modified (when/by whom), and every sheet with its used range.

Inputs: file (required).

set_fillA
Destructive

Set or clear the fill color of one or more contiguous ranges (non-contiguous rows = several ranges; sent in one batch). color "#FFFF00" etc., or null to clear. Verified by reading the fill back.

Inputs: file (required), sheet (required), ranges (required), send, +1 more.

set_formatA
Destructive

Format one or more contiguous ranges: bold, italic, fontColor (#RRGGBB), fontSize, wrapText, horizontalAlignment (General/Left/Center/Right/Justify), numberFormat (e.g. "yyyy-mm-dd", "0.00", "@" for text). Font changes are read back and verified. Fill colors: use set_fill.

Inputs: file (required), sheet (required), ranges (required), bold, +7 more.

write_valuesA
Destructive

Write blocks of cell values. Each block is one contiguous range with a 2D values array (a scalar for one cell). expected (same shape; exact text, sha256:, or null to skip a cell) is the base check: a block whose current content differs is skipped as a conflict, never half-written. After writing, every block is read back and compared (status written-verified / written-mismatch). Values are interpreted like typed input: text that looks like a number/date may be converted — mismatches report it.

Inputs: file (required), sheet (required), writes (required), send.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.7/5.0

    Scored across 12 tools

    Disambiguation4/5

    Most tools target a clear resource+action, and the descriptions explicitly separate overlapping areas (e.g. set_format says to use set_fill for colors). The main potential confusion is between write_values, append_update, and append_rows, but their descriptions make the boundaries reasonably clear.

    Naming Consistency4/5

    Nine of twelve tools follow a clear verb_noun pattern (read_range, write_values, add_sheet, insert_rows, set_format, etc.). The outliers are single verbs (resolve, find) and a noun phrase (login_status), which are minor deviations but still readable.

    Tool Count5/5

    Twelve tools is well-scoped for an Excel workbook server, covering authentication, discovery, read/write, search, sheet management, rows, fills, and formatting. Each tool earns its place without obvious redundancy.

    Completeness3/5

    The surface covers reading, writing, appending, searching, adding/renaming sheets, inserting/appending rows, fills, and formatting. However, there are notable lifecycle gaps: no delete_sheet, delete_rows, or clear-range operation, which are common spreadsheet tasks and hard to work around with the current tools.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      C
      maintenance
      Enables managing Excel files in Microsoft 365 (OneDrive/SharePoint) through Microsoft Graph API, including creating workbooks, adding worksheets, creating tables, and reading or adding table rows via MCP tools.
      6
      Apache 2.0
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI coding agents to edit real .xlsx workbooks in place through spreadsheet-native tools like describe, find, read, write, and structural edits, recalculating formulas without Excel, LibreOffice, or Python. Every change comes back as a review link showing changed cells before and after, and nothing is written until the user accepts, while charts, pivots, and VBA data return byte-identical.
      10
      Apache 2.0
    • A
      license
      A
      quality
      B
      maintenance
      Enables building, editing, reading and converting spreadsheets through file-in/file-out tools, including live formulas, tables, conditional formatting, charts and PivotTables. Supports xlsx, csv, tsv, json, html and pdf input and output on Windows, macOS and Linux.
      9
      Apache 2.0