mcp-gsheets
mcp-gsheets is an MCP server that lets AI clients read, write, format, and manage Google Sheets through a broad set of Google Sheets API tools.
Read cell values from one or many ranges, plus spreadsheet metadata, access checks, merged cells, dimensions, structure, formatting, conditional formatting, data validation, filters, border maps, and native tables.
Write/update/append/clear values, insert rows with optional data, delete rows/columns, and insert links or dates.
Create and manage spreadsheets and sheets: create, insert, delete, duplicate, copy to another spreadsheet, rename/update properties, and batch delete sheets.
Format cells and ranges: colors, fonts, alignment, number formats, borders, merge/unmerge, batch formatting, and conditional formatting rules.
Create, update, and delete charts; add, update, delete, and read native Google Sheets tables.
Compare ranges and capture full-sheet snapshots or compact formatting/structure data for efficient inspection.
Support flexible authentication, toolsets to reduce context cost, read-only mode, and MCP annotations for safer client behavior.
Integrates with Google Cloud for authentication and project configuration, allowing access to Google Cloud resources using service account credentials.
Enables reading, writing, and managing Google Sheets documents through a comprehensive set of tools including reading cell values, batch operations, appending rows, clearing cells, sheet management, and cell formatting capabilities.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-gsheets get the sales data from sheet Q1-2024"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Google Sheets Server
A Model Context Protocol (MCP) server for Google Sheets API integration. Enables reading, writing, and managing Google Sheets documents directly from your MCP client (e.g., Claude Code, Claude Desktop, Cursor, etc.).
Key Features
Complete Google Sheets Integration: Read, write, and manage spreadsheets
Advanced Operations: Batch operations, formatting, charts, and conditional formatting
Flexible Authentication: Support for both file-based and JSON string credentials
Production Ready: Built with TypeScript, comprehensive error handling, and full test coverage
Related MCP server: gsheets-mcp
Requirements
Node.js v22 or higher
Google Cloud Project with Sheets API enabled
Service Account with JSON key file
Getting Started
Quick Install (Recommended)
Add the following config to your MCP client:
{
"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"
}
}
}
}Usingmcp-gsheets@latest ensures that your MCP client will always use the latest version of the MCP Google Sheets server.
MCP Client Configuration
claude mcp add mcp-gsheets npx mcp-gsheets@latestAfter adding, edit your Claude Code config to add the required environment variables:
{
"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"
}
}
}
}Add to your Claude Desktop config:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.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"
}
}
}
}Go to Cursor Settings → MCP → New MCP Server. Use the config provided above.
Follow https://docs.cline.bot/mcp/configuring-mcp-servers and use the config provided above.
For other MCP clients, use the standard configuration format shown above. Ensure the command is set to npx and include the environment variables for Google Cloud authentication.
Google Cloud Setup
Go to Google Cloud Console
Create a new project or select existing
Enable Google Sheets API:
Navigate to "APIs & Services" → "Library"
Search for "Google Sheets API" and click "Enable"
Create Service Account:
Go to "APIs & Services" → "Credentials"
Click "Create Credentials" → "Service Account"
In the service accounts list, click the three dots in the
Actionscolumn →Manage keys→Add key→Create new key→ select JSON formatDownload the JSON key file
Share your spreadsheets:
Open your Google Sheet
Click Share and add the service account email (from JSON file)
Grant "Editor" permissions
Alternative Authentication Methods
Option 1: JSON String Authentication
Instead of using a file path for credentials, you can provide the service account credentials directly as a JSON string. This is useful for containerized environments, CI/CD pipelines, or when you want to avoid managing credential files.
{
"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\":\"...\"}"
}
}
}
}Note: When using GOOGLE_SERVICE_ACCOUNT_KEY:
The entire JSON must be on a single line
All quotes must be escaped with backslashes
Newlines in the private key must be represented as
\\nIf the JSON includes a
project_id, you can omitGOOGLE_PROJECT_ID
Option 2: Private Key Authentication (Simplified)
For the most user-friendly approach, you can provide just the private key and email directly. This is the simplest method and requires only two fields from your service account 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"
}
}
}
}Note: When using GOOGLE_PRIVATE_KEY:
Newlines in the private key should be represented as
\\nThe private key must include the
-----BEGIN PRIVATE KEY-----and-----END PRIVATE KEY-----markersThe client email should be the service account email from your JSON file
GOOGLE_PROJECT_IDis optional when using this method
Local Development Setup
If you want to develop or contribute to this project, you can clone and build it locally:
# Clone the repository
git clone https://github.com/freema/mcp-gsheets.git
cd mcp-gsheets
# Install dependencies
npm install
# Build the project
npm run buildInteractive Setup Script
Run the interactive setup script to configure your local MCP client:
npm run setupThis will:
Guide you through the configuration
Automatically detect your Node.js installation (including nvm)
Find your Claude Desktop config
Create the proper JSON configuration
Optionally create a .env file for development
Manual Local Configuration
If you prefer manual configuration with a local build, add to your MCP client config:
{
"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"
}
}
}
}📦 Build & Development
Development Commands
# 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:devTask Runner (Alternative)
If you have Task installed:
# 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 checkDevelopment Setup
Create
.envfile for testing:
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-idRun in development mode:
npm run dev # Watch mode with auto-reload🎚️ Reducing context cost with toolsets
All 44 tools together cost about 9,900 tokens of context in every session,
before the model does anything. Most workflows need a fraction of that.
GSHEETS_TOOLSETS limits which tools the server exposes:
{
"mcpServers": {
"gsheets": {
"command": "npx",
"args": ["mcp-gsheets"],
"env": {
"GOOGLE_PROJECT_ID": "your-project-id",
"GOOGLE_APPLICATION_CREDENTIALS": "/path/to/key.json",
"GSHEETS_TOOLSETS": "core,charts"
}
}
}
}Toolset | Tools | What it covers |
| 11 | Read/write values, metadata, sheet structure, create spreadsheet |
| 9 | Sheet lifecycle, rows and columns |
| 15 | Colours, borders, merges, conditional rules, links, dates |
| 3 | Create, update, delete charts |
| 4 | Native tables |
| 2 | Full-sheet snapshot, range comparison |
Measured tools/list cost:
Configuration | Tools | ≈ Tokens |
unset (default, all toolsets) | 44 | 9,875 |
| 11 | 1,986 |
| 20 | 3,548 |
| 16 | 3,599 |
| 6 | 912 |
Notes:
The default is unchanged — leave
GSHEETS_TOOLSETSunset and you get every tool, exactly as before.coreis always included.GSHEETS_TOOLSETS=chartsmeans "charts as well as core", not "charts only" — without core the server cannot read a cell.A typo is a startup error, not a silently smaller tool list.
GSHEETS_READ_ONLY=truedrops every writing tool and can be combined withGSHEETS_TOOLSETS. It is enforced when a tool is called, not just when the list is built, so a client cannot write by naming a hidden tool.
All tools also carry MCP annotations (readOnlyHint, destructiveHint,
idempotentHint), so clients can skip confirmation prompts on reads and warn
before destructive operations.
📋 Available Tools
Reading Data
Tool | Description | Key Parameters |
| Read cell values from a single range |
|
| Read cell values from multiple ranges in one request |
|
| Get spreadsheet metadata: title, locale, sheets list with IDs, row/column counts |
|
| Verify that the service account can access a spreadsheet |
|
Writing Data
Tool | Description | Key Parameters |
| Write values to a single range (overwrites existing content) |
|
| Write values to multiple ranges in one request |
|
| Append rows after the last row of an existing table. Default |
|
| Clear all values in a range (preserves formatting) |
|
| Insert blank or pre-filled rows at a specific position |
|
| Delete one or more columns using a full-column A1 range |
|
| Delete one or more rows using a full-row A1 range |
|
| Insert a hyperlink formula into a cell |
|
| Insert a date/datetime value formatted correctly into a cell |
|
Sheet Management
Tool | Description | Key Parameters |
| Create a new Google Sheets file |
|
| Add a new sheet tab to an existing spreadsheet |
|
| Remove a sheet tab by its numeric sheet ID |
|
| Copy a sheet within the same spreadsheet |
|
| Copy a sheet to a different spreadsheet |
|
| Rename a sheet, change tab colour, toggle grid lines, etc. |
|
| Delete multiple sheet tabs in one request |
|
Cell Formatting
Tool | Description | Key Parameters |
| Apply background colour, font style, alignment and number format to a range |
|
| Apply different formats to multiple ranges in one request |
|
| Set or remove borders on a range (style, width, colour per side) |
|
| Merge a range of cells |
|
| Unmerge previously merged cells in a range |
|
| Add a conditional formatting rule (gradient or boolean) to a range |
|
Native Tables
Tool | Description | Key Parameters |
| Create a native Google Sheets table with typed columns and optional dropdown values |
|
| Update an existing native Google Sheets table by table ID using an explicit field mask |
|
| Delete a native Google Sheets table by table ID |
|
| Read native tables for a spreadsheet or a specific sheet |
|
Charts
Tool | Description | Key Parameters |
| Create a bar, line, pie, column or other chart on a sheet |
|
| Modify an existing chart's spec or position |
|
| Remove a chart from a spreadsheet |
|
Read / Snapshot Tools
Tool | Description | Key Parameters |
| Return all merged cell ranges for a sheet, with A1 notation and raw GridRange coordinates |
|
| Return column widths, row heights, frozen column/row counts, and hidden flags for every column and row |
|
| Read raw cell formatting (background colour, font, borders, alignment, number format) for a range without returning cell values |
|
| Read all conditional formatting rules and banded (alternating-colour) ranges defined on a sheet |
|
| Lightweight structural metadata only — no per-cell data. Returns dimensions, frozen rows/cols, tab colour, column widths, row heights, hidden columns/rows, and all merges in A1 notation. Single fast API call |
|
| Read cell formatting for a range and return it as compact A1Range→format pairs (run-length encoded). Identical adjacent cells are collapsed into rectangular ranges — reduces output by 90 %+ compared to per-cell data |
|
| Master one-shot tool — returns all structural and formatting metadata (merges, dimensions, conditional formatting, and optionally cell formatting) in a single API call. Supports |
|
| Read the Basic Filter (AutoFilter) configuration for a sheet, including filtered range, sort specs, and per-column filter criteria (hidden values, conditions, colour filters) |
|
| Read data validation rules (checkboxes, dropdowns, custom formulas) from a sheet or range. Returns compact run-length-encoded list of unique rules grouped by cell ranges |
|
🔧 Code Quality
Linting
# Run ESLint
npm run lint
# Fix auto-fixable issues
npm run lint:fixFormatting
# Check formatting with Prettier
npm run format:check
# Format code
npm run formatType Checking
# Run TypeScript type checking
npm run typecheck❗ Troubleshooting
Common Issues
"Authentication failed"
If using file-based auth: Verify JSON key path is absolute and correct
If using JSON string auth: Ensure JSON is properly escaped and valid
If using private key auth: Check that the private key includes BEGIN/END markers and newlines are escaped as
\\nVerify GOOGLE_CLIENT_EMAIL is a valid service account email
Check GOOGLE_PROJECT_ID matches your project (or is included in JSON for full JSON auth)
Ensure Sheets API is enabled
"Permission denied"
Share spreadsheet with service account email
Service account needs "Editor" role
Check email in JSON file (client_email field)
"Spreadsheet not found"
Verify spreadsheet ID from URL
Format:
https://docs.google.com/spreadsheets/d/[SPREADSHEET_ID]/edit
MCP Connection Issues
Ensure you're using the built version (
dist/index.js)Check that Node.js path is correct in Claude Desktop config
Look for errors in Claude Desktop logs
Use
npm run inspectorto debug
🔍 Finding IDs
Spreadsheet ID
From the URL:
https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit
↑ This is the spreadsheet IDSheet ID
Use sheets_get_metadata to list all sheets with their IDs.
📝 Tips
Always test with a copy of your data
Use batch operations for better performance
Set appropriate permissions (read-only vs edit)
Check rate limits for large operations
Use
sheets_check_accessto verify permissions before operations
📘 Tool Details
sheets_get_sheet_structure
Returns lightweight structural/dimensional metadata for a sheet without any per-cell data. Much faster and cheaper than sheets_get_full_sheet_snapshot when you only need layout information.
Parameters:
spreadsheetId(required): The ID of the spreadsheetsheetName(required): Name of the sheet (tab)
Returns: sheetName, sheetId, sheetIndex, tabColor, tabColorStyle, dimensions (rowCount, columnCount), frozen (rowCount, columnCount), columnWidths (array of pixel sizes), rowHeights (array of pixel sizes), hiddenColumns (0-based indices), hiddenRows (0-based indices), mergeCount, merges (A1 notation array)
sheets_get_formatting_compact
Read cell formatting for a range and return it as compact A1Range → format pairs. Adjacent cells with identical formatting are collapsed into rectangular ranges (run-length encoded), reducing output by 90 %+ compared to per-cell data.
Parameters:
spreadsheetId(required): The ID of the spreadsheetsheetName(required): Name of the sheet (tab)range(required): Range without sheet prefix, e.g."A1:Z85"useEffectiveFormat(optional):false(default) = userEnteredFormat (only explicit overrides, smaller output);true= effectiveFormat (all inherited defaults)fields(optional): Array of format field names to include, e.g.["backgroundColor", "textFormat", "borders"]
Returns: { range, formatType, rangeCount, data: { "A1:C3": { backgroundColor: {...} }, ... } }
Supported fields: backgroundColor, backgroundColorStyle, textFormat, horizontalAlignment, verticalAlignment, wrapStrategy, textRotation, numberFormat, padding, borders
sheets_get_full_sheet_snapshot
Master one-shot tool that returns all structural and formatting metadata in a single API call.
Parameters:
spreadsheetId(required): The ID of the spreadsheetsheetName(required): Name of the sheet (tab)includeFormattingRange(optional): If provided (e.g."A1:Z100"), per-cell formatting is included in the responseuseEffectiveFormat(optional): Use effectiveFormat instead of userEnteredFormat when including cell formatting (default:false)fields(optional): Array of format field names to return, e.g.["backgroundColor", "textFormat"]— reduces API transfer size and response sizecompactMode(optional): Whentrue, identical adjacent cells are collapsed into rectangular ranges (RLE). Reduces a typical 85×28 sheet from ~60 000 lines to ~500 lines (default:false)
sheets_insert_rows
Insert new rows at a specific position in a spreadsheet with optional data.
Parameters:
spreadsheetId(required): The ID of the spreadsheetrange(required): A1 notation anchor point where rows will be inserted (e.g., "Sheet1!A5")rows(optional): Number of rows to insert (default: 1)position(optional): 'BEFORE' or 'AFTER' the anchor row (default: 'BEFORE')inheritFromBefore(optional): Whether to inherit formatting from the row before (default: false)values(optional): 2D array of values to fill the newly inserted rowsvalueInputOption(optional): 'RAW' or 'USER_ENTERED' (default: 'USER_ENTERED')
Examples:
// 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
Delete one or more columns from a sheet using a full-column A1 range.
Parameters:
spreadsheetId(required): The ID of the spreadsheetrange(required): Full-column A1 range to delete (e.g., "Sheet1!B:D" or "Sheet1!C:C")
Examples:
// 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
Delete one or more rows from a sheet using a full-row A1 range.
Parameters:
spreadsheetId(required): The ID of the spreadsheetrange(required): Full-row A1 range to delete (e.g., "Sheet1!2:4" or "Sheet1!3:3")
Examples:
// 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"
}📋 Changelog
See CHANGELOG.md for a list of changes in each version.
🤝 Contributing
Fork the repository
Create your feature branch (
git checkout -b feature/amazing-feature)Run tests and linting (
npm run check)Commit your changes (
git commit -m 'Add some amazing feature')Push to the branch (
git push origin feature/amazing-feature)Open a Pull Request
👤 Author
Tomáš Grásl - tomasgrasl.cz
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
Available Tools
44 toolssheets_add_conditional_formattingCIdempotent
Add conditional formatting rules to a Google Sheet
Inputs: rules (required), spreadsheetId (required).
sheets_add_tableAIdempotent
Create a native Google Sheets table with typed columns and optional dropdown values
Inputs: name (required), range (required), columns (required), sheetName (required), +1 more.
sheets_append_valuesA
Append values to the end of a table in a Google Sheets spreadsheet. IMPORTANT: By default, this will OVERWRITE existing empty cells. To INSERT new rows instead, set insertDataOption to "INSERT_ROWS".
Inputs: range (required), values (required), spreadsheetId (required), insertDataOption, +1 more.
sheets_batch_delete_sheetsAIdempotent
Delete multiple sheets from a Google Sheets spreadsheet in a single operation
Inputs: sheetIds (required), spreadsheetId (required).
sheets_batch_format_cellsAIdempotent
Format multiple cell ranges in a Google Sheet in a single operation
Inputs: spreadsheetId (required), formatRequests (required).
sheets_batch_get_valuesARead-onlyIdempotent
Get values from multiple ranges in a Google Sheets spreadsheet
Inputs: ranges (required), spreadsheetId (required), majorDimension, valueRenderOption.
sheets_batch_update_valuesAIdempotent
Update values in multiple ranges of a Google Sheets spreadsheet
Inputs: data (required), spreadsheetId (required), valueInputOption.
sheets_check_accessARead-onlyIdempotent
Check access permissions for a spreadsheet. Returns information about what operations are allowed.
Inputs: spreadsheetId (required).
sheets_clear_valuesAIdempotent
Clear values in a specified range of a Google Sheets spreadsheet
Inputs: range (required), spreadsheetId (required).
sheets_compare_rangesARead-onlyIdempotent
Compare cell formatting between two ranges of identical dimensions. Useful for verifying repeated patterns, e.g. "do all data rows 6–85 have identical formatting?" or "is row 10 formatted identically to the template row 5?". Returns a diff listing only the cells and properties that differ between the two ranges. Cells are compared position-by-position; rangeA and rangeB must have the same number of rows and columns. Use fields to restrict comparison to specific format properties.
Inputs: rangeA (required), rangeB (required), spreadsheetId (required), fields, +1 more.
sheets_copy_toAIdempotent
Copy a sheet to another Google Sheets spreadsheet
Inputs: sheetId (required), spreadsheetId (required), destinationSpreadsheetId (required).
sheets_create_chartAIdempotent
Create a chart in a Google Sheets spreadsheet. Sheet names with spaces should be quoted in ranges (e.g., "My Sheet"!A1:B5). Position uses overlayPosition with anchorCell containing sheetId, rowIndex, and columnIndex.
Inputs: series (required), position (required), chartType (required), spreadsheetId (required), +9 more.
sheets_create_spreadsheetBIdempotent
Create a new Google Sheets spreadsheet
Inputs: title (required), sheets.
sheets_delete_chartAIdempotent
Delete a chart from a Google Sheets spreadsheet
Inputs: chartId (required), spreadsheetId (required).
sheets_delete_columnsAIdempotent
Delete one or more columns from a Google Sheet using a full-column A1 range
Inputs: range (required), spreadsheetId (required).
sheets_delete_rowsBIdempotent
Delete one or more rows from a Google Sheet using a full-row A1 range
Inputs: range (required), spreadsheetId (required).
sheets_delete_sheetBIdempotent
Delete a sheet from a Google Sheets spreadsheet
Inputs: sheetId (required), spreadsheetId (required).
sheets_delete_tableAIdempotent
Delete a native Google Sheets table by tableId
Inputs: tableId (required), spreadsheetId (required).
sheets_duplicate_sheetAIdempotent
Duplicate a sheet within a Google Sheets spreadsheet
Inputs: sheetId (required), spreadsheetId (required), newSheetName, insertSheetIndex.
sheets_format_cellsCIdempotent
Format cells in a Google Sheet (colors, fonts, alignment, number formats)
Inputs: range (required), format (required), spreadsheetId (required).
sheets_get_basic_filterARead-onlyIdempotent
Read the Basic Filter (AutoFilter) configuration for a sheet, including the filtered range, sort specs, and per-column filter criteria (hidden values, conditions, color filters). Returns hasBasicFilter: false if no filter is applied.
Inputs: sheetName (required), spreadsheetId (required).
sheets_get_border_mapARead-onlyIdempotent
Returns a visual tabular map of borders for a range. Instead of per-cell JSON with 4 separate border objects, returns compact grids showing which cells have top/bottom/left/right borders and their styles. Solves the ambiguity between "right border of cell N" vs "left border of cell N+1". Output: a horizontal-lines grid and a vertical-lines grid, each as a 2D array of line styles. Set includeStyle:true to include color and width details (larger output).
Inputs: range (required), spreadsheetId (required), includeStyle.
sheets_get_conditional_formattingARead-onlyIdempotent
Read conditional formatting rules and banded ranges (alternating row/column colors) for a sheet. CF formulas are normalized to English locale (semicolons → commas) by default. Each rule with a formula includes a "_formulaLocaleRaw" field with the original unmodified formula. Set normalizeFormulas:false to get raw formulas as returned by the API.
Inputs: sheetName (required), spreadsheetId (required), normalizeFormulas.
sheets_get_data_validationARead-onlyIdempotent
Read data validation rules (checkboxes, dropdown lists, custom formulas, etc.) from a sheet or range. Returns a compact list of unique validation rules grouped by their cell ranges (run-length encoded). Useful for discovering checkboxes (BOOLEAN), dropdown lists (ONE_OF_LIST / ONE_OF_RANGE), number constraints, and custom formula validations.
Inputs: sheetName (required), spreadsheetId (required), range.
sheets_get_formatting_compactARead-onlyIdempotent
Returns cell formatting for a range as compact A1Range→format pairs. Adjacent cells with identical formatting are collapsed into rectangular ranges (run-length encoded). Reduces output by 90%+ compared to per-cell formatting for typical sheets. Use instead of sheets_get_full_sheet_snapshot when you only need formatting data. Supported fields: backgroundColor, backgroundColorStyle, textFormat, horizontalAlignment, verticalAlignment, wrapStrategy, textRotation, numberFormat, padding, borders.
Inputs: range (required), sheetName (required), spreadsheetId (required), fields, +1 more.
sheets_get_full_sheet_snapshotARead-onlyIdempotent
One-shot tool: reads all structural and formatting metadata for a sheet in a single API call. Returns: sheet properties (frozen rows/cols, dimensions, tab color), merged cells, column widths, row heights, banded ranges, and optionally cell-level formatting for a specified range (includeFormattingRange). compactMode is OFF by default — full per-cell detail is returned unless compactMode:true is provided. When compactMode is ON, adjacent cells with identical formatting are collapsed into range descriptors (90%+ smaller output). Conditional formatting rules are included by default (includeConditionalFormatting:true); set to false to exclude them. CF formulas are normalized to English locale (commas). Use fields to limit which format properties are returned. Use this before programmatically recreating a sheet.
Inputs: sheetName (required), spreadsheetId (required), fields, compactMode, +3 more.
sheets_get_merged_cellsARead-onlyIdempotent
Get all merged cell ranges for a specific sheet. Returns each merge as A1 notation and GridRange coordinates.
Inputs: sheetName (required), spreadsheetId (required).
sheets_get_metadataBRead-onlyIdempotent
Get metadata about a Google Sheets spreadsheet including sheet names, IDs, and properties
Inputs: spreadsheetId (required).
sheets_get_sheet_dimensionsARead-onlyIdempotent
Get column widths (pixelSize), row heights (pixelSize), hidden columns/rows, and frozen row/column counts for a sheet.
Inputs: sheetName (required), spreadsheetId (required).
sheets_get_sheet_formattingARead-onlyIdempotent
Read cell formatting (background color, text color, font family, font size, bold, italic, horizontal/vertical alignment, wrapStrategy, textRotation, numberFormat) for a range. Returns a 2D array matching the requested range rows/columns. Set useEffectiveFormat=true to get the resolved/inherited format instead of the user-entered one.
Inputs: range (required), spreadsheetId (required), useEffectiveFormat.
sheets_get_sheet_structureARead-onlyIdempotent
Lightweight tool returning ONLY structural/dimensional metadata for a sheet — no per-cell data. Returns: sheet dimensions, frozen rows/cols, tab color, sheet index, column widths array, row heights array, hidden columns/rows, and all merge ranges in A1 notation. Use this instead of sheets_get_full_sheet_snapshot when per-cell formatting is not needed. Much faster and cheaper — single API call with minimal field mask.
Inputs: sheetName (required), spreadsheetId (required).
sheets_get_tablesBRead-onlyIdempotent
Read native Google Sheets tables for a spreadsheet or a specific sheet
Inputs: spreadsheetId (required), sheetName.
sheets_get_valuesBRead-onlyIdempotent
Get values from a specified range in a Google Sheets spreadsheet
Inputs: range (required), spreadsheetId (required), majorDimension, valueRenderOption.
sheets_insert_dateAIdempotent
Insert properly formatted dates in Google Sheets with locale support and automatic detection
Inputs: date (required), range (required), spreadsheetId (required), format, +2 more.
sheets_insert_linkBIdempotent
Insert clickable links in Google Sheets cells with custom display text
Inputs: url (required), range (required), spreadsheetId (required), text, +2 more.
sheets_insert_rowsCIdempotent
Insert new rows at a specific position with optional data
Inputs: range (required), spreadsheetId (required), rows, values, +3 more.
sheets_insert_sheetAIdempotent
Add a new sheet to an existing Google Sheets spreadsheet
Inputs: title (required), spreadsheetId (required), index, rowCount, +1 more.
sheets_merge_cellsBIdempotent
Merge cells in a Google Sheet
Inputs: range (required), mergeType (required), spreadsheetId (required).
sheets_unmerge_cellsCIdempotent
Unmerge cells in a Google Sheet
Inputs: range (required), spreadsheetId (required).
sheets_update_bordersCIdempotent
Update borders of cells in a Google Sheet
Inputs: range (required), borders (required), spreadsheetId (required).
sheets_update_chartAIdempotent
Update an existing chart in a Google Sheets spreadsheet
Inputs: chartId (required), spreadsheetId (required), title, legend, +9 more.
sheets_update_sheet_propertiesAIdempotent
Update properties of a sheet in a Google Sheets spreadsheet
Inputs: sheetId (required), spreadsheetId (required), title, tabColor, +1 more.
sheets_update_tableBIdempotent
Update an existing native Google Sheets table by tableId
Inputs: fields (required), tableId (required), spreadsheetId (required), name, +3 more.
sheets_update_valuesAIdempotent
Update values in a specified range of a Google Sheets spreadsheet. Examples:
Fixed range "A1:C3" - must provide exactly 3 rows
Flexible range "A1" - will expand to fit all provided rows
To update rows 42-74 (33 rows), use "A42" not "A42:E53" IMPORTANT: Empty rows in your data array still count as rows!
Inputs: range (required), values (required), spreadsheetId (required), valueInputOption.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 44 tools
The tool set has many getters (values, formatting, structure, snapshot, etc.) that could cause confusion, but each has a clearly distinct purpose with detailed descriptions (e.g., full snapshot vs. specific attribute getters). A few tools like get_sheet_formatting and get_formatting_compact overlap in scope, but their output formats differ enough to disambiguate.
All tools follow a consistent 'sheets_verb_noun' pattern with snake_case. Compound verbs like 'batch_get_values' and 'get_full_sheet_snapshot' are used uniformly. There are no camelCase or mixed conventions, making the naming highly predictable.
With 44 tools, this server far exceeds the typical well-scoped range (3-15) and the heavy threshold (25+). While the breadth covers many Google Sheets features, the granularity (e.g., separate getters for dimensions, borders, merges) makes the surface unwieldy and likely overwhelming for agents.
The server covers a wide range of operations: CRUD for values, sheets, tables, charts, formatting, merges, conditional formatting, and more. However, it lacks write operations for data validation and filters (only read), and does not include chart reading or some advanced features. These are minor gaps given the extensive coverage.
Maintenance
Related MCP Connectors
Google Search Console, GA4 and PageSpeed MCP server for Claude, ChatGPT and Cursor. Free, hosted.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Shared memory MCP server for Claude Code, Codex, Gemini CLI and Cursor. Cited, editable.
Hosted Airtable MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA comprehensive MCP server for Google Sheets integration with Claude, enabling spreadsheet discovery, data manipulation, and formatting through natural language commands and slash commands.19MIT
- AlicenseNot gradedqualityDmaintenanceA local MCP server that lets Claude read and write Google Sheets through the Google Sheets API v4, using OAuth2 authentication with your own Google account.23 npm3MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that lets Claude read, edit, and format Google Sheets in place, including cell updates, formula filling, row/column operations, and find & replace.633 npmMIT
- AlicenseNot gradedqualityBmaintenanceMCP server connecting Claude to Google Sheets, Docs, and Drive, enabling cell-level editing, formatting, chart creation, and file management through natural language.1,276 npmMIT