Postmark
Un servidor MCP para enviar correos electrónicos a través del servicio Postmark, configurado mediante variables de entorno.
Documentación
Servidor MCP Oficial de Postmark

Envía correos electrónicos con Postmark usando Claude y otros asistentes de IA compatibles con MCP.
Características
- Expone un servidor del Protocolo de Contexto de Modelos (MCP) respaldado por tu cuenta de Postmark
- 24 herramientas que abarcan envío de correos (individual y por lotes), plantillas (CRUD + validación), búsqueda de mensajes, diagnósticos de entrega, rebotes, supresiones, estadísticas, información del servidor y webhooks
- Las anotaciones de herramientas MCP (
readOnlyHint,destructiveHint) permiten que los clientes compatibles aprueben automáticamente lecturas seguras y requieran confirmación antes de operaciones de mutación o destructivas - Configuración sencilla mediante variables de entorno
- Manejo integral de errores y apagado elegante
- Registro estructurado en JSON en stderr con persistencia opcional en archivo de registro; las direcciones de correo electrónico se enmascaran parcialmente por defecto
- Aplicación de HTTPS y lista de permitidos de dominios opcional para el registro de webhooks
- Seguimiento automático de aperturas y clics en cada envío
Documentación Útil
- 📒 Documentación de la API
- 🔎 Explorador de API
- 📖 Artículos de Ingeniería
- 📝 Registro de Cambios — novedades en cada versión
Comentarios
¡Nos encantaría saber de ti! Comparte tus comentarios y sugerencias usando nuestro formulario de comentarios.
Síguenos en X - @postmarkapp
Configuración
Requisitos
- Node.js v20 o superior
- Una cuenta de Postmark y token de servidor
Instalación (Desarrollo Local)
Clona el repositorio:
git clone https://github.com/ActiveCampaign/postmark-mcp
cd postmark-mcp
Instala las dependencias:
npm install
# or
yarn
# or
bun install
Configuración (Desarrollo Local)
Crea tu propio archivo de entorno a partir del ejemplo
cp .env.example .env
Edita tu .env para que contenga tus credenciales y ajustes de Postmark.
Importante: Esto está destinado únicamente a fines de desarrollo local. Los secretos nunca deben almacenarse en el control de versiones y los archivos de tipo .env deben agregarse a .gitignore.
Requerido
| Variable | Descripción |
|---|---|
POSTMARK_SERVER_TOKEN | Tu token de API del servidor de Postmark |
DEFAULT_SENDER_EMAIL | Dirección de correo electrónico del remitente por defecto (debe ser un remitente verificado en Postmark) |
DEFAULT_MESSAGE_STREAM | Flujo de mensajes de Postmark (p. ej., outbound) |
Opcional
| Variable | Predeterminado | Descripción |
|---|---|---|
AGENT_LABEL | — | Una etiqueta para esta instancia (p. ej., prod, staging). Se envía como X-Agent-Label en cada solicitud de API de Postmark, útil para identificar fuentes de tráfico en registros o tickets de soporte. |
WEBHOOK_URL_ALLOWLIST | — | Lista separada por comas de prefijos de URL HTTPS que createWebhook aceptará (p. ej., https://hooks.yourapp.com,https://inbound.corp.io). Cuando no se establece, se acepta cualquier URL HTTPS válida. |
LOG_FILE | — | Ruta a un archivo donde se agregan registros JSON estructurados además de stderr. El archivo se crea si no existe. No se aplica rotación ni límite de tamaño: usa una herramienta externa como logrotate para gestionar el archivo en implementaciones de larga duración. |
LOG_EMAIL_FULL | false | Establécelo en true para registrar direcciones de correo electrónico sin enmascarar. Por defecto, la parte del buzón se enmascara parcialmente en los registros (u**r@example.com). |
Ejecuta el servidor:
npm start
# or
yarn start
# or
bun start
Prueba de humo (requiere .env válido):
El repositorio incluye dos archivos de ejemplo para pruebas de humo. Copia cada uno a su nombre sin "ejemplo" (que está en gitignore) antes de ejecutarlos, para que tus ediciones locales — incluidas las direcciones de remitente verificado — nunca se confirmen.
# Read-only suite (25 checks). Optionally edit RECIPIENT_WITH_HISTORY.
cp smoke-test.example.mjs smoke-test.mjs
npm run smoke
# Mutating suite (full lifecycles + real email sends).
# REQUIRED: edit SENDER and RECIPIENT to two of your verified addresses.
cp smoke-test-mutating.example.mjs smoke-test-mutating.mjs
node smoke-test-mutating.mjs
La suite de solo lectura inicia el servidor a través de stdio y ejercita cada herramienta de lectura contra tu cuenta de Postmark, además de las rutas de validación para editTemplate y createWebhook. No envía correos ni muta el estado.
La suite de mutación ejecuta ciclos completos de crear→editar→eliminar para plantillas (incluida la vinculación de diseños), webhooks y supresiones, y envía correos reales entre las dos direcciones que configures. Se limpia sola. El script se niega a ejecutarse mientras los valores de marcador de posición sigan en su lugar.
Instalación Rápida en Cursor
Después de instalar el MCP, actualiza tu configuración para establecer:
POSTMARK_SERVER_TOKENDEFAULT_SENDER_EMAILDEFAULT_MESSAGE_STREAM(predeterminado:outbound)
Configuración del Cliente MCP
Usando npx (recomendado — no requiere clonar)
Instala directamente desde npm sin gestionar una copia local:
{
"mcpServers": {
"postmark": {
"command": "npx",
"args": ["-y", "@activecampaign/postmark-mcp"],
"env": {
"POSTMARK_SERVER_TOKEN": "your-postmark-server-token",
"DEFAULT_SENDER_EMAIL": "your-sender-email@example.com",
"DEFAULT_MESSAGE_STREAM": "outbound"
}
}
}
}
Usando un clon local
{
"mcpServers": {
"postmark": {
"command": "node",
"args": ["/absolute/path/to/postmark-mcp/index.js"],
"env": {
"POSTMARK_SERVER_TOKEN": "your-postmark-server-token",
"DEFAULT_SENDER_EMAIL": "your-sender-email@example.com",
"DEFAULT_MESSAGE_STREAM": "outbound"
}
}
}
}
Ambos fragmentos funcionan con Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json), Cursor (.cursor/mcp.json) y cualquier otro cliente MCP que acepte el formato de configuración JSON estándar.
Herramientas
Esta sección proporciona una referencia completa de las herramientas del servidor MCP de Postmark, incluidos ejemplos de indicaciones y cargas útiles. El servidor registra 24 herramientas organizadas en ocho categorías.
Tabla de Contenidos
- Correo electrónico
- Plantillas
- Mensajes
- Diagnósticos
- Rebotes
- Supresiones
- Estadísticas y Servidor
- Webhooks
Correo Electrónico
sendEmail
Envía un correo electrónico transaccional a un destinatario o hasta 50 destinatarios.
Ejemplo de Indicación:
Send an email using Postmark to recipient@example.com with the subject "Meeting Reminder" and the message "Don't forget our team meeting tomorrow at 2 PM."
Carga Útil Esperada:
{
"to": "recipient@example.com",
"subject": "Meeting Reminder",
"textBody": "Don't forget our team meeting tomorrow at 2 PM.",
"htmlBody": "<p>Don't forget our team meeting tomorrow at 2 PM.</p>",
"from": "sender@example.com",
"cc": "manager@example.com",
"bcc": "archive@example.com",
"replyTo": "support@example.com",
"tag": "meetings"
}
to acepta una sola dirección o un arreglo de hasta 50 direcciones. htmlBody, from, cc, bcc, replyTo y tag son opcionales. Si se omite from, se usa DEFAULT_SENDER_EMAIL.
Respuesta:
Email sent successfully!
MessageID: 0a1b2c3d-...
To: recipient@example.com
Subject: Meeting Reminder
sendEmailWithTemplate
Envía un correo electrónico usando una plantilla de Postmark.
Ejemplo de Indicación:
Send the "welcome" template to customer@example.com with name "John Doe" and login_url "https://myapp.com/login".
Carga Útil Esperada:
{
"to": "customer@example.com",
"templateAlias": "welcome",
"templateModel": {
"name": "John Doe",
"login_url": "https://myapp.com/login"
},
"from": "sender@example.com",
"tag": "onboarding"
}
Proporciona ya sea templateId (número) o templateAlias (cadena), no ambos.
Respuesta:
Template email sent successfully!
MessageID: 0a1b2c3d-...
To: customer@example.com
Template: welcome
sendBatch
Envía hasta 500 correos electrónicos en una sola llamada de API. Cada mensaje es totalmente independiente: su propio destinatario, asunto y cuerpo. Esto envuelve el punto final de lote síncrono de Postmark (POST /email/batch), que devuelve resultados inmediatos por mensaje.
Nota: Postmark también ofrece una API de correo masivo asíncrona (
POST /email/bulk) para trabajos de gran volumen sin límite de recuento de mensajes y un límite de carga útil de 50 MB. Ese punto final usa un flujo de trabajo de envío y sondeo y actualmente no está envuelto por este servidor MCP.
Carga Útil Esperada:
{
"messages": [
{
"to": "alice@example.com",
"subject": "Order #1234 confirmed",
"textBody": "Thanks Alice — your order is on its way.",
"tag": "order-confirmation"
},
{
"to": "bob@example.com",
"subject": "Order #1235 confirmed",
"textBody": "Thanks Bob — your order is on its way.",
"tag": "order-confirmation"
}
]
}
Campos por mensaje: to, subject, textBody son obligatorios. htmlBody, from, cc, bcc, replyTo y tag son opcionales. Si se omite from en un mensaje, se usa DEFAULT_SENDER_EMAIL.
Respuesta:
Sent 2/2 successfully
Successes:
- alice@example.com — abc-123-def
- bob@example.com — abc-456-ghi
Cuando algunos mensajes fallan en el envío (p. ej., destinatarios suprimidos), los fallos se enumeran primero con su ErrorCode y motivo:
Sent 8/10 successfully (2 failed)
Failures:
- blocked@example.com — 406: Address has been suppressed.
- bad@example.com — 300: Inactive recipient
...
sendBatchWithTemplate
Envía hasta 500 correos electrónicos con plantilla: misma plantilla, modelos de plantilla por destinatario. Ideal para flujos de "renderiza esta plantilla de incorporación para cada nuevo usuario".
Carga Útil Esperada:
{
"templateAlias": "welcome",
"from": "hello@yourapp.com",
"tag": "onboarding",
"recipients": [
{ "to": "alice@example.com", "templateModel": { "name": "Alice", "plan": "Pro" } },
{ "to": "bob@example.com", "templateModel": { "name": "Bob", "plan": "Free" } }
]
}
Proporciona ya sea templateId (número) o templateAlias (cadena). Los from y tag de nivel superior se aplican a todos los destinatarios, pero pueden anularse por destinatario. Cada destinatario también acepta cc, bcc y replyTo opcionales.
Respuesta: mismo formato que sendBatch.
Plantillas
listTemplates
Enumera las plantillas guardadas en este servidor. Devuelve las primeras 100 plantillas; si un servidor tiene más de 100, la paginación aún no es compatible y la respuesta indicará que los resultados están truncados.
Respuesta:
Found 2 templates:
• **Welcome**
- ID: 12345678
- Alias: welcome
- Subject: Welcome to {{product_name}}
getTemplate
Recupera el contenido completo de una sola plantilla (cuerpo HTML, cuerpo de texto, asunto, tipo).
Carga Útil: { "templateIdOrAlias": "welcome" } — acepta ID numérico o alias de cadena.
createTemplate
Crea una nueva plantilla. Requiere name. Debe proporcionarse al menos uno de htmlBody o textBody.
subject es obligatorio para plantillas Estándar y debe omitirse para plantillas de Diseño — Postmark rechaza el campo en Diseños.
layoutTemplate (solo Estándar) vincula la nueva plantilla a un Diseño existente por alias. Sin él, la nueva plantilla se renderiza sin envoltura (sin marco de ningún diseño).
Carga Útil Esperada:
{
"name": "Order Confirmation",
"subject": "Your order #{{order_id}} is confirmed",
"htmlBody": "<h1>Thanks {{name}}</h1>",
"textBody": "Thanks {{name}}",
"alias": "order-confirmation",
"templateType": "Standard",
"layoutTemplate": "basic"
}
templateType puede ser "Standard" (predeterminado) o "Layout".
editTemplate
Actualiza una plantilla existente. Requiere templateIdOrAlias más al menos un campo actualizado (name, subject, htmlBody, textBody, alias o layoutTemplate).
Pasa "layoutTemplate": null para desvincular una plantilla de su Diseño actual (el MCP traduce esto a la cadena vacía que la API de Postmark requiere para limpiar la asociación).
deleteTemplate
Elimina permanentemente una plantilla por ID o alias. Las plantillas de Diseño no se pueden eliminar mientras las plantillas Estándar sigan vinculadas a ellas — desvincula primero mediante editTemplate.
Carga Útil: { "templateIdOrAlias": "order-confirmation" }
validateTemplate
Valida el contenido de la plantilla (sintaxis de Mustachio, variables indefinidas) sin guardar. Se requiere al menos uno de subject, htmlBody o textBody.
Carga Útil Esperada:
{
"subject": "Order #{{order_id}}",
"htmlBody": "<p>Thanks {{name}}</p>",
"textBody": "Thanks {{name}}",
"testRenderModel": { "order_id": 42, "name": "John" },
"templateType": "Standard"
}
Mensajes
searchOutboundMessages
Busca en el historial de mensajes salientes.
Carga Útil Esperada (todos los filtros opcionales):
{
"recipient": "user@example.com",
"fromEmail": "sender@example.com",
"tag": "marketing",
"subject": "Welcome",
"status": "sent",
"messageStream": "outbound",
"fromDate": "2025-05-01",
"toDate": "2025-05-15",
"count": 50,
"offset": 0
}
status es uno de queued, sent, processed. count es 1–500 (predeterminado 50).
getMessageDetails
Recupera detalles completos y la línea de tiempo de eventos de un solo mensaje saliente.
Carga Útil: { "messageId": "0a1b2c3d-..." }
Diagnósticos
diagnoseDelivery
Herramienta de triaje compuesta. Responde "¿llegó mi correo a X y, si no, por qué?" ejecutando búsqueda de mensajes, verificación de supresiones y consultas de historial de rebotes en paralelo contra una dirección de destinatario, y luego sintetiza una recomendación en lenguaje sencillo.
Esta es una herramienta de diagnóstico: compone múltiples llamadas de API de Postmark en una sola respuesta coherente en lugar de reflejar un único punto final.
Ejemplo de Indicación:
Did my email to recipient@example.com get delivered? If not, what should I do?
Carga Útil Esperada:
{
"recipient": "recipient@example.com",
"messageId": "0a1b2c3d-...",
"fromDate": "2026-04-21",
"toDate": "2026-04-28",
"messageStream": "outbound"
}
Todos los campos excepto recipient son opcionales. Si se omite messageId, se usa el mensaje más reciente al destinatario. La ventana de búsqueda predeterminada son los últimos 7 días.
Ejemplo de respuesta:
Delivery Diagnosis: recipient@example.com
────────────────────────────────────────────────
Suppression: not suppressed on stream "outbound"
Most recent message:
MessageID: fadeae4e-fb04-4102-9303-9876078c7b81
Subject: Welcome to MyApp
Sent: 2026-04-27T18:42:19.0000000-04:00
Status: Sent
Events: Delivered, Opened×2, Clicked
Bounce history: none
Recommended action:
Email was delivered. If recipient says they didn't see it, check their
spam folder or ask them to whitelist the sender domain.
Cuando el destinatario está suprimido, la recomendación difiere según el motivo: SpamComplaint es permanente, HardBounce puede ser reactivable, ManualSuppression se puede eliminar mediante deleteSuppressions.
Rebotes
searchBounces
Busca en el registro de rebotes con filtros opcionales por tipo, destinatario, etiqueta, ID de mensaje, flujo de mensajes, rango de fechas y estado activo/inactivo.
Carga Útil Esperada (toda opcional):
{
"type": "HardBounce",
"inactive": true,
"emailFilter": "@example.com",
"tag": "marketing",
"messageID": "0a1b2c3d-...",
"messageStream": "outbound",
"fromDate": "2025-05-01",
"toDate": "2025-05-15",
"count": 50,
"offset": 0
}
Valores admitidos de type (coinciden con el enum BounceType de Postmark — 22 valores): AddressChange, AutoResponder, BadEmailAddress, Blocked, ChallengeVerification, DMARCPolicy, DnsError, HardBounce, InboundError, ManuallyDeactivated, OpenRelayTest, SMTPApiError, SoftBounce, SpamComplaint, SpamNotification, Subscribe, TemplateRenderingFailed, Transient, Unconfirmed, Unknown, Unsubscribe, VirusNotification.
getBounceDump
Devuelve el volcado SMTP sin procesar de un rebote. Los volcados de rebotes se conservan durante 30 días.
Carga útil: { "bounceId": 123456 }
activateBounce
Reactiva una dirección de correo electrónico desactivada (solo rebotes donde CanActivate: true).
Carga útil: { "bounceId": 123456 }
Supresiones
listSuppressions
Lista las supresiones de un flujo de mensajes.
Carga útil esperada (toda opcional):
{
"messageStream": "outbound",
"suppressionReason": "HardBounce",
"origin": "Recipient",
"emailAddress": "user@example.com",
"fromDate": "2025-05-01",
"toDate": "2025-05-15"
}
suppressionReason ∈ HardBounce, SpamComplaint, ManualSuppression. origin ∈ Recipient, Customer, Admin. Si se omite messageStream, se utiliza DEFAULT_MESSAGE_STREAM.
createSuppressions
Suprime hasta 50 direcciones de correo electrónico en un flujo de mensajes.
Carga útil: { "emailAddresses": ["a@example.com", "b@example.com"], "messageStream": "outbound" }
deleteSuppressions
Elimina hasta 50 direcciones de la lista de supresiones. Nota: las supresiones de SpamComplaint no se pueden eliminar.
Carga útil: { "emailAddresses": ["a@example.com"], "messageStream": "outbound" }
Estadísticas y Servidor
getDeliveryStats
Herramienta de estadísticas unificada. El comportamiento predeterminado devuelve un resumen general amigable; pase un stat opcional para un desglose específico.
Carga útil esperada (toda opcional):
{
"stat": "summary",
"tag": "marketing",
"fromDate": "2025-05-01",
"toDate": "2025-05-15",
"messageStream": "outbound"
}
Valores admitidos de stat:
stat | Qué devuelve |
|---|---|
summary (predeterminado) | Tasas generales de apertura / clics / rebotes / spam |
overview | Todos los recuentos de resumen (enviados, rastreados, aperturas, clics, rebotes, …) |
sent | Recuento de enviados |
bounces | Desglose de rebotes por tipo |
spam | Recuento de quejas de spam |
tracked | Recuento de correos rastreados |
opens | Aperturas totales + únicas |
openPlatforms | Desglose de plataforma de apertura (Escritorio / Móvil / WebMail / Desconocido) |
openClients | Top 10 de clientes de correo (Apple Mail, Gmail, …) |
openReadTimes | Histograma de tiempo de lectura |
clicks | Clics en enlaces totales + únicos |
clickBrowsers | Top 10 de navegadores usados para hacer clic |
clickPlatforms | Desglose de plataforma de clics (Escritorio / Móvil / WebMail / Desconocido) |
clickLocation | Ubicación de clics en HTML vs. texto plano |
Respuesta de resumen predeterminada:
Email Delivery Summary
Sent: 74
Tracked: 33 (44.6% of sent)
Open rate: 93.9% (31/33 unique opens)
Click rate: 4.8% (10/207 unique links clicked)
Bounced: 1 (1.4%)
Spam: 0 (0.0%)
Period: 2025-05-01 → 2025-05-15
Tag: marketing
Respuesta de muestra de stat: "openPlatforms":
Open Platform Usage
Desktop 20 (64.5%)
Mobile 0 (0.0%)
WebMail 11 (35.5%)
Unknown 0 (0.0%)
getServerInfo
Devuelve el nombre, color, configuración de seguimiento y URL de webhooks del servidor de Postmark.
Carga útil: {}
Webhooks
listWebhooks
Lista los webhooks configurados. Filtro opcional de messageStream.
createWebhook
Crea una suscripción de webhook. Requiere un url y al menos un disparador.
Nota de seguridad: Los webhooks son persistentes — una vez registrados, Postmark enviará por POST los datos de eventos (aperturas, clics, rebotes, quejas de spam, etc.) a la URL de destino para todos los eventos futuros que coincidan en ese servidor, hasta que se elimine el webhook. Solo registre webhooks que apunten a URL que usted controle. Use WEBHOOK_URL_ALLOWLIST para restringir las URL aceptadas a prefijos conocidos.
El url debe usar HTTPS. Las URL HTTP se rechazan. Si se establece WEBHOOK_URL_ALLOWLIST, la URL también debe coincidir con uno de los prefijos configurados.
Carga útil esperada:
{
"url": "https://hooks.yourapp.com/postmark",
"messageStream": "outbound",
"openEnabled": true,
"clickEnabled": true,
"deliveryEnabled": false,
"bounceEnabled": true,
"spamComplaintEnabled": true,
"subscriptionChangeEnabled": false
}
deleteWebhook
Elimina un webhook por ID.
Carga útil: { "webhookId": 1234567 }
Detalles de Implementación
Encabezados de Solicitud de API
Todas las solicitudes a la API de Postmark incluyen los siguientes encabezados para la identificación del cliente:
| Encabezado | Descripción |
|---|---|
X-Postmark-Client | Siempre postmark-mcp — identifica este servidor como el origen de la solicitud |
X-Postmark-Client-Version | Versión de este servidor MCP, que coincide con la versión del paquete |
X-Postmark-MCP-Client | Nombre y versión de la aplicación host de MCP (p. ej., claude-desktop/1.0), capturados del protocolo de enlace initialize de MCP. Se omite si el cliente no proporciona esta información. |
X-Agent-Label | Valor de la variable de entorno AGENT_LABEL. Se omite cuando no está establecida. |
Este servidor usa su propio cliente HTTP (sin el paquete npm de postmark) para que el tráfico de MCP sea identificable como postmark-mcp en los registros de Postmark y en los tickets de soporte.
Configuración Automática
Todos los correos electrónicos se configuran automáticamente con:
TrackOpens: trueTrackLinks: "HtmlAndText"- Flujo de mensajes de la variable de entorno
DEFAULT_MESSAGE_STREAM
Manejo de Errores
El servidor implementa un manejo integral de errores:
- Validación de todas las variables de entorno requeridas
- Apagado correcto en SIGTERM y SIGINT
- Manejo adecuado de errores para llamadas a la API
- Sin exposición de información sensible en los registros
- Formato consistente de mensajes de error
Registro
Cada invocación de herramienta emite una línea JSON estructurada a stderr. Si se establece LOG_FILE, la misma línea también se agrega a ese archivo.
Forma de la entrada de registro:
{
"timestamp": "2026-06-16T20:34:01.123Z",
"tool": "sendEmail",
"clientName": "claude-desktop",
"clientVersion": "1.0",
"args": {
"to": "u**r@example.com",
"subject": "Meeting Reminder",
"textBody": "[312ch]"
},
"status": "ok",
"durationMs": 243
}
En caso de error, status es "error" y un campo error contiene el mensaje.
Qué se registra y qué no:
| Datos | Registrado como |
|---|---|
| Direcciones de correo electrónico | Parcialmente enmascaradas: u**r@example.com (establezca LOG_EMAIL_FULL=true para deshabilitar) |
htmlBody / textBody | Solo recuento de bytes: [312ch] |
templateModel y otros objetos de datos | Solo nombres de claves: { "_keys": ["name", "plan"] } |
Matrices de messages / recipients por lotes | Recuento + lista de destinatarios: { "_count": 2, "_recipients": ["u**r@…", "a*b@…"] } |
Campos que coinciden con password, secret, token, apikey | [redacted] |
| Nombre de herramienta, duración, identidad del cliente MCP, estado | Registrado en su totalidad |
Los mensajes operativos no estructurados (inicio, apagado, conectividad de API) continúan escribiéndose en stderr como texto plano junto a los registros JSON de herramientas.
Consideraciones de Seguridad
Alcance de acceso
Este servidor MCP actúa con los permisos completos del POSTMARK_SERVER_TOKEN configurado. Expone 24 herramientas — incluidos envíos masivos de correo, gestión de plantillas, registro de webhooks y ediciones de listas de supresión — a cualquier cliente MCP que se conecte.
Postmark tiene dos tipos de tokens: un Token de Servidor (usado aquí) y un Token de Cuenta. Ninguno admite permisos de subalcance — un Token de Servidor otorga acceso completo a todas las operaciones en el servidor al que pertenece. La forma práctica de limitar la exposición es estructural:
- Cree un servidor de Postmark dedicado utilizado exclusivamente para el tráfico de MCP. Una vulneración se limita entonces a los datos y la configuración de ese servidor, no a toda su cuenta.
- Configure ese servidor solo con los flujos de mensajes y las firmas de remitente verificadas que realmente necesite.
- Rote el token si alguna vez se expone.
Radio de impacto de las herramientas
Las 24 herramientas incluyen varias operaciones de alto impacto. A continuación, el desglose por nivel de riesgo:
| Categoría | Herramientas |
|---|---|
| Destructivas (irreversibles) | editTemplate, deleteTemplate, deleteWebhook, deleteSuppressions |
| Envío (correo saliente) | sendEmail, sendEmailWithTemplate, sendBatch, sendBatchWithTemplate |
| Aditivas (cambios de estado de cuenta) | createTemplate, createSuppressions, createWebhook, activateBounce |
| Solo lectura | Las 12 herramientas restantes |
Todas las herramientas llevan anotaciones de MCP (readOnlyHint, destructiveHint, idempotentHint). Los clientes de MCP que respetan las anotaciones — incluidos Cursor y Claude Desktop — pueden aprobar automáticamente búsquedas seguras de solo lectura (readOnlyHint: true) y mostrarán avisos de confirmación para cualquier cosa que no sea una lectura: envíos, ediciones de plantillas, cambios de supresiones y gestión de webhooks. Las herramientas que eliminan datos permanentemente también llevan destructiveHint: true para clientes que distinguen entre acciones destructivas y meramente mutadoras.
Política de URL de webhooks
createWebhook exige HTTPS en todas las URL. Una vez que se registra un webhook, Postmark enviará por POST los datos de eventos (aperturas, clics, rebotes, quejas de spam) a esa URL de forma continua hasta que se elimine el webhook. Para evitar que una llamada de herramienta comprometida o mal dirigida registre una devolución de llamada que usted no controla, establezca WEBHOOK_URL_ALLOWLIST con los prefijos HTTPS que usted posee. Audite los webhooks registrados regularmente con listWebhooks o mediante el panel de Postmark.
Para proteger su receptor de webhooks, incluya en la lista blanca las IP de envío publicadas de Postmark a nivel de red o firewall para que solo Postmark pueda hacer POST a su endpoint.
Riesgo de inyección de prompts
Debido a que este servidor MCP puede enviar correos electrónicos y registrar webhooks, es un objetivo potencial de inyección de prompts — donde contenido malicioso en un correo, plantilla o repositorio engaña a la IA para que invoque una herramienta con argumentos no intencionados. Las mitigaciones anteriores (token dedicado, aprobación de herramientas en su cliente MCP, WEBHOOK_URL_ALLOWLIST) reducen el radio de impacto si esto ocurre. Nunca configure la aprobación automática para herramientas de envío o destructivas en entornos no confiables.
Para obtener más información sobre la API de Postmark, visite la Documentación para desarrolladores de Postmark.
Licencia
MIT © ActiveCampaign