Gmail MCP Server (Actively Maintained Fork)
MCP serverCommunicationGive your AI access to your Gmail so it can work with your email as part of a conversation. Once added, it connects to your Gmail account and signs in automatically, so you don't have to handle login steps yourself. It's a lightweight way to bring your inbox into your AI's abilities.
Unavailable. This server has no hosted endpoint yet, so Ahel can't serve it.
Add to setup to save this item as a reference. Ahel cannot run it, and signing in will not install it.
What your AI can do with it
- Connect your AI to your Gmail account
- Sign in to Gmail automatically, with no manual login steps
- Work with your Gmail messages during a conversation
Getting started
- Save this item in Your setup as a reference.
- Read the source or reference documentation for its setup requirements. Saving it here does not connect it to your AI.
- Check this page for availability before trying to install it through Ahel.
From the project's README
As published by artymclabin/gmail-mcp-server in README.md.
Installation: npx @artymclabin/gmail-mcp auth - or just tell your Claude to install the MCP from this repo (https://github.com/ArtyMcLabin/Gmail-MCP-Server) and let it set up. Prefer manual steps? See Installation & Authentication.
Also on the official MCP Registry (io.github.ArtyMcLabin/Gmail-MCP-Server) and Smithery.
This is an actively maintained fork of GongRzhe/Gmail-MCP-Server.
The original repository has been unmaintained since August 2025 - 7+ months with zero maintainer activity and 72+ unmerged pull requests. I use this MCP server daily as part of my Claude Code workflow and depend on it working correctly, so I picked it up.
Pull requests are welcome. If you've been sitting on fixes or features with nowhere to submit them, this is the place.
Philosophy
This fork is lean and pragmatic. It's a local stdio MCP server - you run it on your own machine, and your LLM client already has shell + filesystem access. So the threat model is "don't leak credentials to third parties, don't break the Gmail surface" - not "defend a hosted multi-tenant service". I keep dependencies minimal. I use this daily in my own Claude Code workflow - if I wouldn't run it or maintain it myself, it doesn't go in.
There's a downstream fork that took this in the maximalist direction. I'm not affiliated with its maintainer and I don't track its security or features - use it at your own risk: klodr/gmail-mcp. If that's the philosophy you want, go check it out. PRs welcome here as always.
What this fork adds
- Fixed reply threading - auto-resolves
In-Reply-ToandReferencesheaders so email replies land in the correct thread instead of creating orphaned messages (upstream PR #91, still pending) - Send-as alias support - optional
fromparameter for multi-identity email management (send from any configured Gmail alias) - Reply-all tool -
reply_allautomatically fetches the original email, builds To/CC recipient lists (excluding yourself), and sets proper threading headers (PR #3 by @MaxGhenis) - Fixed
list_filters- was returning empty array due to wrong response property name (PR #4 by @nicholas-anthony-ai) - Custom OAuth2 scoping -
--scopesflag to request only the permissions you need, with automatic tool filtering (PR #6 by @tansanDOTeth) - CI/CD hardening - fixed shell injection vector in GitHub Actions workflow, added least-privilege permissions scope (PR #9 by @JF10R)
- Security hardening - fixed path traversal in attachment download, restricted OAuth credential file permissions (PR #10 by @JF10R)
- Dependency security - upgraded MCP SDK to v1.27.1 (3 CVE fixes), upgraded nodemailer (DoS + routing fix), moved dev-only packages out of production deps (PR #11 by @JF10R)
- Thread-level tools -
get_thread,list_inbox_threads,get_inbox_with_threads,modify_threadfor efficient thread-based email operations in a single call - CC/BCC visibility -
read_emailnow shows CC and BCC headers when present (PR #21 by @panghy) - Phishing report tools -
report_phishingandbatch_report_phishingfor marking messages as spam via the Gmail API (PR #24 by @ShivamB25) - Draft lifecycle tools -
send_draft,delete_draft,update_draftclose the orphan-draft gap:send_draftatomically sends an existing draft and removes it from Drafts (no ghost copy);update_draftmutates a draft in place preserving its ID (no draft pile-up across iteration loops);delete_draftdiscards an abandoned draft (PR #30 by @thisisambros) - Tool annotations - MCP spec annotations (
readOnlyHint,destructiveHint,idempotentHint) on all tools for safer LLM tool execution (PR #14 by @bryankthompson) - Download email tool -
download_emailsaves emails to disk in json/eml/txt/html formats without consuming LLM context (PR #13 by @icanhasjonas) - Durable OAuth sessions -
refresh_tokenis persisted across restarts, ending the hourly re-auth loop (PR #35 by @BrentBaccala) - Custom OAuth callback port - the auth listener derives port and path from your callback URL instead of hardcoding 3000 (PR #41 by @soapergem)
- Safe permanent-delete gating -
delete_email/batch_delete_emailsrequire the opt-ingmail.fullscope (which also satisfies all other mail scopes), so default auth stays least-privilege (PR #39 by @caioribeiroclw-pixel)
All features are production-tested in daily use.
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.
Features
- Send emails with subject, content, attachments, and recipients
- Full attachment support - send and receive file attachments
- Download email attachments to local filesystem
- Download full emails to files in json/eml/txt/html formats
- Thread-level operations - get full threads, list inbox threads, batch-expand threads
- Support for HTML emails and multipart messages with both HTML and plain text versions
- Full support for international characters in subject lines and email content
- Read email messages by ID with advanced MIME structure handling
- Enhanced attachment display showing filenames, types, sizes, and download IDs
- Search emails with various criteria (subject, sender, date range)
- Comprehensive label management with ability to create, update, delete and list labels
- List all available Gmail labels (system and user-defined)
- List emails in inbox, sent, or custom labels
- Mark emails as read/unread
- Move emails to different labels/folders
- Delete emails
- Batch operations for efficiently processing multiple emails at once
- Full integration with Gmail API
- Simple OAuth2 authentication flow with auto browser launch
- Support for both Desktop and Web application credentials
- Global credential storage for convenience
Installation & Authentication
Installing from npm (recommended)
npx @artymclabin/gmail-mcp auth
Installing from source
git clone https://github.com/ArtyMcLabin/Gmail-MCP-Server.git
cd Gmail-MCP-Server
npm install
npm run build
Note: The
npx @gongrzhe/server-gmail-autoauth-mcpcommands found in older docs reference the unmaintained upstream fork. This fork is published as@artymclabin/gmail-mcp.
Setting up Google Cloud credentials
-
Create a Google Cloud Project and obtain credentials:
a. Create a Google Cloud Project:
- Go to Google Cloud Console
- Create a new project or select an existing one
- Enable the Gmail API for your project
b. Create OAuth 2.0 Credentials:
- Go to "APIs & Services" > "Credentials"
- Click "Create Credentials" > "OAuth client ID"
- Choose either "Desktop app" or "Web application" as application type
- Give it a name and click "Create"
- For Web application, add
http://localhost:3000/oauth2callbackto the authorized redirect URIs - Download the JSON file of your client's OAuth keys
- Rename the key file to
gcp-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 node dist/index.js authb. Local Authentication:
# Place gcp-oauth.keys.json in your current directory # The file will be automatically copied to global config node dist/index.js authThe authentication process will:
- Look for
gcp-oauth.keys.jsonin the current directory or~/.gmail-mcp/ - If found in current directory, copy it to
~/.gmail-mcp/ - Open your default browser for Google authentication
- Save credentials as
~/.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/oauth2callbackto your authorized redirect URIs
Custom callback URL / port: By default the local OAuth server listens on port
3000at/oauth2callback. If port 3000 is unavailable, or you need a different redirect URI, pass a full callback URL as an argument. The listener automatically binds to the port and path from that URL:node dist/index.js auth http://localhost:8080/oauth2callbackThe URL you pass must exactly match one of the authorized redirect URIs registered in the Google Cloud Console.
- Look for
-
Configure in Claude Desktop:
{
"mcpServers": {
"gmail": {
"command": "node",
"args": [
"/absolute/path/to/Gmail-MCP-Server/dist/index.js"
]
}
}
}
Docker Support
If you prefer using Docker:
- Authentication:
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
- Usage:
{
"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:
node dist/index.js auth https://gmail.gongrzhe.com/oauth2callback
Setup Instructions for Cloud Environment
-
Configure Reverse Proxy:
- Set up your n8n container to expose a port for authentication
- Configure a reverse proxy to forward traffic from your domain (e.g.,
gmail.gongrzhe.com) to this port
-
DNS Configuration:
- Add an A record in your DNS settings to resolve your domain to your cloud server's IP address
-
Google Cloud Platform Setup:
- In your Google Cloud Console, add your custom domain callback URL (e.g.,
https://gmail.gongrzhe.com/oauth2callback) to the authorized redirect URIs list
- In your Google Cloud Console, add your custom domain callback URL (e.g.,
-
Run Authentication:
node dist/index.js auth https://gmail.gongrzhe.com/oauth2callback -
Configure in your application:
{ "mcpServers": { "gmail": { "command": "node", "args": [ "/absolute/path/to/Gmail-MCP-Server/dist/index.js" ] } } }
This approach allows authentication flows to work properly in environments where localhost isn't accessible, such as containerized applications or cloud servers.
OAuth Scopes
You can limit the server's Gmail access by specifying OAuth scopes during authentication. This controls which tools are available to the LLM, reducing the attack surface for sensitive operations.
Available Scopes
| Scope | Description |
|---|---|
gmail.readonly | Read-only access to emails (search, read, download attachments) |
gmail.modify | Full read/write access to emails (superset of readonly - includes sending, modifying, deleting) |
gmail.compose | Create drafts and send emails only |
gmail.send | Send emails only |
gmail.labels | Manage labels only |
gmail.settings.basic | Manage filters and settings |
Note:
gmail.modifyis a superset that includes all read capabilities. You don't needgmail.readonlyif you havegmail.modify.
Authenticating with Specific Scopes
Use the --scopes flag to request only the permissions you need:
# Read-only access (recommended for safe browsing)
node dist/index.js auth --scopes=gmail.readonly
# Read-only with filter management
node dist/index.js auth --scopes=gmail.readonly,gmail.settings.basic
# Full access (default behavior)
node dist/index.js auth --scopes=gmail.modify,gmail.settings.basic
If no --scopes flag is provided, the server defaults to gmail.modify,gmail.settings.basic for full functionality.
Scope-to-Tool Mapping
The server automatically filters available tools based on your authorized scopes:
| Tools | Required Scope (any) |
|---|---|
read_email, search_emails, download_attachment | gmail.readonly or gmail.modify |
list_email_labels | gmail.readonly, gmail.modify, or gmail.labels |
send_email, draft_email, reply_all, send_draft | gmail.modify, gmail.compose, or gmail.send |
delete_draft, update_draft | gmail.modify or gmail.compose |
modify_email, batch_modify_emails, modify_thread, report_phishing, batch_report_phishing | gmail.modify |
delete_email, batch_delete_emails | gmail.full (https://mail.google.com/) |
create_label, update_label, delete_label, get_or_create_label | gmail.modify or gmail.labels |
list_filters, get_filter, create_filter, delete_filter, create_filter_from_template | gmail.settings.basic |
gmail.full is intentionally separate from the default scopes because it grants permanent-delete capability. Prefer modify_email / batch_modify_emails for archive, mark-read, label, or inbox cleanup flows; re-authenticate with --scopes=gmail.full,gmail.settings.basic only when the assistant should be able to permanently delete mail. gmail.full is a superset of the other mail scopes, so that combination keeps every read/send/modify/label tool available (settings scopes remain separate - Gmail's filter endpoints only accept gmail.settings.*).
Re-authenticating
To change your scopes, simply run the auth command again with different scopes. This will replace your existing credentials.
Claude Code CLI Configuration
To use this MCP server with Claude Code, add it to your MCP settings.
Read-Only Configuration (Recommended for Safe Browsing)
First, authenticate with read-only scope:
node dist/index.js auth --scopes=gmail.readonly
Then add to your Claude Code MCP settings (~/.claude/mcp_settings.json or project-level .mcp.json):
{
"mcpServers": {
"gmail": {
"command": "npx",
"args": ["/absolute/path/to/Gmail-MCP-Server/dist/index.js"]
}
}
}
With read-only scopes, only these 4 tools will be available to Claude:
read_email- Read email contentsearch_emails- Search your inboxlist_email_labels- List available labelsdownload_attachment- Download attachments
Full Access Configuration
For full Gmail management capabilities:
node dist/index.js auth --scopes=gmail.modify,gmail.settings.basic
{
"mcpServers": {
"gmail": {
"command": "npx",
"args": ["/absolute/path/to/Gmail-MCP-Server/dist/index.js"]
}
}
}
This enables all 23 tools including sending emails, managing labels, creating filters, reply-all, thread operations, phishing reports, and batch operations.
Running multiple instances (tool-name prefix)
Some MCP clients dedupe tool entries by their base name across servers, which makes it impossible to run two instances of this server side-by-side (e.g. one for a personal account and one for a shared inbox) - only one instance's tools surface, even though both servers report as connected.
The server accepts an optional --tool-prefix=<value> CLI flag (or GMAIL_MCP_TOOL_PREFIX env var) that is prepended to every tool name at registration. Default is empty (fully backward-compatible).
Example: register two instances with distinct prefixes in Claude Code:
# Personal account
claude mcp add gmail-personal -s user \
-e GMAIL_CREDENTIALS_PATH=$HOME/.gmail-mcp/credentials-personal.json \
-- node /absolute/path/to/Gmail-MCP-Server/dist/index.js --tool-prefix=personal_
# Shared inbox
claude mcp add gmail-info -s user \
-- node /absolute/path/to/Gmail-MCP-Server/dist/index.js --tool-prefix=info_
Tools then surface as mcp__gmail-personal__personal_search_emails, mcp__gmail-info__info_search_emails, etc. - distinct at every layer. The dispatch handler strips the prefix and looks up the resolved name via getToolByName; only strips when the result is a known tool (so a prefix value that overlaps a real tool name cannot cause silent mis-dispatch).
The auth subcommand runs before the server starts and is unaffected - invoke it without --tool-prefix.
Available Tools
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 and inline images.
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>"
}
Inline Images (embedded in HTML):
Embed images inside the HTML body so they render in place, instead of arriving as separate attachments. Reference each image from htmlBody by its cid, and supply it as a file path or base64 content. Works the same way on draft_email, update_draft, and reply_all.
{
"to": ["recipient@example.com"],
"subject": "Quarterly Report",
"body": "Revenue is up. See the chart below.",
"htmlBody": "<p>Revenue is up:</p><img src=\"cid:chart1\">",
"inlineImages": [
{ "cid": "chart1", "path": "/path/to/chart.png" }
]
}
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 CC/BCC headers (when present) and attachment details:
Subject: Project Files
From: sender@example.com
To: recipient@example.com
CC: colleague@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)
5. Search Emails (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. This tool requires gmail.full (https://mail.google.com/); the default gmail.modify scope is not enough for Gmail's permanent-delete endpoint.
{
"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"
}
Shortened here. Read the whole README on GitHub.
Signals
- GitHub stars
- 246
- Forks
- 61
- Last commit
- Oct 2026
- Weekly downloads
- 241
- Weekly_downloads
- 483 weekly_downloads
Ahel review
S4info
community integration, published by artymclabin, not gmail
Automated review, not a security audit. Ruleset v1.
Advanced
- Delivery
- Gmail-MCP-Server MCP server → your Ahel connector (mcp.ahel.ai) → your AI.
- Item type
- mcp-server
- Key
io-github-artymclabin-gmail-mcp-server- Source
- github.com/artymclabin/gmail-mcp-server
github.com/artymclabin/gmail-mcp-server
More in Communication
MCP server · builderio
More in Communicationpalisade
MCP server · palisadeemail
More in Communicationagent-native-brain
MCP server · builderio
More in Communicationqr-generator
MCP server · modelcontextprotocol
More in Communicationshipmail-mcp
MCP server · shipmail-to
More in Communicationagentphone
MCP server · agentphone-ai
More in Communication