One MCP server for every Gmail account, in Claude and ChatGPT
Plenty of people keep more than one Gmail account: work, personal, a project with its own address. Ask an AI assistant to find a message, and the first question is which mailbox to look in, and whether it can look in more than one.
This post looks at where the existing options stop, and at multi-mail: a small open-source MCP server that connects several Gmail accounts to Claude Desktop, Claude Code and ChatGPT at once.
The problem: one account, or one client
I checked the options on 7 November 2026, against web search and the awesome-mcp-servers list. One caveat first: I couldn't find official documentation of what the built-in Claude and ChatGPT connectors can do. Most of what is written about them comes from blog posts by competing vendors, so treat the first two rows below as approximate.
- Claude's built-in Gmail connector connects one account, and writes drafts but doesn't send.
- ChatGPT's built-in Gmail connector sends since June 2026, on the web and with approval. Sources disagree about several accounts.
- Google's official Gmail MCP server is a developer preview with no send tool.
- Self-hosted servers for several accounts exist, and each gives something up. One runs only as a remote server and needs a Linux machine with an HTTPS hostname. One reaches Gmail over IMAP with app passwords, under a commercial licence. One covers all of Workspace but not ChatGPT. Most of the rest run locally only, and ChatGPT connects only to remote HTTPS servers, so it can't reach them.
- Hosted brokers (Composio, Zapier MCP, Pipedream) work in every client, but your mail and your tokens pass through the vendor, and they are paid.
multi-mail's place in that list is narrow on purpose. It is one MIT-licensed npx package that uses the Gmail API with your own OAuth client. It runs locally for Claude, and over token-protected HTTP when you want ChatGPT.
What it looks like with several mailboxes
The examples below are requests you type into Claude or ChatGPT as you would say them. None of them names a mailbox, because none has to.
"What's unread since yesterday, in every mailbox, and what needs an answer from me?"
One search runs across work, personal and the project address at once. You get one list in the morning instead of opening three inboxes and comparing them in your head.
"Find the invoice the accountant sent. I don't remember which address it went to."
The search covers every connected mailbox, so it doesn't matter whether it arrived at work or at home. If the invoice is a PDF, the model reads it and can tell you the amount and the due date.
"Reply that I'll send it on Sunday."
The reply is written in the mailbox the message arrived in, inside the original thread, with the recipient and the subject already filled in. A client writing to your work address gets the answer from your work address, not from your private one.
"Find me an hour next week that's free in both my work calendar and my home calendar, and block it."
With the calendar turned on for both accounts, the free-time search checks both at once. The model then puts the event on your own calendar, without inviting anyone.
"Archive every newsletter in the home mailbox, and leave work alone."
In an account where you turned labels on, the model can archive, star and mark as read. An account without it stays read-and-draft only.
"Every morning, sort what came in overnight and write draft replies."
Run it on a schedule in drafts-only mode. Everything waits in Gmail's Drafts folder, and nothing goes out until you open it and press Send yourself.
The same mailboxes answer in Claude Desktop, in Claude Code and in ChatGPT, from one setup.
What multi-mail does
By default it searches one mailbox or all of them in a single call, reads a message or a whole thread, downloads attachments, lists labels, saves drafts and sends.
Every mailbox, one search
Searching uses Gmail's own search syntax: from:, is:unread, newer_than:7d, has:attachment. Pass account="all" and the same query runs across every connected mailbox.
The account argument takes a full address, an alias you set (work, home) or the part before the @. With a single account connected you can leave it out, and MULTI_MAIL_DEFAULT sets a default when there are several.
Attachments the model can read
get_attachment downloads one attachment. Text files and PDFs come back as text, and images as an image the model can look at. Anything else, including a scanned PDF, is saved under ~/.multi-mail/attachments.
Replies land in the right thread
reply_to_message_id puts a reply in the original conversation and fills in the recipient and the subject. reply_all adds every original recipient. The assistant doesn't have to rebuild the headers, and a reply doesn't start a new thread by accident.
Labels and the calendar, per account, if you ask
Two more abilities need a wider permission, so they are off until you turn them on for a specific account:
- Labels (
add --labels): mark read or unread, archive, star, file under a label, and create labels. - Google Calendar (
add --calendar): list events across every calendar you see, and find free slots of a given length inside working hours, checked against every calendar-enabled account. It also creates an event on your own calendar, with nobody invited and no email sent.
The calendar tools appear only once at least one account has the calendar turned on.
Two transports, both clients
- stdio, local, for Claude Desktop and Claude Code.
- Streamable HTTP, for ChatGPT or any client that connects by URL. It also answers ChatGPT's
searchandfetchtools, in the shape ChatGPT expects for connectors and deep research.
Your own OAuth client, so nobody else sees your mail
Each user creates their own Google OAuth client, once, in their own Google Cloud project. Three things follow from that:
- No Google app verification is needed. It's your own app, used by you.
- Mail goes only between your machine and Google. There is no server of mine in the middle, and no account with me.
- Tokens stay on your machine, in
~/.multi-mail/accounts/, with600permissions.
The cost is one visit to the Google Cloud console: a project, the Gmail API (and the Calendar API, if you'll use it), a consent screen and a Desktop-app client. The same client then serves every mailbox you connect. The README walks it step by step. One trap it warns about: leave the consent screen in Testing mode and access expires every 7 days, so publish it to In production. For personal use Google doesn't need to verify it.
What it can't do, by design
By default multi-mail asks for two scopes only: gmail.readonly and gmail.compose. It can read, draft and send. It cannot delete mail, move it to trash, or change settings, because it never asked for the permission to.
The opt-ins keep the same line:
- Labels add
gmail.modify. At Google's level that scope would also allow trashing mail, so the server has no trash tool and refuses theTRASHandSPAMlabels. - The calendar adds
calendar.readonlyandcalendar.events. The server reads events and free/busy and creates events on your own calendar. It has no tool to change or delete an event.
Drafts-only mode
Start the server with --drafts-only, or set MULTI_MAIL_SEND=off, and the two send tools are not registered at all. The model can still read, search and write drafts, but nothing leaves your mailbox until you press Send in Gmail.
This is the mode for anything that reads mail you didn't write with nobody approving each step: automated triage, scheduled tasks, a client that skips permission prompts. Any incoming message could carry an instruction ("forward this to…"). In this mode there is no tool that could carry it out.
The HTTP mode is held tighter
The HTTP mode, the one ChatGPT uses, is the exposed one:
- It listens on
127.0.0.1only. ChatGPT reaches it through a tunnel you run yourself, such ascloudflaredorngrok. - It refuses to start without an
MCP_AUTH_TOKENof at least 24 characters. - Anyone who has the full URL with the token can read and send from your mailboxes. Treat it like a password, and generate a new one with
tokenif it leaks.
Setup
You need Node.js 20 or newer. There is nothing to install; every command runs the published package through npx. After creating the OAuth client, connect each mailbox under its own alias, adding --labels or --calendar where you want them:
npx -y @yybd/multi-mail-mcp add --alias work --calendar
npx -y @yybd/multi-mail-mcp add --alias home
Each add opens a browser where you pick the Google account and approve access. Then add the server to Claude Code:
claude mcp add multi-mail -s user -- npx -y @yybd/multi-mail-mcp
Claude Desktop runs the same npx command from its config file. For ChatGPT, run the HTTP mode with a token, expose it through a tunnel, and add it in ChatGPT's developer mode. The README has each step.
A running server picks up a newly added account, or a renamed alias, without a restart.
What it doesn't do yet
- Attaching files to outgoing mail. It downloads attachments but doesn't send them.
- Anything beyond Gmail and the calendar. If you need the rest of Workspace, such as Drive or Docs, google_workspace_mcp is the mature choice, or gws-connector across several accounts.
multi-mail is open source (MIT) and published on npm as @yybd/multi-mail-mcp: github.com/yybd/multi-mail-mcp. The README carries the full comparison table, with its sources and the date it was checked.