Mektup mcp

Mektup es una plataforma de correo electrónico autoalojada y multidominio. Este servidor MCP permite que un agente de codificación de IA (Claude Code, Claude Desktop, Cursor, Lovable, Replit, Base44 o cualquier cliente compatible con MCP) gestione correo electrónico real para un dominio.

Documentación

Servidor MCP de Mektup

Mektup es una plataforma de correo electrónico multidominio totalmente gestionada: Mektup aloja toda la infraestructura de correo, por lo que no hay nada que autoalojar; solo te registras y lo usas. Este servidor MCP permite que un agente de IA de codificación (Claude Code, Claude Desktop, Cursor, Lovable, Replit, Base44 o cualquier cliente compatible con MCP) gestione correo electrónico real para un dominio: registrarlo, añadir los registros DNS, crear buzones, enviar y leer correo, gestionar borradores/contactos/carpetas/reenvíos/respuestas de vacaciones, como llamadas nativas a herramientas dentro de su propia sesión, en lugar de que el humano escriba manualmente comandos curl o pegue una clave API en código generado.

Cada llamada a una herramienta es una llamada HTTP directa a la API REST real de Mektup. No hay lógica separada que aprender: si entiendes la API, entiendes el servidor MCP. Cobertura completa: cada endpoint REST tiene una herramienta correspondiente, verificada con operaciones reales de lectura y escritura contra la API de producción en vivo (crear → actualizar → listar → eliminar, confirmado en cada paso).

Dos formas de ejecutarlo, mismo conjunto de herramientas en ambos casos (lib/build-server.js define las herramientas una vez, compartidas por ambos):

  • Remoto (HTTP Streamable) — un servidor que alojamos en https://mcp.usemektup.com/mcp. Apunta cualquier cliente que acepte una URL de "servidor MCP personalizado" directamente a él, sin instalación. Esto es lo que quieren las plataformas tipo Lovable/Cursor/Replit/Base44.
  • Local (stdio) — ejecuta server.js tú mismo con tu clave en una variable de entorno. Para clientes MCP que solo admiten lanzar un proceso local (configuración de Claude Desktop, etc.).

Servidor remoto (recomendado para integraciones de plataformas)

Endpoint: https://mcp.usemektup.com/mcp (HTTP Streamable — admite tanto los modos de respuesta JSON directa como de transmisión SSE de la especificación).

Sin estado: no se mantiene ninguna sesión entre solicitudes — cada llamada a una herramienta ya es un paso directo de una sola vez a la API REST, por lo que no hay estado de sesión que valga la pena conservar.

Aislamiento de inquilinos: idéntico a la API REST, porque es la API REST subyacente — el servidor no contiene credenciales específicas de la cuenta, simplemente reenvía el token que el llamador envió (clave API o token de acceso OAuth, ver más abajo) directamente a api.usemektup.com, que es el único lugar que realmente lo verifica. Un token solo ve los datos de su propia cuenta.

Dos modos de autenticación, mismo endpoint, ambos llegan como el mismo encabezado Authorization: Bearer <token>:

OAuth (recomendado para integraciones de plataformas)

Para una plataforma con usuarios finales reales (Lovable, Cursor, Replit, Base44, ...) — el usuario hace clic en "conectar", inicia sesión con su cuenta Mektup existente, aprueba, listo. Sin copiar y pegar tokens, sin visitar el panel de control.

Clerk (clerk.usemektup.com) es el servidor de autorización OAuth 2.1 — este servidor MCP solo es un servidor de recursos. El descubrimiento es automático para cualquier cliente MCP compatible con OAuth que cumpla con la especificación: solo necesita la URL del endpoint anterior y encuentra el resto por sí mismo mediante https://mcp.usemektup.com/.well-known/oauth-protected-resource/mcp (RFC 9728), que apunta al propio https://clerk.usemektup.com/.well-known/oauth-authorization-server de Clerk (RFC 8414). A partir de ahí, el cliente se registra mediante el Registro Dinámico de Clientes (sin configuración manual necesaria por tu parte) y ejecuta un flujo estándar de Código de Autorización + PKCE, terminando con un token de acceso JWT utilizado exactamente como una clave API.

Lovable: Conectores → Todo → Personalizado (tarjeta MCP) → Nombre del servidor Mektup, URL del servidor https://mcp.usemektup.com/mcp, Autenticación → OAuth (predeterminado cuando un servidor lo admite) → Añadir y autorizar.

