Community Gmail server with auto-auth: search, read and send email via MCP.
Multi Mail is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Several Gmail accounts: search, read, draft, send, labels and Google Calendar. Own OAuth client.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user yybd-multi-mail-mcp '--' npx -y @yybd/multi-mail-mcp
# 2 — ask your agent for something these tools do
# list_accounts, search_emails, read_email and 14 more
Multi Mail costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. This one runs on your machine: your client starts Multi Mail as a process under your own user, with your files and your network, so the tool surface below is what it can do to your computer rather than to a server somewhere else. Its scan result is on the Security tab — read the surface before you approve it.
This is a public server: you run it yourself and this marketplace is not in the path. You need Node.js — the current LTS (24) is the safe choice; npx comes with it. Claude Code registers it in one command; --scope user makes it available in every project. The '--' is in quotes so that PowerShell passes it on.
claude mcp add --scope user yybd-multi-mail-mcp '--' npx -y @yybd/multi-mail-mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
Nothing is required, but it can take MULTI_MAIL_DEFAULT (Account used when a tool call names none (email or alias)), MULTI_MAIL_HOME (Folder holding credentials.json and account tokens (default ~/.multi-mail)), MULTI_MAIL_SEND (Set to off for drafts-only mode: no tool can send mail), MULTI_MAIL_TZ (IANA time zone for calendar tools, overriding each calendar's own setting) if you want to set them.
One config entry your client uses to start the process locally. A local server runs with your file system and your network, which is why it is priced without metering.
17 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Read from its source code. A server that builds its tool list when it starts can list more tools than this.
List the Gmail accounts this server can use. Call it first when the user has not said which mailbox, or to learn the aliases to pass as "account" to every other tool. Returns each account's email, alias, and whether labels and calendar are enabled for it, the default account if one is set, and…
No parameter schema on file.
Search one mailbox, or all of them with account="all", using Gmail search syntax. Returns id, thread id, date, from, to, subject and snippet — use read_email for the full body. An empty query lists the newest mail.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Email, alias, or "all" to search every connected mailbox. |
| query | string | no | Gmail query, e.g. "from:bank is:unread newer_than:30d". |
| max_results | integer | no | How many messages to return (1–100). With account="all", the newest across all mailboxes. |
| page_token | string | no | nextPageToken from a previous call (single account only). |
Read one message in full: from, to, cc, reply-to, date, subject, labels, the body as plain text (HTML is converted to text), and the list of attachments with part_id, name, type and size. Use it after search_emails when you need what a single message says; use read_thread instead for the whole…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Which mailbox: email address, alias, or local part. Optional when only one account is connected. |
| message_id | string | yes | The message id ("id") returned by search_emails or list_drafts. |
| max_chars | integer | no | Longest body to return, in characters (default 20,000). Raise it for long newsletters or legal text. |
Read a whole conversation: every message in the thread, oldest first, each with the same fields as read_email (headers, plain-text body, attachment list). Use it when the reply history matters, such as before answering or summarising a back-and-forth; use read_email for a single message. max_chars…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Which mailbox: email address, alias, or local part. Optional when only one account is connected. |
| thread_id | string | yes | The "threadId" returned by search_emails or read_email. |
| max_chars | integer | no | Total characters for all bodies together (default 40,000), split evenly between the messages. |
List every label of one mailbox: system labels such as INBOX, UNREAD, STARRED, SENT, and the user's own labels (Gmail's folders), each with its id, name and type, sorted by name. Use it to find the exact name for a "label:" search in search_emails, or the name or id to pass to modify_labels. Works…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Which mailbox: email address, alias, or local part. Optional when only one account is connected. |
Save a message (new or reply) in Gmail Drafts without sending it. The safe default for writing.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Mailbox to write from (email, alias or local part). |
| to | no | Recipients: "a@x.com, Name <b@y.com>" or a list. Optional when replying. | |
| cc | no | Cc recipients, same format as "to". | |
| bcc | no | Bcc recipients, same format as "to". They are not shown to the other recipients. | |
| subject | string | no | Optional when replying ("Re: …" is added). |
| body | string | yes | Plain-text body. |
| html | string | no | Optional HTML version of the body. |
| reply_to_message_id | string | no | Reply in the thread of this message id. |
| reply_all | boolean | no | With reply_to_message_id and no "to": copy all original recipients. |
Send a message (new or reply) immediately. Only when the user explicitly asked to send; confirm recipients, subject and body with them first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Mailbox to write from (email, alias or local part). |
| to | no | Recipients: "a@x.com, Name <b@y.com>" or a list. Optional when replying. | |
| cc | no | Cc recipients, same format as "to". | |
| bcc | no | Bcc recipients, same format as "to". They are not shown to the other recipients. | |
| subject | string | no | Optional when replying ("Re: …" is added). |
| body | string | yes | Plain-text body. |
| html | string | no | Optional HTML version of the body. |
| reply_to_message_id | string | no | Reply in the thread of this message id. |
| reply_all | boolean | no | With reply_to_message_id and no "to": copy all original recipients. |
List the drafts saved in one mailbox: for each, the draftId (needed by send_draft), the message id, thread id, date, recipients, subject and a short snippet. Use it to check what is waiting to be sent, or to find a draft made earlier with create_draft. To read a draft's full text, pass its message…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Which mailbox: email address, alias, or local part. Optional when only one account is connected. |
| max_results | integer | no | How many drafts to return (1–100). |
Send an existing draft. Only when the user explicitly asked to send it.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Which mailbox: email address, alias, or local part. Optional when only one account is connected. |
| draft_id | string | yes | draftId from create_draft or list_drafts. |
Download one attachment of a message and return its contents. Text files and PDFs with a text layer come back as text, PNG/JPEG/GIF/WebP images (up to 5 MB) as an image you can see; any other file, and a scanned PDF, is saved under ~/.multi-mail/attachments and its path is returned with a note.…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Which mailbox: email address, alias, or local part. Optional when only one account is connected. |
| message_id | string | yes | Message id from search_emails or read_email. |
| part_id | string | no | partId from the attachments list of read_email. |
| filename | string | no | Attachment file name, when part_id is not known. |
| save | boolean | no | Also save the file under ~/.multi-mail/attachments. |
| max_chars | integer | no | Longest text to return for text and PDF files (default 50,000); longer text is cut and marked. |
Add or remove labels on specific messages, or on every message of a thread. This is how to mark read (remove UNREAD), mark unread (add UNREAD), archive (remove INBOX), star (add STARRED), or file mail under a label. Labels are names in any case, or ids from list_labels; unknown names return an…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Which mailbox: email address, alias, or local part. Optional when only one account is connected. |
| message_ids | array | no | Message ids to change. |
| thread_id | string | no | Change every message in this thread instead. |
| add | array | no | Labels to add. |
| remove | array | no | Labels to remove. |
Create a new user label in one mailbox and return its id and name, ready for modify_labels. Use it when the user wants mail filed under a label that list_labels does not show yet. A "/" makes a nested label, e.g. "Projects/Acme". Fails if a label with that name already exists. Only for accounts…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Which mailbox: email address, alias, or local part. Optional when only one account is connected. |
| name | string | yes | The new label's name; "/" nests it under a parent. |
List calendar events between two times, earliest first, across every calendar the user sees in Google Calendar (the primary one and those ticked in the sidebar), for one account or for every calendar-enabled account with account="all". Each event has its title, start and end with the time-zone…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Account (email, alias, local part) or "all" for every calendar-enabled account. Optional with one. |
| from | yes | — | |
| to | yes | — | |
| query | string | no | Free-text filter (title, description, location, attendees). |
| max_results | integer | no | How many events to return (1–250), earliest first. |
| time_zone | string | no | IANA time zone for reading and writing times, e.g. Asia/Jerusalem. Default: MULTI_MAIL_TZ, else the calendar's own setting. |
Find open slots of at least the given length inside working hours on the chosen weekdays, checked against the busy times of every calendar the user sees (of every calendar-enabled account with account="all"). Returns the slots with start, end and length, the time zone used, and which calendars…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Account (email, alias, local part) or "all" for every calendar-enabled account. Optional with one. |
| from | yes | — | |
| to | yes | — | |
| minutes | integer | no | Length of the meeting. |
| day_start | string | no | Start of the working day, HH:MM (default 09:00). |
| day_end | string | no | End of the working day, HH:MM (default 18:00). |
| weekdays | array | no | Allowed days, 0 = Sunday … 6 = Saturday. E.g. [0,1,2,3,4] for Sunday–Thursday. |
| max_slots | integer | no | How many free slots to return at most (1–50), earliest first. |
| time_zone | string | no | IANA time zone for reading and writing times, e.g. Asia/Jerusalem. Default: MULTI_MAIL_TZ, else the calendar's own setting. |
Create an event on the account's own primary calendar and return its id, times and link. Nobody is invited and no email goes out, so it is safe for holding a slot or adding a reminder; to meet with others, draft them an email instead. Give "end", or "minutes" (default 60), or all_day. Times…
| Parameter | Type | Required | Notes |
|---|---|---|---|
| account | string | no | Which mailbox: email address, alias, or local part. Optional when only one account is connected. |
| summary | string | yes | Title. |
| start | yes | — | |
| end | string | no | End, same formats as start. |
| minutes | integer | no | Length in minutes when "end" is not given (default 60). |
| all_day | boolean | no | An all-day event on the date of "start" (through the date of "end", if given). |
| description | string | no | Notes shown in the event. |
| location | string | no | Place or meeting link. |
| time_zone | string | no | IANA time zone for reading and writing times, e.g. Asia/Jerusalem. Default: MULTI_MAIL_TZ, else the calendar's own setting. |
Search every connected Gmail account (Gmail query syntax). Returns result ids for the fetch tool.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Gmail search query. |
Full text of a message returned by the search tool (id is "account:messageId").
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | A result id from the search tool, in the form "account:messageId". |
- Every tool, no call limit
- No card, and mcprush charges nothing for it
- Source published under MIT
- Runs on your machine — nothing of it reaches our gateway
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Multi Mail or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | moderate | capability blast radius (moderate) — client exposure if the model is manipulated | −3 |
| verification-discount | repo | publisher verification (public source) — no provenance, but the source is public and inspectable | −1 |
| coverage-honesty | source | inspection depth (source) — how much of the target the scan could see | −0 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
Tools were statically extracted from the published source (17 recovered), not enumerated from a running server. Tool-poisoning, Unicode-smuggling, capability and toxic-flow analysis ran on this inferred surface, but a mis-parsed registration could be missed or mis-attributed, so tool-derived findings are capped below “confirmed”. To grade the real runtime surface, scan the running server: --command "npx -y <package>".
1 of the 17 recovered tools are registered only when canSend holds (dist/mcp.js:134) — typically when a key or option is configured. They are part of the server's surface and were analysed; a server started without that configuration exposes only the other 12.
1 of the 17 recovered tools are registered only when canSend holds (dist/mcp.js:151) — typically when a key or option is configured. They are part of the server's surface and were analysed; a server started without that configuration exposes only the other 12.
3 of the 17 recovered tools are registered only when listAccounts().some(hasCalendarScope) holds (dist/mcp.js:206) — typically when a key or option is configured. They are part of the server's surface and were analysed; a server started without that configuration exposes only the other 12.
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. moderate is the level these add up to.
12 tools are registered unconditionally · (1) 1 more only when canSend holds (dist/mcp.js:134) · (2) 1 more only when canSend holds (dist/mcp.js:151) · (3) 3 more only when listAccounts().some(hasCalendarScope) holds (dist/mcp.js:206) — typically when a key or option is configured. All 17 are in the table below and were analysed; the conditional ones are marked.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| list_accounts | no tags | |
| search_emails | no tags | |
| read_email | untrusted-input | untrusted-input: keyword "read_email" |
| read_thread | no tags | |
| list_labels | no tags | |
| create_draft | state-write | state-write: declares readOnlyHint: false |
| send_email conditional (1) | external-sink | external-sink: keyword "send_email", declares readOnlyHint: false, openWorldHint: true |
| list_drafts | no tags | |
| send_draft conditional (2) | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| get_attachment | untrusted-input | untrusted-input: keyword "download" |
| modify_labels | state-write | state-write: declares readOnlyHint: false |
| create_label | state-write | state-write: declares readOnlyHint: false |
| list_events conditional (3) | no tags | |
| find_free_time conditional (3) | no tags | |
| create_event conditional (3) | state-write | state-write: declares readOnlyHint: false |
| search | no tags | |
| fetch | untrusted-input | untrusted-input: keyword "fetch" |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
Always latest — the install command names no version, so it installs the newest release when it runs; the current release on file is 0.2.1. Pin a release below and the command asks for exactly that one.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Multi Mail can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.