by GongRzhe
Provides a Model Context Protocol server that enables AI assistants to send, read, search, and organize Gmail messages, supporting attachments, label and filter management, and automatic OAuth2 authentication.
Enables AI assistants (e.g., Claude Desktop) to interact with a Gmail account through natural‑language commands. The server handles sending, drafting, reading, searching, modifying, deleting emails and offers full attachment support, label and filter management, and batch operations.
npx -y @smithery/cli install @gongrzhe/server-gmail-autoauth-mcp --client claude
) or manually with npm.gcp-oauth.keys.json
in ~/.gmail-mcp/
(global) or the working directory, then run npx @gongrzhe/server-gmail-autoauth-mcp auth
to complete the browser‑based OAuth flow.send_email
, read_email
, search_emails
, list_email_labels
, etc., from the assistant’s prompts.localhost
isn’t reachable.Q: Do I need to expose a public URL for authentication?
A: Only when running in a cloud/containerized environment. Provide a custom callback URL (e.g., https://mydomain.com/oauth2callback
) during auth
.
Q: Where are the OAuth tokens stored?
A: In ~/.gmail-mcp/credentials.json
(global) and are scoped for offline access.
Q: Can I use this server with other AI platforms? A: Yes, any platform that supports MCP can invoke the provided tools.
Q: Is there a size limit for attachments? A: Gmail limits attachments to 25 MB per email; the server enforces this limit.
Q: How does batch processing avoid rate limits? A: The server chunks requests (default batch size = 50) and retries individual failures.
Q: What if port 3000 is already in use? A: Stop the conflicting process or change the port in the server’s configuration before authentication.
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"
]
}
}
}
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/oauth2callback
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:
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>"
}
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"]
}
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...)
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
}
modify_email
)Adds or removes labels from emails (move to different folders, archive, etc.).
{
"messageId": "182ab45cd67ef",
"addLabelIds": ["IMPORTANT"],
"removeLabelIds": ["INBOX"]
}
delete_email
)Permanently deletes an email.
{
"messageId": "182ab45cd67ef"
}
list_email_labels
)Retrieves all available Gmail labels.
{}
create_label
)Creates a new Gmail label.
{
"name": "Important Projects",
"messageListVisibility": "show",
"labelListVisibility": "labelShow"
}
update_label
)Updates an existing Gmail label.
{
"id": "Label_1234567890",
"name": "Urgent Projects",
"messageListVisibility": "show",
"labelListVisibility": "labelShow"
}
delete_label
)Deletes a Gmail label.
{
"id": "Label_1234567890"
}
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"
}
batch_modify_emails
)Modifies labels for multiple emails in efficient batches.
{
"messageIds": ["182ab45cd67ef", "182ab45cd67eg", "182ab45cd67eh"],
"addLabelIds": ["IMPORTANT"],
"removeLabelIds": ["INBOX"],
"batchSize": 50
}
batch_delete_emails
)Permanently deletes multiple emails in efficient batches.
{
"messageIds": ["182ab45cd67ef", "182ab45cd67eg", "182ab45cd67eh"],
"batchSize": 50
}
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"]
}
}
list_filters
)Retrieves all Gmail filters.
{}
get_filter
)Gets details of a specific Gmail filter.
{
"filterId": "ANe1Bmj1234567890"
}
delete_filter
)Deletes a Gmail filter.
{
"filterId": "ANe1Bmj1234567890"
}
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
}
}
You can create filters based on various criteria:
Criteria | Example | Description |
---|---|---|
from |
"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 | Description |
---|---|---|
addLabelIds |
["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:
fromSender
)Filters emails from a specific sender and optionally archives them.
{
"template": "fromSender",
"parameters": {
"senderEmail": "newsletter@company.com",
"labelIds": ["Label_Newsletter"],
"archive": true
}
}
withSubject
)Filters emails with specific subject text and optionally marks as read.
{
"template": "withSubject",
"parameters": {
"subjectText": "[URGENT]",
"labelIds": ["Label_Urgent"],
"markAsRead": false
}
}
withAttachments
)Filters all emails with attachments.
{
"template": "withAttachments",
"parameters": {
"labelIds": ["Label_Attachments"]
}
}
largeEmails
)Filters emails larger than a specified size.
{
"template": "largeEmails",
"parameters": {
"sizeInBytes": 10485760,
"labelIds": ["Label_Large"]
}
}
containingText
)Filters emails containing specific text and optionally marks as important.
{
"template": "containingText",
"parameters": {
"searchText": "invoice",
"labelIds": ["Label_Finance"],
"markImportant": true
}
}
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:
Operator | Example | Description |
---|---|---|
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.
Please log in to share your review and rating for this MCP.
{ "mcpServers": { "gmail": { "command": "npx", "args": [ "@gongrzhe/server-gmail-autoauth-mcp" ] } } }
Explore related MCPs that share similar capabilities and solve comparable challenges
by Skyvern-AI
Automates browser‑based workflows by leveraging large language models and computer‑vision techniques, turning natural‑language prompts into fully functional web interactions without writing custom scripts.
by ahujasid
Enables Claude AI to control Blender for prompt‑assisted 3D modeling, scene creation, and manipulation via a socket‑based Model Context Protocol server.
by PipedreamHQ
Connect APIs quickly with a free, hosted integration platform that enables event‑driven automations across 1,000+ services and supports custom code in Node.js, Python, Go, or Bash.
by grab
Enables Cursor AI to read and programmatically modify Figma designs through a Model Context Protocol integration.
by ahujasid
Enables Claude AI to control Ableton Live in real time, allowing AI‑driven creation, editing, and playback of tracks, clips, instruments, and effects through a socket‑based server.
by leonardsellem
Provides tools and resources to enable AI assistants to manage and execute n8n workflows via natural language commands.
by mario-andreschak
A unified platform that manages AI models, MCP servers, and complex workflows, offering secure key storage, visual flow building, and an interactive chat UI.
by tevonsb
Provides a Model Context Protocol server that exposes Home Assistant functionality through a comprehensive REST and SSE API, enabling natural‑language control of smart‑home devices.
by taazkareem
Provides a Model Context Protocol server that lets AI agents read, create, update, and organize ClickUp tasks, lists, spaces, tags, documents, and members through a unified set of tools.