{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-06T17:17:59.057Z","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api","markdownUrl":"https://verifymcp.io/servers/dev-spacepost-mcp/api.md","server":{"slug":"dev-spacepost-mcp","name":"SpacePost","registryName":"dev.spacepost/mcp","description":"Send email and manage domains, contacts and webhooks on SpacePost, the Resend-compatible email API.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"api","type":"remote","identifier":"https://api.spacepost.dev/mcp","withdrawn":false,"url":"https://verifymcp.io/servers/dev-spacepost-mcp/api","version":"0.2.2","transport":null,"scoredAt":"2026-11-06T02:24:43.642Z"},"score":{"total":75,"tier":"medium","status":"scored","weekDelta":3,"history":[{"date":"2026-11-06","total":75},{"date":"2026-11-05","total":74},{"date":"2026-11-04","total":4},{"date":"2026-11-03","total":74},{"date":"2026-11-02","total":73},{"date":"2026-11-01","total":73},{"date":"2026-10-31","total":72},{"date":"2026-10-30","total":72}]},"categories":[{"name":"Endpoint Security","score":83,"verdict":"fail","reasons":["The endpoint's TLS certificate is valid, in date, and uses a strong key.","Authorisation is enforced on tool calls, but the challenge carries no valid RFC 9728 metadata, so a client cannot discover where to get a token.","HTTPS is enforced; there's no plaintext access path.","HSTS check failed: the Strict-Transport-Security header is absent.","DNSSEC check failed: this domain isn't protected by DNSSEC."],"codes":[{"code":"tls.valid","args":{}},{"code":"auth.challenge_only_invoke","args":{}},{"code":"https.enforced","args":{}},{"code":"headers.hsts_absent","args":{}},{"code":"dnssec.absent","args":{}}]},{"name":"Transport & Reachability","score":100,"verdict":"pass","reasons":["Verified streamable-http transport via a live MCP handshake."],"codes":[{"code":"transport.verified","args":{"transport":"streamable-http"}}]},{"name":"Schema Quality & AI Usability","score":67,"verdict":"fail","reasons":["AI-judged instruction clarity (good).","Context-footprint check failed: tool/resource definitions use about 4787 tokens (~104/item across 46 items; 46 tools + 0 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_heavy","args":{"avg":"104","items":"46","tools":"46","tokens":"4787","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":23,"verdict":"partial","reasons":["Stability observed for 7 of 30 days with no destabilising changes; credit accrues until the full window elapses."],"codes":[{"code":"stability.building_history","args":{"days":"7"}}]},{"name":"Tool Coverage","score":83,"verdict":"partial","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","48% of tool parameters carry a description."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"48"}}]},{"name":"Tool Safety","score":100,"verdict":"pass","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","All 11 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.","An AI judge read all 47 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_declared","args":{"pct":"100","annotated":"11","destructive":"11"}},{"code":"toolsafety.manipulation_clean","args":{"units":"47","judged":"47"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28."],"codes":[{"code":"protocol.supported","args":{"latest":"2026-07-28","version":"2025-11-25"}}]}],"inconclusive":[],"malware":[],"components":[{"slug":"api","type":"remote","identifier":"https://api.spacepost.dev/mcp","withdrawn":false,"score":75,"current":true,"url":"https://verifymcp.io/servers/dev-spacepost-mcp/api","markdownUrl":"https://verifymcp.io/servers/dev-spacepost-mcp/api.md"},{"slug":"spacepost-mcp","type":"npm","identifier":"@spacepost/mcp","withdrawn":false,"score":38,"current":false,"url":"https://verifymcp.io/servers/dev-spacepost-mcp/spacepost-mcp","markdownUrl":"https://verifymcp.io/servers/dev-spacepost-mcp/spacepost-mcp.md"}],"facts":[{"label":"Endpoint","value":"https://api.spacepost.dev/mcp"},{"label":"Transports","value":"streamable-http"},{"label":"Auth","value":"required (not validated)"},{"label":"Version","value":"0.2.2"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"list_emails","title":"List emails","description":"List emails.\n\nReturns sent and scheduled emails, newest first, without bodies.\n\nRequires a `full_access` API key. API: `GET /emails` (operationId `listEmails`, Emails).","inputs":[{"name":"after","type":"string","required":false,"description":"Return items older than this id (next page). Cannot be combined with `before`."},{"name":"before","type":"string","required":false,"description":"Return items newer than this id (previous page). Cannot be combined with `after`."},{"name":"limit","type":"integer","required":false,"description":"Number of items to return."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":107},{"name":"send_email","title":"Send an email","description":"Send an email.\n\nValidates 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.\n\n`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.\n\nRequest body: Either `html` or `text` is required. `reply_to` is also accepted as `replyTo` and `scheduled_at` as `scheduledAt`.\n\nWorks with a `sending_access` or `full_access` API key. API: `POST /emails` (operationId `sendEmail`, Emails).","inputs":[{"name":"attachments","type":"array","required":false,"description":null},{"name":"bcc","type":null,"required":false,"description":null},{"name":"cc","type":null,"required":false,"description":null},{"name":"from","type":"string","required":true,"description":"An email address, optionally with a display name: `Acme <hello@acme.com>`. At most 998 characters, display name included. A display name can't contain `<`, `>` or an encoded word, and a `from` name c…"},{"name":"headers","type":"object","required":false,"description":null},{"name":"html","type":"string","required":false,"description":null},{"name":"idempotency_key","type":"string","required":false,"description":"A unique key (1 to 256 characters) that makes the request safe to retry for 24 hours."},{"name":"reply_to","type":null,"required":false,"description":null},{"name":"scheduled_at","type":"string","required":false,"description":"ISO 8601 date-time or natural language such as \"in 1 hour\" or \"in 2 days\". At most 30 days ahead."},{"name":"subject","type":"string","required":true,"description":null},{"name":"tags","type":"array","required":false,"description":null},{"name":"tenant_id","type":"string","required":false,"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."},{"name":"text","type":"string","required":false,"description":null},{"name":"to","type":null,"required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":522},{"name":"send_batch_emails","title":"Send batch emails","description":"Send batch emails.\n\nSends 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.\n\nPut the emails in `body` as an array. Prefer send_email for a single message.\n\nWorks with a `sending_access` or `full_access` API key. API: `POST /emails/batch` (operationId `sendBatchEmails`, Emails).","inputs":[{"name":"body","type":"array","required":true,"description":"The JSON request body."},{"name":"idempotency_key","type":"string","required":false,"description":"A unique key (1 to 256 characters) that makes the request safe to retry for 24 hours."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":166},{"name":"get_email","title":"Retrieve an email","description":"Retrieve an email.\n\nRequires a `full_access` API key. API: `GET /emails/{id}` (operationId `getEmail`, Emails).","inputs":[{"name":"id","type":"string","required":true,"description":"The email id."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":49},{"name":"update_email","title":"Reschedule an email","description":"Reschedule an email.\n\nChanges `scheduled_at` of an email that is still `scheduled`.\n\nRequires a `full_access` API key. API: `PATCH /emails/{id}` (operationId `updateEmail`, Emails).","inputs":[{"name":"id","type":"string","required":true,"description":"The email id."},{"name":"scheduled_at","type":"string","required":true,"description":"ISO 8601 date-time or natural language such as \"in 1 hour\" or \"in 2 days\". At most 30 days ahead."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":102},{"name":"cancel_email","title":"Cancel a scheduled email","description":"Cancel a scheduled email.\n\nRequires a `full_access` API key. API: `POST /emails/{id}/cancel` (operationId `cancelEmail`, Emails).","inputs":[{"name":"id","type":"string","required":true,"description":"The email id."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":52},{"name":"list_domains","title":"List domains","description":"List domains.\n\nRequires a `full_access` API key. API: `GET /domains` (operationId `listDomains`, Domains).","inputs":[{"name":"after","type":"string","required":false,"description":"Return items older than this id (next page). Cannot be combined with `before`."},{"name":"before","type":"string","required":false,"description":"Return items newer than this id (previous page). Cannot be combined with `after`."},{"name":"limit","type":"integer","required":false,"description":"Number of items to return."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":94},{"name":"create_domain","title":"Create a domain","description":"Create a domain.\n\nRegisters a domain and returns the DNS records to add (three DKIM CNAMEs, plus MX and SPF on the MAIL FROM subdomain).\nDomain names are globally unique. The number of domains is limited by your plan (Free 3, Pro 10, Scale 1,000).\n\nThe 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.\n\nRequires a `full_access` API key. API: `POST /domains` (operationId `createDomain`, Domains).","inputs":[{"name":"custom_return_path","type":"string","required":false,"description":"Subdomain used for the custom MAIL FROM (bounce handling and SPF)."},{"name":"name","type":"string","required":true,"description":"Domain or subdomain you own. Lower-cased."},{"name":"region","type":"string","required":false,"description":"Accepted for compatibility. The region is chosen by the platform and returned on the domain."},{"name":"tenant_id","type":"string","required":false,"description":"Platform mode. Make the domain tenant-owned (our tenant id or your `external_id`). Mail from it is attributed to that tenant."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":243},{"name":"get_domain","title":"Retrieve a domain","description":"Retrieve a domain.\n\nRequires a `full_access` API key. API: `GET /domains/{id}` (operationId `getDomain`, Domains).","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":46},{"name":"update_domain","title":"Update a domain","description":"Update a domain.\n\nToggles open and click tracking.\n\nRequires a `full_access` API key. API: `PATCH /domains/{id}` (operationId `updateDomain`, Domains).","inputs":[{"name":"click_tracking","type":"boolean","required":false,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"open_tracking","type":"boolean","required":false,"description":null},{"name":"tls","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":77},{"name":"delete_domain","title":"Delete a domain","description":"Delete a domain.\n\nRequires a `full_access` API key. API: `DELETE /domains/{id}` (operationId `deleteDomain`, Domains).","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":46},{"name":"verify_domain","title":"Verify a domain","description":"Verify a domain.\n\nRe-checks DNS now. Retrieve the domain afterwards to read the new `status` and per-record statuses.\n\nRequires a `full_access` API key. API: `POST /domains/{id}/verify` (operationId `verifyDomain`, Domains).","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":70},{"name":"list_api_keys","title":"List API keys","description":"List API keys.\n\nRequires a `full_access` API key. API: `GET /api-keys` (operationId `listApiKeys`, API Keys).","inputs":[{"name":"after","type":"string","required":false,"description":"Return items older than this id (next page). Cannot be combined with `before`."},{"name":"before","type":"string","required":false,"description":"Return items newer than this id (previous page). Cannot be combined with `after`."},{"name":"limit","type":"integer","required":false,"description":"Number of items to return."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":100},{"name":"create_api_key","title":"Create an API key","description":"Create an API key.\n\nThe `token` is returned only in this response.\n\nRequires a `full_access` API key. API: `POST /api-keys` (operationId `createApiKey`, API Keys).","inputs":[{"name":"domain_id","type":"string","required":false,"description":"Restrict a `sending_access` key to one of your domains. Not allowed with `full_access`."},{"name":"name","type":"string","required":true,"description":null},{"name":"permission","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":96},{"name":"delete_api_key","title":"Delete an API key","description":"Delete an API key.\n\nThe key stops working immediately. The response body is an empty object.\n\nRequires a `full_access` API key. API: `DELETE /api-keys/{id}` (operationId `deleteApiKey`, API Keys).","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":66},{"name":"list_webhooks","title":"List webhooks","description":"List webhooks.\n\nRequires a `full_access` API key. API: `GET /webhooks` (operationId `listWebhooks`, Webhooks).","inputs":[{"name":"after","type":"string","required":false,"description":"Return items older than this id (next page). Cannot be combined with `before`."},{"name":"before","type":"string","required":false,"description":"Return items newer than this id (previous page). Cannot be combined with `after`."},{"name":"limit","type":"integer","required":false,"description":"Number of items to return."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":99},{"name":"create_webhook","title":"Create a webhook","description":"Create a webhook.\n\nIn production the endpoint must use https and resolve to a public address.\n\nRequires a `full_access` API key. API: `POST /webhooks` (operationId `createWebhook`, Webhooks).","inputs":[{"name":"endpoint","type":"string","required":true,"description":"Public URL that receives POST requests. https is required in production."},{"name":"events","type":"array","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":80},{"name":"get_webhook","title":"Retrieve a webhook","description":"Retrieve a webhook.\n\nRequires a `full_access` API key. API: `GET /webhooks/{id}` (operationId `getWebhook`, Webhooks).","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":49},{"name":"update_webhook","title":"Update a webhook","description":"Update a webhook.\n\nRequires a `full_access` API key. API: `PATCH /webhooks/{id}` (operationId `updateWebhook`, Webhooks).","inputs":[{"name":"endpoint","type":"string","required":false,"description":null},{"name":"events","type":"array","required":false,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"status","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":70},{"name":"delete_webhook","title":"Delete a webhook","description":"Delete a webhook.\n\nRequires a `full_access` API key. API: `DELETE /webhooks/{id}` (operationId `deleteWebhook`, Webhooks).","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":49},{"name":"list_audiences","title":"List audiences","description":"List audiences.\n\nRequires a `full_access` API key. API: `GET /audiences` (operationId `listAudiences`, Audiences).","inputs":[{"name":"after","type":"string","required":false,"description":"Return items older than this id (next page). Cannot be combined with `before`."},{"name":"before","type":"string","required":false,"description":"Return items newer than this id (previous page). Cannot be combined with `after`."},{"name":"limit","type":"integer","required":false,"description":"Number of items to return."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":99},{"name":"create_audience","title":"Create an audience","description":"Create an audience.\n\nRequires a `full_access` API key. API: `POST /audiences` (operationId `createAudience`, Audiences).","inputs":[{"name":"name","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":47},{"name":"get_audience","title":"Retrieve an audience","description":"Retrieve an audience.\n\nRequires a `full_access` API key. API: `GET /audiences/{id}` (operationId `getAudience`, Audiences).","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":49},{"name":"delete_audience","title":"Delete an audience","description":"Delete an audience.\n\nAlso deletes its contacts.\n\nRequires a `full_access` API key. API: `DELETE /audiences/{id}` (operationId `deleteAudience`, Audiences).","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":54},{"name":"list_contacts","title":"List contacts","description":"List contacts.\n\nRequires a `full_access` API key. API: `GET /audiences/{audienceId}/contacts` (operationId `listContacts`, Contacts).","inputs":[{"name":"after","type":"string","required":false,"description":"Return items older than this id (next page). Cannot be combined with `before`."},{"name":"audience_id","type":"string","required":true,"description":null},{"name":"before","type":"string","required":false,"description":"Return items newer than this id (previous page). Cannot be combined with `after`."},{"name":"limit","type":"integer","required":false,"description":"Number of items to return."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":109},{"name":"create_contact","title":"Create a contact","description":"Create a contact.\n\nEmails are lower-cased. An address can only appear once per audience.\n\nRequires a `full_access` API key. API: `POST /audiences/{audienceId}/contacts` (operationId `createContact`, Contacts).","inputs":[{"name":"audience_id","type":"string","required":true,"description":null},{"name":"email","type":"string","required":true,"description":null},{"name":"first_name","type":"string","required":false,"description":null},{"name":"last_name","type":"string","required":false,"description":null},{"name":"unsubscribed","type":"boolean","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":98},{"name":"get_contact","title":"Retrieve a contact","description":"Retrieve a contact.\n\nRequires a `full_access` API key. API: `GET /audiences/{audienceId}/contacts/{idOrEmail}` (operationId `getContact`, Contacts).","inputs":[{"name":"audience_id","type":"string","required":true,"description":null},{"name":"id_or_email","type":"string","required":true,"description":"The contact id or its (URL-encoded) email address."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":77},{"name":"update_contact","title":"Update a contact","description":"Update a contact.\n\nRequires a `full_access` API key. API: `PATCH /audiences/{audienceId}/contacts/{idOrEmail}` (operationId `updateContact`, Contacts).","inputs":[{"name":"audience_id","type":"string","required":true,"description":null},{"name":"first_name","type":"string","required":false,"description":null},{"name":"id_or_email","type":"string","required":true,"description":"The contact id or its (URL-encoded) email address."},{"name":"last_name","type":"string","required":false,"description":null},{"name":"unsubscribed","type":"boolean","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":101},{"name":"delete_contact","title":"Delete a contact","description":"Delete a contact.\n\nRequires a `full_access` API key. API: `DELETE /audiences/{audienceId}/contacts/{idOrEmail}` (operationId `deleteContact`, Contacts).","inputs":[{"name":"audience_id","type":"string","required":true,"description":null},{"name":"id_or_email","type":"string","required":true,"description":"The contact id or its (URL-encoded) email address."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":77},{"name":"list_broadcasts","title":"List broadcasts","description":"List broadcasts.\n\nRequires a `full_access` API key. API: `GET /broadcasts` (operationId `listBroadcasts`, Broadcasts).","inputs":[{"name":"after","type":"string","required":false,"description":"Return items older than this id (next page). Cannot be combined with `before`."},{"name":"before","type":"string","required":false,"description":"Return items newer than this id (previous page). Cannot be combined with `after`."},{"name":"limit","type":"integer","required":false,"description":"Number of items to return."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":99},{"name":"create_broadcast","title":"Create a broadcast","description":"Create a broadcast.\n\nCreates a draft. The `from` address must belong to a verified domain of your team and `audience_id` to one of your audiences.\n\nRequires a `full_access` API key. API: `POST /broadcasts` (operationId `createBroadcast`, Broadcasts).","inputs":[{"name":"audience_id","type":"string","required":true,"description":null},{"name":"from","type":"string","required":true,"description":"An email address, optionally with a display name: `Acme <hello@acme.com>`. At most 998 characters, display name included. A display name can't contain `<`, `>` or an encoded word, and a `from` name c…"},{"name":"html","type":"string","required":false,"description":null},{"name":"name","type":"string","required":false,"description":"Internal name"},{"name":"preview_text","type":"string","required":false,"description":null},{"name":"reply_to","type":null,"required":false,"description":null},{"name":"subject","type":"string","required":true,"description":null},{"name":"text","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":192},{"name":"get_broadcast","title":"Retrieve a broadcast","description":"Retrieve a broadcast.\n\nRequires a `full_access` API key. API: `GET /broadcasts/{id}` (operationId `getBroadcast`, Broadcasts).","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":49},{"name":"update_broadcast","title":"Update a broadcast","description":"Update a broadcast.\n\nOnly drafts can be updated.\n\nRequest body: Any field of the create request; only drafts can be updated.\n\nRequires a `full_access` API key. API: `PATCH /broadcasts/{id}` (operationId `updateBroadcast`, Broadcasts).","inputs":[{"name":"audience_id","type":"string","required":false,"description":null},{"name":"from","type":"string","required":false,"description":"An email address, optionally with a display name: `Acme <hello@acme.com>`. At most 998 characters, display name included. A display name can't contain `<`, `>` or an encoded word, and a `from` name c…"},{"name":"html","type":"string","required":false,"description":null},{"name":"id","type":"string","required":true,"description":null},{"name":"name","type":"string","required":false,"description":null},{"name":"preview_text","type":"string","required":false,"description":null},{"name":"reply_to","type":null,"required":false,"description":null},{"name":"subject","type":"string","required":false,"description":null},{"name":"text","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":191},{"name":"delete_broadcast","title":"Delete a broadcast","description":"Delete a broadcast.\n\nOnly drafts and broadcasts that are scheduled for the future can be deleted.\n\nRequires a `full_access` API key. API: `DELETE /broadcasts/{id}` (operationId `deleteBroadcast`, Broadcasts).","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":63},{"name":"get_broadcast_readiness","title":"Check a broadcast before sending","description":"Check a broadcast before sending.\n\nSpacePost extension (not part of Resend). Returns a deliverability checklist: sender domain and DMARC, subject, Gmail\nclipping (HTML over 102 KB), image-heavy bodies, link shorteners, spam phrases, unsubscribe link and audience quality.\n`ready` is false when any check has level `error`; `POST /broadcasts/{id}/send` is then refused with `validation_error`.\nWarnings never block a send.\n\nRequires a `full_access` API key. API: `GET /broadcasts/{id}/readiness` (operationId `getBroadcastReadiness`, Broadcasts).","inputs":[{"name":"id","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":147},{"name":"send_broadcast","title":"Send or schedule a broadcast","description":"Send or schedule a broadcast.\n\nQueues a draft for delivery to every subscribed contact of its audience. The broadcast needs `html` or `text`.\nWithout `scheduled_at` it starts immediately; the status becomes `queued`, then `sending` and `sent`.\n\nSends to every subscribed contact in the audience. Run get_broadcast_readiness first and confirm with the user.\n\nRequires a `full_access` API key. API: `POST /broadcasts/{id}/send` (operationId `sendBroadcast`, Broadcasts).","inputs":[{"name":"id","type":"string","required":true,"description":null},{"name":"scheduled_at","type":"string","required":false,"description":"ISO 8601 date-time or natural language such as \"in 1 hour\" or \"in 2 days\". At most 30 days ahead."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":160},{"name":"list_suppressions","title":"List suppressions","description":"List suppressions.\n\nRequires a `full_access` API key. API: `GET /suppressions` (operationId `listSuppressions`, Suppressions).","inputs":[{"name":"after","type":"string","required":false,"description":"Return items older than this id (next page). Cannot be combined with `before`."},{"name":"before","type":"string","required":false,"description":"Return items newer than this id (previous page). Cannot be combined with `after`."},{"name":"limit","type":"integer","required":false,"description":"Number of items to return."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":102},{"name":"create_suppression","title":"Add a suppression","description":"Add a suppression.\n\nAdds the address with reason `manual`. Adding an address that is already suppressed returns the existing entry.\n\nRequires a `full_access` API key. API: `POST /suppressions` (operationId `createSuppression`, Suppressions).","inputs":[{"name":"email","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":71},{"name":"delete_suppression","title":"Remove a suppression","description":"Remove a suppression.\n\nRequires a `full_access` API key. API: `DELETE /suppressions/{idOrEmail}` (operationId `deleteSuppression`, Suppressions).","inputs":[{"name":"id_or_email","type":"string","required":true,"description":"The suppression id or the (URL-encoded) email address."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":69},{"name":"list_tenants","title":"List tenants","description":"List tenants.\n\nRequires a `full_access` API key. API: `GET /tenants` (operationId `listTenants`, Tenants).","inputs":[{"name":"after","type":"string","required":false,"description":"Return items older than this id (next page). Cannot be combined with `before`."},{"name":"before","type":"string","required":false,"description":"Return items newer than this id (previous page). Cannot be combined with `after`."},{"name":"limit","type":"integer","required":false,"description":"Number of items to return."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":98},{"name":"create_tenant","title":"Create a tenant","description":"Create a tenant.\n\nCreates one of your customers, with its own SES tenant (isolated reputation). `external_id` must be unique within your account.\n\nRequires a `full_access` API key. API: `POST /tenants` (operationId `createTenant`, Tenants).","inputs":[{"name":"daily_limit","type":"integer|null","required":false,"description":"Max recipients per day for this tenant. Omit or null for no cap."},{"name":"external_id","type":"string","required":false,"description":"Your own id for the customer. Unique per account; accepted wherever a tenant id is."},{"name":"name","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":123},{"name":"get_tenant","title":"Retrieve a tenant","description":"Retrieve a tenant.\n\nRequires a `full_access` API key. API: `GET /tenants/{ref}` (operationId `getTenant`, Tenants).","inputs":[{"name":"ref","type":"string","required":true,"description":"The tenant id or your own `external_id`."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":58},{"name":"update_tenant","title":"Update a tenant","description":"Update a tenant.\n\nChanges the name, `external_id` or `daily_limit` (`null` removes the cap).\n\nRequires a `full_access` API key. API: `PATCH /tenants/{ref}` (operationId `updateTenant`, Tenants).","inputs":[{"name":"daily_limit","type":"integer|null","required":false,"description":"Null removes the cap."},{"name":"external_id","type":"string","required":false,"description":null},{"name":"name","type":"string","required":false,"description":null},{"name":"ref","type":"string","required":true,"description":"The tenant id or your own `external_id`."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":106},{"name":"delete_tenant","title":"Delete a tenant","description":"Delete a tenant.\n\nFails with `422` while the tenant still has domains; delete those first.\n\nRequires a `full_access` API key. API: `DELETE /tenants/{ref}` (operationId `deleteTenant`, Tenants).","inputs":[{"name":"ref","type":"string","required":true,"description":"The tenant id or your own `external_id`."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":74},{"name":"pause_tenant","title":"Pause a tenant","description":"Pause a tenant.\n\nStops all sending for the tenant. Sends return `403 sending_paused`; emails already queued fail. The body is optional.\n\nRequires a `full_access` API key. API: `POST /tenants/{ref}/pause` (operationId `pauseTenant`, Tenants).","inputs":[{"name":"reason","type":"string","required":false,"description":"Stored as `paused_reason`. Defaults to a generic reason."},{"name":"ref","type":"string","required":true,"description":"The tenant id or your own `external_id`."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":103},{"name":"unpause_tenant","title":"Unpause a tenant","description":"Unpause a tenant.\n\nResumes sending. A tenant that was paused by the reputation guard (bounce or complaint rate) can only be unpaused by a\n`trusted` or `internal` team; others get `403 invalid_access` and should contact support.\n\nRequires a `full_access` API key. API: `POST /tenants/{ref}/unpause` (operationId `unpauseTenant`, Tenants).","inputs":[{"name":"ref","type":"string","required":true,"description":"The tenant id or your own `external_id`."}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":112}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-06T02:24:43.000Z","track":"remote","endpoint":"https://api.spacepost.dev/mcp","declaredUrl":null,"truncated":false,"tls":{"outcome":"valid","label":"Valid","version":"TLS 1.3","cipherSuite":"TLS_AES_128_GCM_SHA256","chainError":null,"certificates":[{"subject":"CN=api.spacepost.dev","issuer":"CN=YE2,O=Let's Encrypt,C=US","notBefore":"2026-10-27T23:02:41Z","notAfter":"2027-01-25T23:02:40Z","keyType":"ECDSA","keyBits":256,"isCa":false},{"subject":"CN=YE2,O=Let's Encrypt,C=US","issuer":"CN=Root YE,O=ISRG,C=US","notBefore":"2025-09-03T00:00:00Z","notAfter":"2028-09-02T23:59:59Z","keyType":"ECDSA","keyBits":384,"isCa":true},{"subject":"CN=Root YE,O=ISRG,C=US","issuer":"CN=ISRG Root X2,O=Internet Security Research Group,C=US","notBefore":"2026-05-13T00:00:00Z","notAfter":"2032-09-02T23:59:59Z","keyType":"ECDSA","keyBits":384,"isCa":true},{"subject":"CN=ISRG Root X2,O=Internet Security Research Group,C=US","issuer":"CN=ISRG Root X1,O=Internet Security Research Group,C=US","notBefore":"2026-05-13T00:00:00Z","notAfter":"2032-09-02T23:59:59Z","keyType":"ECDSA","keyBits":384,"isCa":true}]},"dnssec":{"result":"insecure","label":"Not signed","name":"api.spacepost.dev.","steps":[{"zone":".","outcome":"verified","label":"Verified"},{"zone":"dev.","outcome":"verified","label":"Verified"},{"zone":"spacepost.dev.","outcome":"insecure_proven","label":"Unsigned (proven)"}]},"auth":{"outcome":"challenged_unvalidated","label":"Challenged, unverified","gate":"invoke","gateLabel":"On tool calls","status":200,"authorizationServers":[]},"httpsRedirect":{"outcome":"https_enforced","label":"HTTPS enforced","status":301},"transports":[{"transport":"streamable-http","outcome":"verified","label":"Verified","status":200,"followed":false}],"provenance":null,"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-10-30","recent":[{"id":"chg_01a1aeac-348e-7b6e-8346-389b9abe63f6","kind":"score.rubric_changed","summary":"We updated how we score, so this day's move reflects our rubric, not a change to the server","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-06","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1aeac-348e-7b6e-8346-389b9abe63f6"},{"id":"chg_01a1a713-e6b3-758a-95f1-5f112706e200","kind":"score.total_changed","summary":"Trust score (74 → 4)","materiality":"functional","direction":"regression","scoreDelta":-70,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a713-e6b3-758a-95f1-5f112706e200"},{"id":"chg_01a1a713-e5fa-71ef-b17a-fee7bcb96783","kind":"check.unverifiable","summary":"Authorization (fail → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a713-e5fa-71ef-b17a-fee7bcb96783"},{"id":"chg_01a1a713-e640-7287-b9d2-5c113a1c824b","kind":"check.unverifiable","summary":"Capabilities (pass → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a713-e640-7287-b9d2-5c113a1c824b"},{"id":"chg_01a1a713-e661-7add-baa4-ac3cc2ea777f","kind":"check.unverifiable","summary":"Tool coverage (100 → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a713-e661-7add-baa4-ac3cc2ea777f"},{"id":"chg_01a1a713-e677-71b7-9172-158a0169590c","kind":"check.appeared","summary":"First check of Schema quality (unverified)","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a713-e677-71b7-9172-158a0169590c"},{"id":"chg_01a1a713-e68c-79be-9fb9-b60a1630a444","kind":"capture.status_changed","summary":"Endpoint reachability (reachable → unreachable)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a713-e68c-79be-9fb9-b60a1630a444"},{"id":"chg_01a1a713-e626-7004-a5dd-52e0c34e4711","kind":"check.verdict","summary":"Transport (pass → fail)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a713-e626-7004-a5dd-52e0c34e4711"},{"id":"chg_01a1a713-e5c6-7250-a5c3-af54614fedd0","kind":"check.unverifiable","summary":"HSTS header (fail → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a713-e5c6-7250-a5c3-af54614fedd0"},{"id":"chg_01a1a713-e5b6-7a53-b985-7dbf7bcc3852","kind":"check.unverifiable","summary":"Stability (0.13 → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a713-e5b6-7a53-b985-7dbf7bcc3852"},{"id":"chg_01a1a713-e625-71aa-bce7-d5d617021359","kind":"check.unverifiable","summary":"TLS certificate (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a713-e625-71aa-bce7-d5d617021359"},{"id":"chg_01a1a713-e612-70fa-8361-4b5f6eb69b8d","kind":"check.unverifiable","summary":"Tool safety (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a713-e612-70fa-8361-4b5f6eb69b8d"},{"id":"chg_01a1a461-39aa-7c46-aed2-59ba84e9eca4","kind":"param.description_changed","summary":"“create_broadcast” reworded the description of “from”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a461-39aa-7c46-aed2-59ba84e9eca4"},{"id":"chg_01a1a461-39ab-750f-898d-d03dd0c47346","kind":"param.description_changed","summary":"“send_email” reworded the description of “from”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a461-39ab-750f-898d-d03dd0c47346"},{"id":"chg_01a1a461-39ac-71a1-bc07-0e2598e954ca","kind":"param.description_changed","summary":"“update_broadcast” reworded the description of “from”","materiality":"cosmetic","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a461-39ac-71a1-bc07-0e2598e954ca"},{"id":"chg_01a1a461-39a8-7c9c-9d79-94870d98e538","kind":"check.verdict","summary":"Schema quality (pass → fail)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a1a461-39a8-7c9c-9d79-94870d98e538"},{"id":"chg_01a19f36-3828-7c98-83fc-d75d7f33dcda","kind":"score.total_changed","summary":"Trust score (73 → 74)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a19f36-3828-7c98-83fc-d75d7f33dcda"},{"id":"chg_01a194e9-34be-7eea-921b-f4c67e997beb","kind":"score.total_changed","summary":"Trust score (72 → 73)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-01","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a194e9-34be-7eea-921b-f4c67e997beb"},{"id":"chg_01a18fc2-7ff6-7304-aba1-d2b254e91841","kind":"check.reverified","summary":"Stability (unverified → 0.03)","materiality":"functional","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a18fc2-7ff6-7304-aba1-d2b254e91841"},{"id":"chg_01a18df8-7d9e-7978-918d-0a2604867d41","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-30","url":"https://verifymcp.io/servers/dev-spacepost-mcp/api#chg-chg_01a18df8-7d9e-7978-918d-0a2604867d41"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/dev-spacepost-mcp/api/changelog.json"},"links":{"html":"https://verifymcp.io/servers/dev-spacepost-mcp/api","markdown":"https://verifymcp.io/servers/dev-spacepost-mcp/api.md","changelogJson":"https://verifymcp.io/servers/dev-spacepost-mcp/api/changelog.json","changelogRss":"https://verifymcp.io/servers/dev-spacepost-mcp/api.xml","external":[{"label":"Remote endpoint","href":"https://api.spacepost.dev/mcp"},{"label":"Authorisation metadata","href":"https://api.spacepost.dev/.well-known/oauth-protected-resource/mcp"},{"label":"Repository","href":"https://github.com/404-studio/spacepost-mcp"},{"label":"Website","href":"https://docs.spacepost.dev/tools/mcp/"}]}}