Skip to main content
Glama
MauricioPerera

mail-mcp

mail-mcp

CI Coverage Version Node.js Version License: MIT PRs Welcome

Self-hosted, provider-agnostic mail service. Point it at any mailbox's IMAP/SMTP credentials and it exposes:

  • REST API mirroring the common mailbox operations: list folders, list/get/search messages, send, flag, move, delete, quota (best-effort).

  • Webhooks (message.received) via a persistent IMAP IDLE watcher — fires an HTTP POST (with a per-webhook bearer secret) whenever new mail arrives, retried with exponential backoff (up to 6 attempts) if the receiving endpoint fails.

  • MCP server (Streamable HTTP, POST /mcp) exposing the same operations as tools, so any MCP-compatible agent can use it directly.

Multi-mailbox from the start: add as many accounts as you want to config/accounts.json.

Request bodies on the REST API are validated with Zod (lib/schemas.js) — invalid payloads get a 422 ERR_VALIDATION_FAILED with field-level errors instead of reaching the mail layer. Webhook subscriptions persist in SQLite (config/webhooks.sqlite, via better-sqlite3) instead of a flat JSON file. Messages larger than MAIL_MCP_MAX_MESSAGE_SIZE (default 25MB) are returned with bodyTruncated: true and no parsed body/attachments, to avoid loading huge messages into memory.

Setup

npm install
cp .env.example .env   # fill in MAIL_MCP_API_TOKEN and one MAILMCP_PASS_<ID> per account

Copy config/accounts.json.example to config/accounts.json (gitignored — no passwords in this file either, those live only in .env):

[
  {
    "id": "example",
    "user": "user@example.com",
    "imap": { "host": "imap.example.com", "port": 993, "secure": true },
    "smtp": { "host": "smtp.example.com", "port": 465, "secure": true }
  }
]

The password for account id: "example" is read from MAILMCP_PASS_EXAMPLE.

node index.js

Runs on 127.0.0.1:4900 by default (see MAIL_MCP_PORT). Put it behind a reverse proxy with TLS if you need to reach it from outside the host.

Related MCP server: Agent Email

systemd

An example unit is in deploy/mail-mcp.service — copy it to /etc/systemd/system/, adjust paths, and it loads secrets from /root/mail-mcp/.env via EnvironmentFile.

Auth

Every REST and MCP request requires Authorization: Bearer <MAIL_MCP_API_TOKEN>.

Tests

npm test              # run once
npm run test:coverage # run with coverage report

Coverage covers the pure/logic modules (lib/schemas.js, lib/accounts.js, lib/webhooks-store.js). lib/mailclient.js and lib/idle-watcher.js talk to real IMAP/SMTP servers and are exercised through manual end-to-end testing instead of unit tests — they're excluded from the coverage badge so it isn't misleading.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A generic IMAP and SMTP MCP server that enables AI agents to interact with email accounts for reading, searching, and sending messages. It provides high-level tools for managing email workflows like daily digests and folder organization across any standard email provider.
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    An open-source MCP server that provides AI agents with secure access to read, search, and manage emails via Microsoft 365 and Gmail. It features security-first defaults like recipient allowlists and markdown content conversion to facilitate safe agent interaction with mailboxes.
    6
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    Provider-agnostic email MCP server that connects any IMAP mailbox to AI assistants, enabling email management through natural language.
    8
    AGPL 3.0
  • A
    license
    B
    quality
    C
    maintenance
    An MCP server that exposes IMAP operations as tools for AI assistants, enabling email management including listing mailboxes, reading, searching, moving, flagging emails, and creating drafts.
    7
    29 npm
    MIT