Skip to main content
Glama
multi-gmail-mcp

multi-gmail-mcp

by japan08

multi-gmail-mcp

Multi-account Gmail MCP server for Claude Desktop, Cursor, and other MCP hosts.

It lets your assistant:

  • connect one or more Gmail accounts

  • scan the inbox with lightweight list mode (metadata only)

  • load one full thread at a time with get_thread (plain or quote-stripped bodies)

  • draft replies from real message text (not Gmail snippets)

  • send replies (send) or new outbound mail (send_new), including HTML bodies

  • save drafts to Gmail

  • send only after explicit approval

  • manage follow-up reminders for email threads

Safety rule: nothing is ever sent automatically. send, send_new, and followup_send must only be called after human approval.


What This MCP Does

This server is thread-first, not message-first, and metadata-first for inbox triage.

  • multi_gmail_fetch with mode=list (default) returns small per-thread metadata — snippets are not full emails

  • for each thread you care about, call multi_gmail_get_thread once — never load many full threads in one LLM context

  • multi_gmail_get_thread returns a chronological transcript (format, stripped, latestN)

  • multi_gmail_send sends an approved reply (messageId required); multi_gmail_send_new starts a new thread (standalone outbound mail)

  • outbound tools support format: text/plain (default) or text/html (pricing tables, CTAs)

  • legacy mode=full on fetch still batch-loads and auto-drafts (token-heavy — avoid for normal inbox review)

  • multi_gmail_followup_due refreshes the thread before showing a due follow-up

This project is designed for setups where one person may handle:

  • multiple Gmail accounts

  • multiple chats against one MCP server session

  • inbox review plus follow-up workflows in the same toolset


Related MCP server: @striderlabs/mcp-gmail

Requirements

  • Node.js 18+

  • a Gmail account

  • Claude Desktop, Cursor, or another MCP-compatible host

  • a Google Cloud project with Gmail API enabled

Check Node:

node --version

Install

npm install -g @nitsantechnologies/multi-gmail-mcp
mkdir -p ~/.multi-gmail-mcp

Set this env var anywhere you run the server or auth command:

export MULTI_GMAIL_MCP_HOME="$HOME/.multi-gmail-mcp"

Useful commands:

multi-gmail-mcp
multi-gmail-mcp-auth

Local development from git still works:

git clone https://github.com/nitsan-ai/Multi-Gmail-MCP.git
cd Multi-Gmail-MCP
npm install
npm start
npm run auth

Google OAuth Setup

  1. Open Google Cloud Console

  2. Create or select a project

  3. Enable Gmail API

  4. Go to APIs & Services -> Credentials

  5. Create OAuth client ID

  6. Choose Desktop app

  7. Download the JSON file

  8. Save it in your config home as:

~/.multi-gmail-mcp/credentials.json

Set a different location with MULTI_GMAIL_MCP_HOME. For local git development, project root still works by default.

OAuth scopes used by this MCP:

  • https://www.googleapis.com/auth/gmail.readonly

  • https://www.googleapis.com/auth/gmail.modify

  • https://www.googleapis.com/auth/gmail.send

  • https://www.googleapis.com/auth/gmail.settings.basic (Gmail signature on send/draft)

After upgrading: re-authenticate every connected account once so tokens include gmail.settings.basic (required for automatic signature appending on send, set_draft, and followup_send):

MULTI_GMAIL_MCP_HOME="$HOME/.multi-gmail-mcp" multi-gmail-mcp-auth --alias <your-alias>

Then reconnect in your MCP client (connect + connect_finish).


Local Account Auth

Authenticate the first Gmail account:

MULTI_GMAIL_MCP_HOME="$HOME/.multi-gmail-mcp" multi-gmail-mcp-auth

Add another account with an alias:

MULTI_GMAIL_MCP_HOME="$HOME/.multi-gmail-mcp" multi-gmail-mcp-auth --alias work

Notes:

  • token files are saved under $MULTI_GMAIL_MCP_HOME/accounts/

  • each alias gets its own token JSON

  • --account is accepted as a synonym for --alias


Connect to Claude Desktop

Edit:

~/Library/Application Support/Claude/claude_desktop_config.json

Example:

{
  "mcpServers": {
    "multi-gmail-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@nitsantechnologies/multi-gmail-mcp"
      ],
      "env": {
        "MULTI_GMAIL_MCP_HOME": "/Users/you/.multi-gmail-mcp"
      }
    }
  }
}

Replace /Users/you/.multi-gmail-mcp with your real path.

After saving:

  • fully quit Claude Desktop

  • reopen Claude Desktop


