Skip to main content
Glama

google-workspace-mcp

MCP server for Google Workspace with persistent multi-account OAuth, OS keychain storage, and health monitoring.

Why

AI assistants lose Google Workspace authentication between sessions. Users with multiple Google accounts must re-authenticate manually every time. This MCP server solves both problems:

  • Persistent auth — OAuth tokens stored in OS keychain, survive restarts

  • Multi-account — Unlimited Google accounts with human-readable profile labels

  • Health monitoring — Three-layer defense: startup check, background heartbeat, graceful tool failure

  • Setup in 5 minutes — Interactive wizard handles everything

  • Zero secrets in code — All credentials live in OS keychain or env vars, never on filesystem

Prerequisites

  • Node.js 18+

  • GCP project with OAuth 2.0 credentials (Desktop application type)

  • Enabled APIs: Gmail, Calendar, Drive, Sheets, People

  • OS keychain (macOS Keychain, Windows Credential Vault, or Linux libsecret) — falls back to encrypted file store

Quick Start

# Install globally
npm install -g google-workspace-mcp

# Run the setup wizard (5 minutes)
gws-mcp setup

# Or manually:
gws-mcp auth add work --scopes gmail,calendar,drive --email you@company.com
gws-mcp auth add personal --scopes gmail,drive --email you@gmail.com
gws-mcp auth status

Add to your Claude Code settings.json:

{
  "mcpServers": {
    "google-workspace": {
      "command": "npx",
      "args": ["-y", "google-workspace-mcp"]
    }
  }
}

Available Tools

Admin Tools

Tool

Description

list_profiles

Show all profiles with health status

manage_profiles

Add/edit/remove profile, change scopes, set business rules

auth_status

Detailed auth health for one or all profiles

configure_notifications

Set notification channels, heartbeat interval

configure_permissions

Set business rules per profile per service

Gmail

Tool

Description

gmail_search

Search messages with Gmail query syntax

gmail_read

Read full message with HTML link extraction

gmail_read_thread

Read entire thread — deduplicated, attributed

gmail_send

Send new email

gmail_reply

Reply to a message (handles threading)

gmail_forward

Forward a message

gmail_list_labels

List all labels

gmail_modify_labels

Add/remove labels

Calendar

Tool

Description

calendar_list_events

List events in date range

calendar_get_event

Get event details

calendar_create_event

Create event with attendees

calendar_update_event

Modify existing event

calendar_delete_event

Delete/cancel event

calendar_free_busy

Check availability across profiles

Drive

Tool

Description

drive_list_files

List/search files (supports shared drives)

drive_get_file

Get file metadata

drive_read_file

Read content — text, Docs export, PDF extraction

drive_upload_file

Upload a file

drive_create_folder

Create folder

drive_share

Share file/folder

Sheets

Tool

Description

sheets_read_range

Read cell range

sheets_append_row

Append row

sheets_update_range

Update cell range

sheets_batch_update

Full batchUpdate API

sheets_create

Create new spreadsheet

Contacts

Tool

Description

contacts_search

Search contacts

contacts_list

List contacts

Configuration

Profiles

Profiles are stored in ~/.gws-mcp/profiles.json (metadata only — no tokens):

{
  "profiles": [
    {
      "label": "work",
      "email": "you@company.com",
      "scopes": ["gmail", "calendar", "drive"],
      "rules": {
        "gmail": { "read": true, "send": true, "delete": false },
        "calendar": { "read": true, "create": true, "delete": false },
        "drive": { "read": true, "upload": true, "delete": false }
      }
    }
  ]
}

Two-Layer Permission Model

  1. OAuth scopes — What Google allows (set during auth add)

  2. Business rules — What you allow Claude to do (set in profiles.json or via manage_profiles tool)

Business rules are enforced even if the OAuth token technically allows more.

Notifications

Config in ~/.gws-mcp/config.json:

{
  "notifications": {
    "channels": ["desktop", "log"],
    "telegram": {
      "enabled": false,
      "botToken": "env:GWS_MCP_TELEGRAM_BOT_TOKEN",
      "chatId": "env:GWS_MCP_TELEGRAM_CHAT_ID"
    },
    "heartbeatIntervalMinutes": 30,
    "alertOn": ["reauth_needed", "token_expiring_24h", "scope_change_detected"]
  }
}

CLI Commands

gws-mcp setup                  # Interactive wizard
gws-mcp auth add <profile>     # Add account
gws-mcp auth remove <profile>  # Remove account
gws-mcp auth refresh <profile> # Force token refresh
gws-mcp auth status             # Health table
gws-mcp config show             # Show config (redacted)
gws-mcp config set <key> <val>  # Set config value
gws-mcp config reset            # Reset to defaults
gws-mcp serve                   # Start MCP server

Security

Where Secrets Live

Secret

Storage

In Git?

OAuth Client ID + Secret

OS Keychain

Never

Access tokens

OS Keychain

Never

Refresh tokens

OS Keychain

Never

Telegram bot token

Env var

Never

Profile metadata

~/.gws-mcp/profiles.json

Never

Pre-Publish Audit

The prepublishOnly script automatically scans for leaked credentials before npm publish:

grep -rn "AIza\|ya29\.\|GOCSPX\|client_secret\|refresh_token" src/

Roadmap

See ROADMAP.md for planned features.

Contributing

See CONTRIBUTING.md for development setup and guidelines.

License

MIT

-
license - not tested
-
quality - not tested
-
maintenance - not tested

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

  • Governed email for AI agents (Mailbuttons / mbag.ai): sandbox inboxes, policy gate, audit log.

  • AI-powered medical document management for cancer patients. Google Drive, Gmail, Calendar via MCP.

  • Authenticated email gateway for AI agents — per-agent inboxes, HITL approval, SPF/DKIM verified.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/yaniv-tg/google-workspace-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server