Draft and send a Sendly campaign
Go from an idea to a campaign in DRAFT, then to a test, then to a send. Sending reaches real inboxes, so it happens only after the user explicitly confirms the audience size.
Connecting and calling the tools
Every tool in this skill comes from the sendly MCP server, the Sendly connector, and is written here as sendly:<tool>.
- Tools listed by name: call them directly, for example
sendly:list_contacts. - Only
sendly:search_toolsandsendly:execute_typescriptlisted (Code Mode, the default): callsendly:search_toolsfirst, then call each tool insidesendly:execute_typescriptasexternal_<tool>(for exampleexternal_list_contacts); the program mustreturnits result. Scopes, confirmations and gates are identical on both surfaces. - "Tool not found": switch to the Code Mode route instead of retrying the direct call. If
sendly:search_toolsdoes not return the tool either, its OAuth scope was not granted; the user reconnects Sendly and approves that scope. - No
sendlytools at all: Sendly is not connected yet. Install the Sendly power, which adds the server; it signs in with OAuth on first use.
Tools you will use
sendly:list_segments,sendly:list_segment_contacts,sendly:list_lists,sendly:list_contacts: find and size the audience.sendly:list_templates,sendly:get_template: reuse the copy and layout of an existing template.sendly:create_campaign: save a campaign in DRAFT. Needsname,subject,body, andfrom, even though the schema marks only the first two as required.sendly:update_campaign: change a draft campaign.sendly:send_test_email: send a test to the project owner's own verified address. Refuses any other recipient.sendly:send_campaign: two-step. Withoutconfirm: trueit returns the audience size and sends nothing. Withconfirm: trueit sends to every contact in the audience.sendly:check_domain: confirm thefromaddress is on a verified domain.
Workflow
- Settle the audience. Call
sendly:list_segmentsorsendly:list_lists, thensendly:list_segment_contactsorsendly:list_contactsto show who is in it and how many. - If the user wants to start from a template, call
sendly:list_templatesandsendly:get_template. - Write the subject and body in the user's voice. Show them and ask for changes once.
- Call
sendly:check_domainand make sure thefromaddress is on a verified domain. If not, stop and offer thechecking-email-deliverabilityskill. - Call
sendly:create_campaignwith name, subject, body, from, and audience. Report the campaign id and that it is a DRAFT. Nothing is sent. - Offer a test. Call
sendly:send_test_emailonly after the user says yes; it goes to their own verified address. - When the user asks to send, call
sendly:send_campaignwithoutconfirm. Report the audience size it returned, the subject, and the from address. - Ask: "Send this to N contacts now?" Only after an explicit yes in this turn, call
sendly:send_campaignagain withconfirm: true. Report the result.
Rules
- Never call
sendly:send_campaignwithconfirm: true,sendly:send_email, orsendly:send_mailbox_emailwithout an explicit yes to a stated recipient count. An earlier "send it" before the count was shown is not confirmation. - Never send to addresses that are not already contacts in the project. There is no bulk import or arbitrary-recipient send here, and a purchased list is not consent.
- If
sendly:send_test_emailrefuses a recipient, explain that tests go only to the owner's own verified address. - If the sending tools are missing, the user did not grant the sending scope. Say so; do not look for another way to send.
- Do not fabricate links, prices, or claims in the copy. Ask for them.
