gsheets-mcp
A 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.
README
gsheets-mcp
A local MCP (Model Context Protocol) server that lets Claude read and write your Google Sheets through the Google Sheets API v4.
It runs entirely on your own machine. You authenticate with your own Google account using OAuth2 (the "installed app" / Desktop flow), and your data never passes through any third-party server.
Free and open source under the MIT License. No telemetry, no third-party servers.
🌐 Website: https://gsheets-mcp.trombella.org/
What you get
| Tool | What it does |
|---|---|
list_spreadsheets |
List your Google Sheets on Drive (optionally filtered by name). |
get_sheet_info |
Metadata for a spreadsheet: title, locale, and its tabs (names, IDs, size). |
read_range |
Read values from a range (e.g. Foglio1!A1:D10). |
update_range |
Write/overwrite values into a range. |
append_rows |
Append rows to the end of a table. |
Most tools take a spreadsheet ID — the long string in a sheet's URL:
https://docs.google.com/spreadsheets/d/<THIS_IS_THE_ID>/edit.
You can also discover IDs with list_spreadsheets instead of copying them by hand.
Prerequisites
- Node.js 18+ (
node --version). - A Google account.
Part 1 — Set up Google Cloud (one time)
You need an OAuth "Desktop app" client so the server can ask for your permission to access your sheets.
1. Create a Google Cloud project
- Go to https://console.cloud.google.com/.
- Top bar → project dropdown → New Project. Give it a name (e.g.
gsheets-mcp) and create it. Make sure it's selected.
2. Enable the APIs
- Go to APIs & Services → Library (https://console.cloud.google.com/apis/library).
- Search for Google Sheets API, open it, click Enable.
- Search for Google Drive API, open it, click Enable.
The Drive API is used only by
list_spreadsheetsto enumerate your sheets, via the read-onlydrive.readonlyscope. It is not used to modify, move or delete files.
3. Configure the OAuth consent screen
- Go to APIs & Services → OAuth consent screen.
- User type: External → Create. (Internal is only available on Google Workspace organizations.)
- Fill in the required fields: App name (e.g.
gsheets-mcp), your email as User support email and Developer contact. You can leave the rest blank. Save and continue. - Scopes: you can skip adding scopes here (the app requests them at login). Save and continue.
- Test users: click Add users and add your own Google email. This is required — in "Testing" mode only listed test users can authorize the app. Save and continue.
- Leave the app in Testing mode. That's fine for personal use and never expires for your own test-user account. (Publishing to "Production" would trigger Google's app verification, which you don't need here.)
4. Create the OAuth client credentials
- Go to APIs & Services → Credentials.
- Create Credentials → OAuth client ID.
- Application type: Desktop app. Name it (e.g.
gsheets-mcp desktop). Create. - In the confirmation dialog, click Download JSON. This file contains your
client_idandclient_secret.
5. Place the credentials file
Save the downloaded file as credentials.json in the config directory:
mkdir -p ~/.config/gsheets-mcp
mv ~/Downloads/client_secret_*.json ~/.config/gsheets-mcp/credentials.json
Keep this file private — it's ignored by git. You can override its location with the
GSHEETS_MCP_CREDENTIALSenvironment variable (see.env.example).
Part 2 — Install and build
From the project folder:
npm install
npm run build
Part 3 — Log in (one time)
Run the interactive login. It opens your browser on Google's consent screen; approve
access, and the token is saved to ~/.config/gsheets-mcp/token.json (refreshed
automatically from then on).
npm run login
# equivalently: node dist/index.js login
Because the app is in Testing mode, Google shows a "Google hasn't verified this app" warning. This is expected for your own app — click Advanced → Go to gsheets-mcp (unsafe) and continue. Then grant the two requested permissions (see below).
When you see ✅ Authorization complete in the terminal, you're done.
Scopes requested:
https://www.googleapis.com/auth/spreadsheets— read/write your spreadsheets.https://www.googleapis.com/auth/drive.readonly— read-only, used only bylist_spreadsheetsto enumerate your sheets. It cannot modify or delete files.To revoke access at any time, visit https://myaccount.google.com/permissions.
Note: if you upgrade the server and the requested scopes change, you must run
npm run loginagain — a previously granted consent doesn't cover new scopes. The same applies per machine (each computer stores its own token).
Part 4 — Add the server to Claude Desktop
Open Claude Desktop's config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
Add a gsheets entry under mcpServers, pointing at the compiled entrypoint. Use the
absolute path to dist/index.js in this project:
{
"mcpServers": {
"gsheets": {
"command": "node",
"args": ["/absolute/path/to/google-sheets-mcp/dist/index.js"]
}
}
}
Save the file and fully quit and reopen Claude Desktop. You should now see the
gsheets tools available. Try asking Claude something like:
"List my Google Sheets, then read
A1:C5from the one named 'Budget'."
Using it with Claude Code
claude mcp add gsheets -- node /absolute/path/to/google-sheets-mcp/dist/index.js
Usage examples (what to ask Claude)
- List: "List my Google Sheets" / "Find my spreadsheets whose name contains 'budget'."
- Info: "What tabs does spreadsheet
<ID>have?" (returns the exact tab names to use). - Read: "Read range
Foglio1!A1:D10from spreadsheet<ID>." - Update: "Put the values
[[\"Name\",\"Score\"],[\"Ada\",42]]starting atFoglio1!A1in spreadsheet<ID>." - Append: "Append the row
[\"Grace\", 99]toFoglio1in spreadsheet<ID>."
⚠️ Note: tab names are localized
Ranges use the tab (sheet) name, e.g. Sheet1!A1:D10. But the default tab name
depends on your Google account's language: it's Sheet1 in English, Foglio1 in
Italian, Hoja1 in Spanish, Feuille1 in French, and so on. Using the wrong name
returns Unable to parse range: ….
If you're unsure of the real tab name, open the sheet and read the tab label at the
bottom, or just ask Claude to read the whole sheet by passing only the tab name as
the range (e.g. Foglio1). A dedicated get_sheet_info tool that lists the exact tab
names is on the roadmap.
Configuration reference
All optional; defaults work out of the box. See .env.example.
| Variable | Default | Purpose |
|---|---|---|
GSHEETS_MCP_CONFIG_DIR |
~/.config/gsheets-mcp |
Where credentials.json / token.json live. |
GSHEETS_MCP_CREDENTIALS |
<config dir>/credentials.json |
Path to the OAuth client file. |
GSHEETS_MCP_TOKEN |
<config dir>/token.json |
Path to the saved token. |
Troubleshooting
- "Not authenticated. Run the one-time login first" — you haven't logged in yet, or
the token file is missing. Run
npm run login. - "OAuth client credentials not found" —
credentials.jsonisn't where the server expects it. Check Part 1, step 5. 403 access_deniedin the browser — your Google account isn't listed as a test user. Add it under OAuth consent screen → Test users (Part 1, step 3.5).- "Request had insufficient authentication scopes" — your saved token predates a
scope change (e.g.
list_spreadsheetsneedsdrive.readonly). Runnpm run loginagain to re-consent. Unable to parse range: …— the tab name is wrong. Tab names are localized (Foglio1in Italian,Sheet1in English). Useget_sheet_infoto see the exact names.- No
refresh_tokenwarning — revoke the app at https://myaccount.google.com/permissions and runnpm run loginagain. - Tools don't appear in Claude Desktop — confirm the path in
claude_desktop_config.jsonis absolute and points todist/index.js, that you rannpm run build, and that you fully restarted Claude Desktop.
Development
npm run build # compile to dist/
npm run watch # recompile on change
npm run typecheck # type-check without emitting
Source layout: src/index.ts (entrypoint), src/auth.ts (OAuth), src/sheetsClient.ts
and src/driveClient.ts (API wrappers), src/tools/* (one file per MCP tool).
License
Released under the MIT License. You're free to use, modify and distribute it. If it saves you time, you can support development with a coffee — see the website for the link. ☕
Not affiliated with or endorsed by Google. "Google Sheets" is a trademark of Google LLC.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。