IMPLEMENTATION GUIDE
A complete walkthrough: external reviewers email feedback to per-person addresses; your AI agent receives it (webhook or pull), triages it, and replies — threaded, secure, metered.
You run Acme and a project called reviews. A dozen outside reviewers send feedback by email. You want an agent to read each message, file it into your tracker, and acknowledge the reviewer — without anyone watching an inbox, and without exposing an SMTP server.
Each reviewer gets: acme-reviews-otter-maple-cobalt@boundedloop.net
Sign in at app.boundedloop.net. Your account gets a client slug (e.g. acme). In Projects & delivery, add a project — reviews. Every address under it looks like:
acme-reviews-<word>-<word>-<word>@boundedloop.net
Give every reviewer a distinct three-word address. The words are an unguessable capability — pick memorable ones; the gateway accepts any 3–5 word address under your project and maps it to your account.
Reviewer A → acme-reviews-otter-maple-cobalt@boundedloop.net
Reviewer B → acme-reviews-harbor-ember-quill@boundedloop.net
Distinct phrases let you attribute, rate-limit, and revoke per reviewer. For sensitive channels, enable a sender allowlist so only that reviewer's email is accepted (backed by upstream SPF/DKIM/DMARC). Flooded addresses auto-rotate and reissue.
Two patterns — use either or both. Push is best for always-on agents; pull for agents that can't expose an endpoint.
In the dashboard, set the project's Webhook URL, toggle deliver to webhook, and Generate secret. We POST a signed summary on every accepted email; your endpoint verifies the HMAC and pulls the full content.
// verify the delivery (Node)
import crypto from 'node:crypto';
app.post('/inbound', (req, res) => {
const sig = req.headers['x-bl-signature'];
const mac = 'sha256=' + crypto
.createHmac('sha256', BL_SECRET)
.update(req.rawBody).digest('hex');
if (sig !== mac) return res.sendStatus(401);
const { id, project, phrase, from,
subject, pullUrl } = req.body;
// fetch full text/html/attachments:
// GET pullUrl with your Bearer token
res.sendStatus(200);
});
Connect a remote MCP server, use the CLI, or hit REST — all with a scoped token.
# Claude Code — remote MCP
claude mcp add --transport http boundedloop \
https://mcp.boundedloop.net \
--header "Authorization: Bearer bl_live_…"
# CLI
bl login --token bl_live_…
bl inbox list --project reviews
# REST
curl https://api.boundedloop.net/v1/messages?project=reviews \
-H "Authorization: Bearer bl_live_…"
In the dashboard's API tokens, mint a token with just the scopes the agent needs. Give it messages:read to read, and add messages:reply if the agent should answer reviewers. Tokens are shown once, hashed at rest, and revocable instantly.
Over MCP the agent calls get_message; over REST it GETs the message. Either way it gets parsed text, html, and an attachment list.
GET /v1/messages/reviews/otter-maple-cobalt/$ID
→ { "from": "reviewer@partner.com",
"subject": "Re: spec v3",
"text": "Looks good — ship it, but fix the title.",
"html": "…",
"attachments": [ { "index":0, "filename":"notes.pdf",
"contentType":"application/pdf", "size":18342, "url":"…" } ] }
With messages:reply, the agent answers the reviewer. The reply is sent as the address they wrote to and threads natively in their client.
POST /v1/messages/reviews/otter-maple-cobalt/$ID/reply
Authorization: Bearer bl_live_…
{ "text": "Thanks! Filed as ACME-412 and fixed the title." }
→ delivered from acme-reviews-otter-maple-cobalt@boundedloop.net, threaded
reviewer email
↓ acme-reviews-otter-maple-cobalt@boundedloop.net
edge: SPF/DKIM ✓ · format ✓ · allowlist ✓ · not revoked ✓ · <25MB ✓
↓ stored + metered
delivery: push signed webhook · or · pull MCP / CLI / REST
↓
your agent reads → acts → replies (threaded back to the reviewer)