Mcp Server Spreadsheet

io.github.marekrost由 GitHub 帳號 marekrost 發布v0.3.3更新於 Oct 25, 2026

MCP server for spreadsheet files (.xlsx, .csv, .ods) - cell-level ops + DuckDB SQL engine.

已驗證STDIO僅桌面檔案與儲存資料與分析

概覽

AI 產生的概覽

本機 MCP 伺服器,用來讀寫 Excel、CSV 與 ODS 試算表,提供儲存格層級工具與 DuckDB SQL 引擎。

可以做什麼
列出、建立與複製活頁簿檔案,並列出、新增、重新命名、刪除或複製工作表(CSV 視為名為 default 的單一工作表)。讀取整張工作表、單一儲存格、範圍與已使用範圍尺寸。寫入儲存格、範圍與附加列;插入、刪除、清除與複製列、欄及範圍。依值或正規表示式搜尋工作表。檢視資料表結構並執行唯讀 SQL SELECT(含跨表 JOIN 與彙總),或執行 INSERT、UPDATE、DELETE 並寫回檔案。
適用情境
適合讓助理在本機檢視或修改試算表資料,例如彙整 CSV、調整 Excel 活頁簿結構,或用 SQL 查詢多張工作表而不必逐格讀取。
執行需求
以 PyPI 套件 mcp-server-spreadsheet 透過 uvx 在本機 stdio 執行,或以 uv 從原始碼執行;需要 Python 3.10 以上。無需驗證。可選設定 MCP_SPREADSHEET_ROOT 為絕對目錄,將所有路徑參數限制在該目錄內。
安裝前請注意
工具會寫入與刪除試算表資料,包括刪除列、欄、工作表以及 SQL 變更;原子儲存降低但不能消除誤改風險,建議保留備份。未設定 MCP_SPREADSHEET_ROOT 時,行程可存取的任意路徑都允許。保留原有格式但只讀寫值;ODS 公式不會保留。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Mcp Server Spreadsheet,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

mcp-server-spreadsheet

mcp-name: io.github.marekrost/mcp-server-spreadsheet

Data-first MCP server for reading and writing spreadsheet files (.xlsx, .csv, .ods).

Key features

  • Multi-format — works with Excel (.xlsx), CSV (.csv), and OpenDocument (.ods) files through a unified tool interface.
  • Dual mode — cell-level workbook operations and a DuckDB-powered SQL query engine, interleaved freely on the same file.
  • Workbook essentials — worksheets, rows, columns, cells, search.
  • Data-only — preserves existing formatting but only reads and writes values.
  • Stateless — every call specifies file and sheet explicitly; no handles or sessions.
  • Atomic saves — writes go to a temp file, then os.replace() into the target path.
  • Type coercion on write — numeric strings become numbers, everything else is text.
  • SQL across sheets — JOINs, GROUP BY, aggregates, subqueries via in-memory DuckDB; mutations write back to the file.
  • CSV as single-sheet workbook — CSV files are treated as a workbook with one sheet named default.

Requirements

  • Python 3.10+

Installation

From PyPI (recommended)

No local checkout needed — just configure your MCP client (see below).

From source (for development)

bash
git clone https://github.com/marekrost/mcp-server-spreadsheet.gitcd mcp-server-spreadsheetuv sync

Usage

Claude Desktop

Add to your claude_desktop_config.json:

Using PyPI (recommended):

json
{  "mcpServers": {    "mcp-server-spreadsheet": {      "command": "uvx",      "args": ["mcp-server-spreadsheet"]    }  }}

Using local source:

json
{  "mcpServers": {    "mcp-server-spreadsheet": {      "command": "uv",      "args": ["run", "--directory", "/path/to/mcp-server-spreadsheet", "main.py"]    }  }}

Claude Code

Add to your .mcp.json:

Using PyPI (recommended):

json
{  "mcpServers": {    "mcp-server-spreadsheet": {      "command": "uvx",      "args": ["mcp-server-spreadsheet"]    }  }}

Using local source:

json
{  "mcpServers": {    "mcp-server-spreadsheet": {      "command": "uv",      "args": ["run", "--directory", "/path/to/mcp-server-spreadsheet", "main.py"]    }  }}

Standalone (stdio transport)

bash
# PyPIuvx mcp-server-spreadsheet
# Local sourceuv run main.py

Restricting file access to a directory (optional)

Set MCP_SPREADSHEET_ROOT to confine all path arguments to a single directory tree. Paths outside it are rejected with a clear error returned to the agent.

