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   NPM Version  MIT licensed

Envía correos electrónicos con Postmark usando Claude y otros asistentes de IA compatibles con MCP.

Postmark MCP setup video

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

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

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

VariableDescripción
POSTMARK_SERVER_TOKENTu token de API del servidor de Postmark
DEFAULT_SENDER_EMAILDirección de correo electrónico del remitente por defecto (debe ser un remitente verificado en Postmark)
DEFAULT_MESSAGE_STREAMFlujo de mensajes de Postmark (p. ej., outbound)

Opcional

VariablePredeterminadoDescripció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_FULLfalseEstablé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_TOKEN
  • DEFAULT_SENDER_EMAIL
  • DEFAULT_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

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:

statQué devuelve
summary (predeterminado)Tasas generales de apertura / clics / rebotes / spam
overviewTodos los recuentos de resumen (enviados, rastreados, aperturas, clics, rebotes, …)
sentRecuento de enviados
bouncesDesglose de rebotes por tipo
spamRecuento de quejas de spam
trackedRecuento de correos rastreados
opensAperturas totales + únicas
openPlatformsDesglose de plataforma de apertura (Escritorio / Móvil / WebMail / Desconocido)
openClientsTop 10 de clientes de correo (Apple Mail, Gmail, …)
openReadTimesHistograma de tiempo de lectura
clicksClics en enlaces totales + únicos
clickBrowsersTop 10 de navegadores usados para hacer clic
clickPlatformsDesglose de plataforma de clics (Escritorio / Móvil / WebMail / Desconocido)
clickLocationUbicació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:

EncabezadoDescripción
X-Postmark-ClientSiempre postmark-mcp — identifica este servidor como el origen de la solicitud
X-Postmark-Client-VersionVersión de este servidor MCP, que coincide con la versión del paquete
X-Postmark-MCP-ClientNombre 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-LabelValor 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: true
  • TrackLinks: "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:

DatosRegistrado como
Direcciones de correo electrónicoParcialmente enmascaradas: u**r@example.com (establezca LOG_EMAIL_FULL=true para deshabilitar)
htmlBody / textBodySolo recuento de bytes: [312ch]
templateModel y otros objetos de datosSolo nombres de claves: { "_keys": ["name", "plan"] }
Matrices de messages / recipients por lotesRecuento + 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, estadoRegistrado 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íaHerramientas
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 lecturaLas 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