SpacePost MCP
An official MCP server that allows AI assistants to send emails, manage domains, API keys, webhooks, audiences, contacts, broadcasts, suppressions, and tenants via the SpacePost email API. It mirrors the REST API endpoints as tools, supporting both hosted HTTP and local stdio execution.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://api.spacepost.dev/mcpWhat you can do with it
- Send transactional or marketing emails via AI agents
- Manage email domains and verify DNS records
- Configure and monitor webhooks for email events
- Manage contacts and audiences for broadcasts
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- spacepost 0.2.1
- MCP protocol
- 2025-06-18
- Tools
- 46 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
46 advertised
list_emails — List emails
List emails. Returns sent and scheduled emails, newest first, without bodies. Requires a `full_access` API key. API: `GET /emails` (operationId `listEmails`, Emails).
{
"type": "object",
"properties": {
"after": {
"type": "string",
"format": "uuid",
"description": "Return items older than this id (next page). Cannot be combined with `before`."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Number of items to return."
},
"before": {
"type": "string",
"format": "uuid",
"description": "Return items newer than this id (previous page). Cannot be combined with `after`."
}
}
}{
"title": "List emails",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}send_email — Send an email
Send an email. Validates and queues one email. Each recipient counts towards your quota. Use `scheduled_at` to send later (up to 30 days ahead). Pass `tenant_id` to send on behalf of a tenant (not needed when the `from` domain belongs to one). Fails with `422` if `tenant_id` conflicts with the domain's tenant, `403 sending_paused` if the tenant is paused and `429 daily_quota_exceeded` if it reached its daily cap. `from` must be on a verified domain (e.g. "Acme <hi@acme.com>"); call list_domains to find one. Provide `html`, `text` or both. Send to delivered@test.spacepost.dev (or bounced@ / complained@) to test without sending real mail. Delivered email cannot be recalled: confirm recipients and content with the user when unsure. Pass `idempotency_key` when retrying so the email is not sent twice. Request body: Either `html` or `text` is required. `reply_to` is also accepted as `replyTo` and `scheduled_at` as `scheduledAt`. Works with a `sending_access` or `full_access` API key. API: `POST /emails` (operationId `sendEmail`, Emails).
{
"type": "object",
"required": [
"from",
"to",
"subject"
],
"properties": {
"cc": {
"oneOf": [
{
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
{
"type": "array",
"items": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"maxItems": 50,
"minItems": 1
}
]
},
"to": {
"oneOf": [
{
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
{
"type": "array",
"items": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"maxItems": 50,
"minItems": 1
}
]
},
"bcc": {
"oneOf": [
{
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
{
"type": "array",
"items": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"maxItems": 50,
"minItems": 1
}
]
},
"from": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"html": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"value"
],
"properties": {
"name": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$",
"maxLength": 256
},
"value": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$",
"maxLength": 256
}
}
},
"maxItems": 50
},
"text": {
"type": "string"
},
"headers": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"subject": {
"type": "string",
"maxLength": 998,
"minLength": 1
},
"reply_to": {
"oneOf": [
{
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
{
"type": "array",
"items": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"maxItems": 50,
"minItems": 1
}
]
},
"tenant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Platform mode. Our tenant id or your `external_id`. Optional when the `from` domain belongs to a tenant; a conflict with the domain's tenant is a 422."
},
"attachments": {
"type": "array",
"items": {
"type": "object",
"required": [
"filename"
],
"properties": {
"path": {
"type": "string",
"format": "uri",
"description": "A public URL fetched at send time."
},
"content": {
"type": "string",
"description": "Base64-encoded file content."
},
"filename": {
"type": "string",
"maxLength": 255
},
"content_id": {
"type": "string",
"description": "Content-ID for inline images (`cid:`)."
},
"content_type": {
"type": "string",
"examples": [
"application/pdf"
]
}
},
"description": "Provide exactly one of `content` or `path`."
},
"maxItems": 50
},
"scheduled_at": {
"type": "string",
"examples": [
"in 1 hour",
"2026-10-30T09:00:00Z"
],
"description": "ISO 8601 date-time or natural language such as \"in 1 hour\" or \"in 2 days\". At most 30 days ahead."
},
"idempotency_key": {
"type": "string",
"examples": [
"welcome-user-4821"
],
"maxLength": 256,
"minLength": 1,
"description": "A unique key (1 to 256 characters) that makes the request safe to retry for 24 hours."
}
}
}{
"title": "Send an email",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}send_batch_emails — Send batch emails
Send batch emails. Sends up to 100 emails in one call. All-or-nothing, if any email is invalid none are sent. Attachments, `scheduled_at` and a per-email `tenant_id` are supported; the paused-tenant and tenant-cap errors apply to the whole batch. Put the emails in `body` as an array. Prefer send_email for a single message. Works with a `sending_access` or `full_access` API key. API: `POST /emails/batch` (operationId `sendBatchEmails`, Emails).
{
"type": "object",
"required": [
"body"
],
"properties": {
"body": {
"type": "array",
"items": {
"type": "object",
"required": [
"from",
"to",
"subject"
],
"properties": {
"cc": {
"oneOf": [
{
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
{
"type": "array",
"items": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"maxItems": 50,
"minItems": 1
}
]
},
"to": {
"oneOf": [
{
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
{
"type": "array",
"items": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"maxItems": 50,
"minItems": 1
}
]
},
"bcc": {
"oneOf": [
{
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
{
"type": "array",
"items": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"maxItems": 50,
"minItems": 1
}
]
},
"from": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"html": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"value"
],
"properties": {
"name": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$",
"maxLength": 256
},
"value": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$",
"maxLength": 256
}
}
},
"maxItems": 50
},
"text": {
"type": "string"
},
"headers": {
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"subject": {
"type": "string",
"maxLength": 998,
"minLength": 1
},
"reply_to": {
"oneOf": [
{
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
{
"type": "array",
"items": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"maxItems": 50,
"minItems": 1
}
]
},
"tenant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Platform mode. Our tenant id or your `external_id`. Optional when the `from` domain belongs to a tenant; a conflict with the domain's tenant is a 422."
},
"attachments": {
"type": "array",
"items": {
"type": "object",
"required": [
"filename"
],
"properties": {
"path": {
"type": "string",
"format": "uri",
"description": "A public URL fetched at send time."
},
"content": {
"type": "string",
"description": "Base64-encoded file content."
},
"filename": {
"type": "string",
"maxLength": 255
},
"content_id": {
"type": "string",
"description": "Content-ID for inline images (`cid:`)."
},
"content_type": {
"type": "string",
"examples": [
"application/pdf"
]
}
},
"description": "Provide exactly one of `content` or `path`."
},
"maxItems": 50
},
"scheduled_at": {
"type": "string",
"examples": [
"in 1 hour",
"2026-10-30T09:00:00Z"
],
"description": "ISO 8601 date-time or natural language such as \"in 1 hour\" or \"in 2 days\". At most 30 days ahead."
}
},
"description": "Either `html` or `text` is required. `reply_to` is also accepted as `replyTo` and `scheduled_at` as `scheduledAt`."
},
"maxItems": 100,
"minItems": 1,
"description": "The JSON request body."
},
"idempotency_key": {
"type": "string",
"examples": [
"welcome-user-4821"
],
"maxLength": 256,
"minLength": 1,
"description": "A unique key (1 to 256 characters) that makes the request safe to retry for 24 hours."
}
}
}{
"title": "Send batch emails",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}get_email — Retrieve an email
Retrieve an email. Requires a `full_access` API key. API: `GET /emails/{id}` (operationId `getEmail`, Emails).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "The email id."
}
}
}{
"title": "Retrieve an email",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}update_email — Reschedule an email
Reschedule an email. Changes `scheduled_at` of an email that is still `scheduled`. Requires a `full_access` API key. API: `PATCH /emails/{id}` (operationId `updateEmail`, Emails).
{
"type": "object",
"required": [
"id",
"scheduled_at"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "The email id."
},
"scheduled_at": {
"type": "string",
"examples": [
"in 1 hour",
"2026-10-30T09:00:00Z"
],
"description": "ISO 8601 date-time or natural language such as \"in 1 hour\" or \"in 2 days\". At most 30 days ahead."
}
}
}{
"title": "Reschedule an email",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}cancel_email — Cancel a scheduled email
Cancel a scheduled email. Requires a `full_access` API key. API: `POST /emails/{id}/cancel` (operationId `cancelEmail`, Emails).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid",
"description": "The email id."
}
}
}{
"title": "Cancel a scheduled email",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}list_domains — List domains
List domains. Requires a `full_access` API key. API: `GET /domains` (operationId `listDomains`, Domains).
{
"type": "object",
"properties": {
"after": {
"type": "string",
"format": "uuid",
"description": "Return items older than this id (next page). Cannot be combined with `before`."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Number of items to return."
},
"before": {
"type": "string",
"format": "uuid",
"description": "Return items newer than this id (previous page). Cannot be combined with `after`."
}
}
}{
"title": "List domains",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}create_domain — Create a domain
Create a domain. Registers a domain and returns the DNS records to add (three DKIM CNAMEs, plus MX and SPF on the MAIL FROM subdomain). Domain names are globally unique. The number of domains is limited by your plan (Free 3, Pro 10, Scale 1,000). The response lists the DNS records (DKIM CNAMEs, MAIL FROM MX and SPF TXT) the user must add at their DNS provider; afterwards call verify_domain and then get_domain to see the new status. DNS changes can take minutes to hours. Requires a `full_access` API key. API: `POST /domains` (operationId `createDomain`, Domains).
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"examples": [
"acme.com"
],
"description": "Domain or subdomain you own. Lower-cased."
},
"region": {
"type": "string",
"description": "Accepted for compatibility. The region is chosen by the platform and returned on the domain."
},
"tenant_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Platform mode. Make the domain tenant-owned (our tenant id or your `external_id`). Mail from it is attributed to that tenant."
},
"custom_return_path": {
"type": "string",
"default": "send",
"pattern": "^[a-z0-9-]{1,63}$",
"description": "Subdomain used for the custom MAIL FROM (bounce handling and SPF)."
}
}
}{
"title": "Create a domain",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}get_domain — Retrieve a domain
Retrieve a domain. Requires a `full_access` API key. API: `GET /domains/{id}` (operationId `getDomain`, Domains).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
}
}
}{
"title": "Retrieve a domain",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}update_domain — Update a domain
Update a domain. Toggles open and click tracking. Requires a `full_access` API key. API: `PATCH /domains/{id}` (operationId `updateDomain`, Domains).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"tls": {
"enum": [
"opportunistic",
"enforced"
],
"type": "string"
},
"open_tracking": {
"type": "boolean"
},
"click_tracking": {
"type": "boolean"
}
}
}{
"title": "Update a domain",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}delete_domain — Delete a domain
Delete a domain. Requires a `full_access` API key. API: `DELETE /domains/{id}` (operationId `deleteDomain`, Domains).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
}
}
}{
"title": "Delete a domain",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}verify_domain — Verify a domain
Verify a domain. Re-checks DNS now. Retrieve the domain afterwards to read the new `status` and per-record statuses. Requires a `full_access` API key. API: `POST /domains/{id}/verify` (operationId `verifyDomain`, Domains).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
}
}
}{
"title": "Verify a domain",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_api_keys — List API keys
List API keys. Requires a `full_access` API key. API: `GET /api-keys` (operationId `listApiKeys`, API Keys).
{
"type": "object",
"properties": {
"after": {
"type": "string",
"format": "uuid",
"description": "Return items older than this id (next page). Cannot be combined with `before`."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Number of items to return."
},
"before": {
"type": "string",
"format": "uuid",
"description": "Return items newer than this id (previous page). Cannot be combined with `after`."
}
}
}{
"title": "List API keys",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}create_api_key — Create an API key
Create an API key. The `token` is returned only in this response. Requires a `full_access` API key. API: `POST /api-keys` (operationId `createApiKey`, API Keys).
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 50,
"minLength": 1
},
"domain_id": {
"type": "string",
"format": "uuid",
"description": "Restrict a `sending_access` key to one of your domains. Not allowed with `full_access`."
},
"permission": {
"enum": [
"full_access",
"sending_access"
],
"type": "string",
"default": "full_access"
}
}
}{
"title": "Create an API key",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}delete_api_key — Delete an API key
Delete an API key. The key stops working immediately. The response body is an empty object. Requires a `full_access` API key. API: `DELETE /api-keys/{id}` (operationId `deleteApiKey`, API Keys).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
}
}
}{
"title": "Delete an API key",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}list_webhooks — List webhooks
List webhooks. Requires a `full_access` API key. API: `GET /webhooks` (operationId `listWebhooks`, Webhooks).
{
"type": "object",
"properties": {
"after": {
"type": "string",
"format": "uuid",
"description": "Return items older than this id (next page). Cannot be combined with `before`."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Number of items to return."
},
"before": {
"type": "string",
"format": "uuid",
"description": "Return items newer than this id (previous page). Cannot be combined with `after`."
}
}
}{
"title": "List webhooks",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}create_webhook — Create a webhook
Create a webhook. In production the endpoint must use https and resolve to a public address. Requires a `full_access` API key. API: `POST /webhooks` (operationId `createWebhook`, Webhooks).
{
"type": "object",
"required": [
"endpoint",
"events"
],
"properties": {
"events": {
"type": "array",
"items": {
"enum": [
"email.sent",
"email.delivered",
"email.delivery_delayed",
"email.bounced",
"email.complained",
"email.opened",
"email.clicked",
"email.failed",
"email.scheduled",
"email.suppressed"
],
"type": "string",
"description": "Event names you can subscribe a webhook to."
},
"minItems": 1
},
"endpoint": {
"type": "string",
"format": "uri",
"description": "Public URL that receives POST requests. https is required in production."
}
}
}{
"title": "Create a webhook",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}get_webhook — Retrieve a webhook
Retrieve a webhook. Requires a `full_access` API key. API: `GET /webhooks/{id}` (operationId `getWebhook`, Webhooks).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
}
}
}{
"title": "Retrieve a webhook",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}update_webhook — Update a webhook
Update a webhook. Requires a `full_access` API key. API: `PATCH /webhooks/{id}` (operationId `updateWebhook`, Webhooks).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"events": {
"type": "array",
"items": {
"enum": [
"email.sent",
"email.delivered",
"email.delivery_delayed",
"email.bounced",
"email.complained",
"email.opened",
"email.clicked",
"email.failed",
"email.scheduled",
"email.suppressed"
],
"type": "string",
"description": "Event names you can subscribe a webhook to."
},
"minItems": 1
},
"status": {
"enum": [
"enabled",
"disabled"
],
"type": "string"
},
"endpoint": {
"type": "string",
"format": "uri"
}
}
}{
"title": "Update a webhook",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}delete_webhook — Delete a webhook
Delete a webhook. Requires a `full_access` API key. API: `DELETE /webhooks/{id}` (operationId `deleteWebhook`, Webhooks).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
}
}
}{
"title": "Delete a webhook",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}list_audiences — List audiences
List audiences. Requires a `full_access` API key. API: `GET /audiences` (operationId `listAudiences`, Audiences).
{
"type": "object",
"properties": {
"after": {
"type": "string",
"format": "uuid",
"description": "Return items older than this id (next page). Cannot be combined with `before`."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Number of items to return."
},
"before": {
"type": "string",
"format": "uuid",
"description": "Return items newer than this id (previous page). Cannot be combined with `after`."
}
}
}{
"title": "List audiences",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}create_audience — Create an audience
Create an audience. Requires a `full_access` API key. API: `POST /audiences` (operationId `createAudience`, Audiences).
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 100,
"minLength": 1
}
}
}{
"title": "Create an audience",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}get_audience — Retrieve an audience
Retrieve an audience. Requires a `full_access` API key. API: `GET /audiences/{id}` (operationId `getAudience`, Audiences).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
}
}
}{
"title": "Retrieve an audience",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}delete_audience — Delete an audience
Delete an audience. Also deletes its contacts. Requires a `full_access` API key. API: `DELETE /audiences/{id}` (operationId `deleteAudience`, Audiences).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
}
}
}{
"title": "Delete an audience",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}list_contacts — List contacts
List contacts. Requires a `full_access` API key. API: `GET /audiences/{audienceId}/contacts` (operationId `listContacts`, Contacts).
{
"type": "object",
"required": [
"audience_id"
],
"properties": {
"after": {
"type": "string",
"format": "uuid",
"description": "Return items older than this id (next page). Cannot be combined with `before`."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Number of items to return."
},
"before": {
"type": "string",
"format": "uuid",
"description": "Return items newer than this id (previous page). Cannot be combined with `after`."
},
"audience_id": {
"type": "string",
"format": "uuid"
}
}
}{
"title": "List contacts",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}create_contact — Create a contact
Create a contact. Emails are lower-cased. An address can only appear once per audience. Requires a `full_access` API key. API: `POST /audiences/{audienceId}/contacts` (operationId `createContact`, Contacts).
{
"type": "object",
"required": [
"audience_id",
"email"
],
"properties": {
"email": {
"type": "string",
"format": "email"
},
"last_name": {
"type": "string",
"maxLength": 100
},
"first_name": {
"type": "string",
"maxLength": 100
},
"audience_id": {
"type": "string",
"format": "uuid"
},
"unsubscribed": {
"type": "boolean",
"default": false
}
}
}{
"title": "Create a contact",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}get_contact — Retrieve a contact
Retrieve a contact. Requires a `full_access` API key. API: `GET /audiences/{audienceId}/contacts/{idOrEmail}` (operationId `getContact`, Contacts).
{
"type": "object",
"required": [
"audience_id",
"id_or_email"
],
"properties": {
"audience_id": {
"type": "string",
"format": "uuid"
},
"id_or_email": {
"type": "string",
"examples": [
"jane@example.com"
],
"description": "The contact id or its (URL-encoded) email address."
}
}
}{
"title": "Retrieve a contact",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}update_contact — Update a contact
Update a contact. Requires a `full_access` API key. API: `PATCH /audiences/{audienceId}/contacts/{idOrEmail}` (operationId `updateContact`, Contacts).
{
"type": "object",
"required": [
"audience_id",
"id_or_email"
],
"properties": {
"last_name": {
"type": "string",
"maxLength": 100
},
"first_name": {
"type": "string",
"maxLength": 100
},
"audience_id": {
"type": "string",
"format": "uuid"
},
"id_or_email": {
"type": "string",
"examples": [
"jane@example.com"
],
"description": "The contact id or its (URL-encoded) email address."
},
"unsubscribed": {
"type": "boolean"
}
}
}{
"title": "Update a contact",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}delete_contact — Delete a contact
Delete a contact. Requires a `full_access` API key. API: `DELETE /audiences/{audienceId}/contacts/{idOrEmail}` (operationId `deleteContact`, Contacts).
{
"type": "object",
"required": [
"audience_id",
"id_or_email"
],
"properties": {
"audience_id": {
"type": "string",
"format": "uuid"
},
"id_or_email": {
"type": "string",
"examples": [
"jane@example.com"
],
"description": "The contact id or its (URL-encoded) email address."
}
}
}{
"title": "Delete a contact",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}list_broadcasts — List broadcasts
List broadcasts. Requires a `full_access` API key. API: `GET /broadcasts` (operationId `listBroadcasts`, Broadcasts).
{
"type": "object",
"properties": {
"after": {
"type": "string",
"format": "uuid",
"description": "Return items older than this id (next page). Cannot be combined with `before`."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Number of items to return."
},
"before": {
"type": "string",
"format": "uuid",
"description": "Return items newer than this id (previous page). Cannot be combined with `after`."
}
}
}{
"title": "List broadcasts",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}create_broadcast — Create a broadcast
Create a broadcast. Creates a draft. The `from` address must belong to a verified domain of your team and `audience_id` to one of your audiences. Requires a `full_access` API key. API: `POST /broadcasts` (operationId `createBroadcast`, Broadcasts).
{
"type": "object",
"required": [
"audience_id",
"from",
"subject"
],
"properties": {
"from": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"html": {
"type": "string"
},
"name": {
"type": "string",
"maxLength": 100,
"description": "Internal name",
"not shown to recipients.": null
},
"text": {
"type": "string"
},
"subject": {
"type": "string",
"maxLength": 998,
"minLength": 1
},
"reply_to": {
"oneOf": [
{
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
{
"type": "array",
"items": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"maxItems": 50,
"minItems": 1
}
]
},
"audience_id": {
"type": "string",
"format": "uuid"
},
"preview_text": {
"type": "string",
"maxLength": 200
}
}
}{
"title": "Create a broadcast",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}get_broadcast — Retrieve a broadcast
Retrieve a broadcast. Requires a `full_access` API key. API: `GET /broadcasts/{id}` (operationId `getBroadcast`, Broadcasts).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
}
}
}{
"title": "Retrieve a broadcast",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}update_broadcast — Update a broadcast
Update a broadcast. Only drafts can be updated. Request body: Any field of the create request; only drafts can be updated. Requires a `full_access` API key. API: `PATCH /broadcasts/{id}` (operationId `updateBroadcast`, Broadcasts).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"from": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"html": {
"type": "string"
},
"name": {
"type": "string",
"maxLength": 100
},
"text": {
"type": "string"
},
"subject": {
"type": "string",
"maxLength": 998,
"minLength": 1
},
"reply_to": {
"oneOf": [
{
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
{
"type": "array",
"items": {
"type": "string",
"examples": [
"Acme <hello@acme.com>"
],
"description": "An email address, optionally with a display name: `Acme <hello@acme.com>`."
},
"maxItems": 50,
"minItems": 1
}
]
},
"audience_id": {
"type": "string",
"format": "uuid"
},
"preview_text": {
"type": "string",
"maxLength": 200
}
}
}{
"title": "Update a broadcast",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}delete_broadcast — Delete a broadcast
Delete a broadcast. Only drafts and broadcasts that are scheduled for the future can be deleted. Requires a `full_access` API key. API: `DELETE /broadcasts/{id}` (operationId `deleteBroadcast`, Broadcasts).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
}
}
}{
"title": "Delete a broadcast",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}get_broadcast_readiness — Check a broadcast before sending
Check a broadcast before sending. SpacePost extension (not part of Resend). Returns a deliverability checklist: sender domain and DMARC, subject, Gmail clipping (HTML over 102 KB), image-heavy bodies, link shorteners, spam phrases, unsubscribe link and audience quality. `ready` is false when any check has level `error`; `POST /broadcasts/{id}/send` is then refused with `validation_error`. Warnings never block a send. Requires a `full_access` API key. API: `GET /broadcasts/{id}/readiness` (operationId `getBroadcastReadiness`, Broadcasts).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
}
}
}{
"title": "Check a broadcast before sending",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}send_broadcast — Send or schedule a broadcast
Send or schedule a broadcast. Queues a draft for delivery to every subscribed contact of its audience. The broadcast needs `html` or `text`. Without `scheduled_at` it starts immediately; the status becomes `queued`, then `sending` and `sent`. Sends to every subscribed contact in the audience. Run get_broadcast_readiness first and confirm with the user. Requires a `full_access` API key. API: `POST /broadcasts/{id}/send` (operationId `sendBroadcast`, Broadcasts).
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"format": "uuid"
},
"scheduled_at": {
"type": "string",
"examples": [
"in 1 hour",
"2026-10-30T09:00:00Z"
],
"description": "ISO 8601 date-time or natural language such as \"in 1 hour\" or \"in 2 days\". At most 30 days ahead."
}
}
}{
"title": "Send or schedule a broadcast",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}list_suppressions — List suppressions
List suppressions. Requires a `full_access` API key. API: `GET /suppressions` (operationId `listSuppressions`, Suppressions).
{
"type": "object",
"properties": {
"after": {
"type": "string",
"format": "uuid",
"description": "Return items older than this id (next page). Cannot be combined with `before`."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Number of items to return."
},
"before": {
"type": "string",
"format": "uuid",
"description": "Return items newer than this id (previous page). Cannot be combined with `after`."
}
}
}{
"title": "List suppressions",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}create_suppression — Add a suppression
Add a suppression. Adds the address with reason `manual`. Adding an address that is already suppressed returns the existing entry. Requires a `full_access` API key. API: `POST /suppressions` (operationId `createSuppression`, Suppressions).
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"format": "email"
}
}
}{
"title": "Add a suppression",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}delete_suppression — Remove a suppression
Remove a suppression. Requires a `full_access` API key. API: `DELETE /suppressions/{idOrEmail}` (operationId `deleteSuppression`, Suppressions).
{
"type": "object",
"required": [
"id_or_email"
],
"properties": {
"id_or_email": {
"type": "string",
"examples": [
"bounced@example.com"
],
"description": "The suppression id or the (URL-encoded) email address."
}
}
}{
"title": "Remove a suppression",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}list_tenants — List tenants
List tenants. Requires a `full_access` API key. API: `GET /tenants` (operationId `listTenants`, Tenants).
{
"type": "object",
"properties": {
"after": {
"type": "string",
"format": "uuid",
"description": "Return items older than this id (next page). Cannot be combined with `before`."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Number of items to return."
},
"before": {
"type": "string",
"format": "uuid",
"description": "Return items newer than this id (previous page). Cannot be combined with `after`."
}
}
}{
"title": "List tenants",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}create_tenant — Create a tenant
Create a tenant. Creates one of your customers, with its own SES tenant (isolated reputation). `external_id` must be unique within your account. Requires a `full_access` API key. API: `POST /tenants` (operationId `createTenant`, Tenants).
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"daily_limit": {
"type": [
"integer",
"null"
],
"minimum": 1,
"description": "Max recipients per day for this tenant. Omit or null for no cap."
},
"external_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Your own id for the customer. Unique per account; accepted wherever a tenant id is."
}
}
}{
"title": "Create a tenant",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}get_tenant — Retrieve a tenant
Retrieve a tenant. Requires a `full_access` API key. API: `GET /tenants/{ref}` (operationId `getTenant`, Tenants).
{
"type": "object",
"required": [
"ref"
],
"properties": {
"ref": {
"type": "string",
"examples": [
"cust_123"
],
"maxLength": 200,
"minLength": 1,
"description": "The tenant id or your own `external_id`."
}
}
}{
"title": "Retrieve a tenant",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}update_tenant — Update a tenant
Update a tenant. Changes the name, `external_id` or `daily_limit` (`null` removes the cap). Requires a `full_access` API key. API: `PATCH /tenants/{ref}` (operationId `updateTenant`, Tenants).
{
"type": "object",
"required": [
"ref"
],
"properties": {
"ref": {
"type": "string",
"examples": [
"cust_123"
],
"maxLength": 200,
"minLength": 1,
"description": "The tenant id or your own `external_id`."
},
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"daily_limit": {
"type": [
"integer",
"null"
],
"minimum": 1,
"description": "Null removes the cap."
},
"external_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
}
}
}{
"title": "Update a tenant",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}delete_tenant — Delete a tenant
Delete a tenant. Fails with `422` while the tenant still has domains; delete those first. Requires a `full_access` API key. API: `DELETE /tenants/{ref}` (operationId `deleteTenant`, Tenants).
{
"type": "object",
"required": [
"ref"
],
"properties": {
"ref": {
"type": "string",
"examples": [
"cust_123"
],
"maxLength": 200,
"minLength": 1,
"description": "The tenant id or your own `external_id`."
}
}
}{
"title": "Delete a tenant",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}pause_tenant — Pause a tenant
Pause a tenant. Stops all sending for the tenant. Sends return `403 sending_paused`; emails already queued fail. The body is optional. Requires a `full_access` API key. API: `POST /tenants/{ref}/pause` (operationId `pauseTenant`, Tenants).
{
"type": "object",
"required": [
"ref"
],
"properties": {
"ref": {
"type": "string",
"examples": [
"cust_123"
],
"maxLength": 200,
"minLength": 1,
"description": "The tenant id or your own `external_id`."
},
"reason": {
"type": "string",
"maxLength": 300,
"description": "Stored as `paused_reason`. Defaults to a generic reason."
}
}
}{
"title": "Pause a tenant",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}unpause_tenant — Unpause a tenant
Unpause a tenant. Resumes sending. A tenant that was paused by the reputation guard (bounce or complaint rate) can only be unpaused by a `trusted` or `internal` team; others get `403 invalid_access` and should contact support. Requires a `full_access` API key. API: `POST /tenants/{ref}/unpause` (operationId `unpauseTenant`, Tenants).
{
"type": "object",
"required": [
"ref"
],
"properties": {
"ref": {
"type": "string",
"examples": [
"cust_123"
],
"maxLength": 200,
"minLength": 1,
"description": "The tenant id or your own `external_id`."
}
}
}{
"title": "Unpause a tenant",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
Not advertised
Resources
Not advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 845 ms
- 95th percentile latency
- 845 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 845 ms · metadata changed · 46 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http spacepost-mcp https://api.spacepost.dev/mcpCodex
codex mcp add spacepost-mcp --url https://api.spacepost.dev/mcpCursor
{
"mcpServers": {
"spacepost-mcp": {
"url": "https://api.spacepost.dev/mcp"
}
}
}Cline
{
"mcpServers": {
"spacepost-mcp": {
"type": "streamableHttp",
"url": "https://api.spacepost.dev/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"spacepost-mcp": {
"type": "http",
"url": "https://api.spacepost.dev/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http spacepost-mcp https://api.spacepost.dev/mcpClaude Desktop
{
"mcpServers": {
"spacepost-mcp": {
"url": "https://api.spacepost.dev/mcp"
}
}
}Windsurf
{
"mcpServers": {
"spacepost-mcp": {
"serverUrl": "https://api.spacepost.dev/mcp"
}
}
}Let your agent find its tools
Find servers like SpacePost MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other productivity and knowledge servers
Do you run SpacePost MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.