---
title: "30 things to ask an email and SMS MCP server"
description: "Thirty prompts for Claude, Cursor, ChatGPT or any MCP client connected to Unitpost, grouped by job, with the tools each calls and which ones send."
url: https://www.unitpost.com/blog/agents/email-sms-mcp-prompts
section: Blog
updated: 2026-11-02
---
# 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.

## 30 things to ask an email and SMS MCP server

> Thirty prompts for Claude, Cursor, ChatGPT or any MCP client connected to Unitpost, grouped by job, with the tools each calls and which ones send.

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`.

```bash
https://mcp.unitpost.com/mcp?toolsets=default,campaigns
```

### Set up a sending domain

- "Add mail.yourdomain.com as a sending domain and list the DNS records I need to publish." `email_domains_create` returns the `records`. Changes.
- "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).
- "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.
- "Which From addresses have we saved on that domain?" `email_senders_list` (domains).

### Send and debug transactional email

- "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.
- "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.
- "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).
- "Cancel the scheduled email to sam@yourdomain.com." `email_list` filtered by `to` and `status`, then `email_update`. Changes.
- "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.
- "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

- "Add ada@example.com with first name Ada and the custom field plan set to pro." `contacts_create`. Changes.
- "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.
- "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.
- "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.
- "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

- "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.
- "Validate it and list every blocker and warning." `email_campaigns_validate` returns `can_send`, `blockers`, `sendable`, `variable_coverage` and `warnings`.
- "Send me a test of that template first." `email_templates_test_send`. Without a verified domain, only workspace members can receive it. Sends.
- "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.
- "How did last week's campaign do, and why did it pause?" `email_campaigns_stats` (campaigns) and `pause_reason` from `email_campaigns_get`.

### SMS

- "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.
- "Has Ada agreed to marketing texts? Show the history." `contacts_get`, then `sms_consent_get` for her consent state and every recorded change.
- "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.
- "Show me my whole conversation with Ada's number." `sms_list` with `participant` set to her E.164 number returns both directions.

### Webhooks

- "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.
- "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.
- "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

- "Last 30 days of email for mail.yourdomain.com: delivered, bounced, complained." `email_stats` with `days` and `domain_id`.
- "How many texts did we send this period, and how much of the period's allowance is used?" `sms_stats` and `usage_get`.
- "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.

## FAQ

### 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.

## Related

- [Write emails that AI inbox summaries get right](https://www.unitpost.com/blog/agents/emails-ai-summaries-read-correctly): What Gmail's Gemini and Apple Intelligence do with your email, per their own help pages, and how to write mail that their summaries get right.
- [Gmail sending limits and API scopes for AI agents](https://www.unitpost.com/blog/agents/gmail-limits-for-ai-agents): What an AI agent sending through Gmail runs into: daily sending limits, Gmail API quota units, and restricted scopes that need a yearly security review.
- [How email webhooks work (they're POST)](https://www.unitpost.com/blog/concepts/how-email-webhooks-work): An email webhook is an HTTP POST to your URL when a message is delivered, bounced, opened, or clicked — not polling, not IMAP.
