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)

  1. Download InnerSheet

    Download innersheet-mcp-v2.zip and double-click it to unzip. Move the innersheet folder 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.

  2. Double-click install.command

    The installer:

    • installs uv if 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 innersheet to 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 claude CLI 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.command in Terminal from inside the folder.

  3. Create your Google Cloud OAuth client (once)

    Follow the Google Cloud setup below — about five minutes, free. Save the downloaded file as client_secret.json inside the innersheet folder.

  4. 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)

  1. Download InnerSheet

    Download innersheet-mcp-v2.zip, right-click it and choose Extract All. Move the innersheet folder somewhere stable, for example C:\innersheet, before you run the installer.

  2. Run install.ps1

    Right-click install.ps1 and choose Run with PowerShell. It does the same as the macOS installer: installs uv if 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.ps1
  3. Create your Google Cloud OAuth client (once)

    Follow the Google Cloud setup below and save the downloaded file as client_secret.json inside the innersheet folder.

  4. 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)

  1. Download InnerSheet

    Download innersheet-mcp-v2.zip and unzip it into a stable folder, for example ~/innersheet.

  2. Run bash install.sh

    From inside the folder. It installs uv if 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.json over.

  3. Create your Google Cloud OAuth client (once)

    Follow the Google Cloud setup below and save the downloaded file as client_secret.json inside the innersheet folder.

  4. 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.

  1. 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 — innersheet is fine.

  2. 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.

  3. 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.

  4. Decide who can sign in: publish, or add yourself as a test user

    A new app starts in Testing. Open Audience and pick one:

    OptionHowTrade-off
    Publish the app RecommendedAudience → 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 TestingAudience → 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.

  5. 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.

  6. Save it next to the server

    Rename the file to client_secret.json and put it in your innersheet folder — that is the path the installer configured. Never commit it to git or share it; it is in the shipped .gitignore.

  7. 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.json and refreshes itself.

    “Google hasn't verified this app”? Expected for a project you created: click Advanced, then Go to InnerSheet (unsafe).

Prefer a service account? Create one in IAM & Admin → Service Accounts, download its key, share each sheet with the service account's email as Editor, and set 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.

VariableDefaultWhat it does
GOOGLE_OAUTH_CLIENT_SECRETSSet by the installerPath to your OAuth client JSON (Desktop app). Required in OAuth mode.
SHEETS_MCP_AUTHoauthoauth (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.jsonWhere the OAuth token is cached. Delete this file to sign in again.
SHEETS_MCP_ALLOWED_SPREADSHEETSEmpty — all allowedComma-separated spreadsheet IDs. Every other spreadsheet is refused before any Google call.
SHEETS_MCP_READ_ONLYOff1, true or yes blocks every write and requests read-only Google scopes.
SHEETS_MCP_MAX_READ_CELLS5000Reads larger than this are truncated, with a note telling the agent to narrow the range.
SHEETS_MCP_MAX_WRITE_CELLS10000A 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

FlagDefaultWhat it does
--version—Print the version and exit — a quick health check.
--transportstdiostdio for local clients, http for web chats (Streamable HTTP at /mcp).
--host127.0.0.1HTTP bind address.
--port8000HTTP 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.

InnerSheet running in a terminal: the version check prints innersheet 2.0.0 and the MCP server starts with transport stdio
The server, running for real — version check, then the MCP server starting on stdio.
  1. In a terminal: uv run /path/to/innersheet/server.py --version should print innersheet 2.0.0. If not, the problem is the install, not the client.
  2. "List my spreadsheets" — the agent should answer with real sheet names. If it can't find any, the Google sign-in didn't complete.
  3. "Read A1:D10 from <your sheet>" — confirm the values match what you see in the browser.
  4. "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) — open mcp-server-innersheet.log.
  • Claude Code: claude mcp list shows whether InnerSheet is connected.
  • The exact error text — then search for it on the Troubleshooting page.