Koskamo

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.

SpacePost MCP logo, by SpacePostVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by SpacePost
You need:Send your API key as a bearer token: Authorization: Bearer sp_live_... .
MCP endpoint (Streamable HTTP)
https://api.spacepost.dev/mcp
Vendor documentation

What 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

Vendor evidenceRegistry 0.2.2-1
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
Server-advertised capabilities
{
  "tools": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

SpacePost is a Resend-compatible email API. Every tool maps to one REST endpoint and returns its JSON response. To send: list_domains to find a verified domain for `from`, then send_email. List tools paginate with `limit` and `after` (the id of the last item). Errors come back as { statusCode, name, message }.

Tools

46 advertised

list_emails — List emails
Advertised by the server during the last successful anonymous check.
Advertised read-only

List emails. Returns sent and scheduled emails, newest first, without bodies. Requires a `full_access` API key. API: `GET /emails` (operationId `listEmails`, Emails).

list_emails input schema
{
  "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`."
    }
  }
}
list_emails annotations
{
  "title": "List emails",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
send_email — Send an email
Advertised by the server during the last successful anonymous check.
Open-world

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

send_email input schema
{
  "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."
    }
  }
}
send_email annotations
{
  "title": "Send an email",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
send_batch_emails — Send batch emails
Advertised by the server during the last successful anonymous check.
Open-world

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

send_batch_emails input schema
{
  "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."
    }
  }
}
send_batch_emails annotations
{
  "title": "Send batch emails",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
get_email — Retrieve an email
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve an email. Requires a `full_access` API key. API: `GET /emails/{id}` (operationId `getEmail`, Emails).

get_email input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "The email id."
    }
  }
}
get_email annotations
{
  "title": "Retrieve an email",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
update_email — Reschedule an email
Advertised by the server during the last successful anonymous check.

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

update_email input schema
{
  "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."
    }
  }
}
update_email annotations
{
  "title": "Reschedule an email",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
cancel_email — Cancel a scheduled email
Advertised by the server during the last successful anonymous check.
Advertised destructive

Cancel a scheduled email. Requires a `full_access` API key. API: `POST /emails/{id}/cancel` (operationId `cancelEmail`, Emails).

cancel_email input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "The email id."
    }
  }
}
cancel_email annotations
{
  "title": "Cancel a scheduled email",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
list_domains — List domains
Advertised by the server during the last successful anonymous check.
Advertised read-only

List domains. Requires a `full_access` API key. API: `GET /domains` (operationId `listDomains`, Domains).

list_domains input schema
{
  "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`."
    }
  }
}
list_domains annotations
{
  "title": "List domains",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_domain — Create a domain
Advertised by the server during the last successful anonymous check.

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

create_domain input schema
{
  "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)."
    }
  }
}
create_domain annotations
{
  "title": "Create a domain",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_domain — Retrieve a domain
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve a domain. Requires a `full_access` API key. API: `GET /domains/{id}` (operationId `getDomain`, Domains).

get_domain input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    }
  }
}
get_domain annotations
{
  "title": "Retrieve a domain",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
update_domain — Update a domain
Advertised by the server during the last successful anonymous check.

Update a domain. Toggles open and click tracking. Requires a `full_access` API key. API: `PATCH /domains/{id}` (operationId `updateDomain`, Domains).

update_domain input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "tls": {
      "enum": [
        "opportunistic",
        "enforced"
      ],
      "type": "string"
    },
    "open_tracking": {
      "type": "boolean"
    },
    "click_tracking": {
      "type": "boolean"
    }
  }
}
update_domain annotations
{
  "title": "Update a domain",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
delete_domain — Delete a domain
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete a domain. Requires a `full_access` API key. API: `DELETE /domains/{id}` (operationId `deleteDomain`, Domains).

delete_domain input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    }
  }
}
delete_domain annotations
{
  "title": "Delete a domain",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
verify_domain — Verify a domain
Advertised by the server during the last successful anonymous check.

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

verify_domain input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    }
  }
}
verify_domain annotations
{
  "title": "Verify a domain",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_api_keys — List API keys
Advertised by the server during the last successful anonymous check.
Advertised read-only

List API keys. Requires a `full_access` API key. API: `GET /api-keys` (operationId `listApiKeys`, API Keys).

list_api_keys input schema
{
  "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`."
    }
  }
}
list_api_keys annotations
{
  "title": "List API keys",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_api_key — Create an API key
Advertised by the server during the last successful anonymous check.

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

create_api_key input schema
{
  "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"
    }
  }
}
create_api_key annotations
{
  "title": "Create an API key",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
delete_api_key — Delete an API key
Advertised by the server during the last successful anonymous check.
Advertised destructive

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

delete_api_key input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    }
  }
}
delete_api_key annotations
{
  "title": "Delete an API key",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
list_webhooks — List webhooks
Advertised by the server during the last successful anonymous check.
Advertised read-only

List webhooks. Requires a `full_access` API key. API: `GET /webhooks` (operationId `listWebhooks`, Webhooks).

list_webhooks input schema
{
  "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`."
    }
  }
}
list_webhooks annotations
{
  "title": "List webhooks",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_webhook — Create a webhook
Advertised by the server during the last successful anonymous check.

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

create_webhook input schema
{
  "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."
    }
  }
}
create_webhook annotations
{
  "title": "Create a webhook",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_webhook — Retrieve a webhook
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve a webhook. Requires a `full_access` API key. API: `GET /webhooks/{id}` (operationId `getWebhook`, Webhooks).

get_webhook input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    }
  }
}
get_webhook annotations
{
  "title": "Retrieve a webhook",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
update_webhook — Update a webhook
Advertised by the server during the last successful anonymous check.

Update a webhook. Requires a `full_access` API key. API: `PATCH /webhooks/{id}` (operationId `updateWebhook`, Webhooks).

update_webhook input schema
{
  "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"
    }
  }
}
update_webhook annotations
{
  "title": "Update a webhook",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
delete_webhook — Delete a webhook
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete a webhook. Requires a `full_access` API key. API: `DELETE /webhooks/{id}` (operationId `deleteWebhook`, Webhooks).

delete_webhook input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    }
  }
}
delete_webhook annotations
{
  "title": "Delete a webhook",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
list_audiences — List audiences
Advertised by the server during the last successful anonymous check.
Advertised read-only

List audiences. Requires a `full_access` API key. API: `GET /audiences` (operationId `listAudiences`, Audiences).

list_audiences input schema
{
  "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`."
    }
  }
}
list_audiences annotations
{
  "title": "List audiences",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_audience — Create an audience
Advertised by the server during the last successful anonymous check.

Create an audience. Requires a `full_access` API key. API: `POST /audiences` (operationId `createAudience`, Audiences).

create_audience input schema
{
  "type": "object",
  "required": [
    "name"
  ],
  "properties": {
    "name": {
      "type": "string",
      "maxLength": 100,
      "minLength": 1
    }
  }
}
create_audience annotations
{
  "title": "Create an audience",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_audience — Retrieve an audience
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve an audience. Requires a `full_access` API key. API: `GET /audiences/{id}` (operationId `getAudience`, Audiences).

get_audience input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    }
  }
}
get_audience annotations
{
  "title": "Retrieve an audience",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
delete_audience — Delete an audience
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete an audience. Also deletes its contacts. Requires a `full_access` API key. API: `DELETE /audiences/{id}` (operationId `deleteAudience`, Audiences).

delete_audience input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    }
  }
}
delete_audience annotations
{
  "title": "Delete an audience",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
list_contacts — List contacts
Advertised by the server during the last successful anonymous check.
Advertised read-only

List contacts. Requires a `full_access` API key. API: `GET /audiences/{audienceId}/contacts` (operationId `listContacts`, Contacts).

list_contacts input schema
{
  "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"
    }
  }
}
list_contacts annotations
{
  "title": "List contacts",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_contact — Create a contact
Advertised by the server during the last successful anonymous check.

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

create_contact input schema
{
  "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
    }
  }
}
create_contact annotations
{
  "title": "Create a contact",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_contact — Retrieve a contact
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve a contact. Requires a `full_access` API key. API: `GET /audiences/{audienceId}/contacts/{idOrEmail}` (operationId `getContact`, Contacts).

get_contact input schema
{
  "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."
    }
  }
}
get_contact annotations
{
  "title": "Retrieve a contact",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
update_contact — Update a contact
Advertised by the server during the last successful anonymous check.

Update a contact. Requires a `full_access` API key. API: `PATCH /audiences/{audienceId}/contacts/{idOrEmail}` (operationId `updateContact`, Contacts).

update_contact input schema
{
  "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"
    }
  }
}
update_contact annotations
{
  "title": "Update a contact",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
delete_contact — Delete a contact
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete a contact. Requires a `full_access` API key. API: `DELETE /audiences/{audienceId}/contacts/{idOrEmail}` (operationId `deleteContact`, Contacts).

delete_contact input schema
{
  "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."
    }
  }
}
delete_contact annotations
{
  "title": "Delete a contact",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
list_broadcasts — List broadcasts
Advertised by the server during the last successful anonymous check.
Advertised read-only

List broadcasts. Requires a `full_access` API key. API: `GET /broadcasts` (operationId `listBroadcasts`, Broadcasts).

list_broadcasts input schema
{
  "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`."
    }
  }
}
list_broadcasts annotations
{
  "title": "List broadcasts",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_broadcast — Create a broadcast
Advertised by the server during the last successful anonymous check.

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

create_broadcast input schema
{
  "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
    }
  }
}
create_broadcast annotations
{
  "title": "Create a broadcast",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_broadcast — Retrieve a broadcast
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve a broadcast. Requires a `full_access` API key. API: `GET /broadcasts/{id}` (operationId `getBroadcast`, Broadcasts).

get_broadcast input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    }
  }
}
get_broadcast annotations
{
  "title": "Retrieve a broadcast",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
update_broadcast — Update a broadcast
Advertised by the server during the last successful anonymous check.

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

update_broadcast input schema
{
  "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
    }
  }
}
update_broadcast annotations
{
  "title": "Update a broadcast",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
delete_broadcast — Delete a broadcast
Advertised by the server during the last successful anonymous check.
Advertised destructive

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

delete_broadcast input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    }
  }
}
delete_broadcast annotations
{
  "title": "Delete a broadcast",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
get_broadcast_readiness — Check a broadcast before sending
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

get_broadcast_readiness input schema
{
  "type": "object",
  "required": [
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    }
  }
}
get_broadcast_readiness annotations
{
  "title": "Check a broadcast before sending",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
send_broadcast — Send or schedule a broadcast
Advertised by the server during the last successful anonymous check.
Open-world

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

send_broadcast input schema
{
  "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."
    }
  }
}
send_broadcast annotations
{
  "title": "Send or schedule a broadcast",
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": false,
  "destructiveHint": false
}
list_suppressions — List suppressions
Advertised by the server during the last successful anonymous check.
Advertised read-only

