JMAP MCP Server A Model Context Protocol (MCP) server that provides tools for interacting with JMAP (JSON Meta Application Protocol) email servers. Built with Deno and using the @htunnicliff/jmap-jam client library. Features Email Management Tools Search Emails : Search emails with text queries, sender/recipient filters, date ranges, and keywords : Search emails with text queries, sender/recipient filters, date ranges, and keywords Get Emails : Retrieve specific emails by ID with full details : Retrieve specific emails by ID with full details Get Threads : Retrieve email threads (conversation chains) : Retrieve email threads (conversation chains) Mark Emails : Mark emails as read/unread, flagged/unflagged : Mark emails as read/unread, flagged/unflagged Move Emails : Move emails between mailboxes : Move emails between mailboxes Delete Emails: Delete emails permanently Mailbox Management Get Mailboxes: List all mailboxes/folders with hierarchy support Email Composition Send Email : Compose and send new emails with support for plain text and HTML : Compose and send new emails with support for plain text and HTML Reply to Email: Reply to existing emails with reply-all support Key Capabilities Full JMAP RFC 8620/8621 compliance via jmap-jam Comprehensive input validation with Zod schemas Pagination support for all list operations Rich error handling and connection management Functional programming patterns throughout TypeScript support with strong typing Installation Prerequisites Deno v1.40 or later A JMAP-compliant email server (e.g., Cyrus IMAP, Stalwart Mail Server, FastMail) Valid JMAP authentication credentials Setup Add the following to your agent of choice: { "mcpServers" : { "fastmail" : { "type" : " stdio " , "command" : " deno " , "args" : [ " run " , " --allow-net=api.fastmail.com " , " --allow-env=JMAP_SESSION_URL,JMAP_BEARER_TOKEN,JMAP_ACCOUNT_ID " , " jsr:@wyattjoh/[email protected] " ], "env" : { "JMAP_SESSION_URL" : " https://api.fastmail.com/jmap/session " , "JMAP_BEARER_TOKEN" : " API_TOKEN " } } } } Usage Environment Variables Variable Required Description JMAP_SESSION_URL Yes JMAP server session URL (usually ends with /.well-known/jmap ) JMAP_BEARER_TOKEN Yes Bearer token for authentication JMAP_ACCOUNT_ID No Account ID (auto-detected if not provided) Available Tools Search for emails with various filters. Parameters: query (optional): Text search query (optional): Text search query from (optional): Filter by sender email address (optional): Filter by sender email address to (optional): Filter by recipient email address (optional): Filter by recipient email address subject (optional): Filter by subject text (optional): Filter by subject text inMailbox (optional): Search within specific mailbox (optional): Search within specific mailbox hasKeyword (optional): Filter by keyword (e.g., '$seen', '$flagged') (optional): Filter by keyword (e.g., '$seen', '$flagged') notKeyword (optional): Exclude by keyword (optional): Exclude by keyword before (optional): Only emails before date (ISO datetime) (optional): Only emails before date (ISO datetime) after (optional): Only emails after date (ISO datetime) (optional): Only emails after date (ISO datetime) limit (optional): Max results (1-100, default: 50) (optional): Max results (1-100, default: 50) position (optional): Starting position for pagination (default: 0) Retrieve specific emails by their IDs. Parameters: ids : Array of email IDs (1-50 IDs) : Array of email IDs (1-50 IDs) properties (optional): Specific properties to return Get list of mailboxes/folders. Parameters: parentId (optional): Filter by parent mailbox (optional): Filter by parent mailbox limit (optional): Max results (1-200, default: 100) (optional): Max results (1-200, default: 100) position (optional): Starting position for pagination Get email threads by their IDs. Parameters: ids : Array of thread IDs (1-20 IDs) Mark emails with keywords (read/unread, flagged/unflagged). Parameters: ids : Array of email IDs (1-100 IDs) : Array of email IDs (1-100 IDs) seen (optional): Mark as read (true) or unread (false) (optional): Mark as read (true) or unread (false) flagged (optional): Mark as flagged (true) or unflagged (false) Move emails to a different mailbox. Parameters: ids : Array of email IDs (1-100 IDs) : Array of email IDs (1-100 IDs) mailboxId : Target mailbox ID Delete emails permanently. Parameters: ids : Array of email IDs (1-100 IDs) Send a new email. Parameters: to : Array of recipients with name and email : Array of recipients with and cc (optional): Array of CC recipients (optional): Array of CC recipients bcc (optional): Array of BCC recipients (optional): Array of BCC recipients subject : Email subject : Email subject textBody (optional): Plain text body (optional): Plain text body htmlBody (optional): HTML body (optional): HTML body identityId (optional): Identity to send from Reply to an existing email. Parameters: emailId : ID of email to reply to : ID of email to reply to replyAll (optional): Reply to all recipients (default: false) (optional): Reply to all recipients (default: false) subject (optional): Custom reply subject (optional): Custom reply subject textBody (optional): Plain text body (optional): Plain text body htmlBody (optional): HTML body (optional): HTML body identityId (optional): Identity to send from JMAP Server Compatibility This server should work with any JMAP-compliant email server, including: Development Running in Development deno run --allow-env --allow-net --watch src/mod.ts Testing # Test connection deno run --allow-env --allow-net src/mod.ts Architecture The server is built using: Deno : Modern JavaScript/TypeScript runtime : Modern JavaScript/TypeScript runtime @modelcontextprotocol/sdk : MCP server framework : MCP server framework jmap-jam : Lightweight, typed JMAP client : Lightweight, typed JMAP client Zod: Runtime type validation Security All input is validated using Zod schemas Environment variables are used for sensitive configuration No secrets are logged or exposed in responses Follows JMAP security best practices Contributing Fork the repository Create a feature branch Make changes following the functional programming style Test your changes thoroughly Submit a pull request License MIT License - see LICENSE file for details.