Claude Gmail MCP
Super simple MCP gmail server for claude, so it can send messages
Installation
npx claude-gmail-mcpAsk AI about Claude Gmail MCP
Powered by Claude Β· Grounded in docs
I know everything about Claude Gmail MCP. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
claude-gmail-mcp
A super tiny Gmail MCP server for Claude Code. Lets Claude send, search, and read Gmail on your behalf.
Two backends are supported and auto-selected at startup:
- Gmail API (OAuth) β recommended. No app password. Batch search. Direct Gmail web URLs on every result.
- SMTP/IMAP (app password) β simpler setup. Fallback when the OAuth token isn't present.
I needed something for my projects β there were a bunch around which seemed super complicated. So why not have Claude CLI build one for me :-p
Prerequisites
- uv installed
- One of:
- A Google Cloud OAuth client (Desktop app) β for the API backend, OR
- A Gmail App Password β for the SMTP/IMAP backend
Install (Gmail API backend β recommended)
-
In Google Cloud Console, create a project, enable the Gmail API, and configure the OAuth consent screen (External, add your Gmail as a test user). Create an OAuth client of type Desktop app and download the credentials JSON.
-
Run the auth helper, pointing at the downloaded file:
uvx --from claude-gmail-mcp claude-gmail-mcp-auth /path/to/credentials.jsonBrowser opens β sign in β approve (scope:
gmail.modify). Refresh token is saved to~/.config/claude-gmail-mcp/token.json(perms600). -
Register the MCP server with Claude Code (no env vars needed):
claude mcp add gmail --scope user -- uvx claude-gmail-mcp
Install (SMTP/IMAP backend β fallback)
claude mcp add gmail --scope user \
-e GMAIL_ADDRESS=you@gmail.com \
-e GMAIL_APP_PASSWORD=your-app-password \
-- uvx claude-gmail-mcp
Replace you@gmail.com and your-app-password with your actual credentials. Drop --scope user to install only for the current project directory.
Verify
claude mcp list
You should see gmail listed as a configured server. To see which backend is active, run:
uvx claude-gmail-mcp 2>&1 | head -1
Expected: [gmail-mcp] backend=api or [gmail-mcp] backend=imap. Ctrl-C to exit.
Backend selection
At startup the server picks exactly one backend:
- Token file at
GMAIL_TOKEN_PATH(default~/.config/claude-gmail-mcp/token.json) exists β API backend. - Else
GMAIL_ADDRESS+GMAIL_APP_PASSWORDenv vars set β IMAP backend. - Else tools return a "no backend configured" error.
To force a switch to the IMAP backend when a token file exists, set GMAIL_TOKEN_PATH to a non-existent path (or delete the token file).
Usage
Ask Claude to send an email:
Send an email to alice@example.com with subject "Hello" and body "Hi from Claude!"
Tools exposed:
send_emailβto,subject,body, optionalcc/bcc,html,attachments(local file paths; unreadable files are skipped with a warning).search_emailsβqueries(single string or list of strings),max_results(per query when a list is passed). Results include the Gmail message ID in hex and a direct Gmail web URL per hit.read_emailβuid(the hex ID fromsearch_emails). Output includes the Gmail web URL at the top.
Batch search example:
Search Gmail for "is:unread from:alice" and "is:unread from:bob" β show me both side by side.
Claude passes both queries in a single tool call. The response is sectioned per query. API backend executes the list step in one HTTP roundtrip; IMAP backend iterates.
Attachment example:
Send an email to alice@example.com with subject "Report" and attach ~/Documents/report.pdf
Publishing to PyPI
python -m build && twine upload dist/*
For Development
git clone https://github.com/pliablepixels/claude-gmail-mcp.git
cd claude-gmail-mcp
uv sync
uv run pytest
Run the server locally:
uv run claude-gmail-mcp
Test with Claude Code using your local copy instead of the published package:
claude mcp add gmail --scope user \
-- uv run --directory /path/to/claude-gmail-mcp claude-gmail-mcp
(For the IMAP backend add -e GMAIL_ADDRESS=... -e GMAIL_APP_PASSWORD=....)
