Skip to main content
The SenderKit MCP server exposes ten tools, identical across the hosted endpoint and the local stdio server. Tool names are prefixed with senderkit_ so they don’t collide with other servers in a multi-server setup. No MCP prompts or resources are exposed — tools only.

Workspace

senderkit_context

Report the connected workspace and the active send mode. No parameters. Call this before sending when you need to confirm which workspace subsequent calls will affect, or whether messages will really be delivered (live) or only recorded in test mode (test). The mode is fixed per connection — derived from the API key prefix for API-key connections (sk_live_ / sk_test_), or from the workspace/mode you chose on the consent screen for OAuth connections. Returns { workspace: { id, slug, name }, mode: "live" | "test" }.

Sending

senderkit_send

Send a templated message to a recipient. Dispatches a real message; live vs test mode is fixed per connection (call senderkit_context to confirm before sending). The result includes a mode field alongside the message ID and status. The most common tool — an agent uses this when you ask it to “send the welcome template” or “email a notice to user@example.com”. Mirrors the POST /v1/send endpoint.
template
string
required
Template slug, e.g. "welcome". Slugs are always lowercase. See Templates.
to
string
required
Recipient address — email address, E.164 phone number, push device token, or JSON-encoded web-push PushSubscription.
vars
object
Template variables as a JSON object.
channel
"email" | "sms" | "push" | "web-push"
Force a channel. Defaults to the template’s primary channel.
version
integer
Pin a specific template version. Omit to use the currently published version.
metadata
object
Free-form metadata as a JSON object of scalar values. Indexed for filtering in senderkit_messages_list.
scheduledAt
string
ISO 8601 timestamp for scheduled delivery. Must be in the future, within 30 days.
idempotencyKey
string
Idempotency key. Repeat values return the original send instead of duplicating.
cc
string[]
Email-only. Cc recipients.
bcc
string[]
Email-only. Bcc recipients.
replyTo
string
Email-only. Reply-To address.
attachments
Attachment[]
Email-only. Up to 10 MB total across all attachments. Each Attachment is { filename, contentType, content (base64), inline?, contentId? }.
from
string
Email-only. From address override (bare address). Must match a verified custom sending domain when using the managed email sender.
fromName
string
Email-only. From display name override, rendered as Name <address>. Max 128 characters; no control characters or angle brackets. Always applies, regardless of sending domain.

senderkit_send_raw

Send inline content without a registered template. Dispatches a real message; live vs test mode is fixed per connection (call senderkit_context to confirm). The result includes a mode field. Useful for one-off sends an agent constructs in the moment — e.g. “draft and send a status update to this list.” See Template sends and raw sends.
channel
"email" | "sms" | "push" | "web-push"
required
The channel to send on.
to
string
required
Recipient address. For channel: "web-push", the JSON-encoded browser PushSubscription (endpoint + p256dh/auth keys).
subject
string
Email subject. Required for channel: "email".
preheader
string
Email preheader (the snippet preview some clients show).
html
string
Email HTML body. Required for channel: "email".
text
string
Email plain-text body.
from
string
Email from-address override. Must match a verified custom sending domain when using the managed email sender.
fromName
string
Email-only. From display name override, rendered as Name <address>. Max 128 characters; no control characters or angle brackets. Always applies, regardless of sending domain.
body
string
Message body. Required for channel: "sms", channel: "push", and channel: "web-push".
title
string
Notification title. Required for channel: "push" and channel: "web-push".
badge
integer
Badge count. Push and web-push.
sound
string
Notification sound name. Push only.
icon
string
Icon URL shown in the notification. Web-push only.
clickUrl
string
URL opened when the user clicks the notification. Web-push only.
pushData
object
Data payload as a JSON object of string values. Push and web-push.
vars
object
Variables for interpolation. Only applied when interpolate: true.
interpolate
boolean
Run server-side variable substitution over the inline content. Defaults to false (content delivered verbatim).
metadata
object
Free-form metadata.
scheduledAt
string
ISO 8601 timestamp for scheduled delivery.
idempotencyKey
string
Idempotency key.
cc
string[]
Email-only. Cc recipients.
bcc
string[]
Email-only. Bcc recipients.
replyTo
string
Email-only. Reply-To address.
attachments
Attachment[]
Email-only. Same shape as senderkit_send.