json
{  "mcpServers": {    "mcp-server-spreadsheet": {      "command": "uvx",      "args": ["mcp-server-spreadsheet"],      "env": { "MCP_SPREADSHEET_ROOT": "/home/me/spreadsheets" }    }  }}

Unset (the default), any path the server process can access is allowed.

Format notes

FormatSheetsFormulasTypes
.xlsxMultiplePreserved as stringsNative (int, float, date, bool)
.odsMultipleNot preservedNative (int, float, date, bool)
.csvSingle (default)N/AInferred on load (int, float, text)

Sheet management tools (add_sheet, delete_sheet, copy_sheet) raise an error for CSV files.

Tools

Workbook Operations

ToolDescription
list_workbooksList all spreadsheet files in a directory (non-recursive)
create_workbook_fileCreate a new empty spreadsheet file (format by extension)
copy_workbookCopy an existing file to a new path

Sheet Operations

ToolDescription
list_sheetsList all sheet names in a workbook
add_sheetAdd a new sheet (optional name and position)
rename_sheetRename an existing sheet
delete_sheetDelete a sheet by name
copy_sheetDuplicate a sheet within a workbook (optional new name and position)

Reading Data

ToolDescription
read_sheetRead entire sheet as rows (optional row/column bounds)
read_cellRead a single cell value, e.g. B3
read_rangeRead a rectangular range, e.g. A1:D10
get_sheet_dimensionsGet row and column count of the used range

Writing Data

ToolDescription
write_cellWrite a value to a single cell
write_rangeWrite a 2D array starting at a given cell
append_rowsAppend rows after the last used row
insert_rowsInsert blank or pre-filled rows at a position (shifts rows down)
delete_rowsDelete rows by index (shifts rows up)
clear_rangeClear values in a range without removing rows/columns
copy_rangeCopy a block of cells to another location (optionally to a different sheet)

Column Operations

ToolDescription
insert_columnsInsert blank columns at a position
delete_columnsDelete columns by index

Search

ToolDescription
search_sheetSearch for a value or regex pattern, returns matching cell references

Table Mode (SQL)

ToolDescription
describe_tableInspect column names, inferred types, row count, and sample values
sql_queryExecute a read-only SQL SELECT (supports JOINs across sheets, GROUP BY, aggregates, subqueries)
sql_executeExecute INSERT INTO, UPDATE, or DELETE FROM — writes changes back to the file

SQL examples:

sql
-- Filter and sortSELECT name, revenue FROM Sales WHERE status = 'Active' ORDER BY revenue DESC LIMIT 20
-- Cross-sheet JOINSELECT o.order_id, c.name FROM Orders o JOIN Customers c ON o.customer_id = c.id
-- AggregateSELECT department, COUNT(*) AS n, AVG(salary) AS avg FROM Employees GROUP BY department
-- MutateUPDATE Sales SET status = 'Closed' WHERE quarter = 'Q1' AND revenue < 1000DELETE FROM Logs WHERE date < '2024-01-01'

Sheet names with spaces must be quoted: SELECT * FROM "Q1 Sales".

Sheets whose table doesn't start at row 1

All three SQL tools accept header_row and data_start_row. Each can be an int (applied to every sheet) or a {sheet_name: row} mapping (sheets not listed fall back to the default). Use header_row when column titles live below row 1, and data_start_row when extra rows (e.g. a units row) sit between the header and the data.

python
# Header on row 3, data follows immediatelysql_query(file, 'SELECT * FROM "People"', header_row=3)
# Mixed workbook: People headers at row 3, Orders header at row 1 with a# units row at row 2.sql_query(    file,    'SELECT * FROM "Orders" o JOIN "People" p ON o.name = p.name',    header_row={"People": 3, "Orders": 1},    data_start_row={"Orders": 3},)

sql_execute preserves rows above header_row when writing changes back.

Running tests

bash
uv sync --group devuv run pytest

Every tool is exercised against .xlsx, .csv, and .ods fixtures generated into a temp directory.

Common Parameters

Every sheet-level tool accepts:

ParameterRequiredDescription
fileyesPath to the spreadsheet file (.xlsx, .csv, or .ods)
sheetnoSheet name. Defaults to the first sheet in the workbook

All row/column indices are 1-based. Cell references use A1 notation (A1, $B$2).

來源:README.md,提交 13e9e25

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.3.3最新Sep 16, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分