Install InnerSheet
Two ways in: the one-click installer (recommended — it installs uv if needed, test-runs the server and adds InnerSheet to Claude Desktop and Claude Code), or the manual path if you'd rather see every step. Either way, budget ten minutes and one free Google Cloud OAuth client.
macOS — recommended path (about 10 minutes)
Download InnerSheet
Download innersheet-mcp-v2.zip and double-click it to unzip. Move the
innersheetfolder somewhere stable, for example your home folder (/Users/yourname/innersheet) — the installer writes this path into your AI client's config, so don't move it afterwards.Double-click
install.commandThe installer:
- installs
uvif it is missing (the official installer from astral.sh); - test-runs the server with
uv run server.py --version— on the first run uv downloads Python and the dependencies, so it needs internet and may take a minute; - adds
innersheetto Claude Desktop's config — your existing config is backed up first and other servers are left untouched; - registers InnerSheet with Claude Code too, if the
claudeCLI is installed; - tells you what's left to do — usually the Google step below.
It is safe to run again. If macOS says the file is from an unidentified developer, right-click it and choose Open. If it says you don't have access privileges, run
bash install.commandin Terminal from inside the folder.- installs
Create your Google Cloud OAuth client (once)
Follow the Google Cloud setup below — about five minutes, free. Save the downloaded file as
client_secret.jsoninside theinnersheetfolder.Restart and verify
Fully quit Claude Desktop (⌘Q, not just the window) and open it again, then ask: "List my spreadsheets". The first time, your browser opens a Google sign-in page.
Windows — recommended path (about 10 minutes)
Download InnerSheet
Download innersheet-mcp-v2.zip, right-click it and choose Extract All. Move the
innersheetfolder somewhere stable, for exampleC:\innersheet, before you run the installer.Run
install.ps1Right-click
install.ps1and choose Run with PowerShell. It does the same as the macOS installer: installsuvif missing, test-runs the server, adds InnerSheet to%APPDATA%\Claude\claude_desktop_config.json(after backing it up), and registers with Claude Code if the CLI is installed.If Windows says running scripts is disabled, open PowerShell in the folder and run it for this one time only:
powershell -ExecutionPolicy Bypass -File install.ps1Create your Google Cloud OAuth client (once)
Follow the Google Cloud setup below and save the downloaded file as
client_secret.jsoninside theinnersheetfolder.Restart and verify
Quit Claude Desktop from the system tray (not just the window), open it again, then ask: "List my spreadsheets".
Linux — recommended path (about 10 minutes)
Download InnerSheet
Download innersheet-mcp-v2.zip and unzip it into a stable folder, for example
~/innersheet.Run
bash install.shFrom inside the folder. It installs
uvif missing, test-runs the server and registers with Claude Code if the CLI is installed. Linux has no standard Claude Desktop config path, so instead of editing a file it prints the config snippet for you to paste into your client (Cursor, Windsurf, Zed…).On a headless machine, do the Google sign-in once on a desktop and copy
~/.config/innersheet/token.jsonover.Create your Google Cloud OAuth client (once)
Follow the Google Cloud setup below and save the downloaded file as
client_secret.jsoninside theinnersheetfolder.Restart and verify
Restart your AI client and ask: "List my spreadsheets".
What the installer adds to your config
This is the entry the installer merges into mcpServers (on Linux it prints it instead). uv run reads the dependency list inside server.py, so there is no virtual environment to manage.
{
"mcpServers": {
"innersheet": {
"command": "uv",
"args": ["run", "/path/to/innersheet/server.py"],
"env": {
"GOOGLE_OAUTH_CLIENT_SECRETS": "/path/to/innersheet/client_secret.json"
}
}
}
}Client says it can't find uv? Desktop apps opened from the Dock or Start menu don't always see the same PATH as your terminal. Replace "uv" with its full path — run which uv (macOS/Linux) or where uv (Windows) to get it. See spawn uv ENOENT.
Google Cloud setup — the one step everyone does once
InnerSheet signs in to Google Sheets with your own account, so Google needs to know the app exists. It is free and needs no credit card. Budget five minutes the first time.
Newer consoles group the OAuth settings under Google Auth Platform (tabs Branding, Audience, Clients); older ones call it OAuth consent screen. Both names are given below.
Create a project
Go to console.cloud.google.com, sign in with the Google account that owns your sheets, and create a new project. Any name works —
innersheetis fine.Enable the two APIs
Open APIs & Services → Library and enable Google Sheets API and Google Drive API. Drive is only used to find spreadsheets by name. Skipping this gives the "API has not been used in project" error.
Configure the consent screen
Open Google Auth Platform → Branding (older consoles: APIs & Services → OAuth consent screen). Set the app name (
InnerSheet) and your email, choose audience External, and save. No logo or privacy policy is needed for personal use.Decide who can sign in: publish, or add yourself as a test user
A new app starts in Testing. Open Audience and pick one:
Option How Trade-off Publish the app Recommended Audience → Publish app → confirm In production. Sign-in stays valid. You see a one-time “Google hasn't verified this app” screen — normal for a personal project, no verification needed. Stay in Testing Audience → Test users → Add users → add the Gmail you will sign in with. Google expires the sign-in every 7 days, so you re-sign weekly. Doing neither gives Error 403: access_denied. Staying in Testing explains a weekly invalid_grant.
Create a Desktop OAuth client
Open Google Auth Platform → Clients → Create client (older consoles: Credentials → Create Credentials → OAuth client ID). Application type Desktop app — not “Web application”, which causes redirect_uri_mismatch. Download the JSON.
Save it next to the server
Rename the file to
client_secret.jsonand put it in yourinnersheetfolder — that is the path the installer configured. Never commit it to git or share it; it is in the shipped.gitignore.First run: sign in once
The first time a tool runs, your browser opens a Google sign-in page. Sign in and accept the permissions. The token is cached at
~/.config/innersheet/token.jsonand refreshes itself.“Google hasn't verified this app”? Expected for a project you created: click Advanced, then Go to InnerSheet (unsafe).
SHEETS_MCP_AUTH=service_account plus GOOGLE_SERVICE_ACCOUNT_JSON=/path/to/key.json. Better for servers and shared team sheets — no browser sign-in, no token expiry.Configuration reference
InnerSheet is configured with environment variables. Put them in the env block of your client's config (or -e KEY=value for claude mcp add), then restart the client.
| Variable | Default | What it does |
|---|---|---|
GOOGLE_OAUTH_CLIENT_SECRETS | Set by the installer | Path to your OAuth client JSON (Desktop app). Required in OAuth mode. |
SHEETS_MCP_AUTH | oauth | oauth (browser sign-in) or service_account. |
GOOGLE_SERVICE_ACCOUNT_JSON | — | Path to the service-account key file, or the JSON itself. Required when SHEETS_MCP_AUTH=service_account. |
SHEETS_MCP_TOKEN_PATH | ~/.config/innersheet/token.json | Where the OAuth token is cached. Delete this file to sign in again. |
SHEETS_MCP_ALLOWED_SPREADSHEETS | Empty — all allowed | Comma-separated spreadsheet IDs. Every other spreadsheet is refused before any Google call. |
SHEETS_MCP_READ_ONLY | Off | 1, true or yes blocks every write and requests read-only Google scopes. |
SHEETS_MCP_MAX_READ_CELLS | 5000 | Reads larger than this are truncated, with a note telling the agent to narrow the range. |
SHEETS_MCP_MAX_WRITE_CELLS | 10000 | A single write larger than this is refused — split it into batches. |
SHEETS_MCP_API_KEY | — | Required for HTTP mode. Clients must send Authorization: Bearer <key>. |
Command-line flags
| Flag | Default | What it does |
|---|---|---|
--version | — | Print the version and exit — a quick health check. |
--transport | stdio | stdio for local clients, http for web chats (Streamable HTTP at /mcp). |
--host | 127.0.0.1 | HTTP bind address. |
--port | 8000 | HTTP port. |
Example: read-only, two sheets only
"env": {
"GOOGLE_OAUTH_CLIENT_SECRETS": "/path/to/innersheet/client_secret.json",
"SHEETS_MCP_READ_ONLY": "1",
"SHEETS_MCP_ALLOWED_SPREADSHEETS": "1AbCdEfGhIjK,1ZyXwVuTsRqP"
}The spreadsheet ID is the part of the sheet's URL between /d/ and /edit. After switching read-only on or off, delete token.json once so Google issues a token with the matching permissions.
Manual install (no installer)
If you'd rather see every step, the manual path is short. You need Python 3.10 or newer.
# macOS / Linux
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
# Windows (PowerShell)
py -3 -m venv .venv
.venv\Scripts\pip install -r requirements.txt| You installed with… | Client config uses |
|---|---|
| The installer (or uv) | "command": "uv", "args": ["run", "/path/to/innersheet/server.py"] |
| Manual venv — macOS/Linux | "command": "/path/to/innersheet/.venv/bin/python", "args": ["/path/to/innersheet/server.py"] |
| Manual venv — Windows | "command": "C:\\innersheet\\.venv\\Scripts\\python.exe" — double backslashes inside JSON |
Per-client config files are on the AI Clients page.
Verify the connection
After restarting your AI client, run these checks in order. Stop at the first one that fails and look it up on the Troubleshooting page.

- In a terminal:
uv run /path/to/innersheet/server.py --versionshould printinnersheet 2.0.0. If not, the problem is the install, not the client. - "List my spreadsheets" — the agent should answer with real sheet names. If it can't find any, the Google sign-in didn't complete.
- "Read A1:D10 from <your sheet>" — confirm the values match what you see in the browser.
- "Upsert today's row in my daily report, dry run only" — the agent should describe what it would write, without writing anything.
Where to look when something fails
- Claude Desktop logs:
~/Library/Logs/Claude/(macOS) or%APPDATA%\Claude\logs\(Windows) — openmcp-server-innersheet.log. - Claude Code:
claude mcp listshows whether InnerSheet is connected. - The exact error text — then search for it on the Troubleshooting page.