MCP server for the postale.io email hosting API — manage domains, mailboxes, aliases, DNS/DKIM, branding and logs from any MCP-compatible AI agent.
Strong foundation with 31 well-named tools following verb_noun convention (list_, get_, create_, update_, delete_). All tools have descriptions (avg 180 chars, within 10-1024 baseline). Input schemas present and typed with Zod. Key strengths: consistent pagination patterns, clear destructive operation warnings, parameter descriptions. Gaps: output schemas not documented in code; some descriptions lack dependency hints or recovery guidance; no tool annotations (readOnlyHint/destructiveHint); error handling present but generic.
Create a new alias in a domain. Destinations is a comma-separated list of email addresses (e.g. '[email protected], [email protected]').
Add a domain to the postale.io account. Ownership is verified either via MX records already pointing to postale.io (verification='mx', default) or via a DNS TXT record (verification='txt'; get the record value first with get_domain_dns_record record='verification'). Optional limits are subject to your plan.
Create a new mailbox in a domain. Optionally set a display name and/or password. If no password is provided, the mailbox is created with a random password (which you can then set with update_mailbox).
PERMANENTLY delete an alias. Requires confirm=true.
PERMANENTLY delete a domain and ALL of its mailboxes, including every stored email. This cannot be undone. Requires confirm=true.
Output schemas not documented. Tool descriptions state what is returned (e.g., 'Returns page info plus domain objects') but JSON Schema output structure is not visible in code. LLMs cannot plan downstream tool calls without knowing response field names and types.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Destructive tools like delete_domain and delete_mailbox have explicit confirm=true parameters and clear warnings, but lack formal destructiveHint metadata. This prevents clients from rendering UI warnings or enforcing approval workflows.
Error handling is generic. The fail() function returns PostaleApiError messages with HTTP status hints, but does not categorize errors as retryable vs. user-fixable vs. fatal. LLMs cannot determine whether to retry, ask the user, or abort.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
Remove the DKIM keys of a domain. Outgoing email will no longer be DKIM-signed. Requires confirm=true.
PERMANENTLY delete a mailbox and ALL of its stored emails. This cannot be undone. Requires confirm=true.
Have postale.io generate a fresh DKIM key pair for a domain. After generating, publish the DNS record from get_domain_dns_record record='dkim'. Note: this replaces any existing keys.
Get a single alias's info: address, destinations, enabled status, creation and update dates.
Get a single domain's info: catch-all address, forward domain, mailbox/alias/storage limits, creation and update dates.
Get the branding settings of a domain: company name, logo URL, and support email.
Get the DKIM key pair (selector, public and private key) of a domain. Returns 404 if the domain has no DKIM keys.
Get a suggested DNS record for a domain, including the currently found value(s) so you can check whether DNS is configured correctly. Record types: 'mx' (mail routing), 'verification' (TXT record for adding the domain via TXT verification), 'dkim' (TXT, requires DKIM keys to exist), 'spf' (TXT), 'dmarc' (TXT), 'autoconfig' (CNAME, Thunderbird autoconfiguration), 'autodiscover' (CNAME, Outlook autodiscover).
Get statistics for a domain: mailbox count, alias count, total storage used, and last activity timestamp.
Get the full protocol (SMTP/IMAP/POP3 transcript) of an email log entry.
Get a single mailbox's info: address, name, enabled status, creation and update dates.
Get a mailbox's current storage usage and quota.
Get the Sieve script of a mailbox (if any). Returns null if no script is set.
Get statistics for a mailbox: message count, total size, and last activity timestamp.
List all aliases of a domain, with pagination (max 25 per page) and optional search query. Returns page info plus alias objects.
List authentication logs for a domain, filtered by date and optional search query, with pagination (max 25 per page). Returns page info plus log entries.
List all domains in the postale.io account, with pagination (max 25 per page) and optional search query. Returns page info (page, lastPage, totalCount) plus domain objects.
List email logs for a domain, filtered by date and optional search query, with pagination (max 25 per page). Returns page info plus log entries.
List all mailboxes of a domain, with pagination (max 25 per page) and optional search query. Returns page info plus mailbox objects.
Install a specific DKIM key pair (bring your own keys) for a domain, e.g. when migrating from another provider without changing DNS.
Update an alias's settings: destinations and/or enabled status. Only the provided fields are changed.
Update a domain's settings: catch-all address, forward domain, and mailbox/alias/storage limits. Only the provided fields are changed.
Update a domain's branding settings: company name, logo URL, and/or support email. Only the provided fields are changed.
Update a mailbox's settings: display name, enabled status, and/or password. Only the provided fields are changed.
Update a mailbox's storage quota (in gigabytes). Set to 0 for unlimited.
Set or update the Sieve script of a mailbox. Pass script=null to remove the script.
Pagination limit hardcoded to 25 items max. While documented, no guidance on when to use pagination or how to handle large result sets. Tools like list_domains could return hundreds of domains; capping at 25 per page is correct, but descriptions lack 'call repeatedly with page parameter' guidance.
No recovery guidance in error messages. When a domain is not found (404), the error message does not suggest 'Try list_domains() to see available domains.' This forces the LLM to guess the next step.