Connect to Cursor

Open Cursor Settings -> MCP -> Add server and use:

{
  "multi-gmail-mcp": {
    "command": "npx",
    "args": [
      "-y",
      "@nitsantechnologies/multi-gmail-mcp"
    ],
    "env": {
      "MULTI_GMAIL_MCP_HOME": "/Users/you/.multi-gmail-mcp"
    }
  }
}

Replace /Users/you/.multi-gmail-mcp with your real path.


First-Time Flow Inside Claude or Cursor

Run this once per account:

  1. multi_gmail_status

  2. multi_gmail_connect with Connect you@example.com personal

  3. multi_gmail_connect_finish

  4. multi_gmail_set_signer

  5. multi_gmail_fetch with mode="list"

  6. multi_gmail_get_thread for each thread you will read or reply to

  7. review drafts

  8. use multi_gmail_send (reply) or multi_gmail_send_new (new outbound) only after approval

Typical signer example:

Set signer name to Jane Smith

Daily Workflow

Ask:

Fetch my inbox with mode list, then get_thread for threads I need to reply to

Step 1 — triage (small payload):

{ "mode": "list", "maxResults": 10 }

You get per thread: threadId, latestMessageId, subject, participants, date, direction, snippet (preview only).

Step 2 — full bodies (one thread per call):

{
  "threadId": "<from fetch>",
  "format": "full",
  "stripped": false
}
  • stripped=false (default) — full plain-text body per message (best for reading mail)

  • stripped=true — quote/signature-stripped text (best when drafting in long threads)

  • format=latest + latestN — first message + last N messages, with omission markers

Present message.text verbatim to the user — do not summarize snippets or bodies.

Step 3 — draft and send:

  • Reply in an existing thread → multi_gmail_send with messageId from fetch / get_thread

  • New outbound email → multi_gmail_send_new (no messageId)

Optional: mode=full on fetch still auto-drafts every thread in one batch (legacy; can cause token overflow).

With mode=list, follow-up-labeled threads are excluded from normal inbox review. Optional markdown export is written unless writeMarkdownFile: false. Nothing is sent until you approve.

After review, per item you can:

  • send or send_new

  • set_draft

  • edit

  • cancel / skip

Follow-up review

Ask:

Show due follow-ups

What happens:

  • due reminders are loaded

  • the thread is refreshed from Gmail first

  • if the recipient already replied, the reminder is resolved automatically

  • otherwise a fresh follow-up draft is shown


Tool Reference

The MCP registers both prefixed and unprefixed names:

  • multi_gmail_fetch and fetch

  • multi_gmail_followup_due and followup_due

  • etc.

In practice, most hosts will show the multi_gmail_* names.

Setup and status tools

multi_gmail_help

Shows the first-time setup flow.

Input: none

multi_gmail_status

Shows:

  • connected account

  • signer status

  • due follow-ups

  • last inbox batch

  • useful local paths

Input:

  • accountAlias optional

  • chatScope optional

multi_gmail_connect

Starts Gmail login for one account and opens the browser.

Input:

  • command required

Format:

Connect you@example.com personal
Connect you@example.com work

multi_gmail_connect_finish

Completes the login started by connect.

Input:

  • code optional

  • pendingAlias optional

  • chatScope optional

Normally you do not need to paste the code manually; the local callback server completes it.

multi_gmail_accounts

Lists all saved local account aliases.

Input: none

multi_gmail_set_signer

Stores the display name used in draft replies for the current session.

Input:

  • name required

  • followUpLabel optional

  • accountAlias optional

  • chatScope optional

multi_gmail_set_mode

Switches response mode for the current chat scope.

Input:

  • mode required: standard or compact

multi_gmail_diagnostics

Checks:

  • credentials file

  • accounts directory

  • reminder store

  • active account binding

Input:

  • accountAlias optional

  • chatScope optional

multi_gmail_setup_labels

Ensures the configured Gmail labels exist.

Useful if labels do not appear after connect or fetch.

Input:

  • accountAlias optional

  • chatScope optional


Inbox and thread tools

multi_gmail_fetch

Lists inbox threads for triage, or (legacy) batch-loads full threads and auto-drafts replies.

Recommended: mode=list (default), then get_thread per selected thread.

mode

Behavior

list (default)

Metadata only: threadId, latestMessageId, subject, participants, snippet, dates, direction. Snippets are not full emails.

full

Legacy: loads full bodies and drafts every thread in one call — token-heavy; avoid for normal inbox review.

Important behavior:

  • maxResults means unique inbox threads

  • list returns messageId / threadId for send and get_thread

  • includeLatestBody (list only): optional latest-message plain body per thread, capped at 15 threads — still prefer get_thread for one thread

  • Response includes gmailListQuery — the exact Gmail q string sent to the API

queryMode

Behavior

inbox (default)

Prepends inbox review filters (in:inbox, excludes follow-up label)

raw

Passes query directly to Gmail — use for sent mail, archives, all-mail, date filters

Input:

  • mode optional: list or full, default list

  • maxResults optional, default 20, max 100

  • query optional Gmail search string (combined with inbox filters when queryMode=inbox)

  • queryMode optional: inbox or raw, default inbox

  • includeLatestBody optional, default false (list mode only)

  • saveGmailDrafts optional, default false (mainly full mode)

  • writeMarkdownFile optional, default true (full mode / review export)

  • accountAlias optional

  • chatScope optional

Examples:

{
  "mode": "list",
  "maxResults": 10
}
{
  "mode": "list",
  "maxResults": 15,
  "query": "newer_than:7d"
}

Sent-mail / historical analysis (raw Gmail query):

{
  "mode": "list",
  "queryMode": "raw",
  "query": "in:sent after:2026/01/01 before:2026/04/01",
  "maxResults": 50
}

Legacy batch mode (avoid for daily triage):

{
  "mode": "full",
  "maxResults": 5,
  "writeMarkdownFile": false
}

multi_gmail_send

Sends one approved reply in an existing thread. Marks the source message read and returns IDs for follow-up threading.

For new outbound mail (no source message), use multi_gmail_send_new instead.

Input:

  • messageId required — from fetch or get_thread

  • to required

  • subject required

  • body required unless legacy html is set

  • format optional: text/plain (default) or text/html — when text/html, body is the HTML part (plain part auto-generated)

  • html optional — legacy HTML part (prefer format + body)

  • cc / bcc optional — single email, comma-separated string, array, or Name <email@example.com> (multiple recipients)

  • quoteOriginal optional, default true — append Gmail-style quoted parent history below your new body (false = new body only)

  • accountAlias optional

  • chatScope optional

Response includes: sentMessageId, threadId, isNewThread: false, markedReadMessageId.

Example (plain reply):

{
  "messageId": "19e90840fbfd1961",
  "to": "recipient@example.com",
  "subject": "Re: Pricing",
  "body": "Thanks — here is the updated quote."
}

multi_gmail_send_new

Sends one approved new email. Use for standalone outbound mail or follow-ups in the same thread.

Input:

  • to required

  • threadId optional — from a prior send_new response; adds this message to that Gmail thread (follow-up in same thread)

  • subject required — Unicode (–, ü, €, etc.) is RFC 2047–encoded automatically

  • body required unless legacy htmlBody is set

  • format optional: text/plain (default) or text/html

  • htmlBody optional — legacy HTML (prefer format + body)

  • cc optional

  • bcc optional

  • accountAlias optional

  • chatScope optional

Response includes: sentMessageId, threadId, isNewThread: true — store threadId for phase-2 threading.

Example (HTML outbound):

{
  "to": "recipient@example.com",
  "subject": "Product — pricing overview",
  "format": "text/html",
  "body": "<h1>Hello</h1><p>See the <a href=\"https://example.com/pricing\">pricing table</a>.</p>"
}

multi_gmail_set_draft

Creates or updates a Gmail draft reply without sending.

Input:

  • messageId required

  • to required

  • subject required

  • body required unless legacy html is set

  • format optional: text/plain (default) or text/html

  • html optional — legacy HTML part

  • cc / bcc optional — comma-separated string, array, or Name <email@example.com>

  • quoteOriginal optional, default true — append quoted parent history (Gmail ··· expander)

  • accountAlias optional

  • chatScope optional

multi_gmail_get_thread

Loads one Gmail thread as an ordered transcript. Call after fetch mode=list when you need real message bodies.

format

Behavior

full (default)

All messages with bodies

latest

First message + latest latestN messages; middle messages collapsed with [N earlier messages omitted]

metadata

Headers/dates only — no bodies

Body options (when format is not metadata):

  • stripped default false — full plain-text per message

  • stripped=true — removes quoted reply history and signatures (drafting in long threads)

  • includeRaw=true — adds rawText alongside stripped text for debugging

Input:

  • threadId required — from fetch, followup_due, or archive

  • format optional: metadata, latest, or full (default full)

  • latestN optional, default 5, max 50 (when format=latest)

  • stripped optional, default false

  • includeRaw optional, default false

  • accountAlias optional

  • chatScope optional

Example (read full mail):

{
  "threadId": "19e913bf5e640ea2",
  "format": "full",
  "stripped": false
}

Example (draft in a long thread):

{
  "threadId": "19e913bf5e640ea2",
  "format": "full",
  "stripped": true
}

multi_gmail_archive

Archives one thread by removing the INBOX label.

Input:

  • threadId required

  • accountAlias optional

  • chatScope optional

multi_gmail_fetch_drafts

Lists messages in Gmail Drafts.

Input:

  • maxResults optional

  • accountAlias optional

  • chatScope optional

multi_gmail_fetch_sent (deprecated)

Lists the latest messages in Gmail Sent without query filters.

Prefer multi_gmail_fetch with queryMode=raw and a Gmail query such as in:sent after:2026/01/01 before:2026/04/01 for filtered sent-mail and historical analysis.

Input:

  • maxResults optional

  • accountAlias optional

  • chatScope optional


Follow-up tools

multi_gmail_followup_trigger

Creates a new follow-up plan for a thread, or updates the existing open plan for that same thread.

Input:

  • messageId required

  • pattern optional

  • daysList optional

  • businessDaysOnly optional, default false

  • dueWeekday optional

  • createGmailDraft optional, default false

  • accountAlias optional

  • chatScope optional

Rules:

  • use either pattern or daysList

  • not both

  • daysList must be ascending

  • duplicates are not allowed

Examples:

{
  "messageId": "gmail-message-id",
  "daysList": [1, 3]
}
{
  "messageId": "gmail-message-id",
  "pattern": "1, 3, 7 business days",
  "businessDaysOnly": true
}

Scheduling behavior:

  • first entry is due from now

  • later entries are chained

  • example: [1, 3] means:

    • follow-up 1 in 1 day

    • follow-up 2 in 3 days after follow-up 1 is sent

multi_gmail_followup_due

Lists due follow-up reminders for the active account.

Behavior:

  • refreshes the thread before returning results

  • includes full threadContext

  • skips reminders if the recipient already replied

Input:

  • accountAlias optional

  • chatScope optional

multi_gmail_followup_send

Sends one approved follow-up email.

Input:

  • reminderId required

  • to optional

  • subject optional

  • body optional (unless legacy html is set)

  • format optional: text/plain (default) or text/html

  • html optional — legacy HTML part

  • cc / bcc optional — comma-separated string, array, or Name <email@example.com>

  • quoteOriginal optional, default true — append quoted parent history below the follow-up body

  • accountAlias optional

  • chatScope optional

Only use this after the user explicitly approves the draft.

multi_gmail_followup_cleanup

Deletes follow-up reminder records from the local store.

Input filters:

  • reminderIds

  • messageId for Gmail internal message id

  • messageHeaderId for RFC Message-ID from Gmail Show original

  • sourceThreadId

  • followUpChainId

  • deleteAll with confirm: true

  • statuses

  • cancelChain

  • removeGmailLabel

  • accountAlias

  • chatScope

Examples:

Delete by RFC Message-ID:

{
  "messageHeaderId": "<abc123@example.com>"
}

Delete one chain:

{
  "reminderIds": ["reminder-id"],
  "cancelChain": true
}

Delete all reminders for an account:

{
  "deleteAll": true,
  "confirm": true
}

Multiple Accounts and Shared Sessions

accountAlias

Use accountAlias when you want to target a specific saved local account:

{
  "accountAlias": "work"
}

chatScope

Some MCP hosts reuse one server session across many chats.

In that case, pass the same chatScope on:

  • connect

  • connect_finish

  • set_signer

  • every later Gmail tool in that same chat

Example:

{
  "chatScope": "work-inbox"
}

This keeps one chat’s active account binding separate from another chat’s.


Files and Data

Important local paths under $MULTI_GMAIL_MCP_HOME:

  • credentials.json Google OAuth client credentials

  • accounts/ saved Gmail OAuth tokens, one JSON file per alias

  • data/followup-reminders.json local follow-up reminder store

  • data/inbox-reviews/latest-inbox-review.md latest markdown inbox review export

Project layout:

~/.multi-gmail-mcp/
├── credentials.json
├── accounts/
└── data/
    ├── followup-reminders.json
    └── inbox-reviews/

Useful env vars:

Name

Purpose

MULTI_GMAIL_MCP_HOME

base directory for credentials, tokens, and local data

GOOGLE_CREDENTIALS_PATH

absolute or config-home-relative path to OAuth credentials

ACCOUNTS_DIR

absolute or config-home-relative path to token files

FOLLOWUP_REMINDERS_PATH

absolute or config-home-relative reminder store path

GMAIL_REVIEW_MARKDOWN_DIR

