google-sheets-mcp
An MCP server that lets Claude read, edit, and format Google Sheets in place, including cell updates, formula filling, row/column operations, and find & replace.
README
Google Sheets MCP
An MCP server that lets Claude work with your Google Sheets in place — no more "here's a new spreadsheet" every time.
Read data, edit cells inline with natural language, append rows, insert/delete rows and columns, fill formulas, format cells, and find & replace — all against the sheet you already have open.
Runs two ways from one codebase:
- Local — a
.mcpbdesktop extension for Claude Desktop and local Cowork sessions. - Remote — a Cloudflare Worker you add as a custom connector, which also works in cloud Cowork sessions, claude.ai on the web, and mobile.
Built on the MCP TypeScript SDK v2
(2026-07-28 spec) and the Google Sheets API v4, with no Google SDK dependency — just
fetch and WebCrypto, so the same code runs on Node and in V8 isolates.
Tools
| Tool | What it does |
|---|---|
list_spreadsheets |
List/search your spreadsheets, most recent first |
get_spreadsheet_info |
Spreadsheet title, tabs, and grid sizes |
read_range |
Read values, raw values, or formulas from a range |
update_cells |
Overwrite a range in place (=-prefixed strings become formulas) |
append_rows |
Append rows after the last row of data |
clear_range |
Clear values (keeps formatting) |
fill_formula |
Fill one formula across a range with relative references adjusting |
insert_rows / insert_columns |
Insert blank rows/columns at a position |
delete_rows / delete_columns |
Delete entire rows/columns |
add_sheet / delete_sheet |
Manage tabs |
format_cells |
Bold, colors, alignment, wrap, number formats |
find_replace |
Find & replace across a sheet or the whole file |
batch_update |
Raw Sheets API batchUpdate escape hatch (charts, merges, validation, …) |
Spreadsheet IDs can be given as bare IDs or full Google Sheets URLs. Rows are 1-based numbers and columns are letters, exactly as in the Sheets UI.
1. Google Cloud credentials (one-time, needed either way)
- In Google Cloud Console, create or pick a project.
- Enable the Google Sheets API and Google Drive API.
- APIs & Services → OAuth consent screen: set it up, add yourself under Test users. Then click Publish app. This does not require Google's verification review — personal-use apps (under 100 known users) are exempt; you just click through an "unverified app" warning once during authorization. Publishing matters because while the app sits in Testing, Google revokes refresh tokens every 7 days. The local extension recovers automatically by re-opening the browser, but a remote deployment needs a manual re-mint each time.
- APIs & Services → Credentials → Create Credentials → OAuth client ID → Desktop app. Save the Client ID and Client Secret.
The Sheets and Drive APIs are free to use, and this project never needs a Cloud billing account attached. Leaving billing unattached is the simplest guarantee against charges.
2a. Local install (Claude Desktop / local Cowork sessions)
npm install
npm run pack # builds and produces google-sheets.mcpb (~1.7 MB)
Double-click google-sheets.mcpb, or Claude Desktop → Settings → Extensions →
Install Extension…. Paste your Client ID and Secret into the extension settings.
On first use a browser opens to authorize; the refresh token is cached at
~/.config/google-sheets-mcp/token.json.
The extension asks only for OAuth credentials. Service-account auth is still
supported when running the server directly or remotely — set
GOOGLE_SERVICE_ACCOUNT_KEY_FILE or GOOGLE_SERVICE_ACCOUNT_KEY in the
environment instead.
Local MCP servers do not run in cloud Cowork sessions or on claude.ai — for those, use the remote deployment below.
2b. Remote install (cloud Cowork sessions, web, mobile)
Mint a refresh token — this runs the same browser consent flow and prints a long-lived token for the server to use:
GOOGLE_OAUTH_CLIENT_ID=…apps.googleusercontent.com \
GOOGLE_OAUTH_CLIENT_SECRET=… \
npm run mint-token
Pick a bearer token. This is the shared secret Claude must present on every request:
node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
Deploy to Cloudflare Workers (free tier is plenty; the Worker is ~174 KB gzipped):
npx wrangler login
npx wrangler secret put MCP_BEARER_TOKEN # the value you just generated
npx wrangler secret put GOOGLE_OAUTH_CLIENT_ID
npx wrangler secret put GOOGLE_OAUTH_CLIENT_SECRET
npx wrangler secret put GOOGLE_REFRESH_TOKEN # from mint-token
npm run deploy
Wrangler prints a URL like https://google-sheets-mcp.<you>.workers.dev. Verify it with
curl https://…/health — it should return ok.
Add it to Claude: Settings → Connectors → Add custom connector.
- If your Add-connector dialog has a Request headers section (beta, gradual
rollout): URL
https://google-sheets-mcp.<you>.workers.dev/mcpwith headerauthorization: Bearer <your MCP_BEARER_TOKEN>. - If it doesn't, put the token in the URL path instead:
https://google-sheets-mcp.<you>.workers.dev/mcp/<your MCP_BEARER_TOKEN>.
Security notes
- The endpoint is public, so the bearer token is the only thing standing between the internet and your spreadsheets. Use a long random value and treat it like a password.
- Auth fails closed: if
MCP_BEARER_TOKENis unset, every request to/mcpis rejected with 401 rather than running unauthenticated. - Token comparison is constant-time, so the secret can't be recovered by timing.
GOOGLE_REFRESH_TOKENgrants access to every spreadsheet your account can open. To narrow that, use a service account instead (GOOGLE_SERVICE_ACCOUNT_KEY, inline JSON) and share only specific sheets with its email address.- To revoke everything at once: myaccount.google.com/permissions.
Configuration reference
| Env var / secret | Purpose |
|---|---|
GOOGLE_OAUTH_CLIENT_ID / GOOGLE_OAUTH_CLIENT_SECRET |
OAuth client (both modes) |
GOOGLE_REFRESH_TOKEN |
Pre-minted refresh token (required for remote) |
GOOGLE_SERVICE_ACCOUNT_KEY |
Inline service-account JSON (alternative to OAuth) |
GOOGLE_SERVICE_ACCOUNT_KEY_FILE |
Path to a service-account key (local only) |
MCP_BEARER_TOKEN |
Shared secret required by the remote endpoint |
GSHEETS_TOKEN_PATH |
Override the local token cache location |
Scopes: spreadsheets (read/write) + drive.metadata.readonly (list/search files).
Development
npm install
npm run build # compile to dist/
npm run typecheck # tsc --noEmit
npm run pack # build + package the .mcpb bundle
npm run dev:worker # run the Worker locally via wrangler
npm run deploy # deploy the Worker
src/
index.ts stdio entry point (local)
worker.ts Cloudflare Worker entry (remote) + bearer auth
server.ts server factory: registers all tool groups
config.ts credentials → token provider, shared by both entries
google/
auth.ts fetch + WebCrypto token providers (refresh token, service account)
client.ts REST client for the Sheets/Drive endpoints used
types.ts minimal API types
node/
localOAuth.ts Node-only desktop OAuth loopback flow
mintToken.ts CLI to print a refresh token for remote deploys
tools/ one module per tool group (read, write, structure, format, advanced)
utils/ A1-notation parsing, tool result/error helpers
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
Neon Database
MCP server for interacting with Neon Management API and databases
E2B
Using MCP to run code via e2b.
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.