Skip to main content
Glama
anishhs-gh

mail-mcp

by anishhs-gh

mail-mcp

A self-hosted MCP server that gives AI agents full email superpowers.

Read, search, send, reply, manage mailboxes and accounts โ€” over any SMTP/IMAP provider.

CI License: MIT Node @mailts/core


โœจ Features

Feature

Description

๐Ÿ“จ 20 MCP tools

Read, search, send, reply, forward, draft, flag, move, delete, bulk send, templates, queue

๐Ÿ” Secure multi-account

Credentials encrypted at rest (AES-256-GCM); passwords never pass through the agent

โšก Efficient reads

BODYSTRUCTURE-driven selective fetch โ€” text only, no attachment bytes wasted

๐Ÿ—„๏ธ Postgres-backed

Accounts managed at runtime via the agent; persists across restarts

๐ŸŒ Provider-agnostic

Gmail, Fastmail, Outlook, or any IMAP/SMTP server

๐Ÿณ Docker-ready

Single container; deploy to Cloud Run, Fly.io, Railway, or anywhere


Related MCP server: mcp-email-sender

๐Ÿš€ Quick Start

Single account (no database needed)

# .env
API_KEYS=your-secret-key

IMAP_HOST=imap.gmail.com
IMAP_PORT=993
IMAP_USER=you@gmail.com
IMAP_PASS=your-app-password

SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=you@gmail.com
SMTP_PASS=your-app-password
npm install && npm run dev
# โ†’ Listening on http://localhost:3000/mcp

Multi-account with Postgres

# .env
API_KEYS=your-secret-key
DATABASE_URL=postgresql://user:pass@host/dbname?sslmode=require
MAIL_MCP_SECRET=any-random-string-32-chars
SERVER_URL=https://your-server.example.com

# Optional default account (always loaded from env)
IMAP_HOST=imap.gmail.com
IMAP_USER=you@gmail.com
IMAP_PASS=your-app-password
SMTP_HOST=smtp.gmail.com
SMTP_USER=you@gmail.com
SMTP_PASS=your-app-password

The mail_mcp_accounts table is created automatically on first run. Add more accounts via the agent at any time.


๐Ÿ”ง Configuration

Variable

Required

Default

Description

API_KEYS

โœ…

โ€”

Comma-separated Bearer tokens for MCP auth

DATABASE_URL

Multi-account

โ€”

Standard Postgres connection string

MAIL_MCP_SECRET

With DB

โ€”

Encryption key for credentials at rest

SERVER_URL

Recommended

โ€”

Public URL โ€” shown in agent password setup guides

PORT

No

3000

HTTP listen port

IMAP_HOST / SMTP_HOST

No

โ€”

Single default account from env

Copy .env.example to .env and fill in your values.

Config loading order

IMAP_HOST / SMTP_HOST  โ†’  always loaded as the "default" account
DATABASE_URL           โ†’  additionally loads more accounts from Postgres
Neither set            โ†’  startup error

๐Ÿ“ง MCP Tools

Tool

Description

list_emails

List emails with optional filters (unread, limit)

get_email

Fetch full email โ€” text/html via BODYSTRUCTURE, attachment metadata from structure tree

search_emails

Search by from, to, subject, body, date range, flags

get_thread

Fetch full conversation thread by Message-ID

get_attachments

List attachment metadata or download with base64 content

watch_inbox

Watch for new emails via IMAP IDLE

Tool

Description

send_email

Send immediately via SMTP or HTTP transport

reply_email

Reply to a message โ€” auto-fills In-Reply-To / References

reply_all_email

Reply-all, excluding self from recipients

forward_email

Forward with original body quoted

save_draft

Save to Drafts folder

send_calendar_invite

Send iCal VEVENT with RSVP

Tool

Description

bulk_send

Send personalised emails to a list with per-row variable substitution

bulk_send_calendar_invite

Send individual calendar invites to a list

define_template

Define a reusable email template with variables

list_templates

List defined templates

preview_template

Preview a template with sample data

send_template

Send using a defined template

Tool

Description

queue_email

Enqueue for async delivery with retries and priority

queue_stats

View queue depth and processing stats

queue_pause / queue_resume

Pause or resume the queue

queue_drain

Wait for queue to empty

queue_cancel

Cancel a queued message

list_dead_letters

List permanently failed messages

retry_dead_letter

Retry a dead-lettered message

Tool

Description

mark_emails

Set/clear seen, flagged, answered

move_emails

Move to another mailbox (IMAP MOVE or COPY+DELETE)

copy_emails

Copy to another mailbox

delete_emails

Permanently delete (mark + EXPUNGE)

sync_incremental

Fetch messages changed since a CONDSTORE mod-sequence

Tool

Description

list_mailboxes

List all IMAP folders

get_mailbox_status

Message counts and sync metadata

create_mailbox

Create a new folder

rename_mailbox

Rename a folder

delete_mailbox

Delete a folder

Tool

Description

list_accounts

List accounts with default status and capabilities

add_account

Add account to DB โ€” returns curl command for password setup