Clave API (la más simple para una sola cuenta, scripts o un cliente sin soporte OAuth)

Authorization: Bearer mek_live_... — crea una en app.usemektup.comClaves API.

Añadirla a un cliente que admita conectores MCP personalizados normalmente son 3 campos:

CampoValor
URL del servidorhttps://mcp.usemektup.com/mcp
Tipo de autenticaciónToken Bearer / Clave API
Tokentu clave mek_live_...

Cursor / Claude Desktop / cualquier cliente que lea configuración MCP JSON sin procesar:

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

Replit / Base44 / otros flujos de "conectar una herramienta": los mismos tres campos que la tabla anterior — URL del servidor, autenticación Bearer, clave.


Configuración local (stdio)

Úsalo cuando un cliente solo pueda lanzar un proceso local, no llamar a una URL remota.

1. Obtén una clave API. Inicia sesión en el panel de control en app.usemektup.com, abre Claves API y crea una. Las claves se ven como mek_live_... y se muestran exactamente una vez: cópiala inmediatamente.

2. Instala las dependencias:

git clone https://github.com/WeeCi/mektup-mcp.git
cd mektup-mcp
npm install

3. Configura tu cliente MCP para ejecutar server.js con la clave como variable de entorno. Para Claude Desktop / Claude Code, añade a tu configuración MCP (por ejemplo, claude_desktop_config.json):

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

MEKTUP_API_BASE_URL es opcional y tiene como valor predeterminado https://api.usemektup.com — no es necesario configurarlo en uso normal.

El servidor se niega a iniciar sin MEKTUP_API_KEY configurado.


Cómo responden las herramientas

Cada herramienta devuelve su resultado como texto JSON en caso de éxito. En caso de fallo, devuelve isError: true con Error: <message> — el mensaje es el mismo que devolvió el endpoint REST subyacente (consulta la referencia de la API para conocer las condiciones de error exactas, incluidos los 402 de límite de facturación, por endpoint).


Herramientas

Cuenta

HerramientaEntradaDescripción
get_meObtener la identidad de la cuenta autenticada. Útil como comprobación de salud de autenticación.
get_usageNivel de facturación actual, sus límites y uso real contra ellos. Verificar antes de una operación masiva.

Claves API

HerramientaEntradaDescripción
list_api_keysListar claves en esta cuenta (solo prefijo y estado).
create_api_keyCrear una nueva clave. La clave completa se devuelve exactamente una vez — muéstrala al usuario inmediatamente para que pueda guardarla.
revoke_api_keyidRevocar una clave inmediatamente. No se puede deshacer — confirma primero con el usuario, especialmente si podría ser la clave que esta misma sesión está usando.

Dominios

HerramientaEntradaDescripción
create_domaindomainRegistrar un dominio, obtener los registros DNS exactos (MX/SPF/DMARC/DKIM) y una recomendación de configuración. Nunca toca el DNS por sí mismo.
list_domainsListar cada dominio en esta cuenta.
get_domain_recordsdomainVolver a obtener los registros DNS de un dominio registrado en cualquier momento después de su creación.
verify_domaindomainVolver a comprobar activamente el DNS en vivo y cambiar a verificado una vez que coincida. No es automático.
delete_domaindomainEliminar un dominio y todo lo que contiene. Destructivo — confirma primero con el usuario.

Buzones

HerramientaEntradaDescripción
create_mailboxdomain, localPart, password?Crear un buzón con credenciales reales IMAP/SMTP-AUTH, usable en cualquier cliente de correo.
list_mailboxesdomainListar buzones en un dominio.
reset_mailbox_passworddomain, localPart, password?Restablecer la contraseña de inicio de sesión de un buzón. Se muestra una vez.
delete_mailboxdomain, localPartEliminar un buzón. Confirma primero con el usuario.

Webhooks

HerramientaEntradaDescripción
get_mailbox_webhookdomain, localPartVerificar la URL de webhook configurada de un buzón (nunca devuelve el secreto de firma).
set_mailbox_webhookdomain, localPart, url, regenerateSecret?Establecer/actualizar la URL que se activa (firmada con HMAC) en cada nuevo mensaje entrante — así es como un agente se entera de nuevo correo sin sondear list_messages. Devuelve el secreto de firma una vez, en la configuración inicial o rotación.
delete_mailbox_webhookdomain, localPartEliminar el webhook de un buzón.

Reenvío

HerramientaEntradaDescripción
list_forwardsdomain, localPartListar direcciones que reciben una copia del correo entrante.
add_forwarddomain, localPart, forwardToAñadir una dirección de reenvío.
remove_forwarddomain, localPart, idEliminar una dirección de reenvío.

Identidad

HerramientaEntradaDescripción
get_identitydomain, localPartObtener nombre para mostrar y firma.
set_identitydomain, localPart, displayName?, signatureText?, signatureHtml?Establecer nombre para mostrar/firma, aplicado automáticamente al correo saliente.

Vacaciones / respuesta automática

HerramientaEntradaDescripción
get_vacationdomain, localPartObtener la configuración de respuesta automática de vacaciones.
set_vacationdomain, localPart, enabled, subject?, message?Habilitar/configurar respuesta automática. message requerido al habilitar.

Carpetas

HerramientaEntradaDescripción
list_foldersdomain, localPartListar carpetas personalizadas.
create_folderdomain, localPart, nameCrear una carpeta.
delete_folderdomain, localPart, idEliminar una carpeta (el correo en ella vuelve a Recibidos/Enviados).

Contactos

A nivel de cuenta, no por buzón.

HerramientaEntradaDescripción
list_contactsListar contactos.
create_contactname?, emailAñadir un contacto.
update_contactid, name?, email?Actualización parcial — solo enviar los campos a cambiar.
delete_contactidEliminar un contacto.

Borradores

HerramientaEntradaDescripción
list_draftsdomain, localPartListar borradores (solo metadatos).
get_draftdomain, localPart, idObtener un borrador incluido su cuerpo.
create_draftdomain, localPart, to?, subject?, text?, html?Crear un borrador.
update_draftdomain, localPart, id, to?, subject?, text?, html?Actualización parcial (compatible con autoguardado).
delete_draftdomain, localPart, idEliminar un borrador.

Envío

HerramientaEntradaDescripción
send_emailfrom, to, subject, text?, html?, attachments?, draftId?Enviar correo real. from debe ser un buzón en esta cuenta, o cualquier dirección en un dominio que esta cuenta haya verificado. Los adjuntos son {filename, contentType?, contentBase64}, máximo 10MB decodificados cada uno. Pasa draftId para eliminar un borrador al enviar con éxito.

Ejemplo:

send_email({ from: "hello@example.com", to: "you@gmail.com", subject: "It works", text: "Real mail, sent through Mektup." })
→ { "messageId": "<...@example.com>", "envelope": { "from": "hello@example.com", "to": ["you@gmail.com"] } }

Mensajes e hilos

HerramientaEntradaDescripción
list_messagesmailbox, limit?, direction?, trash?, folder?, q?Lista mensajes (una fila por hilo). Pasa direction para dividir Recibidos/Enviados — omitirlo combina ambos.
get_delivery_statsmailbox, days?Agrega conteos de enviados/diferidos/rebotados/desconocidos para el correo saliente de un buzón, proveniente del registro de entrega de Postfix de Mektup — no un píxel de seguimiento.
get_threadthreadKey, mailbox, direction?, trash?, folder?Cada mensaje en un hilo, del más antiguo al más reciente.
get_messageidContenido completo del mensaje. Lo marca como leído como efecto secundario. html está controlado por el atacante — nunca lo renderices directamente.
update_messageid, read?, restore?, flagged?, folderId?Marca como leído/no leído, restaura desde la papelera, marca con bandera o mueve a una carpeta — cualquier combinación en una sola llamada.
delete_messageidEliminación en dos etapas: la primera llamada envía a la papelera, la segunda llamada sobre un mensaje ya en la papelera lo elimina permanentemente. Confirma antes de una eliminación permanente.
download_attachmentid, indexDescarga un adjunto, codificado en base64. Prefiere solo cuando se necesita el contenido real del archivo — la lista de adjuntos de get_message ya tiene nombre/tipo/tamaño.

A nivel de cuenta

HerramientaEntradaDescripción
get_unread_countsConteo de no leídos en Recibidos para cada dominio/buzón a la vez.

Ver también

Licencia

MIT