Templates

senderkit_templates_list

List available templates. No parameters. Use when the agent needs to discover what’s available before sending — e.g. asking “which templates exist?” — or to confirm a slug before referencing it. Mirrors GET /v1/templates. See Templates.

senderkit_templates_get

Fetch a single template by slug. Use to inspect a template’s current state — its channel, status, and currently published version (excluding the raw content blob). Mirrors GET /v1/templates/{slug}.
slug
string
required
Template slug, e.g. "welcome". Slugs are always lowercase.

senderkit_templates_create

Generate a new template from a plain-language brief and save it as a draft. The tool composes channel-native content server-side and returns a deep link to review the draft in the editor. Nothing is sent until the user reviews and publishes the draft. Template creation counts toward the workspace’s template cap; the tool returns 409 template_limit_reached if the cap is hit before the AI call runs.
channel
"email" | "sms" | "push" | "web-push"
required
The channel for the new template.
brief
string
required
Plain-language description of the message to generate (max 4,000 characters).
slug
string
Lowercase URL-safe identifier (digits, a-z, _, -). Converted to lowercase automatically. Auto-derived from the brief if omitted; a numeric suffix is appended on collision.
description
string
Optional internal note (max 280 characters).

senderkit_templates_regenerate

Regenerate an existing draft template from a new brief. This fully replaces the draft’s content and discards any manual edits made in the editor — warn the user before calling. Only draft templates can be regenerated; published templates are left untouched.
slug
string
required
Slug of the draft template to regenerate.
brief
string
required
New brief that fully replaces the draft’s content (max 4,000 characters).

Messages

senderkit_messages_list

List messages, optionally filtered. The agent’s window into message history. Use it to answer “did the welcome email to user@example.com go through?” or “show me recent failures.” Mirrors GET /v1/messages.
limit
integer
Max messages to return.
cursor
string
Pagination cursor from a previous response.
status
"scheduled" | "queued" | "rendered" | "dispatched" | "sent" | "delivered" | "failed" | "opted_out" | "blocked" | "canceled"
Filter by message status.
channel
"email" | "sms" | "push" | "web-push"
Filter by channel.
template
string
Filter by template slug.
metadata
object
Filter by metadata; every key/value must match (jsonb containment).

senderkit_messages_get

Fetch a single message by ID. Use to inspect the full record for one send — its current status, the provider’s response, and the timeline of events. Mirrors GET /v1/messages/{id}.
id
string
required
Public message id, e.g. "msg_…".

senderkit_cancel_message

Cancel a still-pending (scheduled or queued) message by ID. Use to abort a scheduled send before its fire time, or pull back a message that hasn’t yet been handed to a provider. Only scheduled and queued messages are cancelable — anything later returns a 409, since delivery once started isn’t reversible. Mirrors DELETE /v1/messages/{id}.
id
string
required
Public message id, e.g. "msg_…".

Errors

Tool failures come back as MCP errors with a single text message. The shape:
  • Validationinvalid_request: <field> <message>. A missing required field, wrong type, or invalid ISO timestamp.
  • Domain<code>: <message> from the underlying API. e.g. template_not_found: No template "welcom", rate_limited: Too many requests.
  • Authunauthorized on a missing or invalid API key.
  • Permissioninsufficient_scope when the key is valid but doesn’t hold the scope required by the called tool. See Authentication → Scopes.
If your agent isn’t doing what you expect, ask it to print the raw tool error. The text matches the REST API’s code / message pair, so anything in the API troubleshooting guide applies here too.

Sending

How a send becomes a delivered message.

Messages

The lifecycle behind every tool response.

API Reference

The REST surface backing these tools.

Installation

Connect a client and start calling tools.