The email layer for AI agents
- Every email, cleaned up
- Ready for your model
- The same result, every time
Your agent shouldn't have to fight MIME headers, quoted-printable, and tangled reply chains. MVRX turns every email into clean JSON it can actually read — in a single call.
Inbox 142
raw · RFC 5322
Received: from mail-sor-f41.google.com ([209.85.220.41])
by mx.acmeco.io with ESMTPS id q9-20020a17090a
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
Message-ID: <c9f1a2@mail.acmeco.io>
From: Priya Nair <priya@acmeco.io>
Subject: Re: Webhook signature verification failing
Date: Tue, 14 Jan 2026 09:12:44 +0000
References: <a1b2c3@mail.runbot.dev> <b7e0d1@mail.runbot.dev>
In-Reply-To: <b7e0d1@mail.runbot.dev>
Content-Type: multipart/alternative; boundary="0000b616f2"
--0000b616f2
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64
PGRpdiBkaXI9Imx0ciI+SGV5IHRlYW0sPGJyPjxicj5U
aGFua3MgZm9yIHRoZSBmaXgg4oCUIHNpZ25hdHVyZXM=
Received: from a.stripe.com ([54.187.216.72])
DKIM-Signature: v=1; a=rsa-sha256; d=stripe.com;
Message-ID: <rcpt-2412-8830@stripe.com>
From: Stripe <receipts@stripe.com>
Subject: Invoice 2026-0114 payment succeeded
Date: Tue, 14 Jan 2026 08:47:03 +0000
(no References header — threadId falls back to
sha256(from, subject, day) per AECS-1 §4.2)
Content-Type: multipart/mixed; boundary="a1c2e3"
--a1c2e3
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64
WW91ciBpbnZvaWNlIGZvciAkNDkuMDAgd2FzIHBhaWQ=
--a1c2e3
Content-Type: application/pdf; name=invoice-2026-0114.pdf
Content-Disposition: attachment; size=48212
Received: from mail.acmeco.io ([10.4.1.22])
DKIM-Signature: v=1; a=rsa-sha256; d=acmeco.io;
Message-ID: <7d3e9b@mail.acmeco.io>
From: Marcus Chen <marcus@acmeco.io>
Subject: Fwd: Q3 vendor contract — signature needed
Date: Tue, 14 Jan 2026 08:31:56 +0000
References: <4f8a1d@mail.vendorco.com>
Content-Type: multipart/mixed; boundary="d7f0a2"
--d7f0a2
Content-Transfer-Encoding: base64
TGVnYWwgc2lnbmVkIG9mZiBvbiB0aGUgcmVkbGluZXM=
--d7f0a2
Content-Type: application/pdf; name=q3-vendor-contract.pdf
Content-Disposition: attachment; size=182044
Received: from out-23.smtp.github.com ([192.30.252.23])
DKIM-Signature: v=1; a=rsa-sha256; d=github.com;
Message-ID: <run-214@github.com>
From: GitHub <notifications@github.com>
Subject: [mvrxapp/mail] Run #214 passed
Date: Tue, 14 Jan 2026 07:58:12 +0000
References: <mvrx-mail-ci@github.com>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
4pyTIDgvOCBmaXh0dXJlcyBwYXNzZWQgb24gbWFpbg==
Received: from mail.acmeco.io ([10.4.1.22])
DKIM-Signature: v=1; a=rsa-sha256; d=acmeco.io;
Message-ID: <e2c47a@mail.acmeco.io>
From: Amara Osei <amara@acmeco.io>
Subject: Re: Onboarding flow copy review
Date: Tue, 14 Jan 2026 07:12:29 +0000
References: <91bd05@mail.acmeco.io>
In-Reply-To: <91bd05@mail.acmeco.io>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64
TmV3IGNvcHkgcmVhZHMgbXVjaCBiZXR0ZXIu
NormalizedEmail
{
"messageId": "c9f1a2@mail.acmeco.io",
"threadId": "a1b2c3@mail.runbot.dev",
"metadata": {
"from": {
"name": "Priya Nair",
"email": "priya@acmeco.io"
},
"subject": "Re: Webhook signature verification failing",
"date": "2026-01-14T09:12:44Z",
"timestamp": 1768381964
},
"content": {
"forAI": "Hey team,\n\nThanks for the fix — signatures are verifying correctly now on staging. Can you confirm the same patch ships to production today?\n\nPriya",
"html": "<div dir="ltr">Hey team,<br><br>Thanks for the fix — signatures are verifying correctly now on staging. Can you confirm the same patch ships to production today?<br><br>Priya</div>"
},
"thread": {
"inReplyTo": "b7e0d1@mail.runbot.dev",
"references": ["a1b2c3@mail.runbot.dev", "b7e0d1@mail.runbot.dev"]
}
}{
"messageId": "rcpt-2412-8830@stripe.com",
"threadId": "sha256:9f41c2ab7d3e5c",
"metadata": {
"from": {
"name": "Stripe",
"email": "receipts@stripe.com"
},
"subject": "Invoice 2026-0114 payment succeeded",
"date": "2026-01-14T08:47:03Z",
"timestamp": 1768380423
},
"content": {
"forAI": "Your invoice for $49.00 was paid. Receipt attached.",
"html": "<div>Your invoice for <strong>$49.00</strong> was paid.<br>Receipt attached as a PDF.</div>"
},
"attachments": [{
"filename": "invoice-2026-0114.pdf",
"size": 48212,
"data": null
}]
}{
"messageId": "7d3e9b@mail.acmeco.io",
"threadId": "4f8a1d@mail.vendorco.com",
"metadata": {
"from": {
"name": "Marcus Chen",
"email": "marcus@acmeco.io"
},
"subject": "Fwd: Q3 vendor contract — signature needed",
"date": "2026-01-14T08:31:56Z",
"timestamp": 1768379516
},
"content": {
"forAI": "Legal signed off on the redlines. Contract attached — needs your signature by Friday.",
"html": "<div>Legal signed off on the redlines.<br>Contract attached — needs your signature by <strong>Friday</strong>.</div>"
},
"attachments": [{
"filename": "q3-vendor-contract.pdf",
"size": 182044,
"data": null
}]
}{
"messageId": "run-214@github.com",
"threadId": "mvrx-mail-ci@github.com",
"metadata": {
"from": {
"name": "GitHub",
"email": "notifications@github.com"
},
"subject": "[mvrxapp/mail] Run #214 passed",
"date": "2026-01-14T07:58:12Z",
"timestamp": 1768377492
},
"content": {
"forAI": "✓ 8/8 fixtures passed on main",
"html": "<div>✓ <strong>8/8</strong> fixtures passed on <code>main</code></div>"
},
"thread": {
"inReplyTo": null,
"references": ["mvrx-mail-ci@github.com"]
}
}{
"messageId": "e2c47a@mail.acmeco.io",
"threadId": "91bd05@mail.acmeco.io",
"metadata": {
"from": {
"name": "Amara Osei",
"email": "amara@acmeco.io"
},
"subject": "Re: Onboarding flow copy review",
"date": "2026-01-14T07:12:29Z",
"timestamp": 1768374749
},
"content": {
"forAI": "New copy reads much better. Ship it.",
"html": "<div>New copy reads much better. Ship it.</div>"
},
"thread": {
"inReplyTo": "91bd05@mail.acmeco.io",
"references": ["91bd05@mail.acmeco.io"]
}
}- 8/8
- reference emails, all passing
- 6
- levels of detail per email
- 0
- runtime dependencies
- 100%
- reproducible results
See the difference
The same email, twice
On the left, what an email actually looks like on the wire. On the right, what your agent gets back from MVRX — the same message, in a shape your model can read, every single time.
Received: from mail-sor-f41.google.com ([209.85.220.41])
by mx.acmeco.io with ESMTPS id q9-20020a17090a…
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=acmeco.io; s=google; h=mime-version:references…
References: <a1b2c3@mail.runbot.dev> <b7e0d1@mail.runbot.dev>
In-Reply-To: <b7e0d1@mail.runbot.dev>
Content-Type: multipart/alternative; boundary="0000b616f2"
--0000b616f2
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Hey team,
Thanks for the fix =E2=80=94 signatures are verifying correc=
tly now on staging. Can you confirm the same patch ships to=
production today?
Priya
--=20
Priya Nair
Platform Lead, Acme Co.
On Mon, Jan 13, 2026 at 4:02=E2=80=AFPM Runbot Support wrot=
e:
> Hi Priya, we found the bug in our HMAC digest step and
--0000b616f2
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64
PGRpdiBkaXI9Imx0ciI+SGV5IHRlYW0sPGJyPjxicj5UaGFua3MgZm9yIHRo
ZSBmaXgg4oCUIHNpZ25hdHVyZXMgYXJlIHZlcmlmeWluZyBjb3JyZWN0bHkg
bm93IG9uIHN0YWdpbmcuIENhbiB5b3UgY29uZmlybSB0aGUgc2FtZSBwYXRj
aCBzaGlwcyB0byBwcm9kdWN0aW9uIHRvZGF5Pzxicj48YnI+UHJpeWE8YnI+
Hey team, Thanks for the fix — signatures are verifying correctly now on staging. Can you confirm the same patch ships to production today? Priya
quoted chain, signature & markup removed · threading resolved to a1b2c3@mail.runbot.dev
- 178 chars
- payload your agent reads · from 18.4 KB raw
- ~41 tokens
- tokens per message
- 1 of 6
- content levels — the rest stay available
What you get back
Everything your agent needs, nothing it doesn't
Every email comes back in the same clean shape — the message itself, who sent it, the thread it belongs to, and any attachments. Ready to use.
Just the message
Quoted replies, signatures, and legal footers stripped away — just what the person actually wrote, short enough to drop straight into a prompt. We call it content.forAI.
§4.3Always the right thread
Every reply lands in the same conversation as the message before it, worked out from the email's own headers. No database to keep in sync.
§5Timestamps you can trust
Every date comes back in UTC, or empty when the email never said — never guessed from the moment it happened to arrive.
§6As much or as little as you need
From the full raw source down to the stripped-back message, pick the level of detail each read calls for — six of them, from archival to conversational.
§4Attachments, only when you want them
The name, type, and size come back up front. The bytes stay put until you actually ask for them.
§4.5See it in code
One call, and you're done
Drop parse() into a Cloudflare Email Worker and you're forwarding clean, agent-ready JSON. No config, no setup, no pipeline to maintain.
What it handles for you
- Cleans up the raw email
- Strips quotes & signatures
- Sorts it into a thread
- Guards against prompt injection
From the @mvrx/mail README — implemented code, not pseudocode.
import { parse, wrappers } from "@mvrx/mail";
export default {
async email(message: ForwardableEmailMessage) {
const email = await parse(message, {
wrapper: wrappers.xml("email"),
});
await fetch("https://agent.example.com/inbox", {
method: "POST",
body: JSON.stringify({
messageId: email.messageId,
threadId: email.threadId,
from: email.metadata.from,
subject: email.metadata.subject,
input: email.content.forAI,
}),
});
},
};Open source
Built on an open standard, not a walled garden
AECS-1 is public domain — free forever, in any language. Everything MVRX ships is built on top of it, so nothing you write is locked to us: implement the spec yourself, swap in another SDK, or use ours.
AECS-1 specification
CC0 1.0
The NormalizedEmail schema and threading algorithm are public domain — implement them in any language, no license required.
@mvrx/aecs
MIT
The spec's reference implementation. Framework-agnostic, zero infrastructure dependencies — fork it, embed it, or write your own from the spec.
@mvrx/mail
AGPL-3.0-only
The Cloudflare Email Routing SDK, built on @mvrx/aecs. Commercial licensing (no AGPL obligations) is available from MVRX for closed-source embedding.
@mvrx/wbxml
MIT
Standalone WBXML codec with no product logic — licensed permissively so it's freely embeddable anywhere.
Full breakdown: /docs/licensing
Managed hosting
Open-source today.
Hosted when you're ready.
Point your domain at MVRX and get clean, agent-ready email delivered as JSON — no servers, no parsing, nothing to run. Join the waitlist and we'll tell you the moment it's live.