update_account

Update host, port, user, label

remove_account

Remove account from DB

set_default_account

Switch the default account

reload_config

Reload accounts without restarting

health_check

Live IMAP/SMTP connectivity probe


๐Ÿ”‘ Secure Password Flow

Passwords never pass through the agent. The agent guides you to set them directly:

You: "Add my work Gmail, imap.gmail.com, work@company.com"

Agent: Account "work" saved. Set your credentials:

  curl -X POST https://your-server/accounts/work/password \
    -H "Authorization: Bearer <your MAIL_MCP_SECRET value>" \
    -H "Content-Type: application/json" \
    -d '{"imap_pass":"your-app-password","smtp_pass":"your-app-password"}'

  Credentials are encrypted at rest. Account activates immediately.

๐ŸŒ HTTP Endpoints

Method

Path

Auth

Description

GET

/health

None

Server health check

GET

/accounts

API_KEYS

List accounts (no passwords)

PATCH

/accounts/:name

API_KEYS

Update non-sensitive fields

DELETE

/accounts/:name

API_KEYS

Remove an account

POST

/accounts/:name/password

MAIL_MCP_SECRET

Set encrypted credentials

The password endpoint deliberately uses MAIL_MCP_SECRET โ€” not API_KEYS โ€” so the agent (which knows API_KEYS) is cryptographically prevented from setting credentials.


๐Ÿšข Deployment

Docker

docker build -t mail-mcp .
docker run -p 3000:3000 --env-file .env mail-mcp

Cloud Run (GCP)

gcloud run deploy mail-mcp \
  --image gcr.io/YOUR_PROJECT/mail-mcp \
  --region us-central1 \
  --allow-unauthenticated \
  --update-secrets="DATABASE_URL=DATABASE_URL:latest,API_KEYS=API_KEYS:latest,MAIL_MCP_SECRET=MAIL_MCP_SECRET:latest" \
  --set-env-vars="SERVER_URL=https://your-service-url"

See deploy/ for Fly.io, Azure Container Apps, and AWS App Runner guides.

CI/CD

Two workflows:

ci.yml โ€” runs automatically on every push to main and every PR:

  • Typecheck โ†’ Build โ†’ Test โ†’ Security audit (parallel)

deploy.yml โ€” triggered manually from GitHub Actions โ†’ Run workflow:

  • Leave version empty โ†’ reads version from package.json, creates git tag, deploys

  • Enter version (e.g. v0.1.0) โ†’ rollback to that existing tag's original commit

  • Source code on main is never modified by deploys or rollbacks

Two separate approval gates:

Gate

Environment

Action

1

tag

Create / validate the release tag

2

production

Build image and deploy to Cloud Run

Required GitHub secrets:

GCP_PROJECT_ID ยท GCP_REGION ยท GCP_WORKLOAD_IDENTITY_PROVIDER ยท GCP_SERVICE_ACCOUNT ยท SERVER_URL

GCP Secret Manager secrets: DATABASE_URL, API_KEYS, MAIL_MCP_SECRET

Set up both environments in GitHub โ†’ Settings โ†’ Environments with required reviewers.


๐Ÿ› ๏ธ Development

git clone https://github.com/anishhs-gh/mail-mcp
cd mail-mcp
npm install
cp .env.example .env   # fill in your credentials
npm run dev            # hot reload on http://localhost:3000
npm test               # 22 unit tests
npm run build          # production build

โšก Powered by @mailts/core

mail-mcp is built on top of @mailts/core โ€” a modern, native TypeScript SMTP/IMAP library with zero legacy dependencies, built from the ground up for Node 18+.

What mailts brings to this MCP:

  • BODYSTRUCTURE parsing โ€” selective MIME section fetch means only text parts are downloaded when reading email; attachment bytes are never transferred unless explicitly requested

  • ImapSession.search() โ€” full IMAP SEARCH through the session lock, no raw client exposure

  • textOnly fetch mode โ€” BODYSTRUCTURE-driven, fetches text/plain and text/html only in a single round-trip

  • Native TLS, DKIM, OAuth2, IDLE โ€” zero legacy dependencies, built for Node 18+

  • SMTP queue with priority scheduling โ€” built-in retry logic, dead-letter handling, and external queue driver support

mailts is also open source โ€” check it out at github.com/anishhs-gh/mailts


๐Ÿค Contributing

Contributions are welcome! Please read CONTRIBUTING.md and CODE_OF_CONDUCT.md first.


๐Ÿ“„ License

MIT ยฉ 2026 Anish Shekh


Built by Anish Shekh

GitHub LinkedIn Website

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    An MCP server that gives AI agents permission-gated, audit-logged access to private email providers (Proton Mail via Bridge and plain IMAP), running locally with OAuth-based authentication and human-controlled escalation for destructive operations.
    66
    60 npm
    11
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    An MCP server that enables AI agents to validate email addresses and send emails via SMTP with zero external dependencies.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server that gives AI agents programmable email inboxes with tools to create inboxes, send and list threaded email, and search messages.
    2 npm
    1
    MIT