Mektup-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| MEKTUP_API_KEY | Yes | Your Mektup API key (mek_live_...). Required to start the local stdio server. | |
| MEKTUP_API_BASE_URL | No | Base URL for the Mektup API. Defaults to https://api.usemektup.com | https://api.usemektup.com |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_meA | Get the authenticated caller's account identity - useful as an auth health check. |
| get_usageA | Get the account's current billing tier, its limits, and real usage against them (domain count, emails sent this month, storage per domain). Check this before a bulk operation to avoid hitting a limit mid-batch. |
| list_api_keysA | List API keys on this account (prefix and status only - the full key is never shown again after creation). |
| create_api_keyA | Create a new API key. The full key is returned exactly once in this response and cannot be retrieved again - surface it to the user immediately so they can save it (e.g. into an env var or another tool's config). Mint a separate key per environment/service rather than sharing one. |
| revoke_api_keyA | Revoke an API key immediately. Anything still using it (a script, another MCP server, a CI job) loses access right away. Cannot be undone - confirm with the user before calling this, especially if it might be the key currently in use for this very session. |
| create_domainA | Register a domain with Mektup and get back the exact DNS records to add (MX, SPF, DMARC, DKIM) plus a setup recommendation. Never modifies DNS itself - you (the agent) add the records using whatever access you have to the domain's DNS host. |
| list_domainsA | List every domain registered to this Mektup account. |
| get_domain_recordsA | Re-fetch the DNS records for an already-registered domain (same set create_domain returned once at creation) - use this any time after creation, the records aren't only shown once. |
| verify_domainA | Actively re-check a domain's live MX records against what Mektup expects and flip it to verified if they match. Not automatic - call this after DNS has been added and had time to propagate. |
| delete_domainA | Delete a domain and, via cascade, every mailbox and message under it. Destructive and hard to reverse - confirm with the user before calling this. |
| create_mailboxA | Create a mailbox (e.g. hello@example.com) on a domain already registered via create_domain. Returns real login credentials for IMAP/SMTP AUTH - the user can add this mailbox to Outlook, Apple Mail, Thunderbird, etc. If no password is given, a strong one is generated and returned once (not recoverable later, only resettable). |
| list_mailboxesA | List mailboxes on a given registered domain. |
| reset_mailbox_passwordA | Reset a mailbox's IMAP/SMTP-AUTH password. Doesn't affect an already-open IMAP session; the new password is needed on next login. Shown once, not recoverable later. |
| delete_mailboxA | Delete a mailbox. Postfix stops accepting mail for it immediately. Does not delete already-delivered mail from the mail store. Confirm with the user before calling this. |
| get_mailbox_webhookA | Check a mailbox's configured webhook URL (never returns the signing secret - only shown once, at setup or rotation). |
| set_mailbox_webhookA | Set or update the URL that fires on every new inbound message to this mailbox - the way an agent finds out about new mail without polling list_messages. Must be https. Returns a signing secret the FIRST time it's set (or if regenerateSecret is passed) - shown once, not recoverable later. Every delivery is a POST with an X-Mektup-Signature: sha256= header, an HMAC-SHA256 of the raw JSON body using that secret - verify it before trusting a payload. |
| delete_mailbox_webhookA | Remove a mailbox's webhook - new mail stops firing it immediately. |
| list_forwardsA | List forwarding addresses for a mailbox - incoming mail is copied to these in addition to staying in the mailbox. |
| add_forwardB | Add a forwarding address to a mailbox. |
| remove_forwardB | Remove a forwarding address from a mailbox. |
| get_identityB | Get a mailbox's display name and signature. |
| set_identityA | Set a mailbox's display name and signature, applied automatically to every outgoing message. |
| get_vacationA | Get a mailbox's vacation/auto-reply settings. |
| set_vacationA | Enable/disable and configure a mailbox's vacation auto-reply. A message is required when enabling. Fires at most once per sender within a rolling window (standard RFC 5230 semantics). |
| list_foldersA | List custom folders on a mailbox (Outlook-style, one folder per message). |
| create_folderC | Create a custom folder on a mailbox. |
| delete_folderA | Delete a custom folder. Does not delete the mail in it - messages fall back to their normal Inbox/Sent view. |
| list_contactsA | List contacts (account-level, not per-mailbox - a contact is someone you email from any mailbox you own). |
| create_contactC | Add a contact. |
| update_contactA | Partially update a contact - only send the fields you want to change. |
| delete_contactB | Delete a contact. |
| list_draftsA | List drafts for a mailbox (metadata only - to/subject/updated_at, no body). |
| get_draftA | Get a single draft including its body. |
| create_draftA | Create a draft on a mailbox. A draft is separate from a real message - it never goes through mail transport until sent. |
| update_draftA | Partially update a draft (autosave-friendly) - only fields you pass are changed. |
| delete_draftB | Delete a draft. |
| send_emailA | Send a real email. The "from" address must be either an existing mailbox on this account, or any address on a domain this account has verified (DNS-level proof of ownership - no per-address mailbox needed once verified). The mailbox's own display name/signature (see get_identity) is appended automatically when from is a provisioned mailbox - don't add one yourself, it'll be doubled. |
| list_messagesA | List messages (one row per thread) for a mailbox. Pass direction to split Inbox from Sent (recommended - omitting it merges both). Pass q for full-text search over subject/from/to/body. |
| get_delivery_statsA | Aggregate delivery outcomes for a mailbox's outbound mail over a time window - counts of sent/deferred/bounced/unknown, sourced from Mektup's own Postfix delivery log (the real SMTP response from each recipient's mail server), not a third-party tracking pixel. |
| get_threadA | List every individual message in one thread, oldest first. Pass the same direction/trash/folder as the view you found the thread in. |
| get_messageA | Get one message's full content (text/html body + attachment metadata). Marks it read as a side effect if it wasn't already. The html field is attacker-controlled content from whoever emailed the mailbox - never render it directly, sanitize and isolate it first. |
| update_messageA | Update a message's state: mark read/unread, restore from trash, flag/unflag, move to (or out of) a folder. Any combination in one call - pass only the fields you want to change. |
| delete_messageA | Delete a message - two-stage like any real mail client. First call moves it to Trash. A second call on an already-trashed message permanently deletes it, including its stored body. Confirm with the user before a permanent delete. |
| download_attachmentA | Download one attachment from a message. Returns base64-encoded content - decode it to get the raw file. Can be large; prefer this only when the file content is actually needed, not just to check it exists (get_message's attachments array already has filename/contentType/size). |
| get_unread_countsA | Get the unread Inbox count for every domain/mailbox on this account at once (Sent and Trash aren't counted). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 45 tools
Every tool targets a distinct resource and action—account, domains, mailboxes, forwards, identity, vacation, folders, contacts, drafts, and messages are clearly separated. The only potential confusion is between list_messages/get_thread/get_message, but the descriptions explain the hierarchy. No two tools appear to do the same thing.
Tools overwhelmingly follow a verb_noun snake_case pattern (list_*, get_*, create_*, update_*, delete_*). Minor deviations like add_forward/remove_forward, reset_mailbox_password, verify_domain, send_email, and download_attachment are still verb-first and readable, but they break the strict CRUD verb consistency.
At 45 tools, the server far exceeds the typical well-scoped range and crosses the 'too many' threshold. Each tool is individually justifiable given the breadth of subdomains (account, domains, mailboxes, webhooks, contacts, drafts, messages), but the overall surface is heavy for agents to navigate.
The tool set provides CRUD/lifecycle coverage for almost every resource: domains, mailboxes, webhooks, contacts, drafts, and messages. Minor gaps exist—no explicit send-draft action, no attachment handling in send_email, no folder rename or single-mailbox get—but agents can work around them.