30 things to ask an email and SMS MCP server

Connected to Unitpost's MCP server, Claude, Cursor, ChatGPT or any MCP client can set up a domain, debug a bounce, build a segment, validate a campaign, check SMS consent, test a webhook and pull stats. Ask for the job, not the endpoint. Each prompt below names the tools it calls and whether it sends or changes anything. Most tools are in the default list; a few need a group added with ?toolsets= on the server URL.

Unitpost ·

Every prompt here works in any client connected to https://mcp.unitpost.com/mcp. Each tool is one Unitpost REST call, so it carries the same scopes, per-workspace rate limit and sending gate as the API. Swap in your own domain, addresses and names.

How to read the list

  • Tool names in backticks are what the client would call, taken from the server's tool list. The client chooses, so it may add a read of its own.
  • Sends means a real email, text or webhook leaves Unitpost. Changes means a write to your workspace. Unmarked prompts only read.
  • Unitpost marks sends, cancels, deletes and overwrites as destructive, so Claude and ChatGPT ask before a send goes out. Additive writes, such as creating a contact or a draft campaign, are not marked, so a client may run them without asking.
  • A tool followed by a group name, like email_list_events (sending), is outside the default list. Add the group to the URL or send it in an X-MCP-Toolsets header. The groups are audience, templates, campaigns, sending, inbox, domains, workspace and sms, plus default and all.
cURL
https://mcp.unitpost.com/mcp?toolsets=default,campaigns

Set up a sending domain

  1. "Add mail.yourdomain.com as a sending domain and list the DNS records I need to publish." email_domains_create returns the records. Changes.
  2. "Is mail.yourdomain.com verified yet? Check it once and tell me what's pending." email_domains_get, then email_domains_verify. The tool's own note says to call verify once, never in a loop: DNS can take hours and Unitpost keeps re-checking a pending domain in the background. Changes (status only).
  3. "Verification failed. What does each nameserver return, and what's the fix?" email_domains_diagnose ranks findings by severity, each with its fix. It shares verify's DNS rate limit, so one call.
  4. "Which From addresses have we saved on that domain?" email_senders_list (domains).

Send and debug transactional email

  1. "Send a test from hello@yourdomain.com to me@yourdomain.com with the subject 'MCP test'." email_domains_list to confirm the domain is verified or degraded, then email_send. Sends.
  2. "Send our published 'Welcome' template to sam@yourdomain.com with first_name set to Sam." email_templates_list, then email_send with template: { id, variables }. A draft template is refused with template_not_published. Sends.
  3. "Schedule that for 9:00 tomorrow New York time and show me it's scheduled." email_send with scheduled_at carrying an offset (a time with no zone is rejected), then email_get to read back status: scheduled. Sends (later).
  4. "Cancel the scheduled email to sam@yourdomain.com." email_list filtered by to and status, then email_update. Changes.
  5. "Why didn't ada@example.com get yesterday's receipt?" email_list with to, email_list_events (sending) for the bounce's diagnostic_code, and suppressions_get by email.
  6. "That one failed with a temporary error. Retry it." email_retry (sending) sends again on the same id, only for a one-off send whose failure was temporary, with an idempotency_key. Sends.

Contacts, segments and topics

  1. "Add ada@example.com with first name Ada and the custom field plan set to pro." contacts_create. Changes.
  2. "Change Ada's plan to team and leave her other fields alone." contacts_get, then contacts_update. The custom_fields map you send replaces the whole map, so the client starts from the current one. Changes.
  3. "Make a dynamic segment of contacts on the pro plan and tell me how many a campaign would reach." segments_create with type: dynamic and a filter, then segments_get_preview (audience) for subscribed_count. Changes.
  4. "Create a 'Product updates' topic people can opt out of, then show Ada's subscriptions." email_topics_create with default_opt_in, then contact_topics_list. Changes.
  5. "Import the people who signed up for our webinar updates from this list." contact_imports_create, then contact_imports_get. New contacts only; existing addresses are skipped, not updated. The server's instructions refuse scraped, purchased or rented lists. Changes.

