A Model Context Protocol (MCP) server for Gmail integration in Claude Desktop with auto authentication support. This server enables AI assistants to manage Gmail through natural language interactions.
To install Gmail AutoAuth for Claude Desktop automatically via Smithery:
npx -y @smithery/cli install @gongrzhe/server-gmail-autoauth-mcp --client claude
Create a Google Cloud Project and obtain credentials:
a. Create a Google Cloud Project:
b. Create OAuth 2.0 Credentials:
http://localhost:3000/oauth2callback
to the authorized redirect URIsgcp-oauth.keys.json
Run Authentication:
You can authenticate in two ways:
a. Global Authentication (Recommended):
# First time: Place gcp-oauth.keys.json in your home directory's .gmail-mcp folder mkdir -p ~/.gmail-mcp mv gcp-oauth.keys.json ~/.gmail-mcp/ # Run authentication from anywhere npx @gongrzhe/server-gmail-autoauth-mcp auth
b. Local Authentication:
# Place gcp-oauth.keys.json in your current directory # The file will be automatically copied to global config npx @gongrzhe/server-gmail-autoauth-mcp auth
The authentication process will:
gcp-oauth.keys.json
in the current directory or ~/.gmail-mcp/
~/.gmail-mcp/
~/.gmail-mcp/credentials.json
Note:
- After successful authentication, credentials are stored globally in
~/.gmail-mcp/
and can be used from any directory- Both Desktop app and Web application credentials are supported
- For Web application credentials, make sure to add
http://localhost:3000/oauth2callback
to your authorized redirect URIs
Configure in Claude Desktop:
{ "mcpServers": { "gmail": { "command": "npx", "args": [ "@gongrzhe/server-gmail-autoauth-mcp" ] } } }
If you prefer using Docker:
docker run -i --rm \ --mount type=bind,source=/path/to/gcp-oauth.keys.json,target=/gcp-oauth.keys.json \ -v mcp-gmail:/gmail-server \ -e GMAIL_OAUTH_PATH=/gcp-oauth.keys.json \ -e "GMAIL_CREDENTIALS_PATH=/gmail-server/credentials.json" \ -p 3000:3000 \ mcp/gmail auth
{ "mcpServers": { "gmail": { "command": "docker", "args": [ "run", "-i", "--rm", "-v", "mcp-gmail:/gmail-server", "-e", "GMAIL_CREDENTIALS_PATH=/gmail-server/credentials.json", "mcp/gmail" ] } } }Cloud Server Authentication
For cloud server environments (like n8n), you can specify a custom callback URL during authentication:
npx @gongrzhe/server-gmail-autoauth-mcp auth https://gmail.gongrzhe.com/oauth2callbackSetup Instructions for Cloud Environment
Configure Reverse Proxy:
gmail.gongrzhe.com
) to this portDNS Configuration:
Google Cloud Platform Setup:
https://gmail.gongrzhe.com/oauth2callback
) to the authorized redirect URIs listRun Authentication:
npx @gongrzhe/server-gmail-autoauth-mcp auth https://gmail.gongrzhe.com/oauth2callback
Configure in your application:
{ "mcpServers": { "gmail": { "command": "npx", "args": [ "@gongrzhe/server-gmail-autoauth-mcp" ] } } }
This approach allows authentication flows to work properly in environments where localhost isn't accessible, such as containerized applications or cloud servers.
The server provides the following tools that can be used through Claude Desktop:
1. Send Email (send_email
)
Sends a new email immediately. Supports plain text, HTML, or multipart emails with optional file attachments.
Basic Email:
{ "to": ["recipient@example.com"], "subject": "Meeting Tomorrow", "body": "Hi,\n\nJust a reminder about our meeting tomorrow at 10 AM.\n\nBest regards", "cc": ["cc@example.com"], "bcc": ["bcc@example.com"], "mimeType": "text/plain" }
Email with Attachments:
{ "to": ["recipient@example.com"], "subject": "Project Files", "body": "Hi,\n\nPlease find the project files attached.\n\nBest regards", "attachments": [ "/path/to/document.pdf", "/path/to/spreadsheet.xlsx", "/path/to/presentation.pptx" ] }
HTML Email Example:
{ "to": ["recipient@example.com"], "subject": "Meeting Tomorrow", "mimeType": "text/html", "body": "<html><body><h1>Meeting Reminder</h1><p>Just a reminder about our <b>meeting tomorrow</b> at 10 AM.</p><p>Best regards</p></body></html>" }
Multipart Email Example (HTML + Plain Text):
{ "to": ["recipient@example.com"], "subject": "Meeting Tomorrow", "mimeType": "multipart/alternative", "body": "Hi,\n\nJust a reminder about our meeting tomorrow at 10 AM.\n\nBest regards", "htmlBody": "<html><body><h1>Meeting Reminder</h1><p>Just a reminder about our <b>meeting tomorrow</b> at 10 AM.</p><p>Best regards</p></body></html>" }2. Draft Email (
draft_email
)
Creates a draft email without sending it. Also supports attachments.
{ "to": ["recipient@example.com"], "subject": "Draft Report", "body": "Here's the draft report for your review.", "cc": ["manager@example.com"], "attachments": ["/path/to/draft_report.docx"] }3. Read Email (
read_email
)
Retrieves the content of a specific email by its ID. Now shows enhanced attachment information.
{ "messageId": "182ab45cd67ef" }
Enhanced Response includes attachment details:
Subject: Project Files
From: sender@example.com
To: recipient@example.com
Date: Thu, 19 Jun 2025 10:30:00 -0400
Email body content here...
Attachments (2):
- document.pdf (application/pdf, 245 KB, ID: ANGjdJ9fkTs-i3GCQo5o97f_itG...)
- spreadsheet.xlsx (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, 89 KB, ID: BWHkeL8gkUt-j4HDRp6o98g_juI...)
4. Download Attachment (download_attachment
)
NEW: Downloads email attachments to your local filesystem.
{ "messageId": "182ab45cd67ef", "attachmentId": "ANGjdJ9fkTs-i3GCQo5o97f_itG...", "savePath": "/path/to/downloads", "filename": "downloaded_document.pdf" }
Parameters:
messageId
: The ID of the email containing the attachmentattachmentId
: The attachment ID (shown in enhanced email display)savePath
: Directory to save the file (optional, defaults to current directory)filename
: Custom filename (optional, uses original filename if not provided)search_emails
)
Searches for emails using Gmail search syntax.
{ "query": "from:sender@example.com after:2024/01/01 has:attachment", "maxResults": 10 }6. Modify Email (
modify_email
)
Adds or removes labels from emails (move to different folders, archive, etc.).
{ "messageId": "182ab45cd67ef", "addLabelIds": ["IMPORTANT"], "removeLabelIds": ["INBOX"] }7. Delete Email (
delete_email
)
Permanently deletes an email.
{ "messageId": "182ab45cd67ef" }8. List Email Labels (
list_email_labels
)
Retrieves all available Gmail labels.
9. Create Label (create_label
)
Creates a new Gmail label.
{ "name": "Important Projects", "messageListVisibility": "show", "labelListVisibility": "labelShow" }10. Update Label (
update_label
)
Updates an existing Gmail label.
{ "id": "Label_1234567890", "name": "Urgent Projects", "messageListVisibility": "show", "labelListVisibility": "labelShow" }11. Delete Label (
delete_label
)
Deletes a Gmail label.
{ "id": "Label_1234567890" }12. Get or Create Label (
get_or_create_label
)
Gets an existing label by name or creates it if it doesn't exist.
{ "name": "Project XYZ", "messageListVisibility": "show", "labelListVisibility": "labelShow" }13. Batch Modify Emails (
batch_modify_emails
)
Modifies labels for multiple emails in efficient batches.
{ "messageIds": ["182ab45cd67ef", "182ab45cd67eg", "182ab45cd67eh"], "addLabelIds": ["IMPORTANT"], "removeLabelIds": ["INBOX"], "batchSize": 50 }14. Batch Delete Emails (
batch_delete_emails
)
Permanently deletes multiple emails in efficient batches.
{ "messageIds": ["182ab45cd67ef", "182ab45cd67eg", "182ab45cd67eh"], "batchSize": 50 }14. Create Filter (
create_filter
)
Creates a new Gmail filter with custom criteria and actions.
{ "criteria": { "from": "newsletter@company.com", "hasAttachment": false }, "action": { "addLabelIds": ["Label_Newsletter"], "removeLabelIds": ["INBOX"] } }15. List Filters (
list_filters
)
Retrieves all Gmail filters.
16. Get Filter (get_filter
)
Gets details of a specific Gmail filter.
{ "filterId": "ANe1Bmj1234567890" }17. Delete Filter (
delete_filter
)
Deletes a Gmail filter.
{ "filterId": "ANe1Bmj1234567890" }18. Create Filter from Template (
create_filter_from_template
)
Creates a filter using pre-defined templates for common scenarios.
{ "template": "fromSender", "parameters": { "senderEmail": "notifications@github.com", "labelIds": ["Label_GitHub"], "archive": true } }Filter Management Features
You can create filters based on various criteria:
Criteria Example Descriptionfrom
"sender@example.com"
Emails from a specific sender to
"recipient@example.com"
Emails sent to a specific recipient subject
"Meeting"
Emails with specific text in subject query
"has:attachment"
Gmail search query syntax negatedQuery
"spam"
Text that must NOT be present hasAttachment
true
Emails with attachments size
10485760
Email size in bytes sizeComparison
"larger"
Size comparison (larger
, smaller
)
Filters can perform the following actions:
Action Example DescriptionaddLabelIds
["IMPORTANT", "Label_Work"]
Add labels to matching emails removeLabelIds
["INBOX", "UNREAD"]
Remove labels from matching emails forward
"backup@example.com"
Forward emails to another address
The server includes pre-built templates for common filtering scenarios:
1. From Sender Template (fromSender
)
Filters emails from a specific sender and optionally archives them.
{ "template": "fromSender", "parameters": { "senderEmail": "newsletter@company.com", "labelIds": ["Label_Newsletter"], "archive": true } }2. Subject Filter Template (
withSubject
)
Filters emails with specific subject text and optionally marks as read.
{ "template": "withSubject", "parameters": { "subjectText": "[URGENT]", "labelIds": ["Label_Urgent"], "markAsRead": false } }3. Attachment Filter Template (
withAttachments
)
Filters all emails with attachments.
{ "template": "withAttachments", "parameters": { "labelIds": ["Label_Attachments"] } }4. Large Email Template (
largeEmails
)
Filters emails larger than a specified size.
{ "template": "largeEmails", "parameters": { "sizeInBytes": 10485760, "labelIds": ["Label_Large"] } }5. Content Filter Template (
containingText
)
Filters emails containing specific text and optionally marks as important.
{ "template": "containingText", "parameters": { "searchText": "invoice", "labelIds": ["Label_Finance"], "markImportant": true } }6. Mailing List Template (
mailingList
)
Filters mailing list emails and optionally archives them.
{ "template": "mailingList", "parameters": { "listIdentifier": "dev-team", "labelIds": ["Label_DevTeam"], "archive": true } }
Here are some practical filter examples:
Auto-organize newsletters:
{ "criteria": { "from": "newsletter@company.com" }, "action": { "addLabelIds": ["Label_Newsletter"], "removeLabelIds": ["INBOX"] } }
Handle promotional emails:
{ "criteria": { "query": "unsubscribe OR promotional" }, "action": { "addLabelIds": ["Label_Promotions"], "removeLabelIds": ["INBOX", "UNREAD"] } }
Priority emails from boss:
{ "criteria": { "from": "boss@company.com" }, "action": { "addLabelIds": ["IMPORTANT", "Label_Boss"] } }
Large attachments:
{ "criteria": { "size": 10485760, "sizeComparison": "larger", "hasAttachment": true }, "action": { "addLabelIds": ["Label_LargeFiles"] } }
The search_emails
tool supports Gmail's powerful search operators:
from:
from:john@example.com
Emails from a specific sender to:
to:mary@example.com
Emails sent to a specific recipient subject:
subject:"meeting notes"
Emails with specific text in the subject has:attachment
has:attachment
Emails with attachments after:
after:2024/01/01
Emails received after a date before:
before:2024/02/01
Emails received before a date is:
is:unread
Emails with a specific state label:
label:work
Emails with a specific label
You can combine multiple operators: from:john@example.com after:2024/01/01 has:attachment
The server provides comprehensive attachment functionality:
attachments
array when sending or drafting emailsSupported File Types: All standard file types including PDF, DOCX, XLSX, PPTX, images (PNG, JPG, GIF), archives (ZIP, RAR), and more.
The server intelligently extracts email content from complex MIME structures:
The server fully supports non-ASCII characters in email subjects and content, including:
The server provides a complete set of tools for managing Gmail labels:
Label visibility settings include:
messageListVisibility
: Controls whether the label appears in the message list (show
or hide
)labelListVisibility
: Controls how the label appears in the label list (labelShow
, labelShowIfUnread
, or labelHide
)These label management features enable sophisticated organization of emails directly through Claude, without needing to switch to the Gmail interface.
The server includes efficient batch processing capabilities:
~/.gmail-mcp/
)OAuth Keys Not Found
gcp-oauth.keys.json
is in either your current directory or ~/.gmail-mcp/
Invalid Credentials Format
web
or installed
credentialsPort Already in Use
Batch Operation Failures
Attachment Issues
Contributions are welcome! Please feel free to submit a Pull Request.
The evals package loads an mcp client that then runs the index.ts file, so there is no need to rebuild between tests. You can load environment variables by prefixing the npx command. Full documentation can be found here.
OPENAI_API_KEY=your-key npx mcp-eval src/evals/evals.ts src/index.ts
MIT
If you encounter any issues or have questions, please file an issue on the GitHub repository.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4