Community Gmail server with auto-auth: search, read and send email via MCP.
Mailoo 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
Mailoo — IMAP/SMTP MCP server. Multi-account, per-folder profiles.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --env 'MCP_EMAIL_ADDRESS=${MCP_EMAIL_ADDRESS}' --env 'MCP_EMAIL_IMAP_HOST=${MCP_EMAIL_IMAP_HOST}' --env 'MCP_EMAIL_SMTP_HOST=${MCP_EMAIL_SMTP_HOST}' --transport stdio mailoo-mcp '--' npx -y @bitfloo/mailoo
# 2 — ask your agent for something these tools do
# list_accounts, get_email_stats, download_attachment and 54 more
It needs MCP_EMAIL_ADDRESS, MCP_EMAIL_IMAP_HOST, MCP_EMAIL_SMTP_HOST: this reads them from your environment, so export them first.
Mailoo 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 Mailoo 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. Claude Code reads MCP_EMAIL_ADDRESS (Email address. Required for the environment-variable account), MCP_EMAIL_IMAP_HOST (IMAP server hostname), MCP_EMAIL_SMTP_HOST (SMTP server hostname) from your environment each time it starts the server, so the value stays out of its config: export them in your shell profile (macOS, Linux), or run setx MCP_EMAIL_ADDRESS …, setx MCP_EMAIL_IMAP_HOST …, setx MCP_EMAIL_SMTP_HOST … and open a new terminal (Windows). The '--' is in quotes so that PowerShell passes it on.
claude mcp add --scope user --env 'MCP_EMAIL_ADDRESS=${MCP_EMAIL_ADDRESS}' --env 'MCP_EMAIL_IMAP_HOST=${MCP_EMAIL_IMAP_HOST}' --env 'MCP_EMAIL_SMTP_HOST=${MCP_EMAIL_SMTP_HOST}' --transport stdio mailoo-mcp '--' npx -y @bitfloo/mailooReconnect, or start a new session, and the tools appear in the model’s tool list.
It reaches a system of yours, so it needs settings only you can give it: MCP_EMAIL_ADDRESS — Email address. Required for the environment-variable account.; MCP_EMAIL_IMAP_HOST — IMAP server hostname.; MCP_EMAIL_SMTP_HOST — SMTP server hostname.. You set them in your own client’s config, on your machine — this marketplace never holds it.
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.
57 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.
List all configured email accounts. Call this first to discover available account names for use with other tools.
No parameter schema on file.
Get email statistics and analytics for a mailbox. Shows volume, top senders, daily trends, and read/flagged counts.
No parameter schema on file.
Download an email attachment by filename. First use get_email to see available attachments and their filenames.
No parameter schema on file.
Batch operation on multiple emails by UID list. Supports mark_read, mark_unread, flag, unflag, move, and delete. delete moves the messages to Trash. Max 100 IDs per call. Returns success/failure counts.
No parameter schema on file.
Extract calendar events (ICS/iCalendar) from an email. Returns structured event data including time, location, attendees, and status.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
No parameter schema on file.
Extract unique contacts from recent email headers. Returns contacts sorted by frequency (most frequent first). Useful for finding frequent correspondents or building an address book.
No parameter schema on file.
Save an email draft to the Drafts folder. Compose over time, then use send_draft to send it. Use list_emails with the Drafts mailbox to see saved drafts.
No parameter schema on file.
Send an existing draft email and remove it from Drafts. The draft is fetched, sent via SMTP, then deleted. Use list_emails with the Drafts mailbox to find draft IDs.
No parameter schema on file.
List emails in a mailbox with optional filters. Returns paginated results with metadata
No parameter schema on file.
Get the full content of a specific email by ID.
No parameter schema on file.
Fetch the full content of multiple emails in a single call (max 20).
No parameter schema on file.
Get the current read/flag/label state of an email without fetching its body.
No parameter schema on file.
Search emails by keyword across subject, sender, and body.
No parameter schema on file.
Create a new mailbox (folder). Use '/' as separator for nested folders (e.g., 'Work/Projects'). Use list_mailboxes to see existing folders.
No parameter schema on file.
Rename an existing mailbox (folder). Use list_mailboxes to see current folder paths.
No parameter schema on file.
⚠️ DESTRUCTIVE: Permanently delete a mailbox and ALL its contents. This cannot be undone. Use list_mailboxes to verify the folder path.
No parameter schema on file.
Check connection health, quota, and capabilities for email accounts. Useful for diagnosing issues.
No parameter schema on file.
List available labels for an email account.
No parameter schema on file.
Add a label to an email.
No parameter schema on file.
Remove a label from an email. For ProtonMail, this removes the email from the label folder.
No parameter schema on file.
Create a new label. For ProtonMail, creates a folder under Labels/.
No parameter schema on file.
Delete a label. For ProtonMail, deletes the label folder.
No parameter schema on file.
Find which real mailbox folder(s) an email belongs to.
No parameter schema on file.
List all mailbox folders for an account with unread counts and special-use flags. Use list_accounts first to get the account name.
No parameter schema on file.
Move an email to a different mailbox folder.
No parameter schema on file.
Delete an email. By default moves to Trash. Set permanent=true for permanent deletion (⚠️ irreversible).
No parameter schema on file.
Change email flags — mark as read/unread, flag/unflag. Idempotent: marking an already-read email as read is a no-op.
No parameter schema on file.
Schedule an email to be sent at a specific time in the future. The email is queued locally and sent automatically when the time arrives.
No parameter schema on file.
List scheduled emails. Shows pending, sent, or all scheduled emails.
No parameter schema on file.
Cancel a scheduled email. Removes it from the queue and moves the associated draft to Trash.
No parameter schema on file.
Read-only SPF/DKIM/DMARC and From/Reply-To/Return-Path domain signals for an email.
No parameter schema on file.
Send a new email. Supports plain text or HTML body, CC, BCC, and attachments.
No parameter schema on file.
Reply to an email with proper threading (In-Reply-To & References headers). Use get_email first to read the original.
No parameter schema on file.
Forward an email to new recipients with optional additional message. Original email is quoted below. Original attachments are not included.
No parameter schema on file.
Detect whether ManageSieve is available for an account (port 4190 by default).
No parameter schema on file.
List ManageSieve scripts on the account (RFC 5804 LISTSCRIPTS).
No parameter schema on file.
Download a ManageSieve script by name (RFC 5804 GETSCRIPT).
No parameter schema on file.
Create or replace a ManageSieve script (RFC 5804 PUTSCRIPT). Does not activate it.
No parameter schema on file.
Delete a ManageSieve script (RFC 5804 DELETESCRIPT). Active scripts must be deactivated first.
No parameter schema on file.
Activate a ManageSieve script (RFC 5804 SETACTIVE). Pass an empty name to deactivate all.
No parameter schema on file.
List all available email templates. Templates are TOML files in …/ with {{variable}} placeholders for subject and body.
No parameter schema on file.
Apply an email template with variable substitution. Use action "preview" to see the result, "draft" to save as draft, or "send" to send immediately.
No parameter schema on file.
Reconstruct a full email conversation thread by following References and In-Reply-To headers.
No parameter schema on file.
Get the status of IMAP IDLE watcher connections and recent activity.
No parameter schema on file.
List all available AI triage presets with their descriptions and suggested labels.
No parameter schema on file.
Get the current AI hooks configuration including preset, rules, and custom instructions.
No parameter schema on file.
Diagnose desktop notification support on this platform.
No parameter schema on file.
Send a test desktop notification to verify that OS permissions are correctly configured.
No parameter schema on file.
Update alert/notification settings at runtime. Changes take effect immediately.
No parameter schema on file.
No parameter schema on file.
- Every tool, no call limit
- No card, and mcprush charges nothing for it
- Source published under LGPL-3.0
- 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 Mailoo 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 | high | capability blast radius (high) — client exposure if the model is manipulated | −6 |
| verification-discount | source | publisher verification (provenance) — cryptographic build provenance ties the artifact to its source | −0 |
| 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 (57 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 57 recovered tools are registered only when group === 'read' holds (dist/tools/calendar.tool.js:24) — 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 41.
1 of the 57 recovered tools are registered only when group === 'write' holds (dist/tools/calendar.tool.js:69) — 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 41.
4 of the 57 recovered tools are registered only when group === 'read' holds (dist/tools/calendar.tool.js:233) — 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 41.
1 of the 57 recovered tools are registered only when group === 'write' holds (dist/tools/calendar.tool.js:442) — 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 41.
1 of the 57 recovered tools are registered only when group === 'read' holds (dist/tools/calendar.tool.js:511) — 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 41.
1 of the 57 recovered tools are registered only when group === 'read' holds (dist/tools/label.tool.js:12) — 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 41.
4 of the 57 recovered tools are registered only when group === 'write' holds (dist/tools/label.tool.js:63) — 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 41.
1 of the 57 recovered tools are registered only when group === 'write' holds (dist/tools/scheduler.tool.js:10) — 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 41.
1 of the 57 recovered tools are registered only when group === 'read' holds (dist/tools/scheduler.tool.js:62) — 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 41.
1 of the 57 recovered tools are registered only when group === 'write' holds (dist/tools/scheduler.tool.js:111) — 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 41.
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. high is the level these add up to.
41 tools are registered unconditionally · (1) 1 more only when group === 'read' holds (dist/tools/calendar.tool.js:24) · (2) 1 more only when group === 'write' holds (dist/tools/calendar.tool.js:69) · (3) 4 more only when group === 'read' holds (dist/tools/calendar.tool.js:233) · (4) 1 more only when group === 'write' holds (dist/tools/calendar.tool.js:442) · (5) 1 more only when group === 'read' holds (dist/tools/calendar.tool.js:511) · (6) 1 more only when group === 'read' holds (dist/tools/label.tool.js:12) · (7) 4 more only when group === 'write' holds (dist/tools/label.tool.js:63) · (8) 1 more only when group === 'write' holds (dist/tools/scheduler.tool.js:10) · (9) 1 more only when group === 'read' holds (dist/tools/scheduler.tool.js:62) · (10) 1 more only when group === 'write' holds (dist/tools/scheduler.tool.js:111) — typically when a key or option is configured. All 57 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 | |
| get_email_stats | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| download_attachment | untrusted-input | untrusted-input: keyword "download", declares openWorldHint: true (interacts with entities outside the server) |
| bulk_action | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| extract_calendar conditional (1) | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| add_to_calendar conditional (2) | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| check_calendar_permissions conditional (3) | no tags | |
| list_calendars conditional (3) | no tags | |
| list_events conditional (3) | no tags | |
| list_reminders conditional (3) | no tags | |
| create_reminder conditional (4) | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| analyze_email_for_scheduling conditional (5) | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| extract_contacts | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| save_draft | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| send_draft | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| list_emails | untrusted-input | untrusted-input: keyword "fetch", declares openWorldHint: true (interacts with entities outside the server) |
| get_email | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_emails | untrusted-input | untrusted-input: keyword "fetch", declares openWorldHint: true (interacts with entities outside the server) |
| get_email_status | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| search_emails | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| export_email | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| create_mailbox | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| rename_mailbox | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| delete_mailbox | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| check_health | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| list_labels conditional (6) | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| add_label conditional (7) | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| remove_label conditional (7) | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| create_label conditional (7) | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| delete_label conditional (7) | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| find_email_folder | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| list_mailboxes | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| move_email | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| delete_email | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| mark_email | untrusted-inputexternal-sink | untrusted-input: keyword "read_email"; external-sink: declares readOnlyHint: false, openWorldHint: true |
| schedule_email conditional (8) | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| list_scheduled conditional (9) | no tags | |
| cancel_scheduled conditional (10) | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| get_email_security | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| send_email | external-sink | external-sink: keyword "send_email", declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| reply_email | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| forward_email | external-sink | external-sink: keyword "forward_email", declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| sieve_status | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| sieve_list_scripts | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| sieve_get_script | untrusted-input | untrusted-input: keyword "download", declares openWorldHint: true (interacts with entities outside the server) |
| sieve_put_script | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| sieve_delete_script | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| sieve_activate_script | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| list_templates | no tags | |
| apply_template | external-sink | external-sink: declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
| get_thread | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_watcher_status | no tags | |
| list_presets | no tags | |
| get_hooks_config | no tags | |
| check_notification_setup | no tags | |
| test_notification | state-write | state-write: declares readOnlyHint: false |
| configure_alerts | external-sink | external-sink: parameter "webhook", declares readOnlyHint: false, destructiveHint: true, openWorldHint: true |
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.0. Pin a release below and the command asks for exactly that one.
No release note was published with this version.
No release note was published with this version.
No release note was published with this version.
No release note was published with this version.
- The version this listing was on when mcprush began following its releases. The registry was not asked when it shipped, so this row carries no date.
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 Mailoo 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.