
JMAP MCP Server
MCP server for interacting with JMAP email servers (FastMail, Stalwart, Cyrus, James) — search, read, send, and manage email.
Add to your client
Copy the config for your MCP client and paste it into its config file.
deno run --allow-net=api.fastmail.com --allow-env=JMAP_SESSION_URL,JMAP_BEARER_TOKEN,JMAP_ACCOUNT_ID jsr:@wyattjoh/jmap-mcp@0.6.4Paste into ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"jmap-mcp-server": {
"command": "deno",
"args": [
"run",
"--allow-net=api.fastmail.com",
"--allow-env=JMAP_SESSION_URL,JMAP_BEARER_TOKEN,JMAP_ACCOUNT_ID",
"jsr:@wyattjoh/jmap-mcp@0.6.4"
],
"env": {
"JMAP_SESSION_URL": "https://api.fastmail.com/jmap/session",
"JMAP_BEARER_TOKEN": "YOUR_API_TOKEN"
}
}
}
}Step-by-step guides: Add to Claude Desktop · Add to Cursor · Add to Windsurf
Before you start
- Deno v1.40 or later
- A JMAP-compliant email server (e.g., Cyrus IMAP, Stalwart Mail Server, FastMail, Apache James)
- Valid JMAP authentication credentials (bearer token)
About JMAP MCP Server
JMAP MCP Server lets AI agents read, search, organize, and send email through any JMAP-compliant server. It registers tools by capability (read-only vs. submission), supports state-based incremental sync for efficient polling, and validates all input with Zod. Installable as a Claude Code plugin from the wyattjoh marketplace or configured directly via Deno running the JSR package.
Tools & capabilities (11)
get_mailboxesList mailboxes/folders with their IDs, names, and metadata. Call this first to get mailbox IDs needed by search_emails (inMailbox) and move_emails (mailboxId). Supports parentId, limit (1-200, default 100), and position pagination.
search_emailsSearch emails with filters (query, body, from, to, subject, inMailbox, hasKeyword, notKeyword, thread-keyword filters, before/after dates), all AND'd together. Returns email IDs plus a queryState for incremental sync. Supports limit (1-100, default 50) and position pagination.
get_emailsRetrieve specific emails by their IDs (1-50). Use the properties parameter to request only needed fields; include bodyValues plus textBody/htmlBody to get body content.
get_threadsGet email threads (conversation chains) by their IDs (1-20). Thread IDs come from the threadId property of get_emails responses. Returns email IDs per thread.
get_email_changesGet IDs of emails created, updated, or destroyed since a previous state (state-based delta tracking). Supports maxChanges (1-500), optional fetchEmails to auto-fetch details, and properties selection.
get_search_updatesGet additions/removals within a previous search query since its queryState. Must use the same filter parameters as the original search_emails call. Supports maxChanges (1-500).
mark_emailsMark emails (1-100 IDs) as read/unread (seen) or flagged/unflagged.
move_emailsMove emails (1-100 IDs) to a different mailbox specified by mailboxId (obtained from get_mailboxes).
delete_emailsDelete emails permanently (1-100 IDs); cannot be undone. Prefer moving to Trash via move_emails for recoverable deletion.
send_emailCompose and send a new email. Takes to/cc/bcc recipients, subject, and textBody and/or htmlBody (at least one required); optional identityId selects the sending identity.
reply_to_emailReply to an existing email by emailId. Automatically sets To/CC, the Re: subject prefix, and threading headers (In-Reply-To, References). Supports replyAll, custom subject, textBody/htmlBody, and identityId.
What this server can do
JMAP MCP Server provides tools for these capabilities — tap one to see every MCP server that does the same:
When to use it
- Let an AI assistant triage an inbox: search by sender, subject, or keyword and mark or move messages
- Draft and send emails or context-aware replies with automatic threading via JMAP submission
- Efficiently poll a mailbox for new or changed messages using state-based incremental sync
- Organize email across mailboxes/folders and permanently delete unwanted messages
Security notes
Authentication uses a JMAP bearer token supplied via the JMAP_BEARER_TOKEN environment variable; do not commit it. All input is validated using Zod schemas and no secrets are logged or exposed in responses. The Deno --allow-net flag should be scoped to your JMAP server's hostname (defaults to api.fastmail.com). The delete_emails tool permanently deletes email and cannot be undone — prefer move_emails to Trash for recoverable deletion.
JMAP MCP Server FAQ
Which email servers are supported?
Any JMAP-compliant server, including Cyrus IMAP 3.0+, Stalwart Mail Server, FastMail (commercial), and Apache James with JMAP support.
How do I authenticate?
Set JMAP_SESSION_URL to your server's JMAP session URL and JMAP_BEARER_TOKEN to a bearer token. JMAP_ACCOUNT_ID is optional and auto-detected if not provided.
How do I use it with a non-FastMail server?
Replace api.fastmail.com in the Deno --allow-net flag with your JMAP server's hostname, and set JMAP_SESSION_URL accordingly.
Is there a quick install for Claude Code?
Yes. Run /plugin marketplace add wyattjoh/claude-code-marketplace then /plugin install jmap-mcp@wyattjoh-marketplace, and configure the required environment variables in your MCP server settings.
Alternatives to JMAP MCP Server
Compare all alternatives →Connect your personal WhatsApp: search, read and send messages and media locally
Powerful Slack MCP with stdio/SSE/HTTP, DMs, group DMs and no-admin token auth
Full Telegram user-account MCP via MTProto: read chats, manage groups, send messages