Skip to main content

Gmail Blade MCP

Production Gmail MCP server for AI agents. Token-efficient, write-safe, thread-intelligent.

Features

Category Tools Description
Read gmail_search, gmail_read, gmail_snippets, gmail_thread, gmail_mailboxes Search, read messages and threads, list labels
Meta gmail_info, gmail_state, gmail_changes, gmail_identities, gmail_filters Account info, incremental sync, send-as aliases, filter rules
Write gmail_send, gmail_reply, gmail_draft, gmail_flag, gmail_move, gmail_bulk, gmail_delete Send, reply, draft, label, move, batch ops, delete
Filter gmail_filter_create, gmail_filter_delete Create and delete Gmail filters
AI gmail_classify, gmail_summarise Gemini-powered classification and summarisation (requires GOOGLE_API_KEY)

What makes this different

  • Token-efficient by default — HTML→plaintext stripping, body truncation, quoted-reply deduplication, concise list format
  • Write-safe — GMAIL_WRITE_ENABLED=true env gate + confirm=true on destructive operations
  • Thread-intelligent — thread_mode=deduped strips quoted replies; latest shows only newest message
  • Incremental sync — gmail_state + gmail_changes via Gmail history.list API
  • Rate-limit aware — automatic exponential backoff on 429 errors
  • Gemini AI — classify and summarise emails using Google Gemini (optional, requires GOOGLE_API_KEY)
  • Credential-safe — OAuth tokens scrubbed from error messages

Quick Start

1. Install

uv sync

2. Set up Gmail API credentials

  1. Go to Google Cloud Console
  2. Create a project (or select existing)
  3. Enable the Gmail API
  4. Create OAuth 2.0 credentials (Desktop application)
  5. On the OAuth consent screen, set publishing status to "In production" — in "Testing" status Google expires refresh tokens after 7 days, which breaks any long-running server. (The "unverified app" warning at consent is a one-time click-through; if you have a Google Workspace org, marking the app Internal avoids the warning entirely.)
  6. Download the JSON file and save as ~/.gmail-blade/credentials.json (or pass --client-id/--client-secret to the auth verb instead)

3. Authenticate

uv run gmail-blade-mcp auth            # mints modify+send scopes (default)
uv run gmail-blade-mcp auth --scopes read   # read-only grant

A browser window opens for OAuth consent. After authorising, the verb prints a paste-ready credential block:

GMAIL_OAUTH_CLIENT_ID=...
GMAIL_OAUTH_CLIENT_SECRET=...
GMAIL_OAUTH_REFRESH_TOKEN=...

and (unless --no-save-token) also saves the refresh token to ~/.gmail-blade/token.json (mode 0600) for standalone use.

The server itself never opens a browser. If no credentials are available it returns a typed error telling you to run gmail-blade-mcp auth. Verify current credentials any time with:

uv run gmail-blade-mcp auth --check    # prints account email + granted scopes

Stallari / headless deployments: set the three GMAIL_OAUTH_* env vars (e.g. paste them into Stallari → Connections → gmail-blade-mcp). When GMAIL_OAUTH_REFRESH_TOKEN is set the server builds credentials in memory and never touches ~/.gmail-blade/. Note the scope grant is fixed when the token is minted — to enable write tools later you need both GMAIL_WRITE_ENABLED=true and a token minted with --scopes write.

4. Configure MCP client

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "gmail-blade": {
      "command": "uv",
      "args": ["--directory", "/path/to/gmail-blade-mcp", "run", "gmail-blade-mcp"],
      "env": {
        "GMAIL_WRITE_ENABLED": "false"
      }
    }
  }
}

Environment Variables

Variable Default Description
GMAIL_OAUTH_CLIENT_ID (none) OAuth client ID (in-memory credential mode)
GMAIL_OAUTH_CLIENT_SECRET (none) OAuth client secret
GMAIL_OAUTH_REFRESH_TOKEN (none) OAuth refresh token — presence switches on in-memory credential mode (mint with gmail-blade-mcp auth)
GMAIL_WRITE_ENABLED false Enable write operations (send, reply, delete, etc.)
GMAIL_MCP_TRANSPORT stdio Transport: stdio or http
GMAIL_MCP_HOST 127.0.0.1 HTTP host (when transport=http)
GMAIL_MCP_PORT 8768 HTTP port (when transport=http)
GMAIL_MCP_API_TOKEN (none) Bearer token for HTTP transport auth
GOOGLE_API_KEY (none) Google AI Studio API key for Gemini classify/summarise tools

Security

  • Write operations disabled by default — set GMAIL_WRITE_ENABLED=true to enable
  • Permanent delete requires confirm=true — use gmail_move to TRASH for soft delete
  • OAuth tokens never appear in error messages — regex scrubbing on all error paths
  • The server can never open a browser — interactive consent exists only in the auth CLI verb; headless deployments get typed errors, not hangs
  • token.json written 0600 — and in env-credential mode nothing is written to disk at all
  • Bearer auth uses constant-time comparison — secrets.compare_digest()
  • Credentials stored locally — ~/.gmail-blade/, never transmitted

Development

make install-dev    # Install with dev + test deps
make test           # Unit tests (no Gmail needed)
make check          # Lint + format + type check
make test-cov       # Tests with coverage

email-v1 Contract

This server implements the Sidereal email-v1 domain contract — the same tool semantics as fastmail-blade-mcp. Skills targeting email-v1 work with either provider.

License

MIT

Metadata

Release files for gmail-blade-mcp 0.9.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for gmail-blade-mcp 0.9.0
File Size Uploaded
gmail_blade_mcp-0.9.0.tar.gz 148.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for gmail-blade-mcp 0.9.0
File Interpreter ABI Platform
gmail_blade_mcp-0.9.0-py3-none-any.whl Python 3 none any Details

Total release size: 184.8 kB

Release files / gmail_blade_mcp-0.9.0.tar.gz

Download URL gmail_blade_mcp-0.9.0.tar.gz
Size 148.0 kB
Tags Source
SHA-256 checksum
How to use checksums
ac604e32e739981af56fa65c1e3df95fbfa7821afed306ebf208f3f7c449bd89
BLAKE2b-256 checksum
How to use checksums
485d8ff54ceaef3f789310c3e66417ca2e33eee2ad3aefe0695eba57274a6085
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 2, 2026.

Transparency log

Release files / gmail_blade_mcp-0.9.0-py3-none-any.whl

Download URL gmail_blade_mcp-0.9.0-py3-none-any.whl
Size 36.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c8b1664f0da5578fa41f6aba6aea373e6385015e98824e337771d6162952ccd5
BLAKE2b-256 checksum
How to use checksums
d730a8eb167da025126a7a6d8bbf5812743cc223be792320d68697b2eab2753f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 2, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.9.0 This release

2 release files

0.3.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page