Two agents, one limit, one refused.

Email integration

Resend, in your agent's hands and under your limits.

Let an agent send email with a ceiling on how many people it can reach. Every recipient counts against the limit, a repeated request sends nothing twice, and a send is confirmed from Resend's own record.

Connect

API key

bound to api.resend.com

What you create

  • An API key with Full access
  • A sending-only key cannot read an email back, so a send could never be confirmed
  1. 01In Resend, open API Keys and create a key with Full access.
  2. 02In Anlyon, open Actions, then Integrations, choose Resend and paste the key.
  3. 03Anlyon checks the key with Resend before storing it. It becomes a secret named RESEND, bound to api.resend.com.
  4. 04Declare one action with the Resend adapter and name your verified sending domain.

Connecting allows nothing by itself. No API returns the credential afterwards, to you, to the console or to an agent, and Anlyon refuses to send it anywhere but api.resend.com.

Operations

Each one is a named tool, off until you switch it on, and Anlyon makes every call with the credential your agent never sees. Reads return what Resend answers and change nothing. Writes count against a limit you set, can wait for a person, and are read back from Resend wherever it allows.

Reads

List emails

resend-list-emails

List sent and scheduled emails, newest first: id, from, to, subject, created_at, last_event and scheduled_at, without bodies or tags (use get-email). 20 per page; when has_more is true, pass the last email's id as after for the next page.

Get email

resend-get-email

Get one sent or scheduled email by id: from, to, cc, bcc, subject, html and text bodies, tags, last_event (for example delivered, bounced, scheduled) and scheduled_at. A long body can be cut at the response limit.

List domains

resend-list-domains

List the account's sending domains with their verification status, region and capabilities. 20 per page; when has_more is true, pass the last domain's id as after for the next page.

Get domain

resend-get-domain

Get one domain by id: its status, tracking settings, capabilities and the DNS records (SPF, DKIM, tracking) with each record's verification status.

List contacts

resend-list-contacts

List contacts, optionally only those in one segment: id, email, first and last name, created_at and whether they unsubscribed. 20 per page; when has_more is true, pass the last contact's id as after for the next page.

Get contact

resend-get-contact

Get one contact by id or by email address: name, whether they unsubscribed from broadcasts, created_at and custom properties.

List segments

resend-list-segments

List the account's segments (the groups of contacts broadcasts are sent to): id, name and created_at. 20 per page; when has_more is true, pass the last segment's id as after for the next page.

Get segment

resend-get-segment

Get one segment by id: its name and created_at. Use list-contacts with segment_id for its members.

List contact segments

resend-list-contact-segments

List the segments one contact belongs to. 20 per page; when has_more is true, pass the last segment's id as after for the next page.

Writes

Send email

resend-send-email

Send one email from an address on the sending domain fixed at install, to up to 50 recipients, with a subject and an html or text body. Counted in emails, one per recipient across to, cc and bcc; Resend's idempotency key and a read-back of the sent email grade the receipt. A sent email cannot be recalled.

Read back

Read back from Resend by Anlyon's own Resend adapter.

Reschedule email

resend-reschedule-email

Move one scheduled email to a new send time, an ISO 8601 time at most 30 days ahead. Only an email that is still scheduled can be changed.

email_idscheduled_at

Acknowledged

Sent once and acknowledged; not read back: Resend reports the schedule in its own timestamp format (2026-10-20 09:00:00+00), which cannot be compared exactly with the ISO 8601 value sent; check it with get-email.

Cancel scheduled email

resend-cancel-scheduled-email

Cancel one scheduled email so it is never sent; a canceled email cannot be rescheduled.

email_id

Read back

Read back by id; last_event must be canceled.

Create contact

resend-create-contact

Create one contact with this email, and optionally a first and last name and whether they are unsubscribed from broadcasts.

emailfirst_namelast_nameunsubscribed

Read back

Read back by the new contact's id; the email must match.

Update contact name

resend-update-contact-name

Set one contact's first and last name; pass both, the current value for the one that does not change.

contact_idfirst_namelast_name

Read back

Read back by id; both names must match.

Set contact subscription

resend-set-contact-subscription

Unsubscribe one contact from all broadcasts (unsubscribed: true) or subscribe them again (false).

contact_idunsubscribed

Read back

Read back by id; unsubscribed must equal the value sent.

Delete contact

resend-delete-contact

Delete one contact by id, removing them from every segment. This cannot be undone.

contact_id

Acknowledged

Sent once and acknowledged; not read back: Resend does not document what reading a deleted contact returns, so the receipt rests on Resend's deleted: true answer.

Add contact to segment

resend-add-contact-to-segment

Add one existing contact to one segment, so broadcasts to that segment reach them.

contact_idsegment_id

Read back

Read back from the contact's segments; the segment must be among them.

Remove contact from segment

resend-remove-contact-from-segment

Remove one contact from one segment; the contact itself is kept.

contact_idsegment_id

Read back

Read back from the contact's segments; the segment must no longer be among them.

The brake

Suggested limits

  • 100 emails a day
  • 50 emails rescheduled a day
  • 50 scheduled emails canceled a day
  • 200 contacts created a day
  • 200 contacts renamed a day
  • 200 contact subscriptions changed a day
  • 20 contacts deleted a day
  • 200 contacts added to segments a day
  • 200 contacts removed from segments a day

Shared by every agent, session and key in the environment. You set the number.

Suggested approvals

  • A person approves sending an email
  • A person approves canceling a scheduled email
  • A person approves deleting a contact
  • A person approves subscribing a contact again

Installed turned off. The reviewer sees the exact request, and the approved request is the one that runs.

Before you rely on it

  • The from address must be on the domain you name. Anlyon refuses any other before sending.
  • A receipt says Resend accepted and recorded the email. It does not say the email reached an inbox.

Use it

1. Connect, from a terminal
npm install -g @anlyonhq/cli
anlyon auth login

# Shows where to create the key, then asks for it without echoing
anlyon connections add resend --secret RESEND

# From a clone of github.com/AnlyonHQ/anlyon-platform:
# see what would be installed, then switch on one operation
anlyon packs plan ./packs/resend
anlyon packs install ./packs/resend --action send-email --yes
2. Call it from your agent, TypeScript
import { Client } from "@anlyonhq/sdk";

const anlyon = new Client({ apiKey: process.env.ANLYON_AGENT_KEY! });

const { data } = await anlyon.actions.invoke(
  "resend-send-email",
  {
    "from": "Acme <hello@acme.com>",
    "to": [
      "sam@example.com"
    ],
    "subject": "Your refund is on its way",
    "html": "<p>Hi Sam, we refunded your order.</p>"
  },
);

if (data?.pendingApproval) {
  console.log("Waiting for a person", data.approvalId);
} else {
  console.log(data?.status, data?.responseStatus);
}
Or hand it to Claude Code over MCP
# Claude Code. Sign in with the browser, no key to paste.
claude mcp add --transport http anlyon https://api.anlyon.com/mcp

# Then ask in plain words. Each operation you switched on is a tool.

Prefer to click?

The console does all of it: connect, switch operations on, set the limit, and copy the setup for your agent.

Free tier, no credit card. One command if you use Claude or Cursor.

$ claude mcp add anlyon -- npx -y @anlyonhq/mcp-server