mcp-google-gmail
🤔 What is this?
mcp-google-gmail is a Python-based MCP server that acts as a bridge between any MCP-compatible client (like Claude Desktop, Cursor, or Windsurf) and the Gmail API. It allows you to list, read, search, send, draft, label, and trash emails — all driven by AI through natural language.
🚀 Quick Start
Essentially the server runs in one line: uvx mcp-google-gmail@latest.
This command will automatically download the latest code and run it. We recommend always using @latest to ensure you have the newest version with the latest features and bug fixes.
☁️ Prerequisite: Google Cloud Setup
You must configure Google Cloud Platform credentials and enable the Gmail API first.
➡️ Jump to the Detailed Google Cloud Platform Setup guide below.
🐍 Install
uvuvxis part ofuv, a fast Python package installer. Install it if you haven't:# macOS / Linux curl -LsSf https://astral.sh/uv/install.sh | sh # Windows powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
🔐 Authenticate
Run the built-in auth command to set up your credentials:
# Point to your OAuth credentials file GMAIL_CREDENTIALS_PATH="/path/to/credentials.json" uvx mcp-google-gmail@latest authThis opens your browser for Google sign-in. After granting permission, a
token.jsonis saved automatically.You only need to do this once — subsequent runs use the cached token.
🏃 Run the Server!
uvx mcp-google-gmail@latest🔌 Connect your MCP Client
Configure your client (e.g., Claude Desktop) to connect to the running server.
➡️ See Usage with Claude Desktop for config examples.
You're ready! Start issuing commands via your MCP client.
✨ Key Features
Full Gmail Access: Read, search, send, draft, label, and trash emails.
15 Tools covering all common Gmail operations.
Flexible Authentication: Supports OAuth 2.0, Service Accounts, Base64 injection, and Application Default Credentials.
Pagination: All list operations support
page_tokenandmax_results.Attachments: Send emails with file attachments.
Reply Threading: Reply to existing threads with proper In-Reply-To headers.
HTML Email: Send plain text and/or HTML bodies.
Stdio & SSE Transports: Works with Claude Desktop, Cursor, and remote/container deployments.
🔐 Authentication
The auth Command
Before using the MCP server, authenticate with Gmail:
# Using OAuth credentials (interactive — opens browser)
GMAIL_CREDENTIALS_PATH="/path/to/credentials.json" uvx mcp-google-gmail@latest auth
# Specify where to save the token
GMAIL_CREDENTIALS_PATH="/path/to/credentials.json" \
GMAIL_TOKEN_PATH="/path/to/token.json" \
uvx mcp-google-gmail@latest authOn success, you'll see:
Credentials path: /path/to/credentials.json
Token path: token.json
Authenticated as: you@gmail.com
Total messages: 12345
Token saved to: token.jsonAuthentication Priority
The server checks for credentials in this order:
GMAIL_CREDENTIALS_CONFIG— Base64-encoded service account JSON (env var)GMAIL_SERVICE_ACCOUNT_PATH— Path to service account key fileGMAIL_TOKEN_PATH— Path to existing OAuth tokenGMAIL_CREDENTIALS_PATH— Path to OAuth credentials (interactive browser flow)Application Default Credentials —
GOOGLE_APPLICATION_CREDENTIALS/gcloud/ GCP metadata
Method A: OAuth 2.0 (Personal Accounts) 🧑💻
Best for personal use or local development.
Set up OAuth credentials in Google Cloud Console (see GCP Setup)
Run
mcp-google-gmail authto authenticate via browserToken is cached for future use with automatic refresh
GMAIL_CREDENTIALS_PATH— Path to OAuthcredentials.json(default:credentials.json)GMAIL_TOKEN_PATH— Where to store the token (default:token.json)
Method B: Service Account (Servers/Automation) ✅
Best for headless environments. Requires domain-wide delegation for accessing user mailboxes.
GMAIL_SERVICE_ACCOUNT_PATH— Path to service account JSON key (default:service_account.json)
Method C: Base64-Encoded Credentials (Containers) 🔒
Best for Docker, Kubernetes, CI/CD where file mounting is impractical.
GMAIL_CREDENTIALS_CONFIG— Base64-encoded content of your service account JSONGenerate with:
base64 -w 0 service_account.json
Method D: Application Default Credentials (GCP) 🌐
Best for Google Cloud environments (Cloud Run, GKE, Compute Engine).
Uses
GOOGLE_APPLICATION_CREDENTIALSorgcloud auth application-default loginNo additional env vars needed — used as automatic fallback
🛠️ Available Tools (15 Total)
Read Operations
gmail_list_messages— List messages with query, labels, pagination (1-500 per page)query(optional): Gmail search query (e.g."is:unread","from:alice@example.com")label_ids(optional): Filter by label IDs (e.g.["INBOX"])max_results(optional, default 20): Messages per page (1-500)page_token(optional): Token for next pageinclude_spam_trash(optional, default false): Include spam/trashReturns:
{messages: [{id, thread_id, snippet, subject, from, date}], next_page_token, result_size_estimate}
gmail_get_message— Get full message by ID (headers, body, attachments)message_id: The Gmail message IDReturns:
{id, thread_id, subject, from, to, cc, date, body_text, body_html, labels, attachments}
gmail_search_messages— Search with Gmail query syntax, returns compact summaries (1-100 per page). Usegmail_get_messageto read the full body of a result.query: Gmail search query (e.g."has:attachment after:2024/01/01")max_results(optional, default 10): Results per page (1-100)page_token(optional): Token for next pageReturns:
{messages: [{id, thread_id, snippet, subject, from, to, date, labels}], next_page_token, result_size_estimate}
gmail_list_drafts— List drafts with pagination and query filtermax_results(optional, default 20): Drafts per page (1-500)page_token(optional): Token for next pagequery(optional): Gmail search query to filter draftsReturns:
{drafts: [{draft_id, message_id, subject, to, snippet}], next_page_token, result_size_estimate}
Send Operations
gmail_send_message— Send email with to/cc/bcc, HTML body, attachments, reply threadingto,subject,body(required)cc,bcc,html_body,attachment_paths(optional)reply_to_message_id,thread_id(optional, for threading)Returns:
{id, thread_id, label_ids}
gmail_create_draft— Create a draft without sending (same params as send)Returns:
{draft_id, message_id}
gmail_update_draft— Update an existing draft (merges provided fields with existing)draft_id(required), all other fields optionalReturns:
{draft_id, message_id}
gmail_delete_draft— Permanently delete a draftdraft_id(required)Returns:
{success: true}
gmail_send_draft— Send an existing draftdraft_id(required)Returns:
{message_id, thread_id}
Label Operations
gmail_list_labels— List all labels (system and user-created)Returns:
{labels: [{id, name, type}]}
gmail_create_label— Create a new label (supports nesting with/)name: Label name (e.g."Projects/Work")Returns:
{id, name}
gmail_delete_label— Delete a user label (system labels cannot be deleted)label_id: The label IDReturns:
{success: true}
gmail_modify_message_labels— Add/remove labels from a messagemessage_id(required)add_label_ids(optional): Label IDs to addremove_label_ids(optional): Label IDs to removeReturns:
{id, label_ids}
Trash Operations
gmail_trash_message— Move a message to trash (auto-deleted after 30 days)message_id: The message IDReturns:
{id, label_ids}
gmail_untrash_message— Restore a message from trashmessage_id: The message IDReturns:
{id, label_ids}
🔌 Usage with Claude Desktop
Add the server config to your claude_desktop_config.json:
{
"mcpServers": {
"gmail": {
"command": "uvx",
"args": ["mcp-google-gmail@latest"],
"env": {
"GMAIL_CREDENTIALS_PATH": "/path/to/credentials.json",
"GMAIL_TOKEN_PATH": "/path/to/token.json"
}
}
}
}🍎 macOS Note: If you get a spawn uvx ENOENT error, use the full path:
"command": "/Users/yourusername/.local/bin/uvx"{
"mcpServers": {
"gmail": {
"command": "uvx",
"args": ["mcp-google-gmail@latest"],
"env": {
"GMAIL_SERVICE_ACCOUNT_PATH": "/path/to/service_account.json"
}
}
}
}{
"mcpServers": {
"gmail": {
"command": "uv",
"args": ["run", "--directory", "/path/to/mcp-gmail", "mcp-google-gmail"]
}
}
}⚙️ Usage with Cursor / Windsurf
{
"mcpServers": {
"gmail": {
"command": "uvx",
"args": ["mcp-google-gmail@latest"],
"env": {
"GMAIL_CREDENTIALS_PATH": "/path/to/credentials.json",
"GMAIL_TOKEN_PATH": "/path/to/token.json"
}
}
}
}🐳 SSE Transport (Remote / Container)
uv run mcp-google-gmail --transport sseVariable | Default | Description |
|
| Bind address |
|
| Listen port |
☁️ Google Cloud Platform Setup (Detailed)
This setup is required before running the server.
Create/Select a GCP Project — Go to the Google Cloud Console
Enable the Gmail API — Navigate to "APIs & Services" → "Library", search for "Gmail API", click Enable
Configure OAuth Consent Screen — Go to "APIs & Services" → "OAuth consent screen", select External, fill in app name and contact email, add the scope
https://www.googleapis.com/auth/gmail.modifyCreate OAuth Credentials — Go to "APIs & Services" → "Credentials" → "Create Credentials" → "OAuth 2.0 Client ID", select Desktop application
Download Credentials — Click the download button and save as
credentials.jsonAuthenticate — Run the auth command:
GMAIL_CREDENTIALS_PATH="/path/to/credentials.json" uvx mcp-google-gmail@latest authComplete the browser sign-in. A
token.jsonwill be saved for future use.
For Service Accounts: Go to Credentials → Create Credentials → Service Account, create a key (JSON), download it. Note: Service accounts require domain-wide delegation for Gmail access.
🔧 Environment Variables Reference
Variable | Default | Description |
| — | Base64-encoded service account JSON |
|
| Path to service account key file |
|
| Path to OAuth token file |
|
| Path to OAuth client credentials file |
|
| SSE transport bind address |
|
| SSE transport port |
💬 Example Prompts for Claude
"List my 10 most recent unread emails"
"Search for emails from alice@example.com with attachments"
"Send an email to bob@example.com with subject 'Meeting Notes' and the body 'Here are the notes from today.'"
"Create a draft reply to the last email from my manager"
"Label all emails from newsletter@example.com as 'Newsletters'"
"Trash all promotional emails from the last week"
"Show me the full content of message ID abc123"
"What are my unread emails about project deadlines?"
🤝 Contributing
Contributions are welcome! Please open an issue to discuss bugs or feature requests. Pull requests are appreciated.
📄 License
This project is licensed under the MIT License — see the LICENSE file for details.
🙏 Credits
Built with FastMCP
Inspired by mcp-google-sheets
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/MindMadeLab/mcp-google-gmail'
If you have feedback or need assistance with the MCP directory API, please join our Discord server