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.jstú 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.com → Claves API.
Añadirla a un cliente que admita conectores MCP personalizados normalmente son 3 campos:
| Campo | Valor |
|---|---|
| URL del servidor | https://mcp.usemektup.com/mcp |
| Tipo de autenticación | Token Bearer / Clave API |
| Token | tu 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
| Herramienta | Entrada | Descripción |
|---|---|---|
get_me | — | Obtener la identidad de la cuenta autenticada. Útil como comprobación de salud de autenticación. |
get_usage | — | Nivel de facturación actual, sus límites y uso real contra ellos. Verificar antes de una operación masiva. |
Claves API
| Herramienta | Entrada | Descripción |
|---|---|---|
list_api_keys | — | Listar claves en esta cuenta (solo prefijo y estado). |
create_api_key | — | Crear una nueva clave. La clave completa se devuelve exactamente una vez — muéstrala al usuario inmediatamente para que pueda guardarla. |
revoke_api_key | id | Revocar 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
| Herramienta | Entrada | Descripción |
|---|---|---|
create_domain | domain | Registrar 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_domains | — | Listar cada dominio en esta cuenta. |
get_domain_records | domain | Volver a obtener los registros DNS de un dominio registrado en cualquier momento después de su creación. |
verify_domain | domain | Volver a comprobar activamente el DNS en vivo y cambiar a verificado una vez que coincida. No es automático. |
delete_domain | domain | Eliminar un dominio y todo lo que contiene. Destructivo — confirma primero con el usuario. |
Buzones
| Herramienta | Entrada | Descripción |
|---|---|---|
create_mailbox | domain, localPart, password? | Crear un buzón con credenciales reales IMAP/SMTP-AUTH, usable en cualquier cliente de correo. |
list_mailboxes | domain | Listar buzones en un dominio. |
reset_mailbox_password | domain, localPart, password? | Restablecer la contraseña de inicio de sesión de un buzón. Se muestra una vez. |
delete_mailbox | domain, localPart | Eliminar un buzón. Confirma primero con el usuario. |
Webhooks
| Herramienta | Entrada | Descripción |
|---|---|---|
get_mailbox_webhook | domain, localPart | Verificar la URL de webhook configurada de un buzón (nunca devuelve el secreto de firma). |
set_mailbox_webhook | domain, 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_webhook | domain, localPart | Eliminar el webhook de un buzón. |
Reenvío
| Herramienta | Entrada | Descripción |
|---|---|---|
list_forwards | domain, localPart | Listar direcciones que reciben una copia del correo entrante. |
add_forward | domain, localPart, forwardTo | Añadir una dirección de reenvío. |
remove_forward | domain, localPart, id | Eliminar una dirección de reenvío. |
Identidad
| Herramienta | Entrada | Descripción |
|---|---|---|
get_identity | domain, localPart | Obtener nombre para mostrar y firma. |
set_identity | domain, localPart, displayName?, signatureText?, signatureHtml? | Establecer nombre para mostrar/firma, aplicado automáticamente al correo saliente. |
Vacaciones / respuesta automática
| Herramienta | Entrada | Descripción |
|---|---|---|
get_vacation | domain, localPart | Obtener la configuración de respuesta automática de vacaciones. |
set_vacation | domain, localPart, enabled, subject?, message? | Habilitar/configurar respuesta automática. message requerido al habilitar. |
Carpetas
| Herramienta | Entrada | Descripción |
|---|---|---|
list_folders | domain, localPart | Listar carpetas personalizadas. |
create_folder | domain, localPart, name | Crear una carpeta. |
delete_folder | domain, localPart, id | Eliminar una carpeta (el correo en ella vuelve a Recibidos/Enviados). |
Contactos
A nivel de cuenta, no por buzón.
| Herramienta | Entrada | Descripción |
|---|---|---|
list_contacts | — | Listar contactos. |
create_contact | name?, email | Añadir un contacto. |
update_contact | id, name?, email? | Actualización parcial — solo enviar los campos a cambiar. |
delete_contact | id | Eliminar un contacto. |
Borradores
| Herramienta | Entrada | Descripción |
|---|---|---|
list_drafts | domain, localPart | Listar borradores (solo metadatos). |
get_draft | domain, localPart, id | Obtener un borrador incluido su cuerpo. |
create_draft | domain, localPart, to?, subject?, text?, html? | Crear un borrador. |
update_draft | domain, localPart, id, to?, subject?, text?, html? | Actualización parcial (compatible con autoguardado). |
delete_draft | domain, localPart, id | Eliminar un borrador. |
Envío
| Herramienta | Entrada | Descripción |
|---|---|---|
send_email | from, 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
| Herramienta | Entrada | Descripción |
|---|---|---|
list_messages | mailbox, limit?, direction?, trash?, folder?, q? | Lista mensajes (una fila por hilo). Pasa direction para dividir Recibidos/Enviados — omitirlo combina ambos. |
get_delivery_stats | mailbox, 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_thread | threadKey, mailbox, direction?, trash?, folder? | Cada mensaje en un hilo, del más antiguo al más reciente. |
get_message | id | Contenido completo del mensaje. Lo marca como leído como efecto secundario. html está controlado por el atacante — nunca lo renderices directamente. |
update_message | id, 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_message | id | Eliminació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_attachment | id, index | Descarga 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
| Herramienta | Entrada | Descripción |
|---|---|---|
get_unread_counts | — | Conteo de no leídos en Recibidos para cada dominio/buzón a la vez. |
Ver también
- Referencia completa de la API REST — todo lo que este servidor envuelve
- Especificación OpenAPI 3.1 — versión legible por máquina de la misma API
- usemektup.com — regístrate, panel de control, precios
Licencia
MIT