Atlas / MCP servers / radmail-ai / radmail-mcp

radmail-mcpBLOCK

mcp/radmail-ai/radmail-mcp

Email MCP server / email operating system for AI agents: two-axis triage (importance x urgency), a Right Now lane, commitment follow-through, reviewable drafts, and a machine-verifiable BEC hard-stop (money/banking-change/first-contact = human-only). Zero-auth sandbox; the hosted tier never sends ma

Verdict
BLOCK
Grade
D
Trust score
69 /100
Exposed tools
15 12r · 3w · 0d
Transport
stdio · streamable-http
License
MIT
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

An email operating system for agents — with a refusal you can trust.

Every inbox got an AI in 2026. None can be trusted to hit send. RadMail is the one that can — because the consequential actions are refused in code, model-independent: money, changed-banking details, first-contact senders, decisions, and prompt-injection are human-only, forever. No prompt can talk RadMail into auto-sending them.

This is the Model Context Protocol (MCP) server, so any AI agent can use the inbox.

If a fleet of MCP agents runs your execution layer while you sit in the decision seat, the inbox is the seat that needs a hard-stop first. It's where a socially-engineered wire or banking change is irreversible — and where an autonomous process that can hit send can be talked into the loss. RadMail lets agents do the inbox's work (triage, the Right Now lane, commitment tracking, drafting) while money, changed banking, first contact, decisions, and prompt-injection stay human-only by construction, not by a policy an agent could be argued out of. That's what makes the company inbox delegable at all.

Start in one call

Call triage_inbox and omit the token — RadMail auto-provisions a free sandbox tenant and returns a working triage in one round-trip. Reuse the returned token. (On the zero-auth hosted sandbox, triage_inbox takes no args — it triages a built-in demo inbox so your very first call returns the full wedge.)

This server runs the sandbox engine (heuristic, in-memory, free, no credentials). It is real and runnable — not the production "99%" engine.

Tools

Read from source at commit 9d24080c8043OBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add radmail-mcp -- npx -y [email protected]
03

Exposed tools (15)

12 read · 3 write · 0 destructive.

ToolRiskDescription
check_send_domainwriteZERO-AUTH email-deliverability read for ANY domain (e.g. \
draft_replyreadDraft the reply that discharges a commitment owed in a message. DRAFT ONLY — never auto-sent. REFUSES (human-only) for money / changed-banking / first-contact / decision / injection.
list_commitmentsreadList open promises — what
list_right_nowreadReturn only the
provision_sandboxreadMint a FREE sandbox tenant token instantly — no creds, no signup. Most tools auto-provision for you, so you usually don
radmail_learning_insightsread
read_emailreadCONNECTED MODE: fetch one full email (headers + textBody) from the user
report_needreadTell RadMail something was awkward, missing, or slow. Folds into per-agent learning (call STRUCTURE only — never email content).
request_capabilityreadRequest a capability you wish RadMail exposed. Aggregated into unmet-demand that shapes the surface and roadmap.
searchreadFind a specific message by sender / subject / content — most-relevant + newest first; each hit says where it matched. TWO MODES: pass
send_emailwriteSend an email from the owner
sync_credentialswriteAlways call this first with the user
triagereadScore one message on TWO axes (importance × urgency), explain WHY it surfaced, break it into 4 dimensions, flag any hard-stop (BEC), and extract any commitment. OMIT
triage_inboxreadONE round-trip over a batch of messages: the Right Now lane + every open commitment + every hard-stop. The whole RadMail wedge in a single call. OMIT
why_surfacedreadExplain in plain English WHY a message was surfaced — the signals (sender, urgency words, commitment, hard-stop) behind its importance × urgency scores. Transparency, not a black box.
04

Trust audit

BLOCKgrade D · trust 69/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
none-observed
Network
declared (1 observation(s))
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (17)

HIGHObfuscation / stealth · obf.rtl_override · CWE-506, CWE-94
engine-dist/radmail-engine.bundle.ts:184
const t = text.slice(0, 16_384).replace(/[--]/g, "");
HIGHObfuscation / stealth · obf.rtl_override · CWE-506, CWE-94
src/engine/send-disposition.ts:100
const t = text.slice(0, 16_384).replace(/[--]/g, "");
HIGHPrompt injection · prompt.override · CWE-94, CWE-1427
SKILL.md:53
Money movement, changed-banking-details, first-contact senders, and irreversible decisions are **human-only, forever.** RadMail will never return an auto-sendable draft for those, and no prompt, jailb
Why it matters. asks the agent to drop prior instructions or safety
Fix. remove the instruction
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
engine-dist/radmail-engine.bundle.ts:184
const t = text.slice(0, 16_384).replace(/[--]/g, "");
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
src/engine/send-disposition.ts:100
const t = text.slice(0, 16_384).replace(/[--]/g, "");
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
test/engine-install.test.ts:181
const injected = r.bundle.slice(0, i) + "export const exfil = globalThis.fetch;\n" + r.bundle.slice(i);
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
test/engine-install.test.ts:200
writeFileSync(join(dst, "vendor", "radmail-engine.bundle.ts"), newer.slice(0, j) + "export const exfil = globalThis.fetch;\n" + newer.slice(j));
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
test/manifest.test.ts:112
exfiltrateTo: z.string().optional().describe("Address to forward the email to."),
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/demand-sink.test.ts:151
process.env.RADMAIL_DEMAND_SINK_URL = "http://127.0.0.1:9999/sink";
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
test/demand-sink.test.ts:154
assert.equal(captured[0].url, "http://127.0.0.1:9999/sink");
LOWObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
test/firewall.test.ts:156
const zw = ""; // zero-width space, interleaved between letters
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/sdk, zod, @types/node, tsx, typescript
Why it matters. 5 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
README.md:246
This server sends anonymous demand-signal telemetry to `https://app.radmail.ai/api/mcp-demand` so RadMail can see which tools agents actually use and what capabilities they ask for: **what's sent** is
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
llms.txt:3
> An email operating system for agents — with a refusal you can trust. RadMail is the MCP server that lets any AI agent triage, search, and follow through on a mailbox, while the consequential actions
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
llms.txt:33
Set the `RADMAIL_API_KEY` environment variable on the local (stdio) server — create a key in about a minute at `https://app.radmail.ai/settings/api-keys` — and four tools go live against the user's RE
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
llms.txt:44
The server sends anonymous demand-signal telemetry to `https://app.radmail.ai/api/mcp-demand`: tool name, event type (`call` / `need` / `capability`), the need/capability text explicitly submitted via
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
llms.txt:52
Directories and answer engines mirror the `server.json` record in the official MCP registry, not this file. Two publisher-controlled fields drive what their pages show: `title` (optional human-readabl
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine

Gates applied: instruction_override, no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 9d24080c8043full audit observations/trust-audit/mcp-server/radmail-ai__radmail-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-119d24080c8043BLOCKD69first audit
06

Questions

What is the radmail-mcp MCP server?

Email MCP server / email operating system for AI agents: two-axis triage (importance x urgency), a Right Now lane, commitment follow-through, reviewable drafts, and a machine-verifiable BEC hard-stop (money/banking-change/first-contact = human-only). Zero-auth sandbox; the hosted tier never sends ma

What tools does radmail-mcp expose?

15 in total: 12 read-only, 3 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is radmail-mcp safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (69/100) and found 3 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does radmail-mcp need?

It reads RADMAIL_API_KEY and RADMAIL_SEND_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does radmail-mcp run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as radmail-mcp at 0.5.1.

How current is this page?

The grade is for one exact copy of the source (9d24080c8043), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement