Mektup

io.github.WeeCi由 GitHub 账号 WeeCi 发布v0.2.6更新于 Oct 24, 2026

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

已验证Streamable HTTP可网页运行效率与工作流沟通与协作

概览

AI 生成的概览

Mektup 把托管的多域名邮件平台封装成 MCP 工具,让助手注册域名、创建邮箱并收发真实邮件。

可以做什么
  • 管理域名:注册域名、获取 DNS 记录、验证域名、列出或删除域名
  • 管理邮箱:创建、列出、重置密码、删除邮箱,并设置 Webhook、转发、身份与假期自动回复
  • 发送邮件:发送带纯文本、HTML 和附件的真实邮件,可直接消耗草稿
  • 读取邮件:列出邮件与会话、获取完整邮件、下载附件、标记、移动、移入回收站或删除
  • 整理:管理草稿、文件夹和账户级联系人
  • 查看账户:身份、用量与计费额度、API 密钥、未读数量与投递统计
适用场景
适合让助手在自己的会话中操作真实邮件:搭建域名与邮箱、发送邮件,或读取和分拣收到的邮件,而无需手写 API 调用或把密钥粘贴进生成的代码。
运行要求
可使用 mcp.usemektup.com 的远程 Streamable HTTP 端点,或在本地克隆仓库后用 Node.js 和 npm install 运行 stdio 进程。必须认证:用 Mektup 账户进行 OAuth 登录,或以 Authorization Bearer 头发送 API 密钥(本地运行时为 MEKTUP_API_KEY)。需要 Mektup 账户;使用自有域名时还需 DNS 管理权限。
安装前请注意
该服务器会执行真实且不可撤销的操作:发送邮件、创建和吊销 API 密钥、删除域名、邮箱、邮件和联系人,以及永久删除已在回收站中的邮件。新建的 API 密钥和邮箱密码只显示一次。邮件 HTML 内容由外部控制,不应直接渲染。计费额度不足会导致 402 错误,批量操作前应先查看用量。Authorization 令牌会被转发给 Mektup API。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Mektup,将其添加到工作区。
  2. 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
  3. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.WeeCi%2Fmektup-mcp/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。

{
  "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

来源:README.md,提交 eff0dd8

工具

0
该服务器需要登录,因此 SourceWeft 无法在没有账号的情况下读取其工具,也未收录。已连接账号所能看到的内容可能因账号及其权限而异。

版本历史

1
  1. v0.2.6最新Sep 16, 2026

评分

已满足适用检查项的 85%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分