Mektup

io.github.WeeCiPublished by GitHub account WeeCiv0.2.6Updated Oct 24, 2026

Fully-managed email as MCP tools - register domains, real mailboxes, send and receive mail.

VerifiedStreamable HTTPWeb executableProductivity & WorkflowCommunication & Collaboration

Overview

AI-generated overview

Mektup exposes a hosted multi-domain email platform as MCP tools, letting an assistant register domains, create mailboxes, and send and read real mail.

What you can do
  • Manage domains: register a domain, fetch its DNS records, verify it, list or delete domains
  • Manage mailboxes: create, list, reset passwords, delete, and set webhooks, forwarding, identity and vacation replies
  • Send mail: send real email with text, HTML and attachments, optionally consuming a draft
  • Read mail: list messages and threads, fetch full messages, download attachments, flag, move, trash or delete
  • Organize: manage drafts, folders and account-level contacts
  • Check account: identity, usage and billing limits, API keys, unread counts and delivery stats
When to use it
Useful when an assistant needs to operate real email for a domain inside its own session — setting up a domain and mailboxes, sending mail, or reading and triaging incoming messages — without hand-writing API calls or pasting keys into generated code.
Requirements
Remote Streamable HTTP endpoint at mcp.usemektup.com, or a local stdio process run from the cloned repository with Node.js and npm install. Authentication is required: OAuth sign-in with a Mektup account, or an API key sent as an Authorization Bearer header (MEKTUP_API_KEY for local runs). A Mektup account and, for custom domains, DNS access are needed.
Before you install
The server performs real, irreversible actions: sending mail, creating and revoking API keys, deleting domains, mailboxes, messages and contacts, and permanently deleting already-trashed messages. Newly created API keys and mailbox passwords are shown only once. Message HTML is attacker-controlled and should not be rendered directly. Billing limits can cause 402 errors, so check usage before bulk operations. The Authorization token is forwarded to the Mektup API.

Installation

In SourceWeft

  1. Open Mektup in the dashboard and add it to a workspace.
  2. Connect the required credentials. They are stored privately and never shown on public pages.
  3. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.WeeCi%2Fmektup-mcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config. The client completes OAuth sign-in on first connect.

{
  "mcpServers": {
    "mektup": {
      "type": "http",
      "url": "https://mcp.usemektup.com/mcp"
    }
  }
}

README

Mektup MCP Server

Mektup is a fully-managed, multi-domain email platform - Mektup hosts all the mail infrastructure, so there's nothing to self-host; you just sign up and use it. 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.

Every tool call is a straight HTTP call to the real Mektup REST API. There's no separate logic to learn — if you understand the API, you understand the MCP server. Full coverage: every REST endpoint has a matching tool, verified with real read and write round-trips against the live production API (create → update → list → delete, confirmed at each step).

Two ways to run it, same tool set either way (lib/build-server.js defines the tools once, shared by both):

  • Remote (Streamable HTTP) — a server we host at https://mcp.usemektup.com/mcp. Point any client that takes a "custom MCP server" URL at it directly, no install. This is what Lovable/Cursor/Replit/Base44-style platforms want.
  • Local (stdio) — run server.js yourself with your key in an env var. For MCP clients that only support launching a local process (Claude Desktop config, etc.).

Remote server (recommended for platform integrations)

Endpoint: https://mcp.usemektup.com/mcp (Streamable HTTP — supports both the direct-JSON-response and SSE-streaming response modes of the spec).

Stateless: no session is kept between requests — every tool call is already a one-shot passthrough to the REST API, so there's no session state worth keeping.

Tenant isolation: identical to the REST API, because it is the REST API underneath — the server holds no account-specific credential itself, it just forwards whichever token the caller sent (API key or OAuth access token, see below) straight through to api.usemektup.com, which is the only place that actually verifies it. A token only ever sees its own account's data.

Two auth modes, same endpoint, both arrive as the same Authorization: Bearer <token> header:

OAuth (recommended for platform integrations)

For a platform with real end users (Lovable, Cursor, Replit, Base44, ...) — the user clicks "connect," signs in with their existing Mektup account, approves, done. No token copy-paste, no dashboard visit.

