MCP Server

radmail-mcp

ai.radmail/radmail-mcp
Communication Security Public & reachable MCP 2026-07-28

What this MCP does

Searches and triages email inboxes, tracks commitments, and applies protections against business email compromise.

draft_reply
Draft a reply for a thread. It returns text for a human to review — it does not and cannot send it.
Input schema
{'type': 'object', 'required': ['message_id'], 'properties': {'guidance': {'type': 'string', 'description': 'Optional steer for the draft. Never sent — review-only.'}, 'message_id': {'type': 'string', 'description': 'An id from triage_inbox to draft a reply for.'}}, 'additionalProperties': False}
list_commitments
Extract the open commitments in the correspondence, both owed by you and owed to you, with who and by-when.
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
list_right_now
Return only the 'Right Now' lane — the most recent and most important messages that genuinely can't be missed.
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
search
Find a specific message by sender, subject, or content. Results come back most-relevant + newest first, and every hit says where it matched (from / subject / body) and why. On this hosted sandbox it searches the built-in demo inbox; run the radmail-mcp package with RADMAIL_API_KEY set and the same tool searches your REAL ingested inbox read-only (with from / after / before filters) via the v1 search API.
Input schema
{'type': 'object', 'required': ['query'], 'properties': {'limit': {'type': 'number', 'description': 'Max hits to return (default 10).'}, 'query': {'type': 'string', 'description': 'Words to find, matched against from / subject / body. Every word must appear somewhere in a message.'}}, 'additionalProperties': False}
triage_inbox
Rank a mailbox on two axes (importance x urgency) and return what needs a human now versus what can wait or is already handled — with each thread's open commitment (the promise you owe or are owed, and whether it's overdue) surfaced inline, so the follow-through is visible on the very first call.
Input schema
{'type': 'object', 'properties': {}, 'additionalProperties': False}
why_surfaced
Explain in plain English why a given message was surfaced — the signals (sender, urgency, commitment) behind its rank.
Input schema
{'type': 'object', 'required': ['message_id'], 'properties': {'message_id': {'type': 'string', 'description': 'An id from triage_inbox, e.g. m_001.'}}, 'additionalProperties': False}
Added
search
Sept. 17, 2026, 7:57 a.m.
Added
draft_reply
Sept. 17, 2026, 7:57 a.m.
Added
list_commitments
Sept. 17, 2026, 7:57 a.m.
Added
why_surfaced
Sept. 17, 2026, 7:57 a.m.
Added
list_right_now
Sept. 17, 2026, 7:57 a.m.
Added
triage_inbox
Sept. 17, 2026, 7:57 a.m.