Campaigns

  1. "Draft a campaign from the 'October update' template to the pro segment, scoped to the Product updates topic. Don't send it." email_campaigns_create makes a draft; nothing sends. Changes.
  2. "Validate it and list every blocker and warning." email_campaigns_validate returns can_send, blockers, sendable, variable_coverage and warnings.
  3. "Send me a test of that template first." email_templates_test_send. Without a verified domain, only workspace members can receive it. Sends.
  4. "Schedule it for Tuesday at 10:00 Berlin time." email_campaigns_send with body.scheduled_at (null means now), then email_campaigns_get to confirm scheduled. Sends.
  5. "How did last week's campaign do, and why did it pause?" email_campaigns_stats (campaigns) and pause_reason from email_campaigns_get.

SMS

  1. "Is SMS ready? Which of our senders can send right now?" sms_brands_list (status and the missing list) and sms_numbers_list, where only active senders send.
  2. "Has Ada agreed to marketing texts? Show the history." contacts_get, then sms_consent_get for her consent state and every recorded change.
  3. "Text Ada: 'Your appointment is confirmed for Thursday at 3 pm.'" sms_send. Marketing texts need recorded consent; a refusal comes back as a 403 with the reason, such as recipient_not_opted_in. STOP and HELP replies are handled for you. Sends.
  4. "Show me my whole conversation with Ada's number." sms_list with participant set to her E.164 number returns both directions.

Webhooks

  1. "Register https://api.yourdomain.com/hooks/unitpost for email.bounced and email.complained." webhooks_create returns the signing_secret exactly once, so move it into your secret store. Changes.
  2. "Fire a test event at it and show me what our server answered." webhooks_test posts a signed sample event and returns the receiver's response. Sends.
  3. "Why are deliveries failing? Once it's fixed, replay the last failed one." webhooks_list_deliveries, then webhooks_replay_delivery (workspace), which runs your handler again with the same event id. Sends.

Reporting

  1. "Last 30 days of email for mail.yourdomain.com: delivered, bounced, complained." email_stats with days and domain_id.
  2. "How many texts did we send this period, and how much of the period's allowance is used?" sms_stats and usage_get.
  3. "Who changed the pro segment yesterday, and with which key?" activity_list (sending), which needs activity:read ticked for the app.

Reporting sessions

For a session that should only look, connect with ?readonly=1 (or X-MCP-Readonly: 1). The server lists read tools only and refuses any write on that connection, whatever the model tries.

What stays in the dashboard?

Some jobs have no tool on purpose, and the server tells the agent to send you to the dashboard instead: API keys and SMTP passwords, teammates, plan and billing, the free-form footer, connected apps, importing from another provider, and toll-free numbers or brand documents for SMS. If a prompt asks for one of these, the right answer is a pointer to the page, not a workaround.

Frequently asked questions

Do I have to name the tool in my prompt?

No. The client reads each tool's name and description and picks one. Naming a tool helps when two could fit, such as email_list and email_list_events. Many descriptions carry a Before and After check, for example reading the domain's status before email_send, so a good client runs those reads on its own.

Why can't my client see email_list_events or email_templates_render?

They aren't in the default list. Add their group to the server URL, such as ?toolsets=default,sending or ?toolsets=default,templates, or send the same value in an X-MCP-Toolsets header. Listing is not permission: the credential's scopes still decide what runs.

Will the client ask before it sends?

Unitpost marks sends, cancels, deletes and overwrites as destructive, and Claude and ChatGPT ask before a send goes out. Other clients follow their own approval settings. For a hard stop, connect with ?readonly=1, which refuses every write, or use a credential without the send scopes.

Free to start

Start sending for free

$0/ mo

  • 5,000 emails / mo — no credit card
  • Your domain with DKIM, SPF & DMARC
  • REST API, SMTP & official SDKs
  • Visual editor + code templates
  • Open & click tracking + signed webhooks
  • 10,000 contacts · automatic suppression