List suppressions. Requires a `full_access` API key. API: `GET /suppressions` (operationId `listSuppressions`, Suppressions).

list_suppressions input schema
{
  "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`."
    }
  }
}
list_suppressions annotations
{
  "title": "List suppressions",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_suppression — Add a suppression
Advertised by the server during the last successful anonymous check.

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

create_suppression input schema
{
  "type": "object",
  "required": [
    "email"
  ],
  "properties": {
    "email": {
      "type": "string",
      "format": "email"
    }
  }
}
create_suppression annotations
{
  "title": "Add a suppression",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
delete_suppression — Remove a suppression
Advertised by the server during the last successful anonymous check.
Advertised destructive

Remove a suppression. Requires a `full_access` API key. API: `DELETE /suppressions/{idOrEmail}` (operationId `deleteSuppression`, Suppressions).

delete_suppression input schema
{
  "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."
    }
  }
}
delete_suppression annotations
{
  "title": "Remove a suppression",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
list_tenants — List tenants
Advertised by the server during the last successful anonymous check.
Advertised read-only

List tenants. Requires a `full_access` API key. API: `GET /tenants` (operationId `listTenants`, Tenants).

list_tenants input schema
{
  "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`."
    }
  }
}
list_tenants annotations
{
  "title": "List tenants",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_tenant — Create a tenant
Advertised by the server during the last successful anonymous check.

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

create_tenant input schema
{
  "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."
    }
  }
}
create_tenant annotations
{
  "title": "Create a tenant",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_tenant — Retrieve a tenant
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieve a tenant. Requires a `full_access` API key. API: `GET /tenants/{ref}` (operationId `getTenant`, Tenants).

get_tenant input schema
{
  "type": "object",
  "required": [
    "ref"
  ],
  "properties": {
    "ref": {
      "type": "string",
      "examples": [
        "cust_123"
      ],
      "maxLength": 200,
      "minLength": 1,
      "description": "The tenant id or your own `external_id`."
    }
  }
}
get_tenant annotations
{
  "title": "Retrieve a tenant",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
update_tenant — Update a tenant
Advertised by the server during the last successful anonymous check.

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

update_tenant input schema
{
  "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
    }
  }
}
update_tenant annotations
{
  "title": "Update a tenant",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
delete_tenant — Delete a tenant
Advertised by the server during the last successful anonymous check.
Advertised destructive

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

delete_tenant input schema
{
  "type": "object",
  "required": [
    "ref"
  ],
  "properties": {
    "ref": {
      "type": "string",
      "examples": [
        "cust_123"
      ],
      "maxLength": 200,
      "minLength": 1,
      "description": "The tenant id or your own `external_id`."
    }
  }
}
delete_tenant annotations
{
  "title": "Delete a tenant",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
pause_tenant — Pause a tenant
Advertised by the server during the last successful anonymous check.
Advertised destructive

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

pause_tenant input schema
{
  "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."
    }
  }
}
pause_tenant annotations
{
  "title": "Pause a tenant",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": true
}
unpause_tenant — Unpause a tenant
Advertised by the server during the last successful anonymous check.

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

unpause_tenant input schema
{
  "type": "object",
  "required": [
    "ref"
  ],
  "properties": {
    "ref": {
      "type": "string",
      "examples": [
        "cust_123"
      ],
      "maxLength": 200,
      "minLength": 1,
      "description": "The tenant id or your own `external_id`."
    }
  }
}
unpause_tenant annotations
{
  "title": "Unpause a tenant",
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http spacepost-mcp https://api.spacepost.dev/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add spacepost-mcp --url https://api.spacepost.dev/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable spacepost-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "spacepost-mcp": {
      "url": "https://api.spacepost.dev/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "spacepost-mcp": {
      "type": "streamableHttp",
      "url": "https://api.spacepost.dev/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start spacepost-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "spacepost-mcp": {
      "type": "http",
      "url": "https://api.spacepost.dev/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http spacepost-mcp https://api.spacepost.dev/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "spacepost-mcp": {
      "url": "https://api.spacepost.dev/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.

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.

Claim this listing