Clerk (clerk.usemektup.com) is the OAuth 2.1 authorization server — this MCP server is only ever a resource server. Discovery is automatic for any spec-compliant OAuth-capable MCP client: it only needs the endpoint URL above and finds the rest itself via https://mcp.usemektup.com/.well-known/oauth-protected-resource/mcp (RFC 9728), which points at Clerk's own https://clerk.usemektup.com/.well-known/oauth-authorization-server (RFC 8414). From there the client registers itself via Dynamic Client Registration (no manual setup needed on your end) and runs a standard Authorization Code + PKCE flow, ending with a JWT access token used exactly like an API key.

Lovable: Connectors → All → Custom (MCP card) → Server Name Mektup, Server URL https://mcp.usemektup.com/mcp, Auth → OAuth (default when a server supports it) → Add & authorize.

API key (simplest for a single account, scripts, or a client without OAuth support)

Authorization: Bearer mek_live_... — create one at app.usemektup.com → API keys.

Adding it to a client that supports custom MCP connectors is normally 3 fields:

FieldValue
Server URLhttps://mcp.usemektup.com/mcp
Auth typeBearer token / API key
Tokenyour mek_live_... key

Cursor / Claude Desktop / any client that reads raw MCP JSON config:

json
{  "mcpServers": {    "mektup": {      "url": "https://mcp.usemektup.com/mcp",      "headers": { "Authorization": "Bearer mek_live_..." }    }  }}

Replit / Base44 / other "connect a tool" flows: same three fields as the table above — server URL, Bearer auth, key.


Local (stdio) setup

Use this when a client can only launch a local process, not call a remote URL.

1. Get an API key. Sign in to the dashboard at app.usemektup.com, open API keys, and create one. Keys look like mek_live_... and are shown exactly once - copy it immediately.

2. Install dependencies:

bash
git clone https://github.com/WeeCi/mektup-mcp.gitcd mektup-mcpnpm install

3. Configure your MCP client to run server.js with the key as an environment variable. For Claude Desktop / Claude Code, add to your MCP config (e.g. claude_desktop_config.json):

json
{  "mcpServers": {    "mektup": {      "command": "node",      "args": ["/absolute/path/to/mektup-mcp/server.js"],      "env": {        "MEKTUP_API_KEY": "mek_live_..."      }    }  }}

MEKTUP_API_BASE_URL is optional and defaults to https://api.usemektup.com — no need to set it under normal use.

The server refuses to start without MEKTUP_API_KEY set.


How tools respond

Every tool returns its result as JSON text on success. On failure, it returns isError: true with Error: <message> — the message is the same one the underlying REST endpoint returned (see the API reference for exact error conditions, including billing-limit 402s, per endpoint).


Tools

Account

ToolInputDescription
get_me—Get the authenticated account identity. Useful as an auth health check.
get_usage—Current billing tier, its limits, and real usage against them. Check before a bulk operation.

API keys

ToolInputDescription
list_api_keys—List keys on this account (prefix and status only).
create_api_key—Create a new key. The full key is returned exactly once - surface it to the user immediately so they can save it.
revoke_api_keyidRevoke a key immediately. Cannot be undone - confirm with the user first, especially if it might be the key this very session is using.

Domains

ToolInputDescription
create_domaindomainRegister a domain, get back the exact DNS records (MX/SPF/DMARC/DKIM) and a setup recommendation. Never touches DNS itself.
list_domains—List every domain on this account.
get_domain_recordsdomainRe-fetch a registered domain's DNS records any time after creation.
verify_domaindomainActively re-check live DNS and flip verified once it matches. Not automatic.
delete_domaindomainDelete a domain and everything under it. Destructive — confirm with the user first.

Mailboxes

ToolInputDescription
create_mailboxdomain, localPart, password?Create a mailbox with real IMAP/SMTP-AUTH credentials, usable in any mail client.
list_mailboxesdomainList mailboxes on a domain.
reset_mailbox_passworddomain, localPart, password?Reset a mailbox's login password. Shown once.
delete_mailboxdomain, localPartDelete a mailbox. Confirm with the user first.

