GMail Manager MCP

Community Productivity

Manage your Gmail inbox in natural language: bulk delete promotions and newsletters, organize labels and get inbox insights.

Install

The installation steps are in the documentation below. Documentation

Documentation

From the project's README on GitHub, refreshed weekly. Links open on GitHub.

Contents
  1. Gmail Manager MCP
  2. ✨ What It Does
  3. 🚀 Quick Setup
  4. 📥 Installation
  5. 💻 Terminal Usage
  6. ⚙️ Configure MCP Client
  7. 🛠️ Available Tools
  8. 🔑 Scopes
  9. 🗄️ Caching
  10. 💬 Example Commands
  11. 🌱 Support & Contributions
  12. 💖 Sponsor

[//]: # (Constants) [license-link]: ../../blob/main/LICENSE [stars-link]: ../../stargazers [vid-link]: https://www.youtube.com/shorts/CCbY_ETwFss [website-link]: https://spark-games.co.uk [coffee-link]: https://buymeacoffee.com/spark88 [bug-link]: ../../issues [release-link]: ../../releases [fork-link]: ../../fork [privacy-link]: ./PRIVACY.md [issues-link]: ../../issues [discord-link]: https://discord.gg/dDnNNXSWJQ

Gmail Manager MCP

🧹 Clean your inbox • 🏷️ Organize with labels • 🗑️ Bulk delete emails

[][issues-link] [][stars-link]

✨ What It Does

Gmail Manager MCP provides direct access to your Gmail inbox through the Model Context Protocol, allowing you to:

| Feature | Description

Find emails by sender, subject, date, or any Gmail query
Get insights about your email patterns and volume
Read the full content of an email
Create and apply labels to categorize emails automatically
Remove old newsletters, notifications, and spam efficiently
List, search, create and update events, RSVP, and find times everyone is free
Attach local files to drafts, download attachments, or file them into Drive

[!IMPORTANT] Upgrading from a version before calendar or Drive support? Google cannot add scopes to a token it has already issued, so your saved credentials keep working for mail while calendar calls and save_attachment_to_drive fail with a permissions error. Enable the Calendar and Drive APIs and add their scopes as below, then re-authenticate once:

npx @spark-apps/gmail-manager-mcp@latest auth

Running a local checkout instead of the published package? Re-authenticate with the build your client actually loads, or you will re-consent against whichever version npm is serving and see the same error:

node /path/to/GMail-Manager-MCP/dist/index.js auth

🚀 Quick Setup

📋 Prerequisites: Get Gmail Credentials 🗝️

🔑 Required before any installation

  1. Create New Project 📁
  2. Enable all three APIs: Gmail 📧, Calendar 📅 and Drive 📁
  3. Create OAuth client ID (Desktop app type) 🔐
  4. Download as gcp-oauth.keys.json 📥
  5. Navigate to Data access → Add or remove scopes → add all three: https://mail.google.com/, https://www.googleapis.com/auth/calendar and https://www.googleapis.com/auth/drive.file 🔓
  6. Navigate to Test users → Add your Google email 👤

📁 Where to put gcp-oauth.keys.json:

For Windows users in WSL:

# Copy from Windows to current directory
cp /mnt/c/Users/YourUsername/gcp-oauth.keys.json ./gcp-oauth.keys.json

General locations:

  • Current directory: ./gcp-oauth.keys.json (works everywhere)
  • Home directory: ~/gcp-oauth.keys.json (for npx usage)
  • Custom path: Set GMAIL_OAUTH_PATH environment variable

📥 Installation

Claude Code, one line, nothing to install first:

claude mcp add gmail-manager -- npx -y @spark-apps/gmail-manager-mcp@latest

Add -s user to make it available in every project instead of just this one.

Then authorise your Google account once:

npx @spark-apps/gmail-manager-mcp@latest auth

That needs an OAuth keys file. See Quick Setup above if you have not made one yet.

📦 Other clients, or a global install

The server runs straight from npm, so npx is enough for any MCP client (see Configure MCP Client for the JSON form):

npx -y @spark-apps/gmail-manager-mcp@latest

Prefer it on your PATH as gmail-manager:

npm i -g @spark-apps/gmail-manager-mcp

🏠 Clone and build locally (Safer 🛡️)

   git clone https://github.com/muammar-yacoob/GMail-Manager-MCP.git
   cd GMail-Manager-MCP
   npm install

💻 Terminal Usage

🖥️ Quick Commands

# Install globally
npm i -g @spark-apps/gmail-manager-mcp

# Setup authentication (run this first)
npx @spark-apps/gmail-manager-mcp@latest auth

# Test MCP server (for debugging)
npx @modelcontextprotocol/inspector npx @spark-apps/gmail-manager-mcp@latest

⚙️ Configure MCP Client

🔧 Required for MCP client integration

Add to your MCP client config file (Claude Desktop example):

  • Windows %APPDATA%\\Claude\\claude_desktop_config.json
  • macOS ~/Library/Application Support/Claude/claude_desktop_config.json
  • Linux ~/.config/Claude/claude_desktop_config.json

📦 For NPM Install:

{
  "mcpServers": {
    "gmail-manager": {
      "command": "npx", "args": ["@spark-apps/gmail-manager-mcp@latest"],
      "env": { "GMAIL_OAUTH_PATH": "C:\\path\\to\\gcp-oauth.keys.json" }
    }
  }
}

For Local Development:

{
  "mcpServers": {
    "gmail-manager": {
      "command": "node", "args": ["C:\\path\\to\\GMail-Manager-MCP\\dist\\index.js"]
    }
  }
}

🛠️ Available Tools

🔧 View All Available Tools

📬 Reading
ToolDescription
search_emailsSearch using Gmail query syntax
read_emailFull content of one email
get_threadEvery message in a conversation, oldest first
🧹 Cleaning up
ToolDescription
trash_emailsMove to Trash, recoverable for 30 days. Prefer this
untrash_emailsPull messages back out of Trash
archive_emailsRemove from inbox, keep everything else
mark_emailsMark read or unread
delete_email / batch_delete_emailsPermanent, bypasses Trash, cannot be undone
🏷️ Labels
ToolDescription
list_labelsList all labels
create_labelCreate a label, or return the existing one if the name is taken
delete_labelDelete a label
apply_label / remove_labelOne message
batch_apply_labels / batch_remove_labelsMany messages, throttled and retried
⚙️ Rules & unsubscribing
ToolDescription
list_filtersFilters (rules) currently on the account
create_filterSet a rule that applies to mail arriving from now on
delete_filterRemove a filter
get_unsubscribe_infoRead a sender's List-Unsubscribe link, without clicking it
unsubscribe_emailOpt out of a mailing list via the sender's own one-click endpoint
✍️ Drafts

Everything here writes to Drafts. Nothing is delivered. See Sending below.

ToolDescription
create_draftCompose to any To/Cc/Bcc with subject, body and attachments. Not tied to a thread
create_replyDraft a threaded reply. Recipient can be overridden with to/cc/bcc
update_draftEdit a draft in place, keeping its ID and URL. Pass only the fields you are changing
delete_draftThrow a draft away, so a superseded version cannot be sent by mistake
list_draftsEvery draft with its ID, recipients, subject and snippet

Three things these do that are worth knowing about:

Every draft reports the recipient Gmail actually stored, read back from the saved message rather than echoed from the request. A wrong address is visible before anyone presses send, which is the only moment it can still be fixed.

A draft addressed only to yourself is called out. create_reply used to answer the From header unconditionally, so replying to your own sent mail resolved the recipient to your own address: the draft looked perfectly correct and would have gone nowhere. Replying to a message you sent now answers its original recipients instead, and says which rule it applied.

update_draft merges rather than replaces. Gmail's API has no partial update, so the underlying call rewrites the whole message; the tool reads the draft first and keeps every field you did not pass, attachments included.

📎 Attachments
ToolDescription
list_attachmentsAttachments on a message, with the IDs needed to fetch them
download_attachmentSave one to a local path. Missing directories are created
save_attachment_to_driveUpload one straight to Google Drive, optionally into a folder

Outgoing attachments are local file paths (~ is expanded), assembled into a proper MIME multipart message and sent base64url-encoded via raw.

Gmail's 25 MB ceiling applies to the encoded message, and base64 adds about a third, so the real limit is roughly 18 MB of actual files. Oversized attachments are refused up front, with the per-file arithmetic, rather than being uploaded and rejected by Google with an opaque 400.

save_attachment_to_drive needs the Drive scope. See Scopes.

📤 Sending

Off by default. This server composes; a human sends. A draft can be read, corrected or thrown away; a sent message cannot, because SMTP has no recall.

To enable delivery, set GMAIL_ENABLE_SEND=1 in the server's environment and restart your MCP client:

"env": { "GMAIL_ENABLE_SEND": "1" }

That adds three tools:

ToolDescription
send_emailCompose and send immediately
send_draftSend an existing draft
resend_emailSend a fresh copy of a sent message (does not recall the original)
📅 Calendar
ToolDescription
list_calendarsCalendars this account can access
list_eventsEvents on a calendar, optionally in a time range
search_eventsFind events by keyword
get_eventOne event in full, including RSVPs
create_eventCreate an event, optionally with Meet link and guests
update_eventChange an event; only the fields you pass are altered
delete_eventDelete an event
respond_to_eventRSVP as yourself
suggest_timeFind slots where everyone is free, via free/busy
🔐 Auth
ToolDescription
authenticate_gmailAuthenticate via browser. Covers Gmail, Calendar and Drive

🔑 Scopes

ScopeWhy
https://mail.google.com/Read, label, draft, trash and permanently delete mail
https://www.googleapis.com/auth/calendarCalendar tools
https://www.googleapis.com/auth/drive.filesave_attachment_to_drive

Drive is requested as drive.file, not the full drive scope: it grants rights over the files this app creates and nothing else, so the server cannot read, list or alter anything already in your Drive.

The trade-off is worth knowing. Because the app never gains rights over folders it did not create, passing a folderId for a folder you made in the Drive web UI can come back as "not found" even though it plainly exists. When that happens the file is uploaded to My Drive instead and the result says so, rather than the upload being lost.

Changing this list invalidates existing credentials. Google will not add scopes to a refresh token it has already issued, so a token predating a scope keeps working for everything else while the new feature returns a bare 403. The tools detect that case and tell you to re-run authentication:

npx @spark-apps/gmail-manager-mcp@latest auth

🗄️ Caching

Mail is cached locally so the same message is not downloaded twice, but never at the expense of being current. Gmail hands out a mailbox-wide historyId and a feed of what changed since any earlier value of it, so this server validates its cache against Gmail rather than expiring it on a timer:

  • Nothing has changed: the cached answer is provably still exact, and a repeated search costs a single request instead of one per result.
  • Something has changed: the list of matching messages is always re-fetched, so new mail, sent mail and anything relabelled show up immediately. Only the per-message headers and bodies are reused, which is safe because Gmail does not let the content of a delivered message change.

There is no staleness window to tune: a message that arrives between two searches appears in the second one.

VariableDefaultEffect
GMAIL_CACHEfullfull keeps the cache in ~/.gmail-mcp/cache/ (owner-only), memory keeps it in RAM for the life of the process, off disables it
GMAIL_CACHE_MAX_MESSAGES2000Messages held before the least recently used are dropped
GMAIL_CACHE_MAX_THREADS300Conversations held
GMAIL_CACHE_MAX_QUERIES200Search results remembered
"env": { "GMAIL_CACHE": "memory" }

Set GMAIL_CACHE=memory on a shared machine if you would rather no mail content touched the disk. The cache is dropped automatically when you authenticate as a different account, and deleting ~/.gmail-mcp/cache/ clears it by hand.

💬 Example Commands

🧹 Quick Cleanup

  • "Delete all promotional emails from last 30 days"
  • "Delete all unread newsletters older than 1 week"
  • "Delete all 'no-reply' emails from last 3 months"
  • "Delete all LinkedIn notification emails"
  • "Delete all password reset emails older than 1 month"
  • "Delete redundant email chains where I'm CC'd"

⚡ Smart Actions

  • "Summarize email with subject: 'last boring meeting'"
  • "Summarize all emails about 'project deadline'"
  • "Reply to email about 'project update' saying 'Got it, thanks!'"
  • "Label all emails from my bank as 'Finance'"
  • "Create 'Travel' label and move all booking confirmations"
  • "Find emails with attachments larger than 5MB"

📊 Inbox Insights

  • "Show me who sends me the most emails"
  • "Find all unread emails older than 1 week"
  • "Show my busiest email days this month"
  • "Find emails I starred but never replied to"

📅 Calendar

  • "What's on my calendar this week?"
  • "Find a 45-minute slot next week when Sam and I are both free, weekdays 9-5"
  • "Move Thursday's standup to 10am and add a Meet link"
  • "Decline the Friday review, comment that I'm on leave"
  • "Search my calendar for anything about the tax deadline"

🛡️ Rules & Unsubscribing

  • "Show me the rules currently on my account"
  • "Rule: anything from noreply@ skips the inbox and gets labelled Noise"
  • "Get the unsubscribe link for this sender so I can check it before clicking"
  • "Unsubscribe me from this newsletter"

Unsubscribing uses the sender's own published opt-out. Where they support one-click (RFC 8058) it completes on its own; where the only route is emailing them, it asks first, since that sends mail from your account. A plain link with no one-click declaration is handed back for you to open. Arbitrary URLs found in mail are never visited, and no response body from a sender is ever read back into the conversation.


🌱 Support & Contributions

⭐ Star the repo & I power up like Mario 🍄
☕ Devs run on coffee - [Buy me one?][coffee-link]
💰 Crypto tips welcome - Tip in crypto
🤝 Contributions are welcome - [🍴 Fork][fork-link], improve, PR!
🎥 Need help? [Setup Tutorial][vid-link] • [Join Discord][discord-link]

💖 Sponsor

Your support helps maintain and improve the tool. please consider [sponsoring the project][stars-link].


Made with ❤️ for MCP • Privacy Policy • Terms of Service

Frequently asked questions

What is GMail Manager MCP?

Manage your Gmail inbox in natural language: bulk delete promotions and newsletters, organize labels and get inbox insights.

How do I install GMail Manager MCP?

Follow the installation steps in its documentation, shown on this page and in its repository.

Is GMail Manager MCP open source?

Yes. Its code is on GitHub under the MIT license.

Who maintains GMail Manager MCP?

It is published by muammar-yacoob. AI.tn lists it but does not maintain or endorse it.

From the community awesome-mcp-servers lists and the project's GitHub repository. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.