MCP Server
Connect AI clients to BYOMailer through the Model Context Protocol. An assistant can pull your newsletter and sequence stats and content, and help you compose a newsletter — preview the audience, save a draft and send yourself a test. It can never send a campaign to your audience: drafts are only sent after you review and schedule them yourself.
Endpoint & Authentication
The server is served over streamable HTTP at https://byomailer.com/mcp and is authenticated with the same API tokens used by the REST API. Generate a token in your account settings and send it as a bearer token on every request.
Transport
Streamable HTTP. Point any MCP-compatible client at /mcp with an Authorization header.
Bearer Token
Use a personal API token: Authorization: Bearer YOUR_API_TOKEN. Requests are rate limited.
No surprise sends
The assistant can read your campaigns and create drafts, but it can never send to your audience — drafts only go out after you review and schedule them yourself.
Connect a Client
Command-line clients
If your client has a CLI, register the server in one command. For Claude Code:
Claude Code
claude mcp add byomailer \
--transport http https://byomailer.com/mcp \
--header "Authorization: Bearer YOUR_API_TOKEN"For the Codex CLI and other tools that accept a streamable-HTTP server with custom headers:
Codex CLI
codex mcp add byomailer \
--transport http \
--url https://byomailer.com/mcp \
--header "Authorization: Bearer YOUR_API_TOKEN" Any client that speaks streamable HTTP and lets you set an Authorization header will work — point it at https://byomailer.com/mcp with Bearer YOUR_API_TOKEN. Run the client's mcp list equivalent afterwards to confirm the tools are discovered.
Config-file clients
For clients configured by JSON (Claude Desktop, Cursor and similar), add BYOMailer to the mcpServers block:
mcp.json
{
"mcpServers": {
"byomailer": {
"type": "http",
"url": "https://byomailer.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_API_TOKEN"
}
}
}
}Calling a Tool
Clients invoke tools with a standard MCP tools/call request. The name is the tool name below and arguments matches its input schema. Most clients build this request for you — you just describe what you want.
tools/call
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "newsletter-stats",
"arguments": { "newsletter_id": 42 }
}
}Tools
Thirty-three tools. Start with a list tool to discover ids, then read stats or content — use view-newsletter-filters, calculate-newsletter-contacts, create-newsletter, update-newsletter and send-newsletter-test-mail to compose and revise a draft newsletter, or create-sequence, create-sequence-step, update-sequence-step and send-sequence-step-test-mail to draft, revise and preview a drip campaign. create-tag adds a tag for labelling contacts. find-contact, create-contact, add-contact-to-list, add-tags-to-contact and remove-contact-from-list add people to lists and tags. list-email-identities, email-identity-details, create-email-identity, refresh-email-identity-status and update-email-identity-tracking manage the sender identities (verified sending domains) in your own AWS SES. list-automations, automation-details, view-automation-options, create-automation and update-automation manage automations. New automations are always paused, and only the dashboard can turn them on.
list-sequencesList the account's sequences so you can find an id to read stats or content for.
Arguments
statusstringFilter by status: draft, live or paused.
searchstringCase-insensitive match against the sequence name.
limitintegerMax rows to return, 1-100 (default 25).
Returns
sequencesarrayMatching sequences, live first.
idintegerSequence id.
namestringSequence name.
statusstringCurrent status.
steps_countintegerNumber of steps.
contacts_countintegerEnrolled contacts.
countintegerNumber of rows returned.
Example result
{
"sequences": [
{
"id": 7,
"name": "Onboarding",
"status": "live",
"steps_count": 4,
"contacts_count": 318
}
],
"count": 1
}create-sequenceCreate a draft sequence (automated drip campaign). Sequences are always created as drafts and can never be activated through the MCP API — going live happens in the dashboard. Pass filters to limit which contacts receive the sequence. Add steps with create-sequence-step.
Arguments
namestringName for the sequence.
filtersarraySequence filters in the view-newsletter-filters format. Only contacts who match them receive the sequence. Omit to target every active contact.
Returns
idintegerNew sequence id.
namestringSequence name.
statusstringAlways "draft".
filtersarrayThe saved sequence filters. Filters that point to lists, tags or topics of another account are removed.
messagestringHuman-readable confirmation.
Example result
{
"id": 12,
"name": "Onboarding drip",
"status": "draft",
"filters": [
{
"connector": "and",
"category": "tags",
"mode": "any",
"values": [
"vip"
]
}
],
"message": "Draft sequence #12 created. Add steps with create-sequence-step."
}update-sequenceUpdate an existing draft sequence. Only draft sequences can be edited — live sequences are locked and the tool returns an error. The status never changes. Only the fields you pass are changed. Filters and a saved segment are exclusive, so passing filters removes a saved segment from the sequence.
Arguments
sequence_idintegerId of the draft sequence to update. Discover ids with list-sequences.
namestringNew name for the sequence.
filtersarraySequence filters in the view-newsletter-filters format. The array replaces the current filters. Pass an empty array to clear them.
Returns
idintegerSequence id.
namestringSequence name.
statusstringAlways "draft".
filtersarrayThe saved sequence filters.
messagestringHuman-readable confirmation.
Example result
{
"id": 12,
"name": "Onboarding drip — VIP",
"status": "draft",
"filters": [
{
"connector": "and",
"category": "lists",
"mode": "any",
"values": [
3
]
}
],
"message": "Draft sequence #12 updated."
}create-sequence-stepAdd a draft step to an existing sequence. Steps are always created as drafts and can never be activated through the MCP API — make a step live from the dashboard. Set the delay before it sends relative to the previous step.
Arguments
sequence_idintegerThe sequence to add the step to.
delay_typestringUnit for the delay: "days" or "hours".
delay_daysintegerDays (max 365) or hours (max 8760) after the previous step. Use 0 to send on enrollment for the first step.
email_identity_idintegerVerified sender identity id to send this step from.
subjectstringEmail subject line. Supports {{ variables }}.
preview_textstringInbox preheader text.
html_contentstringHTML body. Plain-text is derived automatically.
Returns
idintegerNew step id.
sequence_idintegerParent sequence id.
statusstringAlways "draft".
messagestringHuman-readable confirmation.
Example result
{
"id": 48,
"sequence_id": 12,
"status": "draft",
"message": "Draft step #48 added to sequence #12."
}update-sequence-stepUpdate an existing draft step. Only draft steps can be edited — live steps are locked and the tool returns an error. The status never changes: edited steps stay drafts. Only the fields you pass are changed; omitted fields keep their current values. Pair delay_type and delay_days to reschedule.
Arguments
sequence_step_idintegerId of the draft step to update. Discover ids with sequence-content.
delay_typestringUnit for the delay: "days" or "hours". Required together with delay_days.
delay_daysintegerDays (max 365) or hours (max 8760) after the previous step. Required together with delay_type.
email_identity_idintegerVerified sender identity id to send this step from.
email_template_idintegerEmail template id to wrap the content. Pass null to remove the template.
subjectstringEmail subject line. Supports {{ variables }}.
preview_textstringInbox preheader text.
html_contentstringHTML body. Plain-text is derived automatically.
Returns
idintegerStep id.
sequence_idintegerParent sequence id.
statusstringAlways "draft".
messagestringHuman-readable confirmation.
Example result
{
"id": 48,
"sequence_id": 12,
"status": "draft",
"message": "Draft step #48 updated."
}sequence-statsSequence-level totals and aggregate mail metrics across all steps. For a per-step breakdown use sequence-step-stats.
Arguments
sequence_idintegerThe sequence to read stats for.
Returns
idintegerSequence id.
namestringSequence name.
statusstringCurrent status.
statsobjectSequence-wide contact/unsubscribe/click totals.
contactsintegerDistinct contacts enrolled.
unsubscribedintegerDistinct contacts who unsubscribed.
clickedintegerDistinct contacts who clicked.
mail_metricsobjectAggregate metrics across every step.
totalintegerRecipients reached.
sentintegerMessages handed to SES.
deliveredintegerConfirmed delivered.
pendingintegerNot yet sent.
openedintegerOpened at least once.
bouncedintegerHard or soft bounces.
unsubscribedintegerUnsubscribed from this mail.
complainedintegerMarked as spam.
delivery_ratefloat|nulldelivered / sent as a percentage.
open_ratefloat|nullopened / sent as a percentage.
unsubscribe_ratefloat|nullunsubscribed / sent as a percentage.
Example result
{
"id": 7,
"name": "Onboarding",
"status": "live",
"stats": {
"contacts": 318,
"unsubscribed": 6,
"clicked": 121
},
"mail_metrics": {
"total": 1180,
"sent": 1180,
"delivered": 1170,
"pending": 0,
"opened": 540,
"bounced": 10,
"unsubscribed": 6,
"complained": 0,
"delivery_rate": 99.2,
"open_rate": 45.8,
"unsubscribe_rate": 0.5
}
}sequence-contentFull content of a sequence and every one of its steps.
Arguments
sequence_idintegerThe sequence to read content for.
Returns
idintegerSequence id.
namestringSequence name.
statusstringCurrent status.
contacts_countintegerEnrolled contacts.
steps_countintegerNumber of steps.
content_variablesobjectDefault values for template variables.
stepsarraySteps in send order.
idintegerStep id.
delay_daysintegerDelay before this step.
delay_typestringUnit of the delay (e.g. days).
statusstringStep status.
messageobject|nullStep message content.
Example result
{
"id": 7,
"name": "Onboarding",
"status": "live",
"contacts_count": 318,
"steps_count": 4,
"content_variables": {
"name": "there"
},
"steps": [
{
"id": 31,
"delay_days": 0,
"delay_type": "days",
"status": "live",
"message": {
"id": 88,
"subject": "Welcome aboard",
"preview_text": "Glad you are here",
"html_content": "<p>Hi {{ name }}…</p>",
"text_content": "Hi {{ name }}…",
"email_identity_id": 3
}
}
]
}send-sequence-step-test-mailSend a one-off test copy of a single sequence step to your own email address so you can preview it. The step must already have a sender identity attached. Does not send to the sequence audience and does not start or advance the sequence for anyone.
Arguments
sequence_idintegerThe sequence the step belongs to.
step_idintegerThe step to send a test copy of.
Returns
messagestringConfirmation message.
sent_tostringThe address the test was sent to (your own).
Example result
{
"message": "Test email sent to [email protected]",
"sent_to": "[email protected]"
}sequence-step-contentFull content of a single sequence step.
Arguments
sequence_idintegerThe sequence the step belongs to.
step_idintegerThe step to read content for.
Returns
idintegerStep id.
sequence_idintegerParent sequence id.
delay_daysintegerDelay before this step.
delay_typestringUnit of the delay (e.g. days).
statusstringStep status.
messageobject|nullStep message content.
subjectstringSubject line, may contain {{ variables }}.
preview_textstring|nullInbox preheader.
html_contentstringRendered HTML body.
text_contentstringPlain-text body.
email_identityobject|nullSending identity (from name/email).
Example result
{
"id": 31,
"sequence_id": 7,
"delay_days": 0,
"delay_type": "days",
"status": "live",
"message": {
"id": 88,
"subject": "Welcome aboard",
"preview_text": "Glad you are here",
"html_content": "<p>Hi {{ name }}…</p>",
"text_content": "Hi {{ name }}…",
"email_identity": {
"id": 3,
"name": "Acme",
"email": "[email protected]"
}
}
}sequence-step-statsDelivery and engagement stats for a single sequence step. Contacts are counted in the furthest step they have reached.
Arguments
sequence_idintegerThe sequence the step belongs to.
step_idintegerThe step to read stats for.
Returns
idintegerStep id.
sequence_idintegerParent sequence id.
subjectstring|nullStep subject.
delay_daysintegerDelay before this step.
delay_typestringUnit of the delay (e.g. days).
statusstringStep status.
statsobjectContacts/unsubscribed/clicked for this step.
contactsintegerDistinct contacts enrolled.
unsubscribedintegerDistinct contacts who unsubscribed.
clickedintegerDistinct contacts who clicked.
mail_metricsobjectMail metrics for this step.
totalintegerRecipients reached.
sentintegerMessages handed to SES.
deliveredintegerConfirmed delivered.
pendingintegerNot yet sent.
openedintegerOpened at least once.
bouncedintegerHard or soft bounces.
unsubscribedintegerUnsubscribed from this mail.
complainedintegerMarked as spam.
delivery_ratefloat|nulldelivered / sent as a percentage.
open_ratefloat|nullopened / sent as a percentage.
unsubscribe_ratefloat|nullunsubscribed / sent as a percentage.
Example result
{
"id": 31,
"sequence_id": 7,
"subject": "Welcome aboard",
"delay_days": 0,
"delay_type": "days",
"status": "live",
"stats": {
"contacts": 318,
"unsubscribed": 2,
"clicked": 80
},
"mail_metrics": {
"total": 318,
"sent": 318,
"delivered": 316,
"pending": 0,
"opened": 190,
"bounced": 2,
"unsubscribed": 2,
"complained": 0,
"delivery_rate": 99.4,
"open_rate": 59.7,
"unsubscribe_rate": 0.6
}
}create-tagCreate a tag for the account. Tags label contacts and build audiences. Tag names are unique per account — creating a name that already exists returns an error.
Arguments
namestringThe tag name. Must be unique within the account.
Returns
idintegerNew tag id.
namestringThe tag name.
messagestringHuman-readable confirmation.
Example result
{
"id": 9,
"name": "VIP",
"message": "Tag #9 created."
}find-contactLook up one contact by exact email. Returns that person even when they are unsubscribed, or contact null when this account has no such email.
Arguments
emailstringExact email address to look up in this account.
Returns
contactobjectThe contact, or null. When present: id, email, name, unsubscribed_at, tags, and list ids.
Example result
{
"contact": {
"id": 42,
"email": "[email protected]",
"name": "Ada",
"unsubscribed_at": null,
"tags": [
"VIP"
],
"lists": [
3
]
}
}create-contactCreate a contact, or reuse the contact that already has this email. Optional name, tag names, and one list. A new blacklisted email is rejected. Tags are added and never removed. A list that requires opt-in queues the opt-in email.
Arguments
emailstringEmail address. Reuses the account contact with this exact email when one exists.
namestringOptional display name. Omitted leaves the current name unchanged.
tagsarrayOptional tag names to add. Unknown names are created. Existing tags stay. Tag removal is not available.
list_idintegerOptional mailing list id from view-newsletter-filters.
Returns
idintegerContact id.
createdbooleanTrue when a new contact row was inserted.
emailstringThe contact email.
namestringThe contact name.
tagsarrayTag names on the contact.
listsarrayMailing list ids the contact belongs to.
messagestringHuman-readable confirmation.
Example result
{
"id": 42,
"email": "[email protected]",
"name": "Ada",
"unsubscribed_at": null,
"tags": [
"VIP"
],
"lists": [
3
],
"created": true,
"message": "Contact #42 created."
}add-contact-to-listAdd an existing contact to a mailing list without removing their other lists. A list that requires opt-in queues the opt-in email. Tag removal is not available through this API.
Arguments
contact_idintegerContact id from find-contact.
list_idintegerMailing list id from view-newsletter-filters.
Returns
idintegerContact id.
listsarrayMailing list ids the contact belongs to.
messagestringHuman-readable confirmation.
Example result
{
"id": 42,
"email": "[email protected]",
"name": "Ada",
"unsubscribed_at": null,
"tags": [
"VIP"
],
"lists": [
3,
8
],
"message": "Contact #42 added to list #8."
}remove-contact-from-listRemove a contact from one mailing list. Their other lists stay, and the contact is not deleted.
Arguments
contact_idintegerContact id from find-contact.
list_idintegerMailing list id to remove them from.
Returns
idintegerContact id.
listsarrayMailing list ids the contact still belongs to.
messagestringHuman-readable confirmation.
Example result
{
"id": 42,
"email": "[email protected]",
"name": "Ada",
"unsubscribed_at": null,
"tags": [
"VIP"
],
"lists": [
3
],
"message": "Contact #42 removed from list #8."
}list-email-identitiesList the sender identities (verified sending domains) of the account with their verification status, DKIM and MAIL FROM status and tracking flags. Only identities with identity_status verified can send mail.
Arguments
identity_statusstringOptional filter: pending, verifying, verified or failed.
searchstringOptional search against email, name and domain.
limitintegerMaximum identities to return (1-100, default 25).
Returns
identitiesarrayIdentity summaries. Each item carries the fields of email-identity-details minus mail_from_subdomain, region, custom link domain and dns_records.
countintegerNumber of identities returned.
Example result
{
"identities": [
{
"id": 3,
"email": "[email protected]",
"name": "Example Team",
"domain": "example.com",
"identity_status": "verifying",
"dkim_status": "PENDING",
"mail_from_status": "PENDING",
"open_tracking_enabled": true,
"click_tracking_enabled": true,
"verified_at": null,
"last_status_check_at": "2026-09-19T10:00:00+00:00"
}
],
"count": 1
}email-identity-detailsShow one sender identity in full, including the DNS records (DKIM CNAMEs, MAIL FROM MX/TXT and DMARC TXT) the domain owner must publish, each with a verified flag. Use it to guide someone through DNS setup.
Arguments
email_identity_idintegerThe identity id from list-email-identities.
Returns
idintegerIdentity id.
emailstringSender email address.
namestring|nullSender display name.
domainstringDomain registered in SES.
identity_statusstringpending, verifying, verified or failed. Only verified identities can send.
dkim_statusstringPENDING or SUCCESS.
mail_from_statusstringPENDING or SUCCESS.
open_tracking_enabledbooleanWhether opens are tracked.
click_tracking_enabledbooleanWhether clicks are tracked.
verified_atstring|nullISO-8601 timestamp of verification.
last_status_check_atstring|nullISO-8601 timestamp of the last AWS status check.
mail_from_subdomainstring|nullMAIL FROM subdomain, for example mas.example.com.
regionstringAWS region of the identity.
custom_link_domainstring|nullCustom link domain, when configured.
custom_link_domain_verifiedbooleanWhether the custom link domain is verified.
dns_recordsarrayDNS records to publish: type, name, value, priority, purpose (dkim, mail_from, dmarc) and verified.
Example result
{
"id": 3,
"email": "[email protected]",
"name": "Example Team",
"domain": "example.com",
"identity_status": "verifying",
"dkim_status": "PENDING",
"mail_from_status": "PENDING",
"open_tracking_enabled": true,
"click_tracking_enabled": true,
"verified_at": null,
"last_status_check_at": "2026-09-19T10:00:00+00:00",
"mail_from_subdomain": "mas.example.com",
"region": "us-east-1",
"custom_link_domain": null,
"custom_link_domain_verified": false,
"dns_records": [
{
"type": "CNAME",
"name": "abc123._domainkey.example.com",
"value": "abc123.dkim.amazonses.com",
"priority": null,
"purpose": "dkim",
"verified": false
},
{
"type": "MX",
"name": "mas.example.com",
"value": "feedback-smtp.us-east-1.amazonses.com",
"priority": 10,
"purpose": "mail_from",
"verified": false
},
{
"type": "TXT",
"name": "mas.example.com",
"value": "v=spf1 include:amazonses.com ~all",
"priority": null,
"purpose": "mail_from",
"verified": false
},
{
"type": "TXT",
"name": "_dmarc.example.com",
"value": "v=DMARC1; p=none;",
"priority": null,
"purpose": "dmarc",
"verified": false
}
]
}create-email-identityCreate a sender identity. Registers the email domain in your own AWS SES, sets up a MAIL FROM subdomain and a per-identity configuration set, and returns the DNS records to publish. Requires AWS credentials configured in the dashboard. Set existing_aws_identity to import a domain that is already verified in SES.
Arguments
emailstringSender email address. Its domain is registered in SES.
namestringOptional sender display name.
existing_aws_identitybooleanImport a domain that already exists in SES instead of creating it. Default false.
open_tracking_enabledbooleanTrack opens. Default true.
click_tracking_enabledbooleanTrack clicks. Default true.
mail_from_subdomainstringOptional lowercase MAIL FROM subdomain. Default mas.<domain>.
Returns
idintegerIdentity id.
emailstringSender email address.
namestring|nullSender display name.
domainstringDomain registered in SES.
identity_statusstringpending, verifying, verified or failed. Only verified identities can send.
dkim_statusstringPENDING or SUCCESS.
mail_from_statusstringPENDING or SUCCESS.
open_tracking_enabledbooleanWhether opens are tracked.
click_tracking_enabledbooleanWhether clicks are tracked.
verified_atstring|nullISO-8601 timestamp of verification.
last_status_check_atstring|nullISO-8601 timestamp of the last AWS status check.
mail_from_subdomainstring|nullMAIL FROM subdomain, for example mas.example.com.
regionstringAWS region of the identity.
custom_link_domainstring|nullCustom link domain, when configured.
custom_link_domain_verifiedbooleanWhether the custom link domain is verified.
dns_recordsarrayDNS records to publish: type, name, value, priority, purpose (dkim, mail_from, dmarc) and verified.
messagestringHuman-readable confirmation with the next step.
Example result
{
"id": 3,
"email": "[email protected]",
"name": "Example Team",
"domain": "example.com",
"identity_status": "pending",
"dkim_status": "PENDING",
"mail_from_status": "PENDING",
"open_tracking_enabled": true,
"click_tracking_enabled": true,
"verified_at": null,
"last_status_check_at": null,
"mail_from_subdomain": "mas.example.com",
"region": "us-east-1",
"custom_link_domain": null,
"custom_link_domain_verified": false,
"dns_records": [
{
"type": "CNAME",
"name": "abc123._domainkey.example.com",
"value": "abc123.dkim.amazonses.com",
"priority": null,
"purpose": "dkim",
"verified": false
},
{
"type": "MX",
"name": "mas.example.com",
"value": "feedback-smtp.us-east-1.amazonses.com",
"priority": 10,
"purpose": "mail_from",
"verified": false
},
{
"type": "TXT",
"name": "mas.example.com",
"value": "v=spf1 include:amazonses.com ~all",
"priority": null,
"purpose": "mail_from",
"verified": false
},
{
"type": "TXT",
"name": "_dmarc.example.com",
"value": "v=DMARC1; p=none;",
"priority": null,
"purpose": "dmarc",
"verified": false
}
],
"message": "Identity #3 created. Publish the DNS records, then call refresh-email-identity-status."
}refresh-email-identity-statusAsk AWS SES for the current verification state of an identity and sync it: identity status, DKIM status, MAIL FROM status and the verified flag on each DNS record. Call it after the DNS records are published.
Arguments
email_identity_idintegerThe identity id.
Returns
idintegerIdentity id.
emailstringSender email address.
namestring|nullSender display name.
domainstringDomain registered in SES.
identity_statusstringpending, verifying, verified or failed. Only verified identities can send.
dkim_statusstringPENDING or SUCCESS.
mail_from_statusstringPENDING or SUCCESS.
open_tracking_enabledbooleanWhether opens are tracked.
click_tracking_enabledbooleanWhether clicks are tracked.
verified_atstring|nullISO-8601 timestamp of verification.
last_status_check_atstring|nullISO-8601 timestamp of the last AWS status check.
mail_from_subdomainstring|nullMAIL FROM subdomain, for example mas.example.com.
regionstringAWS region of the identity.
custom_link_domainstring|nullCustom link domain, when configured.
custom_link_domain_verifiedbooleanWhether the custom link domain is verified.
dns_recordsarrayDNS records to publish: type, name, value, priority, purpose (dkim, mail_from, dmarc) and verified.
messagestringHuman-readable status line.
Example result
{
"id": 3,
"email": "[email protected]",
"name": "Example Team",
"domain": "example.com",
"identity_status": "verifying",
"dkim_status": "PENDING",
"mail_from_status": "PENDING",
"open_tracking_enabled": true,
"click_tracking_enabled": true,
"verified_at": null,
"last_status_check_at": "2026-09-19T10:00:00+00:00",
"mail_from_subdomain": "mas.example.com",
"region": "us-east-1",
"custom_link_domain": null,
"custom_link_domain_verified": false,
"dns_records": [
{
"type": "CNAME",
"name": "abc123._domainkey.example.com",
"value": "abc123.dkim.amazonses.com",
"priority": null,
"purpose": "dkim",
"verified": false
},
{
"type": "MX",
"name": "mas.example.com",
"value": "feedback-smtp.us-east-1.amazonses.com",
"priority": 10,
"purpose": "mail_from",
"verified": false
},
{
"type": "TXT",
"name": "mas.example.com",
"value": "v=spf1 include:amazonses.com ~all",
"priority": null,
"purpose": "mail_from",
"verified": false
},
{
"type": "TXT",
"name": "_dmarc.example.com",
"value": "v=DMARC1; p=none;",
"priority": null,
"purpose": "dmarc",
"verified": false
}
],
"message": "Identity #3 is verifying."
}update-email-identity-trackingTurn open tracking and click tracking on or off for an identity. Updates the SES configuration set so future mail reports (or stops reporting) opens and clicks.
Arguments
email_identity_idintegerThe identity id.
open_tracking_enabledbooleanWhether to track opens.
click_tracking_enabledbooleanWhether to track clicks.
Returns
idintegerIdentity id.
emailstringSender email address.
namestring|nullSender display name.
domainstringDomain registered in SES.
identity_statusstringpending, verifying, verified or failed. Only verified identities can send.
dkim_statusstringPENDING or SUCCESS.
mail_from_statusstringPENDING or SUCCESS.
open_tracking_enabledbooleanWhether opens are tracked.
click_tracking_enabledbooleanWhether clicks are tracked.
verified_atstring|nullISO-8601 timestamp of verification.
last_status_check_atstring|nullISO-8601 timestamp of the last AWS status check.
messagestringHuman-readable confirmation.
Example result
{
"id": 3,
"email": "[email protected]",
"name": "Example Team",
"domain": "example.com",
"identity_status": "verifying",
"dkim_status": "PENDING",
"mail_from_status": "PENDING",
"open_tracking_enabled": true,
"click_tracking_enabled": false,
"verified_at": null,
"last_status_check_at": "2026-09-19T10:00:00+00:00",
"message": "Tracking updated for identity #3."
}list-automationsList the automations of the account with their trigger condition, actions and live flag. Condition and action values are raw ids. Use automation-details to see them with names.
Arguments
is_livebooleanOptional filter: true for live automations, false for paused ones.
searchstringOptional search against the automation name.
limitintegerMaximum automations to return (1-100, default 25).
Returns
automationsarrayAutomations, newest first. Each item has the fields of automation-details without the resolved names.
countintegerNumber of automations returned.
Example result
{
"automations": [
{
"id": 12,
"name": "Tag new customers",
"type": "simple",
"is_live": false,
"condition": {
"type": "contact_added_to_list",
"value": 8
},
"actions": [
{
"type": "add_tag",
"value": 5
}
],
"created_at": "2026-09-23T10:00:00+00:00",
"updated_at": "2026-09-23T10:00:00+00:00"
}
],
"count": 1
}automation-detailsShow one automation. Each list, tag or sequence id in the condition and the actions comes with its name, or null when the item no longer exists.
Arguments
automation_idintegerThe automation id from list-automations.
Returns
idintegerAutomation id.
namestringAutomation name.
typestringsimple or multistep.
is_livebooleanWhether the automation runs on contacts now.
conditionobjectThe trigger: type and value (list, tag or sequence id), or attribute, operator and value for attribute_changed. Has a name for a list, tag or sequence.
actionsarrayThe actions, in order: type and value (tag, list or sequence id), with a name.
created_atstring|nullISO-8601 creation time.
updated_atstring|nullISO-8601 time of the last change.
Example result
{
"id": 12,
"name": "Tag new customers",
"type": "simple",
"is_live": false,
"condition": {
"type": "contact_added_to_list",
"value": 8,
"name": "Customers"
},
"actions": [
{
"type": "add_tag",
"value": 5,
"name": "VIP"
}
],
"created_at": "2026-09-23T10:00:00+00:00",
"updated_at": "2026-09-23T10:00:00+00:00"
}view-automation-optionsDescribe the building blocks of an automation: the condition types, the action types, and the lists, tags, sequences and contact attributes that a condition or an action can use. An add_sequence action accepts only live sequences.
Returns
condition_typesarrayEach trigger type with a description of the value it needs.
action_typesarrayEach action type with a description of the value it needs.
availableobjectlists, tags and sequences (id and name, sequences also have status) and attributes (names).
Example result
{
"condition_types": [
{
"type": "contact_added_to_list",
"description": "A contact is added to the list. value = list id."
}
],
"action_types": [
{
"type": "add_tag",
"description": "Add the tag to the contact. value = tag id."
}
],
"available": {
"lists": [
{
"id": 8,
"name": "Customers"
}
],
"tags": [
{
"id": 5,
"name": "VIP"
}
],
"sequences": [
{
"id": 3,
"name": "Onboarding",
"status": "live"
}
],
"attributes": [
"plan"
]
}
}create-automationCreate an automation: when the condition happens to a contact, the actions run on that contact. Automations are always created paused. Turn them on from the dashboard, because the MCP server cannot turn an automation on.
Arguments
namestringAutomation name.
typestringsimple (default) or multistep.
conditionobjectThe trigger: type (contact_added_to_list, removed_from_list, tag_added, removed_tag, added_to_sequence, sequence_finished or attribute_changed) and value (the id). For attribute_changed, send attribute and operator (changed_to with a value, or changed).
actionsarrayOne or more actions: type (add_tag, remove_tag, add_list, remove_list or add_sequence) and value (the id). add_sequence needs a live sequence.
Returns
idintegerAutomation id.
namestringAutomation name.
typestringsimple or multistep.
is_livebooleanWhether the automation runs on contacts now.
created_atstring|nullISO-8601 creation time.
updated_atstring|nullISO-8601 time of the last change.
conditionobjectThe saved trigger.
actionsarrayThe saved actions.
messagestringHuman-readable confirmation.
Example result
{
"id": 12,
"name": "Tag new customers",
"type": "simple",
"is_live": false,
"condition": {
"type": "contact_added_to_list",
"value": 8
},
"actions": [
{
"type": "add_tag",
"value": 5
}
],
"created_at": "2026-09-23T10:00:00+00:00",
"updated_at": "2026-09-23T10:00:00+00:00",
"message": "Paused automation #12 created. Turn it on from the BYOMailer dashboard."
}update-automationUpdate a paused automation. A live automation returns an error until you pause it in the dashboard. Only the fields that you send change. A condition replaces the full condition, and an actions array replaces all actions. The live flag does not change.
Arguments
automation_idintegerThe id of the paused automation.
namestringAutomation name.
typestringsimple (default) or multistep.
conditionobjectThe trigger: type (contact_added_to_list, removed_from_list, tag_added, removed_tag, added_to_sequence, sequence_finished or attribute_changed) and value (the id). For attribute_changed, send attribute and operator (changed_to with a value, or changed).
actionsarrayOne or more actions: type (add_tag, remove_tag, add_list, remove_list or add_sequence) and value (the id). add_sequence needs a live sequence.
Returns
idintegerAutomation id.
namestringAutomation name.
typestringsimple or multistep.
is_livebooleanWhether the automation runs on contacts now.
created_atstring|nullISO-8601 creation time.
updated_atstring|nullISO-8601 time of the last change.
conditionobjectThe saved trigger.
actionsarrayThe saved actions.
messagestringHuman-readable confirmation.
Example result
{
"id": 12,
"name": "Tag new customers as VIP",
"type": "simple",
"is_live": false,
"condition": {
"type": "contact_added_to_list",
"value": 8
},
"actions": [
{
"type": "add_tag",
"value": 5
}
],
"created_at": "2026-09-23T10:00:00+00:00",
"updated_at": "2026-09-23T10:00:00+00:00",
"message": "Paused automation #12 updated."
}