# io.github.spruikco/send16-mcp (remote · mcp.send16.com)

Email for AI agents: send mail, manage contacts, automations & webhooks. Zero-DNS first send.

- Trust score: 75/100 (medium)
- Change this week: +7
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `mcp.send16.com`: 75/100 (this document), [markdown](https://verifymcp.io/servers/spruikco-send16-mcp/mcp.md), [page](https://verifymcp.io/servers/spruikco-send16-mcp/mcp)
- npm · `send16-mcp`: 65/100, [markdown](https://verifymcp.io/servers/spruikco-send16-mcp/send16-mcp.md), [page](https://verifymcp.io/servers/spruikco-send16-mcp/send16-mcp)

## Channel facts

- Endpoint: `https://mcp.send16.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.5.8`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 77/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, but the challenge carries no valid RFC 9728 metadata, so a client cannot discover where to get a token.
  - HTTPS not yet verified: we couldn't determine whether a plaintext access path exists.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 77/100
  - AI-judged instruction clarity (excellent).
  - Tool/resource definitions use about 6917 tokens (~87/item across 79 items; 79 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 96/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 87% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http spruikco-send16-mcp https://mcp.send16.com/mcp
```

### Codex

```toml
[mcp_servers.spruikco-send16-mcp]
url = "https://mcp.send16.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "spruikco-send16-mcp": {
      "type": "remote",
      "url": "https://mcp.send16.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add spruikco-send16-mcp --url https://mcp.send16.com/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  spruikco-send16-mcp:
    url: "https://mcp.send16.com/mcp"
```

### Other

```json
{
  "mcpServers": {
    "spruikco-send16-mcp": {
      "type": "http",
      "url": "https://mcp.send16.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 75, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-02 (score 74, +1)

- [security] Tool “list_campaigns” rewrote its description, which is the text the model reads
- [security] Tool “update_campaign” rewrote its description, which is the text the model reads
- [security] Tool “create_campaign” rewrote its description, which is the text the model reads
- [security] Tool “create_contact” rewrote its description, which is the text the model reads
- [security] Tool “duplicate_campaign” rewrote its description, which is the text the model reads
- [security] Tool “import_contacts” rewrote its description, which is the text the model reads
- [security] Tool “update_convo” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 79 → 87
- [functional] Schema quality: good → excellent
- [functional] Server version: 0.5.8 → 0.5.13
- [cosmetic] “list_automation_enrollments” added an optional parameter “pageSize”
- [cosmetic] “list_campaigns” added an optional parameter “search”
- [cosmetic] “update_campaign” added an optional parameter “audienceIds”
- [cosmetic] “update_campaign” added an optional parameter “contactIds”
- [cosmetic] “update_campaign” added an optional parameter “name”
- [cosmetic] “update_campaign” added an optional parameter “segmentId”
- [cosmetic] “update_campaign” added an optional parameter “tagIds”
- [cosmetic] “create_campaign” added an optional parameter “audienceIds”
- [cosmetic] “create_campaign” added an optional parameter “contactIds”
- [cosmetic] “create_campaign” added an optional parameter “html”
- [cosmetic] “create_campaign” added an optional parameter “segmentId”
- [cosmetic] “create_campaign” added an optional parameter “sendToAll”
- [cosmetic] “create_campaign” added an optional parameter “tagIds”
- [cosmetic] “create_contact” added an optional parameter “audienceIds”
- [cosmetic] “duplicate_campaign” added an optional parameter “audienceIds”
- [cosmetic] “duplicate_campaign” added an optional parameter “contactIds”
- [cosmetic] “duplicate_campaign” added an optional parameter “name”
- [cosmetic] “duplicate_campaign” added an optional parameter “segmentId”
- [cosmetic] “duplicate_campaign” added an optional parameter “sendToAll”
- [cosmetic] “duplicate_campaign” added an optional parameter “tagIds”
- [cosmetic] “import_contacts” added an optional parameter “audienceIds”
- [cosmetic] “update_campaign” added an optional parameter “sendToAll”
- [cosmetic] “list_automation_enrollments” added an optional parameter “page”
- [cosmetic] “list_convos” reworded the description of “label”
- [cosmetic] “list_convos” reworded the description of “state”
- [cosmetic] “update_brand” reworded the description of “fontFamily”
- [cosmetic] “update_convo” reworded the description of “assigneeId”
- [cosmetic] “update_convo” reworded the description of “state”
- [cosmetic] “create_contact” reworded the description of “tags”
- [cosmetic] “duplicate_campaign” reworded the description of “campaignId”
- [cosmetic] “import_contacts” reworded the description of “csvData”
- [cosmetic] “import_contacts” reworded the description of “tags”
- [cosmetic] “list_convos” dropped the optional parameter “offset”
- [cosmetic] “list_convos” dropped the optional parameter “screener_status”
- [cosmetic] “update_campaign” dropped the optional parameter “templateSlug”
- [cosmetic] “update_convo” dropped the optional parameter “starred”
- [cosmetic] “list_automation_enrollments” dropped the optional parameter “cursor”
- [cosmetic] “list_automation_enrollments” dropped the optional parameter “limit”

### 2026-07-31 (score 73, +3)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 70, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-28 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 68, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 67)

First indexed and scored.

## MCP tools (79)

### `whoami` (~78 tokens)

Verify the API key and return the authenticated workspace: name, plan, email quota (used/limit), and owner. Call this first to confirm the key works before sending. Pair with list_domains to see which `from` addresses are allowed.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `send_email` (~275 tokens)

Send a transactional email through Send16. Provide `html`, `text`, or both (text-only is fine for OTPs/receipts/alerts). `from_email` must belong to a domain that is verified in the workspace — call `whoami` for the account and `list_domains` to see which senders are allowed; a send from an unverified domain returns a clear error, not a silent failure. For a zero-setup first send, use from_email `onboarding@send16.com` — the sandbox sender delivers with no DNS, but only to your own account email.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `from_email` (string): Sender email address (must be from a verified domain)
- `from_name` (string): Sender display name (e.g. "Acme Co")
- `html` (string): HTML body content
- `reply_to` (string): Reply-to email address
- `subject` (string, required): Email subject line
- `template` (string): Transactional template slug to use instead of inline content
- `text` (string): Plain text body content
- `to` (required): Recipient email address or array of addresses (max 50)
- `variables` (object): Template variables for merge tags

### `send_campaign_test` (~79 tokens)

Send a test email for an existing campaign to preview how it will look in recipients' inboxes.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `campaignId` (string, required): Campaign ID to send test for
- `testEmail` (string, required): Email address to send the test to

### `create_campaign` (~252 tokens)

Create a new email campaign as a draft: optionally with full HTML content and recipients (exactly ONE of audienceIds / segmentId / contactIds / tagIds / sendToAll) so it's ready to test and send. Nothing is sent until schedule_campaign.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `audienceIds` (array): Target these audience IDs (see list_audiences)
- `contactIds` (array): Target these specific contact IDs
- `fromEmail` (string, required): Sender email (must be from a verified domain)
- `fromName` (string, required): Sender display name
- `html` (string): Full HTML body for the email (skip to design later)
- `name` (string, required): Campaign name (internal label)
- `previewText` (string): Preview text shown in inbox alongside subject
- `replyTo` (string): Reply-to email address
- `segmentId` (string): Target this segment (see list_segments)
- `sendToAll` (boolean): Target all subscribed contacts in the workspace
- `subject` (string, required): Email subject line
- `tagIds` (array): Target contacts with these tag IDs

### `design_email_template` (~161 tokens)

Use AI to generate a complete email HTML template based on a description. Returns ready-to-use HTML that can be sent or used in campaigns.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `brandColor` (string): Primary brand color as hex code (e.g. "#4F46E5")
- `companyName` (string): Company or brand name to include in the template
- `description` (string, required): Detailed description of the email content and purpose (e.g. 'Welcome email for a SaaS product with feature highlights and CTA to start trial')
- `style` (string, required): Visual style/aesthetic for the template
- `type` (string, required): Type of email template to generate

### `list_campaigns` (~136 tokens)

List email campaigns, newest first. Use `search` to find a past campaign the user describes vaguely ('the invite one', 'that July newsletter') — it matches name and subject case-insensitively; try distinctive words from their description and broaden if no hits.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `page` (integer): Page number
- `pageSize` (integer): Results per page (max 100)
- `search` (string): Case-insensitive substring match on campaign name or subject
- `status` (string): Filter campaigns by status

### `create_contact` (~167 tokens)

Add a single new contact, optionally straight into audiences and/or with tags — e.g. 'add this person from my email into the newsletter list'. Contacts are subscribed by default. For more than a handful of people, use import_contacts instead.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `audienceIds` (array): Add the contact to these audience IDs (see list_audiences)
- `customFields` (object): Custom field key-value pairs
- `email` (string, required): Contact email address
- `firstName` (string): Contact first name
- `lastName` (string): Contact last name
- `tags` (array): Tag NAMES to assign — matched case-insensitively, created if missing

### `search_contacts` (~90 tokens)

Search contacts by email address or name. Returns matching contacts with their tags and subscription status.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `page` (integer): Page number
- `pageSize` (integer): Results per page (max 100)
- `query` (string, required): Search query (matches against email, first name, last name)

### `list_contacts` (~91 tokens)

List all contacts with optional filtering by subscription status and tag. Supports pagination.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `page` (integer): Page number
- `pageSize` (integer): Results per page (max 100)
- `subscribed` (string): Filter by subscription status
- `tagId` (string): Filter by tag ID

### `import_contacts` (~195 tokens)

Bulk import contacts from CSV data (min column: email), optionally straight into audiences and/or with tags. This is the tool for cross-app flows — e.g. pulling people out of Gmail, a CRM, or a spreadsheet and landing them in a Send16 audience in one call. Set updateExisting for upsert semantics (safe to re-run).

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `audienceIds` (array): Add all imported contacts to these audience IDs (see list_audiences / create_audience)
- `csvData` (string, required): CSV string with headers. Required column: "email". Optional: "firstName", "lastName"
- `tags` (array): Tag NAMES to apply to all imported contacts — matched case-insensitively, created if missing
- `updateExisting` (boolean): Whether to update contacts that already exist

### `list_domains` (~48 tokens)

List all sending domains configured in your Send16 workspace, including their verification status and DNS records.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `check_domain_health` (~75 tokens)

Check the DNS health of a specific domain, including DKIM, SPF, DMARC, and MX record verification status. Triggers a fresh DNS lookup.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `domainId` (string, required): Domain ID to check health for

### `get_campaign_stats` (~66 tokens)

Get detailed performance statistics for a specific campaign including open rate, click rate, bounce rate, and delivery metrics.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `campaignId` (string, required): Campaign ID to get stats for

### `get_deliverability_status` (~62 tokens)

Get your workspace's deliverability summary — sending reputation, domain authentication status, and recent bounce/complaint health. (Deliverability Hub plan feature.)

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `list_automations` (~50 tokens)

List all automations in the workspace, including draft/active/paused status and trigger types.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `get_automation` (~57 tokens)

Get a single automation by ID, including its trigger, steps, and current status.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `automationId` (string, required): Automation ID

### `enroll_in_automation` (~92 tokens)

Manually enroll a contact in an active automation. The automation must be in 'active' status. Use send_event for event-driven enrollment.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `automationId` (string, required): Automation ID to enroll into
- `contactId` (string, required): Contact UUID (use search_contacts to look up by email first)

### `send_event` (~163 tokens)

Fire a custom event for a contact. Automations whose trigger is `{type:'custom_event', eventName:'<name>'}` will enroll the contact and start running. Payload is exposed to condition steps as `event.<key>`.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `contactEmail` (string): Contact email (provide either this or contactId)
- `contactId` (string): Contact UUID (provide either this or contactEmail)
- `name` (string, required): Event name (e.g. 'trial_started', 'order.placed')
- `occurredAt` (string): ISO-8601 timestamp; defaults to now
- `payload` (object): Arbitrary JSON metadata available to automation conditions

### `list_templates` (~39 tokens)

List starter-gallery email templates available to every workspace.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `get_template` (~55 tokens)

Get a single starter template by ID, including its EmailContent JSON.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `templateId` (string, required): Template ID (slug)

### `render_email_content` (~108 tokens)

Compile an EmailContent JSON object (the shape used by the Send16 builder + templates) into HTML using the platform's authoritative renderer. Returns the exact HTML the API would send. Useful for previews and post-processing.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `content` (object, required): EmailContent JSON (from get_template or the builder)
- `variables` (object): Variable replacements (e.g. {firstName:'Alice'})

### `add_domain` (~79 tokens)

Register a new sending domain. Returns the DNS records the user must add to their DNS provider, after which they should call check_domain_health to verify.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `domain` (string, required): FQDN to register (e.g. 'mail.example.com')

### `pre_send_review` (~101 tokens)

Run an AI pre-send review on an email's HTML before sending. Surfaces tone issues, broken links, missing alt text, spam triggers, and accessibility problems.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `audience` (string): Short description of the audience (helps tone analysis)
- `html` (string, required): Full HTML body to review
- `subject` (string, required): Email subject line

### `generate_email_from_url` (~104 tokens)

Scrape a URL (e.g. a launch blog post or product page) and generate an email draft from its content. Returns subject, preview text, and HTML body.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `instructions` (string): Additional guidance — e.g. 'announcement style, focus on the new feature'
- `url` (string, required): Public URL to scrape and turn into an email

### `list_messages` (~153 tokens)

List messages from the unified send log (transactional + campaign). Filter by recipient, sender, status, date range, or source.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `created_after` (string): ISO-8601 timestamp lower bound
- `created_before` (string): ISO-8601 timestamp upper bound
- `from_email` (string): Sender email filter
- `limit` (integer): Page size (default 50)
- `offset` (integer): Page offset
- `source` (string): Restrict to one message source
- `status` (string): Delivery status filter
- `to_email` (string): Recipient email filter

### `get_message` (~60 tokens)

Fetch a single message with its full event timeline (created → sent → delivered → opened → clicked → ...).

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `id` (string, required): Message ID

### `get_message_events` (~55 tokens)

Get just the delivery event timeline for a message — no body or recipient details.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `id` (string, required): Message ID

### `list_convos` (~132 tokens)

List inbox conversations. Filter by state, mailbox, label, screener status, or full-text search. Send16's unified inbox combines transactional reply threading with team-managed shared inboxes.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `label` (string): Filter by label slug (comma-separate for multiple)
- `limit` (integer): Page size (default 50)
- `mailboxId` (string): Filter to one mailbox
- `search` (string): Full-text search across subject + body
- `state` (string): Conversation status

### `get_convo` (~54 tokens)

Get a single conversation with its full thread of posts (incoming + outgoing).

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `id` (string, required): Conversation ID

### `send_reply` (~94 tokens)

Reply to an inbox conversation. The reply is sent from the original recipient address (the alias the convo arrived on) and threaded back to the contact.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `convoId` (string, required): Conversation ID
- `html` (string): HTML body of the reply
- `text` (string): Plain text body of the reply

### `mark_convo_read` (~51 tokens)

Mark a conversation as read for the current viewer.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `convoId` (string, required): Conversation ID

### `update_convo` (~85 tokens)

Update conversation status (open/closed/archived/snoozed) or assignee.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `assigneeId`: Workspace member user ID, or null to unassign
- `convoId` (string, required): Conversation ID
- `state` (string): New status

### `add_convo_note` (~70 tokens)

Add a private internal note on a conversation. Notes are visible only to workspace members.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `body` (string, required): Note body (markdown supported)
- `convoId` (string, required): Conversation ID

### `screener_decide` (~83 tokens)

Decide a pending screener conversation (first-time sender). 'allow' lets future emails through, 'reject' blocks, 'cold' marks as cold outreach.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `convoId` (string, required): Conversation ID
- `decision` (string, required): Screener decision

### `list_inbox_counts` (~57 tokens)

Get unread/total counts per category and label for the inbox sidebar (newsletter, transactional, marketing, calendar, social, cold).

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `list_topics` (~70 tokens)

List subscription topics. Topics are granular categories contacts can subscribe to (e.g. 'product-updates', 'weekly-digest'). Campaigns and automations can be gated to subscribers of a specific topic.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `create_topic` (~103 tokens)

Create a new subscription topic. Contacts opt into topics individually via the preference center.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `description` (string): Description shown in the preference center
- `isDefault` (boolean): Auto-subscribe new contacts to this topic
- `name` (string, required): Display name shown to contacts
- `slug` (string): URL-safe slug (auto-derived from name if omitted)

### `update_topic` (~72 tokens)

Update a subscription topic (name, description, default).

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `description` (string)
- `isDefault` (boolean)
- `name` (string)
- `topicId` (string, required): Topic ID

### `delete_topic` (~50 tokens)

Delete a subscription topic. All subscribers will be detached.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `topicId` (string, required): Topic ID

### `list_actions` (~61 tokens)

List Actions. Actions fire a transactional template when a custom event arrives — Plunk-style 'event_name → template' pairings, simpler than full automations.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `get_action` (~51 tokens)

Get a single Action with its trigger config and template binding.

Input parameters:

- `actionId` (string, required): Action ID
- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `create_action` (~134 tokens)

Create an Action that maps an event name to a transactional template. Each matching event sends one email to the contact.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `delaySeconds` (integer): Delay before sending
- `enabled` (boolean)
- `eventName` (string, required): Event name to match (e.g. 'order.placed')
- `name` (string, required): Display name
- `sendOnce` (boolean): Only send once per contact regardless of how many times the event fires
- `templateSlug` (string, required): Transactional template slug to send

### `update_action` (~99 tokens)

Update an Action (toggle enabled, change template, change event name).

Input parameters:

- `actionId` (string, required): Action ID
- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `delaySeconds` (integer)
- `enabled` (boolean)
- `eventName` (string)
- `name` (string)
- `sendOnce` (boolean)
- `templateSlug` (string)

### `delete_action` (~43 tokens)

Delete an Action.

Input parameters:

- `actionId` (string, required): Action ID
- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `list_audiences` (~48 tokens)

List audiences (lists). An audience is a static, manually-managed group of contacts.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `create_audience` (~49 tokens)

Create a new audience.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `description` (string)
- `name` (string, required)

### `add_contacts_to_audience` (~64 tokens)

Add contacts (by ID) to an audience.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `audienceId` (string, required): Audience ID
- `contactIds` (array, required): Contact IDs to add

### `remove_contact_from_audience` (~59 tokens)

Remove a contact from an audience.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `audienceId` (string, required): Audience ID
- `contactId` (string, required): Contact ID

### `delete_audience` (~60 tokens)

Delete an audience (list). Contacts are not deleted — only the list and its memberships are removed.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `audienceId` (string, required): Audience ID

### `list_segments` (~46 tokens)

List dynamic segments. Segments compute their members from a filter expression at send time.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `preview_segment` (~49 tokens)

Preview the contacts that match a segment without sending.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `segmentId` (string, required): Segment ID

### `update_contact` (~84 tokens)

Update a contact's profile fields, custom fields, or subscription state.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `contactId` (string, required): Contact ID
- `customFields` (object)
- `firstName` (string)
- `lastName` (string)
- `subscribed` (boolean)

### `delete_contact` (~51 tokens)

Delete a contact and all associated events. Irreversible.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `contactId` (string, required): Contact ID

### `get_contact_timeline` (~84 tokens)

Get a contact's full activity timeline: emails received, events fired, opens, clicks, automation enrollments, topic changes.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `contactId` (string, required): Contact ID
- `cursor` (string): Pagination cursor
- `limit` (integer): Page size

### `get_contact_health_score` (~62 tokens)

Get a contact's 0-100 health score based on recent engagement (opens, clicks, replies).

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `contactId` (string, required): Contact ID

### `send_broadcast` (~220 tokens)

One-shot broadcast: create a campaign and immediately schedule it to send, in a single call. Pass either an audienceId, segmentId, topicId, or fully-qualified filter. Provide html OR templateSlug.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `audienceId` (string): Send to all contacts in this audience
- `fromEmail` (string, required): Must be a verified domain
- `fromName` (string, required)
- `html` (string): Full HTML body (one of html/templateSlug required)
- `name` (string, required): Internal campaign name
- `previewText` (string)
- `replyTo` (string)
- `scheduleAt` (string): ISO-8601 future datetime; omit to send immediately
- `segmentId` (string): Send to all contacts matching this segment
- `subject` (string, required)
- `templateSlug` (string): Workspace template slug to use
- `topicId` (string): Send to all subscribers of this topic

### `schedule_campaign` (~99 tokens)

Schedule (or send immediately) an existing draft campaign to an audience/segment/topic.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `audienceId` (string)
- `campaignId` (string, required): Campaign ID
- `scheduleAt` (string): ISO-8601 future datetime; omit to send immediately
- `segmentId` (string)
- `topicId` (string)

### `update_campaign` (~250 tokens)

Update a draft campaign: name, subject, preview text, sender info, HTML content, and/or recipients. Retarget with exactly ONE of audienceIds / segmentId / contactIds / tagIds / sendToAll, then verify with preview_campaign_recipients before sending. Only drafts can be edited.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `audienceIds` (array): Retarget to these audience IDs (see list_audiences). Sets recipient type 'lists'.
- `campaignId` (string, required): Campaign ID
- `contactIds` (array): Retarget to these specific contact IDs
- `fromEmail` (string)
- `fromName` (string)
- `html` (string)
- `name` (string): Campaign name (internal label)
- `previewText` (string)
- `replyTo` (string)
- `segmentId` (string): Retarget to this segment (see list_segments)
- `sendToAll` (boolean): Retarget to all subscribed contacts in the workspace
- `subject` (string)
- `tagIds` (array): Retarget to contacts with these tag IDs

### `pause_campaign` (~55 tokens)

Pause a sending campaign. Already-sent messages are unaffected; remaining sends halt.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `campaignId` (string, required): Campaign ID

### `resume_campaign` (~44 tokens)

Resume a paused campaign.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `campaignId` (string, required): Campaign ID

### `duplicate_campaign` (~238 tokens)

Duplicate a campaign (template, content, and settings) as a new draft — works on sent campaigns too, so this is the way to re-use a past campaign's design. Optionally rename and retarget in the same call (exactly ONE of audienceIds / segmentId / contactIds / tagIds / sendToAll). NOTE: without retargeting, the copy keeps the ORIGINAL campaign's recipients.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `audienceIds` (array): Retarget the new draft to these audience IDs (see list_audiences)
- `campaignId` (string, required): Campaign ID to duplicate
- `contactIds` (array): Retarget the new draft to these contact IDs
- `name` (string): Name for the new draft (default: original name + ' (Copy)')
- `segmentId` (string): Retarget the new draft to this segment
- `sendToAll` (boolean): Retarget the new draft to all subscribed contacts
- `tagIds` (array): Retarget the new draft to contacts with these tag IDs

### `delete_campaign` (~53 tokens)

Delete a draft campaign. Sent campaigns cannot be deleted (only archived).

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `campaignId` (string, required): Campaign ID

### `preview_campaign_recipients` (~58 tokens)

Preview the recipient set for a campaign before sending. Returns count + sample list.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `campaignId` (string, required): Campaign ID

### `activate_automation` (~54 tokens)

Activate an automation. New events matching its triggers will start enrolling contacts.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `automationId` (string, required): Automation ID

### `pause_automation` (~56 tokens)

Pause an automation. Existing enrollments freeze in place; no new contacts enroll.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `automationId` (string, required): Automation ID

### `get_automation_stats` (~63 tokens)

Get aggregate analytics for an automation: total enrollments, completed, exited, open/click rates per step.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `automationId` (string, required): Automation ID

### `list_automation_enrollments` (~84 tokens)

List active and historical enrollments for an automation.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `automationId` (string, required): Automation ID
- `page` (integer): Page number
- `pageSize` (integer): Results per page (max 100)
- `state` (string)

### `list_workspaces` (~44 tokens)

List workspaces the authenticated user has access to (owner or member).

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `get_workspace` (~42 tokens)

Get the current workspace (the one the API key belongs to).

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `get_brand` (~53 tokens)

Get the workspace's brand settings: colors, logo, fonts, and the DESIGN.md spec injected into AI generation prompts.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `update_brand` (~131 tokens)

Update workspace brand settings. The designSpec field is a Markdown DESIGN.md document fed into AI generation system prompts — use it to encode voice, do/don't lists, and visual rules.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `designSpec` (string): Markdown DESIGN.md spec for AI generation
- `fontFamily` (string): Body font family
- `logoUrl` (string)
- `primaryColor` (string): Hex color (e.g. '#4F46E5')
- `secondaryColor` (string): Hex color

### `get_workspace_usage` (~44 tokens)

Get the current month's send count, contact count, and plan limits.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `list_suppressions` (~68 tokens)

List suppressed email addresses (bounces, complaints, unsubscribes, manual).

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `limit` (integer)
- `offset` (integer)
- `reason` (string)

### `add_suppression` (~69 tokens)

Add an email to the suppression list. Future sends to this address will be blocked.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `email` (string, required)
- `notes` (string)
- `reason` (string)

### `remove_suppression` (~59 tokens)

Remove an email from the suppression list. Use only when you've confirmed the recipient wants to receive mail again.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `email` (string, required)

### `list_webhooks` (~56 tokens)

List configured outgoing webhooks (your endpoints that Send16 POSTs delivery events to). Outgoing webhooks are a plan feature.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)

### `create_webhook` (~114 tokens)

Register an outgoing webhook endpoint. Send16 POSTs event JSON to this URL with an HMAC-SHA256 signature. Outgoing webhooks are a plan feature.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `enabled` (boolean): Whether the endpoint is active (default true)
- `events` (array, required): Event types to subscribe to
- `name` (string, required): A label for this endpoint
- `url` (string, required): HTTPS endpoint to receive events

### `delete_webhook` (~47 tokens)

Delete an outgoing webhook endpoint.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `webhookId` (string, required): Webhook ID

### `regenerate_webhook_secret` (~60 tokens)

Rotate the HMAC signing secret for an outgoing webhook endpoint. Returns the new secret once.

Input parameters:

- `apiKey` (string): Send16 API key (overrides SEND16_API_KEY env var)
- `webhookId` (string, required): Webhook ID

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/spruikco-send16-mcp/mcp#diagnostics

## Score history

- 2026-08-03: 75
- 2026-08-02: 74
- 2026-08-01: 73
- 2026-07-31: 73
- 2026-07-30: 70
- 2026-07-29: 69
- 2026-07-28: 69
- 2026-07-27: 68
- 2026-07-26: 67

## Links

- Remote endpoint: https://mcp.send16.com/mcp
- Repository: https://github.com/spruikco/send16-mcp
- Website: https://send16.com/
- Changelog RSS feed: https://verifymcp.io/servers/spruikco-send16-mcp/mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/spruikco-send16-mcp/mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/spruikco-send16-mcp/mcp
