MCP谷歌表格服务器
](https://www.npmjs.com/package/mcp-gsheets)
用于Google Sheets API集成的模型上下文协议(MCP)服务器。允许直接从MCP客户端(例如,Claude Code、Claude Desktop、Cursor等)读取、写入和管理Google表格文档。
主要特点
- 完成Google表格集成:读取、编写和管理电子表格
- 高级操作:批处理操作、格式化、图表和条件格式化
- 灵活的身份验证:支持基于文件和JSON字符串凭据
- 生产就绪:使用TypeScript构建,全面的错误处理和完整的测试覆盖率
需求
- v20或更高
- 谷歌云项目 启用了图纸API
- 带有JSON密钥文件的服务帐户
入门指南
快速安装(推荐)
将以下配置添加到MCP客户端:
{
"mcpServers": {
"mcp-gsheets": {
"command": "npx",
"args": ["-y", "mcp-gsheets@latest"],
"env": {
"GOOGLE_PROJECT_ID": "your-project-id",
"GOOGLE_APPLICATION_CREDENTIALS": "/absolute/path/to/service-account-key.json"
}
}
}
}\[!注意\] 使用 mcp-gsheets@latest 确保您的MCP客户端始终使用最新版本的MCP Google Sheets服务器。MCP客户端配置
Claude Code Use the Claude Code CLI to add the MCP Google Sheets server (guide):
claude mcp add mcp-gsheets npx mcp-gsheets@latest添加后,编辑您的Claude Code配置以添加所需的环境变量:
{
"mcpServers": {
"mcp-gsheets": {
"command": "npx",
"args": ["mcp-gsheets@latest"],
"env": {
"GOOGLE_PROJECT_ID": "your-project-id",
"GOOGLE_APPLICATION_CREDENTIALS": "/absolute/path/to/service-account-key.json"
}
}
}
}Claude Desktop
添加到您的Claude Desktop配置中:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - 窗户:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/claude/claude_desktop_config.json
{
"mcpServers": {
"mcp-gsheets": {
"command": "npx",
"args": ["-y", "mcp-gsheets@latest"],
"env": {
"GOOGLE_PROJECT_ID": "your-project-id",
"GOOGLE_APPLICATION_CREDENTIALS": "/absolute/path/to/service-account-key.json"
}
}
}
}Cursor
首选 Cursor Settings → MCP → New MCP Server.使用上面提供的配置。
Cline
跟随https://docs.cline.bot/mcp/configuring-mcp-servers并使用上面提供的配置。
Other MCP Clients
对于其他MCP客户端,请使用上面显示的标准配置格式。确保 command 设置为 npx 并包括用于Google Cloud身份验证的环境变量。
谷歌云设置
- 首选 谷歌云控制台
- 创建新项目或选择现有项目
- 启用Google Sheets API:
- 导航到“API和服务”→ “图书馆” - 搜索“Google Sheets API”并单击“启用”
- 创建服务帐户:
- 转到“API和服务”→ “凭据” - 点击“创建凭据”→ “服务帐户” - 在服务帐户列表中,单击 Actions 列→ Manage keys → Add key → Create new key → 选择JSON格式 - 下载JSON密钥文件
- 分享您的电子表格:
- 打开你的谷歌表格 - 单击共享并添加服务帐户电子邮件(来自JSON文件) - 授予“编辑”权限
替代身份验证方法
选项1:JSON字符串身份验证
您可以直接以JSON字符串的形式提供服务帐户凭据,而不是使用凭据的文件路径。这对于容器化环境、CI/CD管道或希望避免管理凭据文件时非常有用。
{
"mcpServers": {
"mcp-gsheets": {
"command": "npx",
"args": ["-y", "mcp-gsheets@latest"],
"env": {
"GOOGLE_PROJECT_ID": "your-project-id",
"GOOGLE_SERVICE_ACCOUNT_KEY": "{\"type\":\"service_account\",\"project_id\":\"your-project\",\"private_key_id\":\"...\",\"private_key\":\"-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----\\n\",\"client_email\":\"...@....iam.gserviceaccount.com\",\"client_id\":\"...\",\"auth_uri\":\"https://accounts.google.com/o/oauth2/auth\",\"token_uri\":\"https://oauth2.googleapis.com/token\",\"auth_provider_x509_cert_url\":\"https://www.googleapis.com/oauth2/v1/certs\",\"client_x509_cert_url\":\"...\"}"
}
}
}
}备注:使用时 GOOGLE_SERVICE_ACCOUNT_KEY:
- 整个JSON必须在一行上
- 所有引号必须用反斜杠转义
- 私钥中的新行必须表示为
\\n - 如果JSON包含
project_id,您可以省略GOOGLE_PROJECT_ID
选项2:私钥身份验证(简化)
对于最用户友好的方法,您可以直接提供私钥和电子邮件。这是最简单的方法,只需要您的服务帐户JSON中的两个字段:
{
"mcpServers": {
"mcp-gsheets": {
"command": "npx",
"args": ["-y", "mcp-gsheets@latest"],
"env": {
"GOOGLE_PRIVATE_KEY": "-----BEGIN PRIVATE KEY-----\\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCgR6bvMNOUHZ29\\n+YgbVHAXsT/s+L/jnXTCB193zikCzspSBSfxLu8VRDjkNq9WUoDxizTATzMFNvNf\\n...\\n-----END PRIVATE KEY-----\\n",
"GOOGLE_CLIENT_EMAIL": "spreadsheet@your-project.iam.gserviceaccount.com"
}
}
}
}备注:使用时 GOOGLE_PRIVATE_KEY:
- 私钥中的新行应表示为
\\n - 私钥必须包含
-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----标记物 - 客户端电子邮件应该是JSON文件中的服务帐户电子邮件
GOOGLE_PROJECT_ID使用此方法时是可选的
地方发展设置
如果你想开发或参与这个项目,你可以克隆并在本地构建它:
# Clone the repository
git clone https://github.com/freema/mcp-gsheets.git
cd mcp-gsheets
# Install dependencies
npm install
# Build the project
npm run build交互式设置脚本
运行交互式安装脚本以配置本地MCP客户端:
npm run setup这将:
- 指导您完成配置
- 自动检测您的Node.js安装(包括nvm)
- 查找您的Claude桌面配置
- 创建正确的JSON配置
- 可选择创建.env文件进行开发
手动本地配置
如果您更喜欢使用本地构建进行手动配置,请在MCP客户端配置中添加:
{
"mcpServers": {
"mcp-gsheets": {
"command": "node",
"args": ["/absolute/path/to/mcp-gsheets/dist/index.js"],
"env": {
"GOOGLE_PROJECT_ID": "your-project-id",
"GOOGLE_APPLICATION_CREDENTIALS": "/absolute/path/to/service-account-key.json"
}
}
}
}📦 构建与开发
开发命令
# Development mode with hot reload
npm run dev
# Build for production
npm run build
# Type checking
npm run typecheck
# Clean build artifacts
npm run clean
# Run MCP inspector for debugging
npm run inspector
# Run MCP inspector in development mode
npm run inspector:dev任务运行器(备选)
如果你有 任务 安装:
# Install dependencies
task install
# Build the project
task build
# Run in development mode
task dev
# Run linter
task lint
# Format code
task fmt
# Run all checks
task check开发设置
- 创建
.env测试文件:
cp .env.example .env
# Edit .env with your credentials:
# GOOGLE_PROJECT_ID=your-project-id
# GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
# TEST_SPREADSHEET_ID=your-test-spreadsheet-id- 在开发模式下运行:
npm run dev # Watch mode with auto-reload📋 可用工具
读取数据
| 工具 | 说明 | 关键参数 |
|---|---|---|
sheets_get_values | 从单个范围读取单元格值 | spreadsheetId, range (A1符号), valueRenderOption |
sheets_batch_get_values | 在一个请求中从多个范围读取单元格值 | spreadsheetId, ranges (A1范围数组) |
sheets_get_metadata | 获取电子表格元数据:标题、区域设置、带ID的工作表列表、行/列计数 | spreadsheetId |
sheets_check_access | 验证服务帐户是否可以访问电子表格 | spreadsheetId |
写入数据
| 工具 | 说明 | 关键参数 |
|---|---|---|
sheets_update_values | 将值写入单个范围(覆盖现有内容) | spreadsheetId, range, values (2D阵列), valueInputOption |
sheets_batch_update_values | 在一个请求中将值写入多个范围 | spreadsheetId, data (数组 {range, values}), valueInputOption |
sheets_append_values | 在现有表的最后一行之后追加行。 默认 insertDataOption 是 OVERWRITE --set INSERT_ROWS 将现有行向下推 | spreadsheetId, range, values, valueInputOption, insertDataOption |
sheets_clear_values | 清除范围内的所有值(保留格式) | spreadsheetId, range |
sheets_insert_rows | 在特定位置插入空白或预填行 | spreadsheetId, range (锚), rows, position (之前/之后), values |
sheets_delete_columns | 使用完整的A1列范围删除一个或多个列 | spreadsheetId, range (例如。 Sheet1!B:D) |
sheets_delete_rows | 使用完整的A1行范围删除一行或多行 | spreadsheetId, range (例如。 Sheet1!2:4) |
sheets_insert_link | 在单元格中插入超链接公式 | spreadsheetId, range, url, label |
sheets_insert_date | 将格式正确的日期/日期时间值插入单元格 | spreadsheetId, range, date, format |
表单管理
| 工具 | 说明 | 关键参数 |
|---|---|---|
sheets_create_spreadsheet | 创建新的Google表格文件 | title, sheets (可选初始表单配置) |
sheets_insert_sheet | 将新的工作表选项卡添加到现有电子表格中 | spreadsheetId, title, index |
sheets_delete_sheet | 按数字工作表ID删除工作表选项卡 | spreadsheetId, sheetId |
sheets_duplicate_sheet | 复制同一电子表格中的工作表 | spreadsheetId, sheetId, newSheetName, insertSheetIndex |
sheets_copy_to | 将工作表复制到其他电子表格 | spreadsheetId, sheetId, destinationSpreadsheetId |
sheets_update_sheet_properties | 重命名图纸、更改选项卡颜色、切换网格线等。 | spreadsheetId, sheetId, properties |
sheets_batch_delete_sheets | 在一个请求中删除多个工作表选项卡 | spreadsheetId, sheetIds (数组) |
单元格格式
| 工具 | 说明 | 关键参数 |
|---|---|---|
sheets_format_cells | 将背景颜色、字体样式、对齐方式和数字格式应用于某个范围 | spreadsheetId, range, format |
sheets_batch_format_cells | 在一个请求中将不同格式应用于多个范围 | spreadsheetId, requests (数组 {range, format}) |
sheets_update_borders | 设置或删除范围上的边框(样式、宽度、每边颜色) | spreadsheetId, range, borders |
sheets_merge_cells | 合并一系列单元格 | spreadsheetId, range, mergeType (合并所有/合并列/合并行) |
sheets_unmerge_cells | 取消合并某个区域中以前合并的单元格 | spreadsheetId, range |
sheets_add_conditional_formatting | 向范围添加条件格式规则(渐变或布尔值) | spreadsheetId, range, rule |
图表
| 工具 | 说明 | 关键参数 |
|---|---|---|
sheets_create_chart | 在工作表上创建条形图、折线图、饼图、柱状图或其他图表 | spreadsheetId, sheetId, chartSpec, position |
sheets_update_chart | 修改现有图表的规格或位置 | spreadsheetId, chartId, chartSpec, position |
sheets_delete_chart | 从电子表格中删除图表 | spreadsheetId, chartId |
读取/快照工具
| 工具 | 说明 | 关键参数 |
|---|---|---|
sheets_get_merged_cells | 返回工作表的所有合并单元格区域,使用A1表示法和原始GridRange坐标 | spreadsheetId, sheetName |
sheets_get_sheet_dimensions | 返回每列和每行的列宽、行高、冻结列/行计数和隐藏标志 | spreadsheetId, sheetName |
sheets_get_sheet_formatting | 读取范围的原始单元格格式(背景颜色、字体、边框、对齐方式、数字格式),而不返回单元格值 | spreadsheetId, range |
sheets_get_conditional_formatting | 阅读工作表上定义的所有条件格式规则和带状(交替颜色)范围 | spreadsheetId, sheetName |
sheets_get_sheet_structure | 仅轻量级结构元数据——没有每个单元格的数据。返回A1表示法中的维度、冻结行/列、选项卡颜色、列宽、行高、隐藏列/行以及所有合并。单个快速API调用 | spreadsheetId, sheetName |
sheets_get_formatting_compact | 读取范围的单元格格式,并将其作为紧凑的A1Range返回→格式对(行程编码)。相同的相邻单元格被折叠成矩形范围,与每个单元格的数据相比,输出减少了90%+ | spreadsheetId, sheetName, range, useEffectiveFormat, fields |
sheets_get_full_sheet_snapshot | 主一次性工具-在单个API调用中返回所有结构和格式元数据(合并、维度、条件格式,以及可选的单元格格式)。支持 fields 过滤和 compactMode 限制响应大小 | spreadsheetId, sheetName, includeFormattingRange, fields, compactMode |
sheets_get_basic_filter | 阅读工作表的基本过滤器(自动过滤器)配置,包括过滤范围、排序规范和每列过滤条件(隐藏值、条件、滤色器) | spreadsheetId, sheetName |
sheets_get_data_validation | 从工作表或范围中读取数据验证规则(复选框、下拉菜单、自定义公式)。返回按单元格范围分组的唯一规则的紧凑游程编码列表 | spreadsheetId, sheetName, range |
🔧 代码质量
代码检查
# Run ESLint
npm run lint
# Fix auto-fixable issues
npm run lint:fix格式化
# Check formatting with Prettier
npm run format:check
# Format code
npm run format类型检查
# Run TypeScript type checking
npm run typecheck❗ 故障排除
常见问题
“身份验证失败”
- 如果使用基于文件的身份验证:验证JSON密钥路径是否绝对正确
- 如果使用JSON字符串认证:确保JSON正确转义且有效
- 如果使用私钥auth:检查私钥是否包含BEGIN/END标记,换行符是否转义为
\\n - 验证GOOGLE_CLIENT_EMAIL是有效的服务帐户电子邮件
- 检查GOOGLE_PROJECT_ID是否与您的项目匹配(或是否包含在JSON中以进行完整的JSON身份验证)
- 确保启用图纸API
“权限被拒绝”
- 与服务帐户电子邮件共享电子表格
- 服务帐户需要“编辑”角色
- 在JSON文件中检查电子邮件(client_email字段)
“找不到电子表格”
- 从URL验证电子表格ID
- 格式:
https://docs.google.com/spreadsheets/d/[SPREADSHEET_ID]/edit
MCP连接问题
- 确保您使用的是内置版本(
dist/index.js) - 检查Claude Desktop配置中的Node.js路径是否正确
- 在Claude Desktop日志中查找错误
- 使用
npm run inspector调试
🔍 查找ID
电子表格ID
从URL:
https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
↑ This is the spreadsheet ID工作表ID
使用 sheets_get_metadata 列出所有工作表及其ID。
📝 提示
- 始终使用数据副本进行测试
- 使用批处理操作以获得更好的性能
- 设置适当的权限(只读与编辑)
- 检查大型操作的速率限制
- 使用
sheets_check_access在操作之前验证权限
📘 工具详情
sheets _ sheet \_结构
返回不含任何单元格数据的图纸的轻量级结构/维度元数据。比前者更快、更便宜 sheets_get_full_sheet_snapshot 当您只需要布局信息时。
参数:
spreadsheetId(必填):电子表格的IDsheetName(必填):工作表名称(选项卡)
退货: sheetName, sheetId, sheetIndex, tabColor, tabColorStyle, dimensions (rowCount, columnCount), frozen (rowCount, columnCount), columnWidths (像素大小阵列), rowHeights (像素大小阵列), hiddenColumns (基于0的索引), hiddenRows (基于0的索引), mergeCount, merges (A1符号数组)
______________________________________________________________________
工作表_格式化_协议
读取范围的单元格格式,并将其作为紧凑的A1Range返回→ 格式对。具有相同格式的相邻单元格被折叠成矩形范围(行程编码),与每个单元格的数据相比,输出减少了90%+。
参数:
spreadsheetId(必填):电子表格的IDsheetName(必填):工作表名称(选项卡)range(必填):不带工作表前缀的范围,例如。"A1:Z85"useEffectiveFormat(可选):false(默认)=userEnteredFormat(仅显式覆盖,输出较小);true=有效格式(所有继承的默认值)fields(可选):要包含的格式字段名数组,例如。["backgroundColor", "textFormat", "borders"]
退货: { range, formatType, rangeCount, data: { "A1:C3": { backgroundColor: {...} }, ... } }
支持的字段: backgroundColor, backgroundColorStyle, textFormat, horizontalAlignment, verticalAlignment, wrapStrategy, textRotation, numberFormat, padding, borders
______________________________________________________________________
图纸_get_full_sheet_snapshot
在一个API调用中返回所有结构和格式元数据的主一次工具。
参数:
spreadsheetId(必填):电子表格的IDsheetName(必填):工作表名称(选项卡)includeFormattingRange(可选):如果提供(例如。"A1:Z100"),响应中包含每个单元格的格式useEffectiveFormat(可选):在包含单元格格式时,使用effectiveFormat而不是userEnteredFormat(默认值:false)fields(可选):要返回的格式字段名数组,例如。["backgroundColor", "textFormat"]-减少API传输大小和响应大小compactMode(可选):当true,相同的相邻单元格被折叠成矩形范围(RLE)。将典型的85×28纸张从约60000行减少到约500行(默认值:false)
______________________________________________________________________
sheets_insert_rows
在带有可选数据的电子表格中的特定位置插入新行。
参数:
spreadsheetId(必填):电子表格的IDrange(必填):插入行的A1符号锚点(例如“Sheet1!A5”)rows(可选):要插入的行数(默认值:1)position(可选):锚行的“BEFORE”或“AFTER”(默认值:“BEFORCE”)inheritFromBefore(可选):是否继承前一行的格式(默认值:false)values(可选):填充新插入行的二维值数组valueInputOption(可选):“RAW”或“USER_ENTERED”(默认值:“USER_ENTER”)
示例:
// Insert 1 empty row before row 5
{
"spreadsheetId": "your-spreadsheet-id",
"range": "Sheet1!A5"
}
// Insert 3 rows after row 10 with data
{
"spreadsheetId": "your-spreadsheet-id",
"range": "Sheet1!A10",
"rows": 3,
"position": "AFTER",
"values": [
["John", "Doe", "john@example.com"],
["Jane", "Smith", "jane@example.com"],
["Bob", "Johnson", "bob@example.com"]
]
}sheets_delete_columns
使用完整的A1列范围从工作表中删除一列或多列。
参数:
spreadsheetId(必填):电子表格的IDrange(必填):要删除的整个A1列范围(例如,“Sheet1!B:D”或“Sheet1?C:C”)
示例:
// Delete columns B through D from Sheet1
{
"spreadsheetId": "your-spreadsheet-id",
"range": "Sheet1!B:D"
}
// Delete a single column from the first sheet
{
"spreadsheetId": "your-spreadsheet-id",
"range": "C:C"
}sheets_delete_rows
使用完整的A1行范围从工作表中删除一行或多行。
参数:
spreadsheetId(必填):电子表格的IDrange(必填):要删除的完整A1行范围(例如,“Sheet1!2:4”或“Sheet1?3:3”)
示例:
// Delete rows 2 through 4 from Sheet1
{
"spreadsheetId": "your-spreadsheet-id",
"range": "Sheet1!2:4"
}
// Delete a single row from the first sheet
{
"spreadsheetId": "your-spreadsheet-id",
"range": "3:3"
}📋 更新日志
看 更改日志.md 查看每个版本的更改列表。
🤝 贡献
- 分叉存储库
- 创建功能分支(
git checkout -b feature/amazing-feature) - 运行测试和梳理(
npm run check) - 提交您的更改(
git commit -m 'Add some amazing feature') - 推到分支(
git push origin feature/amazing-feature) - 打开拉取请求
👤 作者
托马斯 格拉斯尔 - 托马斯格拉斯
📄 许可证
此项目根据MIT许可证获得许可-请参阅 许可证 文件以获取详细信息。
