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 分