Skip to main content
Glama
README.md
# gscope - Google Workspace MCP Server

MCP server that lets AI assistants (like Claude Code) work with Google Docs, Sheets, and Drive using your own Google account.

## Quick Start

1. [Set up Google Cloud credentials](#google-cloud-setup) (one-time, ~5 min)
2. [Install gscope](#installation)
3. [Add to Claude Code](#add-to-claude-code)
4. [Authenticate](#authenticate)

---

## Google Cloud Setup

You need to create OAuth credentials in Google Cloud Console so gscope can access Google APIs on your behalf. This is a one-time setup.

### 1. Create or select a Google Cloud project

1. Go to [Google Cloud Console](https://console.cloud.google.com/)
2. Click the project dropdown at the top of the page
3. Click **"New Project"**
4. Name it anything (e.g., `gscope`) and click **Create**
5. Make sure the new project is selected in the dropdown

### 2. Enable the Google APIs

1. In the left sidebar, go to **"APIs & Services"** > **"Library"**
2. Search for and enable each of these (click on each one, then click **"Enable"**):
   - **Google Docs API**
   - **Google Sheets API**
   - **Google Drive API**

### 3. Configure the OAuth consent screen

> **This step is required before creating credentials. Skipping it will cause errors.**

1. In the left sidebar, go to **"Google Auth Platform"** > **"Branding"** (or **"APIs & Services"** > **"OAuth consent screen"**)
2. Fill in the required fields:
   - **App name**: `gscope` (or any name you like)
   - **User support email**: select your email
   - **Developer contact email**: your email
3. Click **Save**

4. Go to **"Audience"** (or **"Público-alvo"**)
5. Make sure it says **"Testing"** (not "In production")
   - If it says "In production", click **"Back to testing"** / **"Voltar para o teste"**
6. Under **"Test users"**, click **"Add users"**
7. **Add the email of the Google account you'll use** (the one you'll sign in with)
8. Click **Save**

> **Important**: While your app is in "Testing" mode, only the emails you add as test users can sign in. This is normal and expected for personal use.

### 4. Create OAuth credentials

1. In the left sidebar, go to **"Credentials"** (or **"Clientes"**)
2. Click **"Create Credentials"** > **"OAuth client ID"**
3. Application type: **Desktop app**
4. Name: `gscope` (or anything)
5. Click **Create**
6. A dialog will show your **Client ID** and **Client Secret**
7. **Copy both values** — you'll need them in the next step

Your Client ID looks like: `123456789-xxxxxxxxxx.apps.googleusercontent.com`
Your Client Secret looks like: `GOCSPX-xxxxxxxxxxxxxxxxx`

### 5. Summary

After completing these steps you should have:
- A Google Cloud project with Docs, Sheets, and Drive APIs enabled
- An OAuth consent screen configured in Testing mode with your email as test user
- A Desktop OAuth client with a Client ID and Client Secret

---

## Installation

```bash
git clone https://github.com/MatheusKindrazki/gscope.git
cd gscope
npm install
npm run build
```

## Add to Claude Code

```bash
claude mcp add --scope user gscope -- node /full/path/to/gscope/dist/index.js
```

Or add manually to your MCP config:

```json
{
  "mcpServers": {
    "gscope": {
      "command": "node",
      "args": ["/full/path/to/gscope/dist/index.js"]
    }
  }
}
```

Then restart Claude Code.

## Authenticate

In Claude Code, set up your credentials (only need to do this once):

```
Use google_workspace_setup with clientId "YOUR_CLIENT_ID" and clientSecret "YOUR_CLIENT_SECRET"
```

Then sign in with Google:

```
Use google_workspace_login
```

A browser window will open. Sign in with the Google account you added as a test user. After approving, you're done!

---

## What can it do?

### Google Docs (6 tools)
| Tool | Description |
|------|-------------|
| `google_docs_create` | Create a new document |
| `google_docs_get` | Read document content and metadata |
| `google_docs_append_text` | Append text to end of document |
| `google_docs_replace_text` | Find and replace text |
| `google_docs_insert_markdown_as_text` | Insert markdown as formatted text |
| `google_docs_batch_update` | Raw batch update (advanced) |

### Google Sheets (6 tools)
| Tool | Description |
|------|-------------|
| `google_sheets_create` | Create a new spreadsheet |
| `google_sheets_get` | Read spreadsheet metadata and values |
| `google_sheets_write_values` | Write values to a range |
| `google_sheets_append_values` | Append rows to a sheet |
| `google_sheets_clear_range` | Clear values from a range |
| `google_sheets_batch_update` | Raw batch update (advanced) |

### Google Drive (5 tools)
| Tool | Description |
|------|-------------|
| `google_drive_list_files` | List and search files |
| `google_drive_get_file` | Get file metadata |
| `google_drive_move_file` | Move file to another folder |
| `google_drive_create_folder` | Create a folder |
| `google_drive_share_file` | Share with another user |

### Management (6 tools)
| Tool | Description |
|------|-------------|
| `google_workspace_setup` | Create config file (run this first!) |
| `google_workspace_login` | Sign in with Google (opens browser) |
| `google_workspace_logout` | Sign out and revoke tokens |
| `google_workspace_current_scope` | Show active config and auth status |
| `google_workspace_list_scopes` | List all configured accounts |
| `google_workspace_validate_config` | Check if everything is set up correctly |

---

## Configuration

### Minimal config (recommended)

Only two values are required — everything else is auto-configured:

```json
{
  "google": {
    "clientId": "YOUR_CLIENT_ID.apps.googleusercontent.com",
    "clientSecret": "YOUR_CLIENT_SECRET"
  }
}
```

**Auto-configured defaults:**
- **Google Scopes**: Docs + Sheets + Drive (read/write)
- **OAuth Port**: Automatically finds a free port
- **Token Storage**: `~/.config/google-mcp/<scope-name>.tokens.json`

### Multiple Google accounts

Use a global config at `~/.config/google-mcp/config.json`:

```json
{
  "defaultScope": "personal",
  "scopes": {
    "personal": {
      "google": {
        "clientId": "PERSONAL_CLIENT_ID",
        "clientSecret": "PERSONAL_SECRET"
      }
    },
    "work": {
      "google": {
        "clientId": "WORK_CLIENT_ID",
        "clientSecret": "WORK_SECRET"
      }
    }
  }
}
```

Use `scopeName: "work"` in any tool call to switch accounts.

### Per-project config

Create `.google-mcp.json` in any project directory. gscope detects it automatically.

### Config resolution order

1. `.google-mcp.local.json` in current directory
2. `.google-mcp.json` in current directory
3. Same files in parent directories (up to git root)
4. Global config at `~/.config/google-mcp/config.json`

---

## Troubleshooting

### Google OAuth errors

**Error 500 on Google sign-in page**
- Make sure the OAuth consent screen is configured (app name, emails filled in)
- Make sure the app is in **"Testing"** mode (not "In production")
- Make sure your email is added as a **test user**
- Wait a few minutes after making changes — Google can take time to propagate

**Error 403: access_denied**
- Your email is not in the test users list
- Go to Google Cloud Console > OAuth consent screen > Test users > Add your email

**Error: redirect_uri_mismatch**
- For Desktop apps, this should not happen. If it does, make sure your OAuth client type is "Desktop app" (not "Web application")

### gscope errors

**"No Google Workspace configuration found"**
- Run `google_workspace_setup` with your Client ID and Secret
- Or create a config file manually (see Configuration above)

**"Not authenticated"**
- Run `google_workspace_login` — a browser will open for Google sign-in

**"Missing required Google API scopes"**
- Remove the `scopes` field from your config to use defaults (Docs + Sheets + Drive)

**Browser didn't open for login**
- Copy the URL shown in the output and paste it into your browser manually

**MCP not showing in Claude Code**
- Make sure you ran `npm run build` after cloning
- Make sure the path in your MCP config points to `dist/index.js` (not `src/index.ts`)
- Restart Claude Code completely (close and reopen, not just /clear)
- Run `claude mcp list` to verify the server is connected

---

## Advanced

See `examples/advanced-global-config.json` for:
- Custom OAuth redirect ports
- Custom Google API scopes
- Aliases for scope names
- Per-scope default Drive folders
- Document locale settings

## Architecture

```
src/
├── index.ts              # Entry point (stdio transport)
├── server/server.ts      # McpServer setup, tool registration
├── config/               # Hierarchical scope resolution
│   ├── schema.ts         # Zod schemas for config validation
│   ├── loader.ts         # Config file reading and merging
│   └── resolver.ts       # ScopeResolver (finds the right config)
├── auth/                 # OAuth 2.0 authentication
│   ├── oauth.ts          # Login flow with local HTTP callback
│   └── token-store.ts    # Token persistence per scope
├── google/               # Google API operations
│   ├── client.ts         # Client factory with caching
│   ├── docs.ts           # Google Docs operations
│   ├── sheets.ts         # Google Sheets operations
│   └── drive.ts          # Google Drive operations
├── tools/                # MCP tool definitions
│   ├── common.ts         # Shared params and helpers
│   ├── docs.ts           # 6 Docs tools
│   ├── sheets.ts         # 6 Sheets tools
│   ├── drive.ts          # 5 Drive tools
│   └── workspace.ts      # 6 management tools
└── utils/
    ├── logger.ts         # Structured logging (stderr, secrets masked)
    ├── git.ts            # Git root detection
    └── port.ts           # Auto free port detection
```

## Security

- Tokens stored locally per-scope (never shared between accounts)
- Secrets never appear in logs (masked with `***REDACTED***`)
- Token data never included in tool responses
- Uses `drive.file` scope by default (minimal permissions)
- All logs go to stderr (stdout reserved for MCP protocol)

## License

MIT

Maintenance

ActivityInactive
ResponsivenessNo issues