MCP Google Sheets Server
<a href="https://glama.ai/mcp/servers/@freema/mcp-gsheets"> <img width="380" height="200" src="https://glama.ai/mcp/servers/@freema/mcp-gsheets/badge" /> </a>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
Requirements
- Node.js v20 or higher
- Google Cloud Project with Sheets API enabled
- Service Account with JSON key file
- npm
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"
}
}
}
}[!NOTE] Using
mcp-gsheets@latestensures that your MCP client will always use the latest version of the MCP Google Sheets server.
MCP Client Configuration
<details> <summary>Claude Code</summary> Use the Claude Code CLI to add the MCP Google Sheets server (<a href="https://docs.anthropic.com/en/docs/claude-code/mcp">guide</a>):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.json - Windows:
%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"
}
}
}
}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.
</details> <details> <summary>Other MCP Clients</summary>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 format - Download 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
\\n - If 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
\\n - The private key must include the
-----BEGIN PRIVATE KEY-----and-----END PRIVATE KEY-----markers - The 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-id- Run in development mode:
npm run dev # Watch mode with auto-reload📋 Available Tools
Reading Data
| Tool | Description | Key Parameters |
|---|---|---|
sheets_get_values | Read cell values from a single range | spreadsheetId, range (A1 notation), valueRenderOption |
sheets_batch_get_values | Read cell values from multiple ranges in one request | spreadsheetId, ranges (array of A1 ranges) |
sheets_get_metadata | Get spreadsheet metadata: title, locale, sheets list with IDs, row/column counts | spreadsheetId |
sheets_check_access | Verify that the service account can access a spreadsheet | spreadsheetId |
Writing Data
| Tool | Description | Key Parameters |
|---|---|---|
sheets_update_values | Write values to a single range (overwrites existing content) | spreadsheetId, range, values (2D array), valueInputOption |
sheets_batch_update_values | Write values to multiple ranges in one request | spreadsheetId, data (array of {range, values}), valueInputOption |
sheets_append_values | Append rows after the last row of an existing table. Default insertDataOption is OVERWRITE — set INSERT_ROWS to push existing rows down | spreadsheetId, range, values, valueInputOption, insertDataOption |
sheets_clear_values | Clear all values in a range (preserves formatting) | spreadsheetId, range |
sheets_insert_rows | Insert blank or pre-filled rows at a specific position | spreadsheetId, range (anchor), rows, position (BEFORE/AFTER), values |
sheets_delete_columns | Delete one or more columns using a full-column A1 range | spreadsheetId, range (e.g. Sheet1!B:D) |
sheets_delete_rows | Delete one or more rows using a full-row A1 range | spreadsheetId, range (e.g. Sheet1!2:4) |
sheets_insert_link | Insert a hyperlink formula into a cell | spreadsheetId, range, url, label |
sheets_insert_date | Insert a date/datetime value formatted correctly into a cell | spreadsheetId, range, date, format |
Sheet Management
| Tool | Description | Key Parameters |
|---|---|---|
sheets_create_spreadsheet | Create a new Google Sheets file | title, sheets (optional initial sheet configs) |
sheets_insert_sheet | Add a new sheet tab to an existing spreadsheet | spreadsheetId, title, index |
sheets_delete_sheet | Remove a sheet tab by its numeric sheet ID | spreadsheetId, sheetId |
sheets_duplicate_sheet | Copy a sheet within the same spreadsheet | spreadsheetId, sheetId, newSheetName, insertSheetIndex |
sheets_copy_to | Copy a sheet to a different spreadsheet | spreadsheetId, sheetId, destinationSpreadsheetId |
sheets_update_sheet_properties | Rename a sheet, change tab colour, toggle grid lines, etc. | spreadsheetId, sheetId, properties |
| `sheets_ |
…