absolute or config-home-relative inbox export directory

Dependencies (for HTML bodies and quote stripping): email-reply-parser, planer, jsdom.


Gmail Labels

This MCP can create Gmail user labels automatically.

Expected labels:

  • Inbox-review

  • Multi-Gmail-MCP Follow-up

Use multi_gmail_setup_labels if they do not appear.


Troubleshooting

Server not showing in Claude or Cursor

  • make sure MULTI_GMAIL_MCP_HOME points at your real config directory

  • make sure node --version is 18+

  • fully quit and reopen the app

  • if npx is unavailable inside the app, install globally and use the full path to multi-gmail-mcp

multi_gmail_status not available

Usually this means the MCP server did not start at all.

Check:

  • JSON config syntax

  • absolute path to the server entry

  • Node availability

  • app restart after config change

Token expired or auth errors

Re-authenticate:

rm ~/.multi-gmail-mcp/accounts/*.json
MULTI_GMAIL_MCP_HOME="$HOME/.multi-gmail-mcp" multi-gmail-mcp-auth

Permission or scope errors

Make sure:

  • Gmail API is enabled

  • OAuth client is a Desktop app

  • scopes include gmail.modify, gmail.send, and gmail.settings.basic

Then re-authenticate (see Local Account Auth above).

Multiple accounts not working

  • run multi_gmail_accounts

  • verify the alias exists

  • re-authenticate missing accounts:

MULTI_GMAIL_MCP_HOME="$HOME/.multi-gmail-mcp" multi-gmail-mcp-auth --alias work

Labels missing in Gmail

Run:

multi_gmail_setup_labels

If that still fails, re-authenticate so the token includes gmail.modify.

Setup state unclear

Run:

multi_gmail_diagnostics

Security Notes

  • credentials.json contains your Google OAuth client secret

  • accounts/ contains Gmail refresh/access tokens

  • never commit either of those paths

  • .gitignore already excludes them

  • token files are written with mode 0600

This repository may also write:

  • local reminder data

  • local markdown inbox review exports

Treat those as sensitive personal data.


License

MIT


Company

Developed by NITSAN Technologies

Available Tools

42 tools
accountsList Gmail accounts saved on this computerA

Returns token file aliases (strings). Pass one as accountAlias on other tools when the MCP client shares one default session across chats.

Inputs: no named parameters.

archiveArchive one Gmail threadA

Archive a Gmail thread for the active account by removing the INBOX label. Use threadId from fetch, followup_due, or get_thread.

Inputs: threadId (required), accountAlias, chatScope.

connectStart Gmail login (opens browser)A

Start Gmail login with Connect you@example.com personal or Connect you@example.com work. Browser opens for approval. Then run connect_finish immediately to finish setup.

Inputs: command (required), chatScope.

connect_finishFinish Gmail login (after browser approve)C

Finish Gmail login after browser approval. Waits if needed; no manual code copy required. After success, run set_signer, then fetch.

Inputs: code, pendingAlias, chatScope.

diagnosticsCheck setup health in one commandC

Verifies credentials path, accounts storage, reminders store, and active account binding, then suggests the next action.

Inputs: accountAlias, chatScope.

fetchList inbox threads or batch-fetch (legacy)A

Recommended: mode=list (default) returns lightweight metadata for triage (subject, snippet, threadId). Snippets are not full email bodies — call get_thread(threadId) for each thread the user should read or reply to, and present message.text verbatim (do not summarize). Never load multiple full threads in one context. queryMode=inbox (default) prepends inbox review filters (in:inbox, exclude follow-up label). queryMode=raw passes query to Gmail unchanged — use for sent mail, archives, all-mail, and date-filtered analysis (e.g. in:sent after:2026/01/01). Legacy mode=full batch-loads bodies and auto-drafts every thread (token-heavy; avoid for normal inbox review). Nothing is sent automatically.

Inputs: mode, maxResults, query, queryMode, +5 more.

fetch_draftsList Gmail Drafts folderA

List drafts saved in Gmail Drafts folder. Separate from inbox. Use to review unsent drafts.

Inputs: maxResults, accountAlias, chatScope.

fetch_sentList Gmail Sent folder (deprecated)B

Deprecated — prefer multi_gmail_fetch with queryMode=raw and a Gmail query such as in:sent after:2026/01/01 before:2026/04/01 for filtered sent-mail analysis. This tool still lists the latest messages in Gmail Sent without date/query filters.

Inputs: maxResults, accountAlias, chatScope.

followup_cleanupDelete stored follow-up remindersA

Remove follow-up reminder(s) from the local store. Pass reminderIds, messageId, messageHeaderId, sourceThreadId, or followUpChainId. Use cancelChain: true with reminderIds to drop an entire chained sequence. Use deleteAll: true with confirm: true to clear all reminders for the account. Optionally removes the Gmail follow-up label when no reminders remain for a thread.

Inputs: reminderIds, messageId, messageHeaderId, sourceThreadId, +8 more.

followup_dueList follow-up reminders that are due nowA

List reminders due now for the active account and refresh thread state before review. Returns the refreshed full thread context for each due reminder. Always present the full draft to the user for proof-reading before any send action. Never call followup_send without explicit user approval.

Inputs: accountAlias, chatScope.

followup_sendSend one follow-up the user approvedA

Send one approved follow-up reminder. Re-checks the thread first and blocks send if customer already replied. Optional overrides: body, format (text/plain default, text/html for HTML), quoteOriginal (default true), appendSignature (default true). IMPORTANT: NEVER call without explicit user approval after showing the draft.

Inputs: reminderId (required), to, subject, body, +8 more.

followup_triggerCreate or update follow-up reminders for a threadB

Create follow-up reminders using daysList or pattern, or update the existing open follow-up plan for the same thread. For daysList: [1, 3]: follow-up 1 is due in 1 day from now; follow-up 2 is due 3 days after follow-up 1 is sent (not 3 days from today). Each value after the first is always an interval after the previous follow-up send. Example: 1 day, then 3 days after the first — use [1, 3], not [1, 2].

Inputs: messageId (required), pattern, daysList, businessDaysOnly, +4 more.

get_threadGet one Gmail thread as a clean transcriptA

Load one Gmail thread at a time (use after fetch mode=list). format=full (default) returns plain-text message bodies. Use stripped=false to read the full email; stripped=true removes quoted reply history when drafting in multi-message threads. format=latest trims to first + latestN messages. Present message.text verbatim to the user — do not summarize. Call separately per thread.

Inputs: threadId (required), format, latestN, stripped, +3 more.

helpSimple first-time setup walkthroughA

Shows setup and the recommended inbox workflow: fetch mode=list, triage metadata, get_thread one thread at a time, draft, send after approval.

Inputs: no named parameters.

multi_gmail_accountsList Gmail accounts saved on this computerA

Returns token file aliases (strings). Pass one as accountAlias on other tools when the MCP client shares one default session across chats.

Inputs: no named parameters.

multi_gmail_archiveArchive one Gmail threadA

Archive a Gmail thread for the active account by removing the INBOX label. Use threadId from fetch, followup_due, or get_thread.

Inputs: threadId (required), accountAlias, chatScope.

multi_gmail_connectStart Gmail login (opens browser)A

Start Gmail login with Connect you@example.com personal or Connect you@example.com work. Browser opens for approval. Then run connect_finish immediately to finish setup.

Inputs: command (required), chatScope.

multi_gmail_connect_finishFinish Gmail login (after browser approve)C

Finish Gmail login after browser approval. Waits if needed; no manual code copy required. After success, run set_signer, then fetch.

Inputs: code, pendingAlias, chatScope.

multi_gmail_diagnosticsCheck setup health in one commandB

Verifies credentials path, accounts storage, reminders store, and active account binding, then suggests the next action.

Inputs: accountAlias, chatScope.

multi_gmail_fetchList inbox threads or batch-fetch (legacy)A

Recommended: mode=list (default) returns lightweight metadata for triage (subject, snippet, threadId). Snippets are not full email bodies — call get_thread(threadId) for each thread the user should read or reply to, and present message.text verbatim (do not summarize). Never load multiple full threads in one context. queryMode=inbox (default) prepends inbox review filters (in:inbox, exclude follow-up label). queryMode=raw passes query to Gmail unchanged — use for sent mail, archives, all-mail, and date-filtered analysis (e.g. in:sent after:2026/01/01). Legacy mode=full batch-loads bodies and auto-drafts every thread (token-heavy; avoid for normal inbox review). Nothing is sent automatically.

Inputs: mode, maxResults, query, queryMode, +5 more.

multi_gmail_fetch_draftsList Gmail Drafts folderA

List drafts saved in Gmail Drafts folder. Separate from inbox. Use to review unsent drafts.

Inputs: maxResults, accountAlias, chatScope.

multi_gmail_fetch_sentList Gmail Sent folder (deprecated)A

Deprecated — prefer multi_gmail_fetch with queryMode=raw and a Gmail query such as in:sent after:2026/01/01 before:2026/04/01 for filtered sent-mail analysis. This tool still lists the latest messages in Gmail Sent without date/query filters.

Inputs: maxResults, accountAlias, chatScope.

multi_gmail_followup_cleanupDelete stored follow-up remindersA

Remove follow-up reminder(s) from the local store. Pass reminderIds, messageId, messageHeaderId, sourceThreadId, or followUpChainId. Use cancelChain: true with reminderIds to drop an entire chained sequence. Use deleteAll: true with confirm: true to clear all reminders for the account. Optionally removes the Gmail follow-up label when no reminders remain for a thread.

Inputs: reminderIds, messageId, messageHeaderId, sourceThreadId, +8 more.

multi_gmail_followup_dueList follow-up reminders that are due nowC

List reminders due now for the active account and refresh thread state before review. Returns the refreshed full thread context for each due reminder. Always present the full draft to the user for proof-reading before any send action. Never call followup_send without explicit user approval.

Inputs: accountAlias, chatScope.

multi_gmail_followup_sendSend one follow-up the user approvedA

Send one approved follow-up reminder. Re-checks the thread first and blocks send if customer already replied. Optional overrides: body, format (text/plain default, text/html for HTML), quoteOriginal (default true), appendSignature (default true). IMPORTANT: NEVER call without explicit user approval after showing the draft.

Inputs: reminderId (required), to, subject, body, +8 more.

multi_gmail_followup_triggerCreate or update follow-up reminders for a threadB

Create follow-up reminders using daysList or pattern, or update the existing open follow-up plan for the same thread. For daysList: [1, 3]: follow-up 1 is due in 1 day from now; follow-up 2 is due 3 days after follow-up 1 is sent (not 3 days from today). Each value after the first is always an interval after the previous follow-up send. Example: 1 day, then 3 days after the first — use [1, 3], not [1, 2].

Inputs: messageId (required), pattern, daysList, businessDaysOnly, +4 more.

multi_gmail_get_threadGet one Gmail thread as a clean transcriptA

Load one Gmail thread at a time (use after fetch mode=list). format=full (default) returns plain-text message bodies. Use stripped=false to read the full email; stripped=true removes quoted reply history when drafting in multi-message threads. format=latest trims to first + latestN messages. Present message.text verbatim to the user — do not summarize. Call separately per thread.

Inputs: threadId (required), format, latestN, stripped, +3 more.

multi_gmail_helpSimple first-time setup walkthroughA

Shows setup and the recommended inbox workflow: fetch mode=list, triage metadata, get_thread one thread at a time, draft, send after approval.

Inputs: no named parameters.

multi_gmail_sendSend one approved replyA

Send one approved reply. Requires messageId (marks source read, threads send). Provide body; set format to text/html for HTML (default text/plain). Legacy html still supported. quoteOriginal (default true) appends Gmail-style quoted parent history below the new body. appendSignature (default true) appends the account Gmail signature from Settings above the quote block. For new outbound / campaigns use send_new instead. Never run without explicit approval.

Inputs: messageId (required), to (required), subject (required), body, +8 more.

multi_gmail_send_newSend one approved new outbound emailA

Send one approved new email. Use for campaigns and cold outreach — no messageId. Optional threadId from a prior send to add the next message in the same Gmail thread (campaign email 2+). Requires to and subject; German/Unicode subjects are RFC 2047–encoded automatically. Provide body with format text/html for HTML campaigns (default text/plain). Legacy htmlBody still supported. Never run without explicit approval.

Inputs: to (required), subject (required), threadId, body, +6 more.

multi_gmail_set_draftSave or update a Gmail draft replyC

Save/update a Gmail draft reply for a thread without sending. Requires messageId, to, subject, and body; use format text/html for HTML drafts (default text/plain). quoteOriginal (default true) appends Gmail-style quoted parent history so drafts show the collapsible history expander in Gmail. appendSignature (default true) appends the account Gmail signature from Settings above the quote block.

Inputs: messageId (required), to (required), subject (required), body, +8 more.

multi_gmail_set_modeSet response style for this chatB

Choose standard (default) or compact response mode for this chat scope.

Inputs: mode (required), chatScope.

multi_gmail_set_signerSet the name signed on reply draftsB

Saves the display name used on reply drafts for this session, and optionally the Gmail follow-up label name. Call after login when the user says how they want to sign. Advanced: chatScope / accountAlias only if README multi-account or shared-session section applies.

Inputs: name (required), followUpLabel, accountAlias, chatScope.

multi_gmail_setup_labelsCreate MCP Gmail sidebar labels if missingA

Calls the Gmail API to create the configured user labels (FOLLOW_UP_GMAIL_LABEL_*, GMAIL_REVIEW_GMAIL_LABEL_*) so they appear under Labels in Gmail—no manual label setup. Use this if labels did not appear after connect or fetch (e.g. old OAuth token missing gmail.modify — re-run npm run auth -- --alias ... then reconnect). Pass accountAlias / chatScope like other Gmail tools.

Inputs: accountAlias, chatScope.

multi_gmail_statusWorkspace summary (account, signer, follow-ups, paths)B

Shows account connection, signer name, last inbox batch, due follow-ups, and local paths. Use this first when unsure what to do next.

Inputs: accountAlias, chatScope.

sendSend one approved replyA

Send one approved reply. Requires messageId (marks source read, threads send). Provide body; set format to text/html for HTML (default text/plain). Legacy html still supported. quoteOriginal (default true) appends Gmail-style quoted parent history below the new body. appendSignature (default true) appends the account Gmail signature from Settings above the quote block. For new outbound / campaigns use send_new instead. Never run without explicit approval.

Inputs: messageId (required), to (required), subject (required), body, +8 more.

send_newSend one approved new outbound emailA

Send one approved new email. Use for campaigns and cold outreach — no messageId. Optional threadId from a prior send to add the next message in the same Gmail thread (campaign email 2+). Requires to and subject; German/Unicode subjects are RFC 2047–encoded automatically. Provide body with format text/html for HTML campaigns (default text/plain). Legacy htmlBody still supported. Never run without explicit approval.

Inputs: to (required), subject (required), threadId, body, +6 more.

set_draftSave or update a Gmail draft replyB

Save/update a Gmail draft reply for a thread without sending. Requires messageId, to, subject, and body; use format text/html for HTML drafts (default text/plain). quoteOriginal (default true) appends Gmail-style quoted parent history so drafts show the collapsible history expander in Gmail. appendSignature (default true) appends the account Gmail signature from Settings above the quote block.

Inputs: messageId (required), to (required), subject (required), body, +8 more.

set_modeSet response style for this chatA

Choose standard (default) or compact response mode for this chat scope.

Inputs: mode (required), chatScope.

set_signerSet the name signed on reply draftsA

Saves the display name used on reply drafts for this session, and optionally the Gmail follow-up label name. Call after login when the user says how they want to sign. Advanced: chatScope / accountAlias only if README multi-account or shared-session section applies.

Inputs: name (required), followUpLabel, accountAlias, chatScope.

setup_labelsCreate MCP Gmail sidebar labels if missingA

Calls the Gmail API to create the configured user labels (FOLLOW_UP_GMAIL_LABEL_*, GMAIL_REVIEW_GMAIL_LABEL_*) so they appear under Labels in Gmail—no manual label setup. Use this if labels did not appear after connect or fetch (e.g. old OAuth token missing gmail.modify — re-run npm run auth -- --alias ... then reconnect). Pass accountAlias / chatScope like other Gmail tools.

Inputs: accountAlias, chatScope.

statusWorkspace summary (account, signer, follow-ups, paths)B

Shows account connection, signer name, last inbox batch, due follow-ups, and local paths. Use this first when unsure what to do next.

Inputs: accountAlias, chatScope.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.9/5.0

    Scored across 42 tools

    Disambiguation2/5

    Every tool appears twice with and without the 'multi_gmail_' prefix, making it hard for an agent to distinguish which version to call. Additionally, 'fetch_sent' is deprecated but still present, causing overlap with the more general 'fetch' tool.

    Naming Consistency2/5

    The tool naming is inconsistent due to the dual prefixes. While each group individually follows a verb_noun pattern, the coexistence of unprefixed and 'multi_gmail_' prefixed tools violates consistency and suggests redundancy.

    Tool Count2/5

    With 42 tools, the count is inflated because of deliberate duplication. The actual unique tool set is about 21, which would be appropriate for a Gmail MCP, but the duplication makes the tool surface unnecessarily large and confusing.

    Completeness4/5

    The unique tool set covers essential Gmail operations: fetch, read, send, draft, archive, follow-ups, account management, and diagnostics. Minor gaps exist (e.g., no delete or label management), but core workflows are well-supported.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      Multi-account Gmail MCP server for reading threads, managing labels, and creating drafts across multiple Gmail accounts.
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      MCP server that lets AI assistants send, read, and manage Gmail through natural language, including email sending, inbox management, and template-based outreach.
      298 npm
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      MCP server for email management that enables reading, searching, drafting, replying to, and sending emails with thread-aware replies and draft-first safety, supporting Gmail API and IMAP/SMTP backends.
      14 npm
      -