mcp-google-gmail
Provides tools for managing Gmail: listing, reading, searching, sending, drafting, labeling, and trashing emails, with support for attachments, reply threading, and HTML emails.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-google-gmaillist my most recent emails"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🤔 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.
Related MCP server: io.github.p-w-4-z/inbox-mcp
🚀 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
This server cannot be deployed
Maintenance
Related MCP Connectors
A MCP server for Gmail that lets you search, read, and draft emails and replies.
Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.
Your IMAP mailbox as an MCP server: read, search and (if you allow it) organize mail. Open source.
1Email inboxes for AI agents: send, receive, reply, search, and manage threaded email over MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn MCP server enabling AI assistants to manage Gmail through natural language, including sending, reading, searching, labeling, and handling attachments with auto authentication.1MIT
- AlicenseAqualityDmaintenanceProvider-agnostic email MCP server that connects any IMAP mailbox to AI assistants, enabling email management through natural language.8AGPL 3.0
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with Gmail through a standardized MCP server interface, allowing for natural language email management and automation.-
- AlicenseNot gradedqualityBmaintenanceLocal MCP server for reading/sending email via Gmail and managing Google Calendar events, enabling an AI agent to handle email and calendar operations through natural language.MIT