MCP Directory

JMAP MCP Server

MCP server for interacting with JMAP email servers (FastMail, Stalwart, Cyrus, James) — search, read, send, and manage email.

Unverified
stdio (local)
API key
TypeScript

Add to your client

Copy the config for your MCP client and paste it into its config file.

Install / run
deno run --allow-net=api.fastmail.com --allow-env=JMAP_SESSION_URL,JMAP_BEARER_TOKEN,JMAP_ACCOUNT_ID jsr:@wyattjoh/jmap-mcp@0.6.4

Paste 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_mailboxes

List 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_emails

Search 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_emails

Retrieve 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_threads

Get 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_changes

Get 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_updates

Get 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_emails

Mark emails (1-100 IDs) as read/unread (seen) or flagged/unflagged.

move_emails

Move emails (1-100 IDs) to a different mailbox specified by mailboxId (obtained from get_mailboxes).

delete_emails

Delete emails permanently (1-100 IDs); cannot be undone. Prefer moving to Trash via move_emails for recoverable deletion.

send_email

Compose 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_email

Reply 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

Verified
stdio (local)
No auth
Python
12 tools
Updated 1 month agoRepo

Powerful Slack MCP with stdio/SSE/HTTP, DMs, group DMs and no-admin token auth

Verified
stdio (local)
API key
Go
12 tools
Updated 1 month agoRepo

Full Telegram user-account MCP via MTProto: read chats, manage groups, send messages

Verified
stdio (local)
API key
Python
11 tools
Updated 11 days agoRepo