attach-contact-to-list
Add a single contact to a single list. Both the contact and the list must belong to your team.
Send and schedule transactional email, manage templates and sending domains, and run the whole audience — lists, topics, properties, segments — from one server.
LABSCO SUMMARY
Deleting a template, a domain, a contact or a segment, and sending or scheduling a campaign, each instruct the assistant to confirm first and to spell out the consequence — deleting a template makes every email referencing that slug fail, deleting a domain stops sending on it entirely. That matters more here than on most servers because the audience side has operations that multiply: attaching contacts to lists is a cartesian product of both. A sensible order of work: get-merge-tags before sending to a template so substitution_data matches what it actually expects, and verify-domain before anything reaches a real recipient.
Lettr's MCP server over its email API: sending and inspecting transmissions, templates with merge tags, sending-domain DNS, webhooks, campaigns, and a complete audience model of contacts, lists, subscription topics, custom properties and segments. The irreversible tools carry an explicit instruction to confirm with the user before running.
Runs over stdio as npx -y lettr-mcp with LETTR_API_KEY, an lttr_ key created in the dashboard. SENDER_EMAIL_ADDRESS and REPLY_TO_EMAIL_ADDRESS set defaults, and --key, --sender and --reply-to do the same on the command line; with no default sender the server asks for one on every send. Sending to arbitrary recipients needs a verified sending domain.
One command plus a key — claude mcp add lettr -e LETTR_API_KEY=<YOUR_LETTR_API_KEY> -- npx -y lettr-mcp
USE CASES
Find the template, read the merge tags it declares, and send with substitution data that matches — rather than discovering the mismatch in the recipient's inbox.
Register the domain, publish the DKIM record it hands back, then trigger verification and read the SPF, DKIM, DMARC and CNAME report.
The full delivery timeline for a transmission with a derived state, and the surrounding events filtered by recipient or bounce class when the answer is not in that one message.
Schedule at least five minutes out and within three days, check its state before it goes, and cancel it if the plan changes.
Bulk-create from a list of addresses — existing ones are skipped and reported separately — with the same properties applied across the batch and everyone attached to the right list.
Define the segment with grouped conditions — OR inside a group, AND between groups — optionally restricted to one list, and read back the cached contact count it produces.
Review the draft with its rendered preview, schedule or send it as a deliberate confirmed step, then page through opens, clicks and bounces by cursor.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
attach-contact-to-listAdd a single contact to a single list. Both the contact and the list must belong to your team.
auth-checkValidate the configured Lettr API key and return the associated team ID. Use this to verify that the API key is correctly set up before performing other operations.
bulk-attach-contacts-to-listsAttach multiple contacts to multiple lists at once. Every contact is attached to every list (a cartesian product of contact_ids × list_ids). All IDs must belong to your team.
bulk-create-audience-contactsCreate many contacts at once from a list of email addresses. Optionally add all of them to a list and/or apply the same custom properties to every contact in the batch. Already-existing emails are skipped (reported separately).
bulk-delete-audience-listsDelete between 1 and 50 audience lists in a single call. Before using this tool, you MUST double-check with the user. Warn them that this action is irreversible — every listed list is removed and its contacts detached. All IDs must belong to your team.
bulk-detach-contacts-from-listsDetach multiple contacts from multiple lists at once (a cartesian product of contact_ids × list_ids). Before using this tool, you MUST double-check with the user, as it removes many memberships at once.
cancel-scheduled-emailCancel a scheduled email before it is sent. Before using this tool, you MUST confirm with the user that they really want to cancel this transmission — this action cannot be undone.
create-audience-contactCreate a single audience contact.
properties keys must match properties already defined for the team (use list-audience-properties).double_opt_in is provided, the contact is created in unverified status and receives a confirmation email; all four of its fields (from, subject, template_slug, redirect_url) are required.create-audience-listCreate a new audience list. The name must be unique within the team.
create-audience-propertyDefine a new custom contact property. The name must start with a lowercase letter and contain only lowercase letters, numbers, and underscores. The type fixes how values are stored and cannot be changed later.
create-audience-segmentCreate an audience segment defined by match conditions.
Conditions are grouped: conditions within a group are ORed together, and groups are ANDed together. The is_true and is_false operators take no value; all other operators require a value. Optionally restrict the segment to a single list with list_id.
create-audience-topicCreate a subscription topic. default_subscription controls whether contacts are opted in or out by default (defaults to opt_in); visibility controls whether the topic is shown on public preference pages (defaults to private).
create-domainRegister a new sending domain with Lettr. The domain starts in pending status until its DKIM record is set up and it is verified. After creation you MUST display the returned DKIM selector/public key to the user so they can configure their DNS.
create-templateCreate a new email template with HTML or Topol editor JSON content. Provide either html or json — they are mutually exclusive. Merge tags are automatically extracted from the content.
create-webhookCreate a new webhook subscription.
Required: name, url, auth_type, events_mode.
delete-audience-contactDelete a contact. Before using this tool, you MUST double-check with the user that they want to delete this contact. Warn them that this action is irreversible and removes the contact from all lists and topics.
delete-audience-listDelete an audience list. Before using this tool, you MUST double-check with the user that they want to delete this list. Warn them that this action is irreversible — the list is removed and its contacts are detached from it.
delete-audience-propertyDelete a custom contact property. Before using this tool, you MUST double-check with the user that they want to delete this property. Warn them that this action is irreversible and removes the property value from every contact.
delete-audience-segmentDelete an audience segment. Before using this tool, you MUST double-check with the user that they want to delete this segment. Warn them that this action is irreversible. (Contacts themselves are not deleted.)
delete-audience-topicDelete a subscription topic. Before using this tool, you MUST double-check with the user that they want to delete this topic. Warn them that this action is irreversible and removes all contact subscriptions to it.
delete-domainDelete a sending domain from Lettr. Before using this tool, you MUST double-check with the user that they want to delete this domain. Warn them that this action is irreversible and will stop all email sending for that domain.
delete-templatePermanently delete an email template and all its versions. Before using this tool, you MUST double-check with the user that they want to delete this template. Warn them that this action is irreversible and any emails referencing this template slug will fail.
delete-webhookDelete a webhook subscription. Before using this tool, you MUST double-check with the user. Warn them that this action is irreversible and event delivery to the configured URL will stop immediately.
detach-contact-from-listRemove a single contact from a single list.
get-audience-contactRetrieve a single contact by ID, including status, custom properties, and the lists and topics it belongs to.
get-audience-listRetrieve a single audience list by its ID, including its current contact count.
get-audience-propertyRetrieve a single custom contact property by its ID.
get-audience-segmentRetrieve a single audience segment by its ID, including its condition groups and cached contact count.
get-audience-topicRetrieve a single subscription topic by its ID.
get-campaignRetrieve a single campaign by its ID, including embedded engagement stats and a preview of its rendered HTML content.
get-domainRetrieve full details of a sending domain including CNAME, DKIM, DMARC and SPF status, tracking domain configuration, and any detected DNS provider.
get-email-detailRetrieve the full delivery timeline for a single transmission by request ID — returns derived state (scheduled/delivered/bounced/failed), recipients and all events.
get-merge-tagsRetrieve the merge tags (variables) for a template. Use this to discover which substitution_data keys a template expects when sending an email. By default returns merge tags for the active version.
get-scheduled-emailRetrieve details of a scheduled (but not yet sent) email, including its state, scheduled_at timestamp, recipients and any events collected so far.
get-templateRetrieve full details of a template by its slug, including active version HTML/JSON content and version count.
get-template-htmlRetrieve a rendered template by project_id and slug. Returns the HTML body, the subject (if set) and the list of merge tags (each with key, name and required flag). This endpoint uses a non-standard {success, data} response envelope.
get-webhookRetrieve details of a specific webhook by its string ID (e.g. "webhook-abc123"). Includes enabled state, event types, auth type, and last delivery timestamps.
health-checkCheck the Lettr API health status. Returns the current API status and a server timestamp. This endpoint does not require authentication.
list-audience-contactsList audience contacts with pagination and optional filters. Filter by free-text search (email or name), status, a specific list, or a specific segment.
list-audience-listsList the audience (contact) lists for your team, with pagination. Use this to discover list IDs to pass to contact and segment tools.
list-audience-propertiesList the custom contact properties defined for your team, with pagination. Use this to discover which property keys are valid when creating or updating contacts.
list-audience-segmentsList audience segments for your team, with pagination. Optionally filter to segments restricted to a specific list.
list-audience-topicsList subscription topics for your team, with pagination. Use this to discover topic IDs to subscribe contacts to.
list-campaign-eventsList engagement events (opens, clicks, bounces, etc.) for a campaign, with optional filters. Uses cursor-based pagination: this tool returns one page plus a next_cursor. Keep calling it with cursor set to the returned next_cursor until next_cursor is null. Note: when a filter is applied, a page can come back with no events but a non-null next_cursor — that means more pages remain, so keep paginating until next_cursor is null.
list-campaignsList campaigns for your team, with pagination and an optional status filter. Each campaign includes embedded engagement stats. Use this to discover campaign IDs for the other campaign tools.
list-domainsList all sending domains registered with your Lettr account. Returns domain names, statuses, and CNAME/DKIM verification state.
list-email-eventsList email events (delivery, bounce, click, open, …) across all sent messages, filtered by event type, recipient, date range, transmission ID or bounce class.
list-emailsList recently sent emails with pagination and optional filters. Returns injection events for each email so you can inspect subject, recipient and timestamp.
list-projectsList projects owned by the team, with pagination. Use this to discover project IDs to pass to template and email tools.
list-templatesPurpose: List email templates with pagination. Returns template names, slugs, and project info.
Returns: Paginated list of templates with id, name, slug, project_id, folder_id, timestamps.
When to use:
list-webhooksList all webhooks configured for your Lettr account. Returns webhook URLs, enabled status, subscribed event types, and last delivery result.
schedule-campaignSchedule a draft campaign for future delivery, or reschedule an already-scheduled campaign to a new time. Before using this tool, you MUST confirm the time with the user and warn them that at the scheduled time this will dispatch real emails to recipients. The campaign must be a draft or already scheduled, with a subject, sender, and content.
schedule-emailSchedule an email for future delivery. Accepts the same fields as send-email plus a required scheduled_at (ISO 8601, UTC) that is at least 5 minutes in the future and at most 3 days out.
Returns: Same response as send-email (request_id + accepted/rejected counts).
send-campaignImmediately send a draft campaign to its recipients. Before using this tool, you MUST double-check with the user that they want to send now. Warn them that this is irreversible and outward-facing — it dispatches real emails to recipients that cannot be recalled. The campaign must be a draft with a subject, sender, and content; on success it transitions to "preparing".
send-emailPurpose: Send a transactional email to one or more recipients. Supports HTML, plain text, AMP HTML, templates with merge tags, attachments, custom headers, tracking, and personalization.
Returns: Send confirmation with request ID and accepted/rejected counts.
When to use:
Key trigger phrases: "Send an email", "Email this to", "Notify", "Send a message", "Reply to them"
subscribe-contact-to-topicSubscribe a single contact to a single topic. Both must belong to your team.
unschedule-campaignCancel a scheduled send, returning the campaign to draft. The campaign must currently be scheduled.
unsubscribe-contact-from-topicUnsubscribe a single contact from a single topic.
update-audience-contactUpdate a contact. All fields are optional — only provided fields change.
status may only be set to subscribed or unsubscribed.properties is a partial update: include only the keys you want to change. Setting a property to null removes it from the contact.update-audience-listRename an audience list. The new name must remain unique within the team.
update-audience-propertyUpdate a property's fallback value. The name and type are fixed at creation and cannot be changed. Set fallback_value to null to clear it.
update-audience-segmentUpdate an audience segment. All fields are optional — only provided fields change. Providing conditions replaces the entire condition set.
update-audience-topicUpdate a subscription topic. All fields are optional — only provided fields change. Note that default_subscription cannot be changed after creation.
update-templateUpdate an existing template's name and/or content. Providing new html or json content creates a new version automatically. The html and json fields are mutually exclusive.
update-webhookUpdate an existing webhook. All fields are optional — only provided fields are changed.
Notes:
active on update (the response field is enabled).events array uses the canonical fully-prefixed event names (e.g. "message.delivery", "engagement.open").verify-domainTrigger DNS verification for a domain. Checks DKIM, CNAME (when applicable), DMARC and SPF records and returns the full validation report.
BEFORE YOU INSTALL
66 tools when we connected. The Campaigns tools, such as send-campaign and schedule-campaign, are available but undocumented; bulk-subscribe-contacts-to-topics and bulk-unsubscribe-contacts-from-topics are documented but not available.
All 3 documented clients run the server on your machine.
CONTEXT COST
Rated by the size of the 66 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
claude mcp add lettr -e LETTR_API_KEY=<YOUR_LETTR_API_KEY> -- npx -y lettr-mcp{
"mcpServers": {
"lettr": {
"command": "npx",
"args": [
"-y",
"lettr-mcp"
],
"env": {
"LETTR_API_KEY": "<YOUR_LETTR_API_KEY>"
}
}
}
}