Webhooks

ToolInputDescription
get_mailbox_webhookdomain, localPartCheck a mailbox's configured webhook URL (never returns the signing secret).
set_mailbox_webhookdomain, localPart, url, regenerateSecret?Set/update the URL that fires (HMAC-signed) on every new inbound message - how an agent finds out about new mail without polling list_messages. Returns the signing secret once, on first setup or rotation.
delete_mailbox_webhookdomain, localPartRemove a mailbox's webhook.

Forwarding

ToolInputDescription
list_forwardsdomain, localPartList addresses that get a copy of incoming mail.
add_forwarddomain, localPart, forwardToAdd a forwarding address.
remove_forwarddomain, localPart, idRemove a forwarding address.

Identity

ToolInputDescription
get_identitydomain, localPartGet display name and signature.
set_identitydomain, localPart, displayName?, signatureText?, signatureHtml?Set display name/signature, applied automatically to outgoing mail.

Vacation / auto-reply

ToolInputDescription
get_vacationdomain, localPartGet vacation auto-reply settings.
set_vacationdomain, localPart, enabled, subject?, message?Enable/configure auto-reply. message required when enabling.

Folders

ToolInputDescription
list_foldersdomain, localPartList custom folders.
create_folderdomain, localPart, nameCreate a folder.
delete_folderdomain, localPart, idDelete a folder (mail in it falls back to Inbox/Sent).

Contacts

Account-level, not per-mailbox.

ToolInputDescription
list_contacts—List contacts.
create_contactname?, emailAdd a contact.
update_contactid, name?, email?Partially update — only send fields to change.
delete_contactidDelete a contact.

Drafts

ToolInputDescription
list_draftsdomain, localPartList drafts (metadata only).
get_draftdomain, localPart, idGet a draft including its body.
create_draftdomain, localPart, to?, subject?, text?, html?Create a draft.
update_draftdomain, localPart, id, to?, subject?, text?, html?Partial update (autosave-friendly).
delete_draftdomain, localPart, idDelete a draft.

Sending

ToolInputDescription
send_emailfrom, to, subject, text?, html?, attachments?, draftId?Send real mail. from must be a mailbox on this account, or any address on a domain this account has verified. Attachments are {filename, contentType?, contentBase64}, max 10MB decoded each. Pass draftId to delete a draft on successful send.

Example:

send_email({ from: "[email protected]", to: "[email protected]", subject: "It works", text: "Real mail, sent through Mektup." })→ { "messageId": "<[email protected]>", "envelope": { "from": "[email protected]", "to": ["[email protected]"] } }

Messages & threads

ToolInputDescription
list_messagesmailbox, limit?, direction?, trash?, folder?, q?List messages (one row per thread). Pass direction to split Inbox/Sent — omitting it merges both.
get_delivery_statsmailbox, days?Aggregate sent/deferred/bounced/unknown counts for a mailbox's outbound mail, sourced from Mektup's own Postfix delivery log — not a tracking pixel.
get_threadthreadKey, mailbox, direction?, trash?, folder?Every message in one thread, oldest first.
get_messageidFull message content. Marks it read as a side effect. html is attacker-controlled — never render it directly.
update_messageid, read?, restore?, flagged?, folderId?Mark read/unread, restore from trash, flag, or move to a folder — any combination in one call.
delete_messageidTwo-stage delete: first call trashes, second call on an already-trashed message permanently deletes it. Confirm before a permanent delete.
download_attachmentid, indexDownload one attachment, base64-encoded. Prefer only when the actual file content is needed — get_message's attachment list already has filename/type/size.

Account-wide

ToolInputDescription
get_unread_counts—Unread Inbox count for every domain/mailbox at once.

See also

License

MIT

Source: README.md at commit eff0dd8

Tools

0
This server asks you to sign in, so SourceWeft could not read its tools without an account and has not indexed them. What a connected account sees can depend on that account and its permissions.

Version history

1
  1. v0.2.6LatestSep 16, 2026

Score

85% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts