mektup

Mektup is a self-hosted, multi-domain email platform.

Community: Submitted by a user or imported; check the owner before granting accessOnlineNo sign-inGlobalFreeCan modify data

What it can do

  • Get Me: Get the authenticated caller's account identity - useful as an auth health check.
  • Get Usage: 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 hitti
  • List Api Keys: List API keys on this account (prefix and status only - the full key is never shown again after creation).

What data it sees

Do you need an account

No: the server works without sign-in

Mektup is a self-hosted, multi-domain email platform. This MCP server lets an AI coding agent (Claude Code, Claude Desktop, Cursor, Lovable, Replit, Base44, or any MCP-compatible client) manage real email for a domain — register it, add the DNS records, create mailboxes, send and read mail, manage drafts/contacts/folders/forwarding/vacation replies — as native tool calls inside its own session, instead of the human hand-writing curl commands or pasting an API key into generated code.

How to connect

How to connect mektup to Claude

The server address to paste into Claude settings:

https://mektup--contact-y3xc.run.tools

  1. Open Claude (claude.ai or the desktop app).
  2. Go to Settings → Connectors.
  3. Click Add custom connector.
  4. Paste the server address copied below into Remote MCP server URL and click Add.
  5. In a chat, click + → Connectors and switch the new connector on.

Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.

Authorization

After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.

How to connect mektup to ChatGPT

The server address to paste into ChatGPT settings:

https://mektup--contact-y3xc.run.tools

  1. Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
  2. Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
  3. Open Settings → Connectors and click Create.
  4. Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
  5. Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
  6. In a new chat open + → Apps/Connectors and enable the connector.

OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.

Authorization

On first use ChatGPT opens the service's sign-in window. Sign in and approve access.

How to connect mektup to Cursor

The server address to paste into Cursor settings:

https://mektup--contact-y3xc.run.tools

Fastest: click Open in Cursor below and confirm the prompt.

Manually:

  1. In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
  2. Paste the JSON copied below into ~/.cursor/mcp.json (per project: .cursor/mcp.json in the repo root).
  3. Save the file. The server appears in the MCP list; authorize it there if asked.

Authorization

If the service needs sign-in, an authorize button appears next to the server in the MCP list.

Server tool list (41)

Raw names from tools/list. Only developers need these.

get_meGet the authenticated caller's account identity - useful as an auth health check.
get_usageGet 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_keysList API keys on this account (prefix and status only - the full key is never shown again after creation).
create_api_keyCreate 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_keyRevoke 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_domainRegister 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_domainsList every domain registered to this Mektup account.
get_domain_recordsRe-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_domainActively 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_domainDelete a domain and, via cascade, every mailbox and message under it. Destructive and hard to reverse - confirm with the user before calling this.
create_mailboxCreate 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_mailboxesList mailboxes on a given registered domain.
reset_mailbox_passwordReset 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_mailboxDelete 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.
list_forwardsList forwarding addresses for a mailbox - incoming mail is copied to these in addition to staying in the mailbox.
add_forwardAdd a forwarding address to a mailbox.
remove_forwardRemove a forwarding address from a mailbox.
get_identityGet a mailbox's display name and signature.
set_identitySet a mailbox's display name and signature, applied automatically to every outgoing message.
get_vacationGet a mailbox's vacation/auto-reply settings.
set_vacationEnable/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_foldersList custom folders on a mailbox (Outlook-style, one folder per message).
create_folderCreate a custom folder on a mailbox.
delete_folderDelete a custom folder. Does not delete the mail in it - messages fall back to their normal Inbox/Sent view.
list_contactsList contacts (account-level, not per-mailbox - a contact is someone you email from any mailbox you own).
create_contactAdd a contact.
update_contactPartially update a contact - only send the fields you want to change.
delete_contactDelete a contact.
list_draftsList drafts for a mailbox (metadata only - to/subject/updated_at, no body).
get_draftGet a single draft including its body.
create_draftCreate a draft on a mailbox. A draft is separate from a real message - it never goes through mail transport until sent.
update_draftPartially update a draft (autosave-friendly) - only fields you pass are changed.
delete_draftDelete a draft.
send_emailSend 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_messagesList 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_threadList every individual message in one thread, oldest first. Pass the same direction/trash/folder as the view you found the thread in.
get_messageGet 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_messageUpdate 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_messageDelete 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_attachmentDownload 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_countsGet the unread Inbox count for every domain/mailbox on this account at once (Sent and Trash aren't counted).