Para agentes de IA

Servidor MCP de SendHQ

Dé a un agente de IA control total y seguro de un espacio de trabajo de SendHQ: enviar y recibir correo, verificar dominios, publicar plantillas e investigar la entregabilidad mediante 59 herramientas con tipado estricto. Escrito primero para agentes; las personas también son bienvenidas.

59 herramientastransporte stdio, un solo comando0 herramientas de gestión de claves
Instalar y conectar (Claude Code)
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
claude mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp

Qué es este servidor

El servidor MCP de SendHQ permite que un agente de IA opere un espacio de trabajo de SendHQ mediante el Model Context Protocol: enviar correo (individual, por lotes, con plantilla, respuestas, adjuntos, reintentos idempotentes), leer y buscar el correo enviado y recibido (asuntos, cuerpos y nombres de adjuntos) y sus eventos de entrega, organizar el correo en etiquetas con reglas de archivado automático, gestionar borradores y adjuntos privados, crear y publicar plantillas alojadas, agregar y verificar dominios y su DNS, configurar la recepción de correo entrante y las direcciones de entrada, inspeccionar la entregabilidad, los rebotes, las quejas y las supresiones, y consultar el uso de la cuenta, el estado de facturación, las analíticas y los metadatos de las claves de API.

Es un servidor stdio local integrado en el binario de la CLI sendhq. Su cliente MCP inicia sendhq mcp como proceso hijo y se comunica mediante JSON-RPC por stdin/stdout. Cada llamada a una herramienta se convierte en una solicitud documentada a la API REST de SendHQ en https://sendhq.cc/api/v1, autenticada con la clave de API de su espacio de trabajo, de modo que el servidor MCP tiene exactamente los permisos de esa clave y ninguno más.

  • 59 herramientas en 8 grupos, generadas a partir de un único catálogo que también se publica como tools.json.
  • JSON Schemas estrictos: los argumentos desconocidos, los tipos incorrectos y los campos obligatorios ausentes se rechazan localmente antes de que nada llegue a SendHQ.
  • Errores estructurados con un code estable, el status HTTP, una explanation, un remedy concreto y la indicación de si reintentar puede ayudar.
  • Toda herramienta que envía correo real o destruye datos lo indica en las primeras palabras de su descripción y lleva anotaciones de seguridad de MCP.
  • El modo --read-only oculta todas las herramientas que envían o modifican datos.
  • No se registra nada. stdout transporta solo mensajes del protocolo; la clave de API y el contenido de los mensajes nunca llegan a un log.
No es el endpoint MCP de documentación.SendHQ también aloja un pequeño endpoint MCP de documentación, de solo lectura, en https://sendhq.cc/api/mcp (consulta de precios y documentación, sin acceso a la cuenta). El servidor de esta página es el completo, con alcance de cuenta; se ejecuta localmente o como el conector alojado que se describe a continuación.

Usar SendHQ en Claude y ChatGPT

Sin instalación: SendHQ también ejecuta este servidor como conector alojado en https://mcp.sendhq.cc/mcp, con las mismas herramientas. Usted inicia sesión con su cuenta de SendHQ en lugar de pegar una clave.

Claude

  1. Abra Settings → Connectors y busque SendHQ en el directorio, o elija Add custom connector y pegue https://mcp.sendhq.cc/mcp.
  2. Haga clic en Connect, inicie sesión en SendHQ, revise el acceso y haga clic en Allow.
  3. Pídale a Claude que revise su bandeja de entrada, que envíe un correo desde su dominio verificado o que le explique un rebote.

ChatGPT

  1. Open Settings → Security and login and turn on Developer mode.
  2. Go to chatgpt.com/plugins, click Create MCP app, name it SendHQ and enter https://mcp.sendhq.cc/mcp.
  3. Sign in to SendHQ and click Allow, then pick SendHQ from the tools menu in a new chat.

Muse by Meta

In Muse, open Connectors and search for SendHQ. Click Connect, sign in to SendHQ and click Allow.

Aprobación y desconexión

  • The request_feature tool sends a feature request to the SendHQ team with your account details, so we can follow up by email.
  • Las herramientas que envían correo real o eliminan datos están etiquetadas como tales. Si el asistente le pregunta primero o no se configura por herramienta en el propio asistente: en Claude, elija Needs approval para esas herramientas en Settings → Connectors → SendHQ.
  • El conector obtiene su propia clave de API, con el nombre del asistente (por ejemplo, “Claude (AI connector)”). Elimínela en API Keys para desconectarlo de inmediato.
  • No puede crear ni revocar claves de API ni modificar la facturación. Los adjuntos se envían y se devuelven en base64; no hay acceso a archivos locales.
  • Los espacios de trabajo sin pago (prueba de integración) solo pueden entregar al correo de la cuenta o a una dirección del simulador de AWS SES.

Preguntas: postmaster@sendhq.cc. Privacidad: sendhq.cc/privacy.

Instalación

Instale el binario sendhq (Linux, macOS y Windows en x86-64 y arm64). El instalador verifica el checksum de la versión y coloca el binario en ~/.local/bin de forma predeterminada.

macOS y Linux
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
Windows PowerShell
irm https://downloads.sendhq.cc/install.ps1 | iex
Comprobar la instalación
sendhq version
SENDHQ_API_KEY=re_your_key sendhq doctor

Cree una clave de API en el panel, en https://sendhq.cc/app#/keys. El servidor MCP no puede crear claves. El único comando que ejecuta el servidor es:

Ejecutar el servidor stdio
SENDHQ_API_KEY=re_your_key sendhq mcp

Normalmente nunca lo ejecuta a mano: lo inicia el cliente MCP. Si se ejecuta en una terminal, espera JSON-RPC por stdin.

Configurar su cliente

Claude Code

claude mcp add
claude mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp

# read-only variant
claude mcp add sendhq-readonly --env SENDHQ_API_KEY=re_your_key -- sendhq mcp --read-only

Agregue --scope user para que esté disponible en todos los proyectos, o --scope project para escribirlo en el .mcp.json del proyecto. En un .mcp.json compartido, haga referencia a la clave desde el entorno en lugar de confirmarla en el repositorio; Claude Code expande ${VAR} en .mcp.json.

.mcp.json
{
  "mcpServers": {
    "sendhq": {
      "command": "sendhq",
      "args": [
        "mcp"
      ],
      "env": {
        "SENDHQ_API_KEY": "${SENDHQ_API_KEY}"
      }
    }
  }
}

OpenAI Codex

~/.codex/config.toml
[mcp_servers.sendhq]
command = "sendhq"
args = ["mcp"]
env = { SENDHQ_API_KEY = "re_your_key" }

O desde la línea de comandos: codex mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp.

Claude Desktop

Edite claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\) y reinicie la aplicación. Las aplicaciones de escritorio no heredan el PATH de su shell, así que use la ruta absoluta del binario (which sendhq).

claude_desktop_config.json
{
  "mcpServers": {
    "sendhq": {
      "command": "/Users/you/.local/bin/sendhq",
      "args": [
        "mcp"
      ],
      "env": {
        "SENDHQ_API_KEY": "re_your_key"
      }
    }
  }
}

Cualquier otro cliente MCP

Configure un servidor stdio con el comando sendhq, los argumentos ["mcp"] (opcionalmente "--read-only") y las variables de entorno que se indican a continuación. El servidor admite las versiones del protocolo MCP 2024-11-05, 2025-03-26, 2025-06-18 y 2025-11-25, e implementa initialize, ping, tools/list y tools/call. Los resultados de las herramientas incluyen tanto un bloque de texto JSON como structuredContent.

Prueba rápida de stdio sin cliente (canalizar a sendhq mcp)
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"probe","version":"1"}}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_service_health","arguments":{}}}

No existe un transporte HTTP alojado para el servidor con alcance de cuenta. Un endpoint MCP remoto con capacidad de escritura necesitaría OAuth por usuario, que SendHQ no ofrece; el binario local mantiene la clave en la máquina que ya la tiene.

Entorno y flags

Variable o flagObligatoriaSignificado
SENDHQ_API_KEYsíClave de API del espacio de trabajo (re_…). Todas las herramientas excepto get_service_health la necesitan. Sin ella, el servidor arranca igualmente y cada llamada devuelve un auth_error estructurado que explica cómo solucionarlo.
SENDHQ_API_BASE_URLnoURL base de la API. Valor predeterminado: https://sendhq.cc/api/v1. Úsela solo para un despliegue local o de staging. SENDHQ_BASE_URL se acepta como alias antiguo.
SENDHQ_MCP_READ_ONLYno1, true o yes se comporta como --read-only.
--read-onlynoExpone solo las herramientas que no envían correo ni cambian el estado. Las herramientas ocultas también se rechazan si se llaman por su nombre.
SENDHQ_PROFILE / --profilenoUsa una clave guardada por sendhq auth login en el llavero del sistema operativo en lugar de SENDHQ_API_KEY. Si existen ambas, prevalece la variable de entorno.

La clave se envía únicamente como encabezado Authorization: Bearer a la URL base configurada. Nunca se imprime, se registra, se repite en los errores ni se incluye en los resultados de las herramientas.

Modelo de seguridad para agentes

  • Envía correo real. send_email, send_batch y send_template_test entregan correo a personas reales y consumen créditos de entrega. Sus descripciones empiezan por SENDS REAL EMAIL. Llámelas solo cuando el usuario haya pedido explícitamente que se envíe ese mensaje concreto, con los destinatarios, el remitente y el contenido confirmados.
  • Destructivas. delete_email, delete_draft, delete_attachment, delete_domain, delete_inbox y remove_suppression están marcadas con destructiveHint: true y sus descripciones empiezan por DESTRUCTIVE. Confirme primero con el usuario. remove_suppression debilita un bloqueo de seguridad y solo es apropiada cuando una persona confirma que la dirección vuelve a funcionar.
  • Cambian el estado. Crear o actualizar borradores, plantillas, dominios y bandejas de entrada, publicar plantillas e iniciar la verificación modifican el espacio de trabajo, pero no envían correo.
  • Solo lectura. Todo lo demás es readOnlyHint: true y se puede llamar libremente.
  • Este servidor nunca modifica el DNS. add_domain devuelve registros para que una persona los publique; get_domain_connect_link devuelve una URL de consentimiento que una persona debe abrir y aprobar en su proveedor de DNS.
  • Este servidor nunca modifica la facturación. get_account solo lee el plan, el uso y el estado de la suscripción.
  • Los espacios de trabajo sin pago (prueba de integración) solo pueden entregar al correo del propietario de la cuenta (get_account → user.email) o a una dirección del simulador de AWS SES, como success@simulator.amazonses.com, y no pueden enviar adjuntos.
  • Aceptado no significa entregado. Un envío correcto devuelve un ID; las evidencias de entrega, rebote y queja llegan más tarde en list_email_events. Nunca afirme que un mensaje llegó a la bandeja de entrada ni que una persona lo leyó.
  • No cambie a otra dirección From para eludir una pausa 423, y nunca vuelva a agregar destinatarios que se hayan dado de baja o que hayan presentado una queja.

Las claves de API quedan fuera del alcance

Por diseño, no hay herramientas que creen, modifiquen, roten, revoquen o eliminen claves de API. Un agente no debe emitir ni destruir credenciales. list_api_keys devuelve solo nombres, prefijos no secretos y fechas de último uso. La gestión de claves se hace en el panel, con una persona que haya iniciado sesión.

Flujos de trabajo

1. Primer envío

  1. get_service_health confirma que la API es accesible (funciona sin clave).
  2. get_account muestra el plan (access.tier), la cuota restante y user.email. En la prueba, ese correo es el único destinatario real permitido.
  3. list_sending_identities enumera las direcciones From que puede usar. Si está vacía, complete primero el flujo de dominio.
  4. Confirme con el usuario el remitente, el destinatario, el asunto y el cuerpo; después llame a send_email con una idempotency_key.
  5. list_email_events con el id devuelto muestra delivery, bounce, complaint o reject en cuanto el proveedor lo notifica (normalmente entre unos segundos y unos minutos).
Primer envío
{
  "name": "send_email",
  "arguments": {
    "from": "Acme <hello@example.com>",
    "to": [
      "owner@example.com"
    ],
    "subject": "SendHQ is connected",
    "text": "It works.",
    "idempotency_key": "first-send-2026-09-26"
  }
}

2. Verificación de dominios de principio a fin

  1. add_domain con name: "example.com". El resultado incluye los registros DNS (CNAME de DKIM, verificación de SES, SPF y el DMARC recomendado).
  2. get_dns_provider con el domain_id detecta el proveedor de DNS autoritativo y devuelve el host relativo exacto que hay que introducir para cada registro en ese proveedor.
  3. Si providers.domainConnect.available es true, get_domain_connect_link devuelve una URL de consentimiento. Entréguesela a la persona; no cambia nada hasta que la apruebe en el proveedor. En caso contrario, entréguele los registros que debe publicar. Nunca publique un segundo registro SPF: combine include:amazonses.com con el valor v=spf1 existente.
  4. verify_domain vuelve a comprobar el DNS y SES. El estado pasa por pending, checking y propagating hasta verified. Consulte verify_domain o get_domain cada 30–60 segundos; el DNS puede tardar de minutos a horas.
  5. Cuando status es verified, las direcciones del dominio aparecen en list_sending_identities.

3. Rebotes, quejas y supresiones

  1. list_blocked_recipients devuelve todas las direcciones bloqueadas con su motivo (bounce, complaint, unsubscribe) y un recuento resumido.
  2. list_suppressions devuelve las supresiones por rebote permanente y por queja; deliverability_stats ofrece las tasas de entrega, rebotes y quejas de 30 días; list_sender_reputation muestra qué direcciones From tienen el envío limitado o en pausa.
  3. Un envío que contiene un destinatario suprimido falla con 422 recipient_suppressed. Quite ese destinatario y vuelva a enviar.
  4. Llame a remove_suppression solo cuando una persona confirme que un buzón que rebotaba ahora funciona. Las supresiones por queja son permanentes (409 complaint_suppression_locked).

4. Recibir correo entrante

  1. El dominio (a menudo un subdominio como inbound.example.com) debe estar verificado.
  2. setup_inbound habilita la recepción y devuelve un registro MX. Una persona lo publica.
  3. verify_inbound hasta que status sea ready.
  4. create_inbox con domain_id y local_part (por ejemplo, support) crea support@inbound.example.com.
  5. Consulte periódicamente list_emails con direction: "in" y unread: true (opcionalmente inbox_id). Lea un mensaje con get_email, su conversación con get_thread y los adjuntos con download_attachment, y márquelo como atendido con mark_email (read: true).
  6. Responda dentro del hilo con send_email y reply_to_email_id; SendHQ establece In-Reply-To, References y el hilo.

5. Webhooks y notificaciones de eventos

Actualmente SendHQ no ofrece webhooks configurables por el cliente, por lo que no hay ninguna herramienta de webhooks. Las notificaciones del proveedor se procesan dentro de SendHQ y se exponen mediante lecturas. En su lugar, consulte periódicamente: list_email_events para el resultado de un mensaje, list_emails con status (por ejemplo, bounced) o after para los cambios recientes, list_emails con direction: "in" y unread: true para el correo entrante nuevo, y list_blocked_recipients para las supresiones nuevas. No consulte más de una vez por minuto, aproximadamente, para cada pregunta.

6. Diagnosticar un fallo de entrega

  1. Localice el mensaje: list_emails con direction: "out" y to o query, o get_email si tiene el ID. status: failed significa que SendHQ o el proveedor lo rechazó en el envío; el error del correo explica el motivo.
  2. list_email_events: bounce (permanente o transitorio, con el diagnóstico del proveedor), complaint, reject o delivery. Si aún no hay eventos, el proveedor no ha informado; espere y vuelva a comprobar.
  3. Si la propia llamada de envío falló, lea el code del error: sender_domain_unverified → termine la verificación del dominio; recipient_suppressed → la dirección ya tuvo un rebote permanente o una queja; sender_paused → revise list_sender_reputation y corrija el origen de la lista; trial_recipient_restricted → límites de la prueba; quota_exhausted → uso en get_account.
  4. get_domain comprueba que DKIM, SPF y DMARC siguen publicados; deliverability_stats muestra si el problema es de un solo mensaje o una tendencia.
  5. Informe lo que muestran las evidencias. Un evento delivery significa que el servidor del destinatario aceptó el mensaje, no que llegó a la bandeja de entrada ni que se leyó.

7. Encargarse de una categoría de tareas (etiquetas)

  1. create_label con name (por ejemplo, Agent/Orders) y skip_inbox: true. Eso convierte la etiqueta en una categoría: el correo recibido que la obtiene se archiva, de modo que aparece solo en la etiqueta y nunca en la bandeja de entrada de la persona.
  2. Envíe el correo de la tarea con send_email (o send_batch) y labels: ["Agent/Orders"]. Las respuestas a esa conversación heredan la etiqueta automáticamente y no pasan por la bandeja de entrada.
  3. Para el correo que empieza fuera de sus conversaciones, agregue una regla de archivado: create_label_rule con inbox_id (una dirección dedicada como orders@…), from, to o subject. Pase apply_to_existing: true para archivar el correo ya recibido.
  4. Trabaje la categoría: list_emails con label: "Agent/Orders", direction: "in" y unread: true; lea con get_email o get_thread, responda con send_email y reply_to_email_id, y use mark_email read: true cuando lo haya atendido.
  5. Mueva un mensaje suelto hacia dentro o fuera con label_email (add / remove). Agregar una etiqueta de categoría a un mensaje recibido también lo archiva.
  6. Opcionalmente, set_inbox_forwarding envía una copia de todo lo que recibe una dirección de recepción a otro buzón (el destino lo confirma primero por correo).
Enviar a una categoría
{
  "name": "send_email",
  "arguments": {
    "from": "Orders <orders@example.com>",
    "to": [
      "customer@example.net"
    ],
    "subject": "Order 1042: confirm delivery window",
    "text": "Reply with a time that works.",
    "labels": [
      "Agent/Orders"
    ],
    "idempotency_key": "order-1042-window"
  }
}

8. Adjuntos y plantillas

Adjunte hasta 10 archivos con attachments de send_email (cada uno necesita content_base64 o un file_path local; filename toma por defecto el nombre base del archivo) en un plan de pago. Para las plantillas alojadas: create_template → update_template_draft → render_template para previsualizar con datos de ejemplo → send_template_test (envía una prueba real) → publish_template; después envíe con send_email o send_batch usando template: {key, data} y exactamente un destinatario to.

Resultados, paginación y errores

Una llamada correcta devuelve el objeto JSON de la API como structuredContent y como bloque de texto JSON. Toda herramienta list_* acepta limit (1–200, valor predeterminado 50) y offset, y agrega un objeto pagination. Siga llamando con offset: pagination.next_offset mientras has_more sea true.

Resultado paginado
{
  "data": [
    "…"
  ],
  "count": 50,
  "pagination": {
    "offset": 0,
    "limit": 50,
    "returned": 50,
    "total": 180,
    "has_more": true,
    "next_offset": 50
  }
}

Una llamada fallida devuelve isError: true con un error estructurado. Siga el remedy en lugar de reintentar a ciegas; reintente solo cuando retryable sea true.

Error estructurado de herramienta
{
  "error": {
    "code": "trial_recipient_restricted",
    "status": 402,
    "message": "The integration trial can deliver only to your account email or an AWS SES simulator address",
    "retryable": false,
    "explanation": "This workspace is on the unpaid integration trial. Trial sends can be delivered only to the account owner's email address or an AWS SES simulator address.",
    "remedy": "Send to the account email (get_account -> user.email) or a simulator address such as success@simulator.amazonses.com to test. To email anyone else, the account owner must activate a paid plan in the dashboard (Profile & Billing). Do not retry the same recipients."
  }
}

Campos de error opcionales: request_id (indíquelo al soporte), retry_after_seconds, problems (lista de infracciones del esquema para invalid_arguments) e idempotent_replayed (consulte Idempotencia).

Idempotencia

send_email y send_batch aceptan idempotency_key (máximo 200 caracteres), que se envía como encabezado Idempotency-Key. Genere una clave estable por cada mensaje lógico, por ejemplo invoice-4812-receipt.

  • Un reintento debe reutilizar la misma clave Y un cuerpo de solicitud idéntico. La misma clave con cualquier cambio (destinatario, asunto, cuerpo, encabezado, datos de plantilla, incluso valores de argumentos) devuelve 409 idempotency_conflict.
  • Misma clave, mismo cuerpo y el original ya terminado: SendHQ devuelve el resultado almacenado sin volver a enviar. Así se reintenta de forma segura después de un timeout o de un network_error.
  • Misma clave mientras el original sigue en curso: 409 idempotency_in_progress, que se puede reintentar tras una breve espera.
  • Un mensaje lógico nuevo necesita una clave nueva.
  • Los fallos almacenados también se reproducen. Si el primer intento falló, reintentar con la misma clave devuelve ese mismo fallo con idempotent_replayed: true y retryable: false. Revise list_emails (direction: out) para confirmar que no salió nada, corrija la causa y después envíe con una clave nueva.
  • El servidor nunca reintenta un POST por su cuenta. Solo las llamadas GET de solo lectura se reintentan automáticamente (hasta 3 intentos ante errores de red, 429 y 5xx).
  • send_email con attachments en línea no admite una idempotency_key, porque ejecuta varias solicitudes. Para envíos con adjuntos seguros ante reintentos: create_draft → upload_attachment → send_email con draft_id e idempotency_key.
Envío seguro ante reintentos (repetir exactamente si hay timeout)
{
  "name": "send_email",
  "arguments": {
    "from": "Acme <billing@example.com>",
    "to": [
      "owner@example.com"
    ],
    "subject": "Receipt #4812",
    "text": "Thanks for your payment.",
    "idempotency_key": "receipt-4812"
  }
}

Límites de frecuencia y cuotas

SendHQ no publica un límite fijo de solicitudes por segundo para la API. Los límites con los que realmente se encuentra un agente son límites de uso, que se devuelven como 429:

  • Entregas mensuales a destinatarios por plan. Cada dirección To, Cc y Bcc cuenta como una entrega. Consulte get_account → usage.recipientDeliveries frente a usage.emailQuotaMonth.
  • Destinatarios diarios por dirección From exacta, según el estado de reputación de ese remitente (list_sender_reputation → dailyLimit, 2.000 de forma predeterminada en los planes de pago).
  • Prueba de integración: 100 destinatarios en total, solo al correo de la cuenta o a direcciones del simulador de SES.
  • Adjuntos: como máximo 10 archivos y 10 MB por mensaje; 10 GB al mes de transferencia de adjuntos ponderada por destinatario en los planes de pago.
  • Por solicitud: To + Cc + Bcc hasta 100 direcciones; send_batch hasta 100 mensajes.
  • Cortacircuitos de reputación: en una ventana móvil de 7 días, los rebotes o las quejas por encima del umbral limitan o pausan una dirección From (423 sender_paused). Se recupera automáticamente cuando las tasas bajan.

quota_exhausted no se puede reintentar hasta que se reinicie el periodo o cambie el plan. rate_limited se puede reintentar después de retry_after_seconds; en los envíos, reintente con la misma idempotency_key y un cuerpo idéntico.

Catálogo de errores

code es estable; ramifique su lógica en función de él y no de message.

codeHTTP¿Reintentar?Qué significa y qué hacer
invalid_arguments—noLos argumentos no superaron localmente el JSON Schema de la herramienta; nada llegó a SendHQ. Corrija los campos indicados en problems.
auth_error401noClave de API ausente, revocada o incorrecta. Defina SENDHQ_API_KEY para el proceso del servidor; las claves las crea una persona en el panel.
trial_recipient_restricted402noLa prueba de integración solo puede entregar al correo de la cuenta o a una dirección del simulador de SES. Envíe allí, o el propietario activa un plan de pago.
payment_required402noLa función requiere un plan de pago (por ejemplo, los adjuntos). Envíe sin ella o cambie a un plan superior.
sender_domain_not_owned403noEl dominio From no pertenece a este espacio de trabajo. Use list_sending_identities o add_domain.
sender_domain_unverified403noEl dominio From aún no está verificado. get_domain, publique los registros que faltan, verify_domain.
domain_limit_reached403noSe alcanzó el límite de dominios del plan. Elimine un dominio sin uso (con aprobación) o cambie a un plan superior.
marketing_not_enabled403noLa clase marketing no está habilitada para este dominio o plan. Use transactional solo si el mensaje realmente lo es.
forbidden403noLa política no permite la operación. Ajuste la solicitud.
not_found404noEl ID no pertenece a este espacio de trabajo. Liste el recurso para encontrar el ID correcto; restaure primero las plantillas archivadas.
idempotency_conflict409noClave reutilizada con un cuerpo distinto. Reenvíe exactamente el original o use una clave nueva para un mensaje nuevo.
idempotency_in_progress409síLa solicitud original sigue en curso. Espere y reintente con la misma clave y el mismo cuerpo.
revision_conflict409noEl borrador de la plantilla cambió desde que lo leyó. get_template, combine los cambios y vuelva a guardar.
complaint_suppression_locked409noEl destinatario presentó una queja. No vuelva a escribirle nunca.
inbound_not_ready409noLa recepción de correo entrante no está lista. setup_inbound, publique el MX, verify_inbound.
conflict409noEl recurso ya existe o está en un estado incorrecto. Léalo y ajústelo.
attachments_too_large413noMás de 10 archivos o 10 MB. Quite adjuntos o reduzca su tamaño.
recipient_suppressed422noUn destinatario tuvo antes un rebote permanente o presentó una queja. Quítelo; consulte list_blocked_recipients.
recipient_unsubscribed422noUn destinatario se dio de baja del correo de marketing. Quítelo de forma permanente.
validation_failed422noContenido rechazado, por ejemplo datos de plantilla que incumplen el contrato de variables. Corrija la entrada.
sender_paused423noEsta dirección From está en pausa por el cortacircuitos de rebotes/quejas de 7 días. Deténgase, corrija la lista y espere la recuperación automática.
quota_exhausted429noSe alcanzó el límite mensual, diario por remitente, de adjuntos o de la prueba. Revise get_account; espere al reinicio o cambie a un plan superior.
rate_limited429síReduzca el ritmo; espere retry_after_seconds. Envíos: misma clave, mismo cuerpo.
server_error5xxsíFallo temporal de SendHQ o del proveedor. Aplique backoff y reintente; los envíos, con la misma clave y el mismo cuerpo. Si idempotent_replayed es true, use una clave nueva después de confirmar que no se envió nada.
network_error—síSe perdió la solicitud o la respuesta. Reintente; en los envíos, la misma idempotency_key lo hace seguro.
invalid_request400noSolicitud mal formada. Lea message y corríjala.
tool_error—noFallo local dentro del servidor MCP (por ejemplo, un file_path ilegible). Lea message.

Referencia de herramientas

Cada herramienta con su clase de seguridad, el endpoint REST al que llama, sus parámetros, la estructura de respuesta y un objeto params de tools/call de ejemplo. Los parámetros son exactos: el servidor rechaza todo lo que no esté en la lista.

Correos e hilos: send_email, send_batch, list_emails, get_email, mark_email, delete_email, list_email_events, get_thread
Etiquetas y reglas de archivado automático: list_labels, get_label, create_label, update_label, delete_label, create_label_rule, delete_label_rule, label_email
Borradores, adjuntos e identidades de remitente: list_sending_identities, create_draft, list_drafts, get_draft, update_draft, delete_draft, upload_attachment, download_attachment, delete_attachment
Plantillas alojadas: list_templates, create_template, get_template, update_template_draft, create_template_draft, render_template, send_template_test, publish_template, archive_template, restore_template
Dominios y DNS: list_domains, get_domain, add_domain, verify_domain, delete_domain, get_dns_provider, get_domain_connect_link
Correo entrante: setup_inbound, verify_inbound, list_inboxes, get_inbox, create_inbox, update_inbox, set_inbox_forwarding, delete_inbox
Entregabilidad, rebotes y supresiones: deliverability_stats, list_sender_reputation, list_suppressions, remove_suppression, list_blocked_recipients
Cuenta, uso, analíticas y claves: get_account, get_analytics, list_api_keys, get_service_health

Correos e hilos

Envía correo realsend_email
POST /emails

Enviar un correo

SENDS REAL EMAIL. Envía un mensaje desde un dominio verificado: html/text sin procesar, una plantilla alojada publicada, una respuesta en un hilo existente o un mensaje con adjuntos. Pase idempotency_key para que un reintento no pueda enviar dos veces; un reintento debe reutilizar la misma clave Y una solicitud idéntica; de lo contrario, SendHQ devuelve 409. attachments es un atajo que crea un borrador, sube cada archivo y envía con ese borrador; no se puede combinar con idempotency_key ni con draft_id (use create_draft + upload_attachment + send_email con draft_id para envíos con adjuntos seguros ante reintentos). Los espacios de trabajo sin pago (prueba de integración) solo pueden entregar al correo de la cuenta o a una dirección del simulador de AWS SES, y no pueden enviar adjuntos.

Proporcione al menos uno de: html, text, template.

ParámetroTipoObligatoriaDescripción
fromstringsíRemitente, p. ej. Acme <hello@example.com>. El dominio debe estar verificado en este espacio de trabajo (consulte list_sending_identities). (máx. 998 caracteres)
tostring[]síDestinatarios. Cada entrada es una dirección, opcionalmente con un nombre visible. To+cc+bcc pueden sumar como máximo 100; cada destino consume un crédito de entrega. (1–100 elementos)
ccstring[]noDestinatarios en copia. (0–100 elementos)
bccstring[]noDestinatarios en copia oculta. (0–100 elementos)
subjectstringnoLínea de asunto. Omítala al enviar una plantilla. (máx. 998 caracteres)
textstringnoCuerpo en texto sin formato. Proporcione text, html o template.
htmlstringnoCuerpo HTML. SendHQ lo sanea y genera el texto cuando se omite text.
reply_tostringnoDirección Reply-To.
headersobjectnoEncabezados personalizados adicionales y seguros (valores string), p. ej. {"X-Entity-Ref-ID": "123"}. Los encabezados de enrutamiento como From/To/Message-ID los controla SendHQ.
message_classstringnotransactional (predeterminado) o marketing. Marketing requiere un plan o dominio con marketing habilitado y agrega la gestión de bajas. (uno de transactional, marketing)
reply_to_email_idstringnoResponder dentro de una conversación existente: el ID em_… del mensaje al que se responde. SendHQ establece In-Reply-To/References y el hilo.
thread_idstringnoID de hilo explícito en el que archivar el mensaje.
draft_idstringnoEnviar con este mensaje los adjuntos de un borrador guardado (dr_…). El borrador se elimina tras un envío correcto.
templateobjectnoEnviar una plantilla alojada publicada en lugar de html/text sin procesar. Requiere exactamente un destinatario to y ningún cc/bcc; la plantilla proporciona el asunto. Proporcione al menos uno de: id, key.
template.idstringnoID de la plantilla (tmpl_…). Proporcione id o key.
template.keystringnoClave de la plantilla, como account-welcome. Proporcione id o key.
template.version_idstringnoID de versión publicada opcional (tmplv_…). Por defecto, la versión publicada actual.
template.dataobjectnoValores para las variables tipadas de la plantilla.
labelsstring[]noNombres de etiqueta o IDs lbl_… en los que archivar este mensaje. Los nombres desconocidos se crean. Las respuestas de la conversación heredan las etiquetas, y una etiqueta de categoría (skip_inbox) mantiene esas respuestas fuera de la bandeja de entrada. Máx. 10. (0–10 elementos)
idempotency_keystringnoEncabezado Idempotency-Key (máx. 200 caracteres). Reutilícelo solo para reintentar exactamente esta solicitud. (máx. 200 caracteres)
attachmentsobject[]noArchivos que adjuntar (máx. 10 archivos, 10 MB en total). Cada uno necesita content_base64 (más filename) o un file_path local. (0–10 elementos) Proporcione al menos uno de: content_base64, file_path.
attachments[].filenamestringnoNombre de archivo que ve el destinatario. Obligatorio con content_base64; por defecto, el nombre base de file_path. (máx. 255 caracteres)
attachments[].content_typestringnoTipo MIME, p. ej. application/pdf. Por defecto, application/octet-stream.
attachments[].content_base64stringnoContenido del archivo en base64 estándar.
attachments[].file_pathstringnoRuta absoluta de un archivo local que el proceso del servidor MCP pueda leer.
Devuelve{id: em_…, providerMessageId, threadId, templateId, templateVersionId, isTest}. Aceptado no significa entregado: haga el seguimiento con list_email_events.
Ejemplo de params de tools/call
{
  "name": "send_email",
  "arguments": {
    "from": "Acme <hello@example.com>",
    "to": [
      "owner@example.com"
    ],
    "subject": "Your export is ready",
    "text": "Download it from your dashboard.",
    "idempotency_key": "export-ready-42"
  }
}
Envía correo realsend_batch
POST /emails/batch

Enviar un lote de correos personalizados

SENDS REAL EMAIL. Envía de 1 a 100 mensajes independientes en una sola solicitud (úselo para personalizar plantillas por destinatario). Cada elemento tiene la misma estructura que send_email (sin attachments/idempotency_key). Cada elemento tiene éxito o falla por separado: HTTP 207 significa éxito parcial; revise cada data[i].ok y data[i].error. Una sola idempotency_key cubre todo el cuerpo del lote.

ParámetroTipoObligatoriaDescripción
emailsobject[]síMensajes que enviar. (1–100 elementos) Proporcione al menos uno de: html, text, template.
idempotency_keystringnoIdempotency-Key para todo el lote (máx. 200 caracteres). (máx. 200 caracteres)
Devuelve{data: [{index, ok, id?, error?: {message, status}}], count, successful, failed}.
Ejemplo de params de tools/call
{
  "name": "send_batch",
  "arguments": {
    "emails": [
      {
        "from": "Acme <hello@example.com>",
        "to": [
          "owner@example.com"
        ],
        "template": {
          "key": "account-welcome",
          "data": {
            "first_name": "Asha"
          }
        }
      }
    ],
    "idempotency_key": "welcome-batch-2026-09-26"
  }
}
Solo lecturalist_emails
GET /emails

Listar y buscar correo

Lista el correo enviado (direction: out) y recibido (direction: in), del más reciente al más antiguo, con filtros. El correo recibido se clasifica: lea la bandeja de entrada de la persona con direction: in, archived: false, category: primary; priorice con important: true; el spam se oculta salvo que se indique category: spam o include_spam: true. Paginado: el resultado incluye pagination {offset, limit, returned, total?, has_more, next_offset}.

ParámetroTipoObligatoriaDescripción
directionstringnoin para el recibido, out para el enviado. (uno de in, out)
statusstringnoFiltro de estado, p. ej. queued, sent, delivered, bounced, complained, failed.
domainstringnoSolo los mensajes de este dominio, o de una lista de dominios separados por comas (coincide con cualquiera).
inbox_idstringnoSolo los mensajes recibidos en esta bandeja de entrada (inb_…).
labelstringnoSolo los mensajes con esta etiqueta: un ID de etiqueta lbl_… o el nombre exacto, o una lista separada por comas (coincide con cualquiera). Use list_labels para ver las carpetas.
archivedbooleannofalse = la vista de la bandeja de entrada (correo recibido no archivado), true = solo archivados. Omítalo para todo el correo.
categorystringnoprimary (personas), updates (newsletters, envíos masivos, automatizados) o spam; o una lista separada por comas. El spam se oculta salvo que se solicite.
importantbooleannotrue = solo los mensajes marcados como importantes (respuestas a conversaciones que usted inició y remitentes marcados como importantes).
include_spambooleannoIncluir el spam en los resultados (para búsquedas en todas las carpetas).
fromstringnoLa dirección del remitente contiene este valor.
tostringnoLa dirección del destinatario contiene este valor.
unreadbooleannotrue = solo no leídos, false = solo leídos.
afterstringnoMarca de tiempo ISO-8601; solo los mensajes creados después de ella. (date-time)
beforestringnoMarca de tiempo ISO-8601; solo los mensajes creados antes de ella. (date-time)
querystringnoBúsqueda de texto libre en asuntos, cuerpos, direcciones de remitente/destinatario y nombres de archivos adjuntos. (máx. 200 caracteres)
limitintegernoTamaño de página. Por defecto, 50. (predeterminado 50; 1–200)
offsetintegernoNúmero de registros que omitir. Use pagination.next_offset de la página anterior. (predeterminado 0; 0–…)
Devuelve{data: [resúmenes de correos], count, pagination}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "list_emails",
  "arguments": {
    "direction": "in",
    "unread": true,
    "limit": 25
  }
}
Solo lecturaget_email
GET /emails/:email_id

Obtener un correo

Recupera un mensaje con sus encabezados, cuerpo html/text, estado, metadatos del hilo y metadatos de los adjuntos (descargue los bytes con download_attachment).

ParámetroTipoObligatoriaDescripción
email_idstringsíID del correo (empieza por em_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
DevuelveObjeto de correo: {id, direction, status, from, to, cc, bcc, subject, html, text, threadId, messageId, providerMessageId, readAt, createdAt, attachments: [{id, filename, contentType, sizeBytes, available}]}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "get_email",
  "arguments": {
    "email_id": "em_123"
  }
}
Cambia el estadomark_email
PATCH /emails/:email_id

Marcar como leído, archivado, spam o importante

Actualiza un mensaje: read, archived, category (primary, updates, spam; solo correo recibido) e important. Marcar como spam o como importante enseña a SendHQ sobre ese remitente para el correo futuro; pase learn: false para cambiar solo este mensaje. Pase al menos un campo.

ParámetroTipoObligatoriaDescripción
email_idstringsíID del correo (empieza por em_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
readbooleannotrue = leído, false = no leído.
archivedbooleannotrue = archivar (fuera de la bandeja de entrada), false = devolver a la bandeja de entrada.
categorystringnoMueve un mensaje recibido a primary, updates o spam. (uno de primary, updates, spam)
importantbooleannoMarca o desmarca el mensaje como importante.
learnbooleannofalse = no recordar este veredicto para el remitente (predeterminado true).
DevuelveEl objeto de correo actualizado.
AnotacionesidempotentHint
Ejemplo de params de tools/call
{
  "name": "mark_email",
  "arguments": {
    "email_id": "em_123",
    "read": true
  }
}
Destructivadelete_email
DELETE /emails/:email_id

Eliminar un correo

DESTRUCTIVE: elimina de forma permanente de SendHQ un mensaje conservado y sus adjuntos almacenados. No recupera un mensaje que ya se entregó.

ParámetroTipoObligatoriaDescripción
email_idstringsíID del correo (empieza por em_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
Devuelve{ok: true}.
AnotacionesdestructiveHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "delete_email",
  "arguments": {
    "email_id": "em_123"
  }
}
Solo lecturalist_email_events
GET /emails/:email_id/events

Listar los eventos de entrega de un correo

Eventos del proveedor para un mensaje enviado: delivery, bounce, complaint, reject, open, click. Es la evidencia de si un mensaje se entregó o de por qué falló. Paginado: el resultado incluye pagination {offset, limit, returned, total?, has_more, next_offset}.

ParámetroTipoObligatoriaDescripción
email_idstringsíID del correo (empieza por em_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
limitintegernoTamaño de página. Por defecto, 50. (predeterminado 50; 1–200)
offsetintegernoNúmero de registros que omitir. Use pagination.next_offset de la página anterior. (predeterminado 0; 0–…)
Devuelve{data: [{event_type, recipient, reason, created_at, …}], count, pagination}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "list_email_events",
  "arguments": {
    "email_id": "em_123"
  }
}
Solo lecturaget_thread
GET /threads/:thread_id

Obtener una conversación

Recupera todos los mensajes de una conversación en orden cronológico (enviados y recibidos), cada uno con los metadatos de sus adjuntos.

ParámetroTipoObligatoriaDescripción
thread_idstringsíID del hilo (normalmente el ID em_… del primer mensaje; consulte threadId en cualquier correo). (máx. 128 caracteres)
Devuelve{id, subject, data: [correos]}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "get_thread",
  "arguments": {
    "thread_id": "em_123"
  }
}

Etiquetas y reglas de archivado automático

Solo lecturalist_labels
GET /labels

Listar etiquetas

Lista las etiquetas (carpetas) del espacio de trabajo con los recuentos totales y de no leídos, y sus reglas de archivado automático. Paginado: el resultado incluye pagination {offset, limit, returned, total?, has_more, next_offset}.

ParámetroTipoObligatoriaDescripción
limitintegernoTamaño de página. Por defecto, 50. (predeterminado 50; 1–200)
offsetintegernoNúmero de registros que omitir. Use pagination.next_offset de la página anterior. (predeterminado 0; 0–…)
Devuelve{data: [{id, name, color, totalCount, unreadCount, rules: [...]}], count, pagination}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "list_labels",
  "arguments": {}
}
Solo lecturaget_label
GET /labels/:label_id

Obtener una etiqueta

Recupera una etiqueta con sus recuentos y reglas de archivado automático.

ParámetroTipoObligatoriaDescripción
label_idstringsíID de la etiqueta (empieza por lbl_) o el nombre exacto de la etiqueta. (máx. 128 caracteres)
DevuelveObjeto de etiqueta.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "get_label",
  "arguments": {
    "label_id": "Billing"
  }
}
Cambia el estadocreate_label
POST /labels

Crear una etiqueta

Crea una etiqueta tipo carpeta. Defina skip_inbox: true para convertirla en una categoría propiedad de un agente: envíe con labels: [name] y las respuestas se archivan en la etiqueta y quedan fuera de la bandeja de entrada. Las reglas de archivado automático opcionales archivan el correo nuevo enviado/recibido (todas las condiciones de una regla deben coincidir). Defina apply_to_existing para archivar también el correo conservado.

ParámetroTipoObligatoriaDescripción
namestringsíNombre de la etiqueta, p. ej. Billing o Clients/Acme. Único por espacio de trabajo (sin distinguir mayúsculas y minúsculas). (máx. 64 caracteres)
colorstringnoColor hexadecimal, como #1a73e8. Opcional.
skip_inboxbooleannoModo categoría: el correo recibido que obtiene esta etiqueta (por una regla, por responder a una conversación enviada con esta etiqueta o manualmente) se archiva para que aparezca solo en la etiqueta, no en la bandeja de entrada.
rulesobject[]noReglas de archivado automático opcionales (máx. 20). Cada una necesita al menos uno de inbox_id, from, to, subject. (0–20 elementos)
rules[].directionstringnoSolo el correo in (recibido) u out (enviado). Omítalo para ambos. (uno de in, out)
rules[].inbox_idstringnoSolo el correo recibido en esta bandeja de entrada (inb_…). Archiva cada dirección de recepción en su propia carpeta.
rules[].fromstringnoEl remitente contiene este texto (sin distinguir mayúsculas y minúsculas), p. ej. @stripe.com. (máx. 200 caracteres)
rules[].tostringnoTo/Cc contiene este texto (sin distinguir mayúsculas y minúsculas). (máx. 200 caracteres)
rules[].subjectstringnoEl asunto contiene este texto (sin distinguir mayúsculas y minúsculas). (máx. 200 caracteres)
rules[].skip_inboxbooleannoArchivar el correo recibido que coincida para que aparezca solo en la carpeta de la etiqueta, no en la bandeja de entrada.
apply_to_existingbooleannoArchivar también el correo ya conservado que coincida con las reglas.
DevuelveLa etiqueta creada con sus reglas.
Ejemplo de params de tools/call
{
  "name": "create_label",
  "arguments": {
    "name": "Agent/Orders",
    "skip_inbox": true,
    "rules": [
      {
        "from": "@stripe.com"
      }
    ]
  }
}
Cambia el estadoupdate_label
PATCH /labels/:label_id

Renombrar, cambiar el color o convertir una etiqueta en categoría

Cambia el nombre de una etiqueta, su color o activa/desactiva el modo categoría (skip_inbox). Al activar el modo categoría se archiva el correo recibido que ya está en la etiqueta.

ParámetroTipoObligatoriaDescripción
label_idstringsíID de la etiqueta (empieza por lbl_) o el nombre exacto de la etiqueta. (máx. 128 caracteres)
namestringnoNombre nuevo. (máx. 64 caracteres)
colorstringnoColor hexadecimal nuevo.
skip_inboxbooleannoModo categoría: el correo recibido que obtiene esta etiqueta (por una regla, por responder a una conversación enviada con esta etiqueta o manualmente) se archiva para que aparezca solo en la etiqueta, no en la bandeja de entrada.
DevuelveLa etiqueta actualizada.
AnotacionesidempotentHint
Ejemplo de params de tools/call
{
  "name": "update_label",
  "arguments": {
    "label_id": "lbl_123",
    "name": "Finance/Billing"
  }
}
Destructivadelete_label
DELETE /labels/:label_id

Eliminar una etiqueta

DESTRUCTIVE: elimina una etiqueta y sus reglas. El correo en sí se conserva; solo pierde esta etiqueta.

ParámetroTipoObligatoriaDescripción
label_idstringsíID de la etiqueta (empieza por lbl_) o el nombre exacto de la etiqueta. (máx. 128 caracteres)
Devuelve{ok: true}.
AnotacionesdestructiveHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "delete_label",
  "arguments": {
    "label_id": "lbl_123"
  }
}
Cambia el estadocreate_label_rule
POST /labels/:label_id/rules

Agregar una regla de archivado automático

Agrega una regla a una etiqueta para que el correo nuevo que coincida se archive automáticamente. Todas las condiciones que defina deben coincidir. Use inbox_id para dar a una dirección de recepción su propia carpeta; agregue skip_inbox para mantenerla fuera de la bandeja de entrada.

ParámetroTipoObligatoriaDescripción
label_idstringsíID de la etiqueta (empieza por lbl_) o el nombre exacto de la etiqueta. (máx. 128 caracteres)
directionstringnoSolo el correo in (recibido) u out (enviado). Omítalo para ambos. (uno de in, out)
inbox_idstringnoSolo el correo recibido en esta bandeja de entrada (inb_…). Archiva cada dirección de recepción en su propia carpeta.
fromstringnoEl remitente contiene este texto (sin distinguir mayúsculas y minúsculas), p. ej. @stripe.com. (máx. 200 caracteres)
tostringnoTo/Cc contiene este texto (sin distinguir mayúsculas y minúsculas). (máx. 200 caracteres)
subjectstringnoEl asunto contiene este texto (sin distinguir mayúsculas y minúsculas). (máx. 200 caracteres)
skip_inboxbooleannoArchivar el correo recibido que coincida para que aparezca solo en la carpeta de la etiqueta, no en la bandeja de entrada.
apply_to_existingbooleannoArchivar también el correo ya conservado que coincida.
Devuelve{id: lrule_…, labelId, direction, inboxId, from, to, subject, skipInbox}.
Ejemplo de params de tools/call
{
  "name": "create_label_rule",
  "arguments": {
    "label_id": "Billing",
    "inbox_id": "inb_123",
    "skip_inbox": true
  }
}
Destructivadelete_label_rule
DELETE /labels/:label_id/rules/:rule_id

Eliminar una regla de archivado automático

DESTRUCTIVE: elimina una regla de archivado automático. El correo ya archivado conserva su etiqueta.

ParámetroTipoObligatoriaDescripción
label_idstringsíID de la etiqueta (empieza por lbl_) o el nombre exacto de la etiqueta. (máx. 128 caracteres)
rule_idstringsíID de la regla (empieza por lrule_), obtenido de get_label. (máx. 128 caracteres)
Devuelve{ok: true}.
AnotacionesdestructiveHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "delete_label_rule",
  "arguments": {
    "label_id": "lbl_123",
    "rule_id": "lrule_123"
  }
}
Cambia el estadolabel_email
POST /emails/:email_id/labels

Agregar o quitar etiquetas de un correo

Mueve un mensaje entre carpetas: agrega o quita etiquetas por nombre o por ID lbl_…. Los nombres desconocidos en add se crean, salvo que create sea false.

ParámetroTipoObligatoriaDescripción
email_idstringsíID del correo (empieza por em_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
addstring[]noEtiquetas que agregar. (0–10 elementos)
removestring[]noEtiquetas que quitar. (0–10 elementos)
createbooleannoCrear las etiquetas desconocidas en add (predeterminado true).
DevuelveEl correo actualizado con labels.
AnotacionesidempotentHint
Ejemplo de params de tools/call
{
  "name": "label_email",
  "arguments": {
    "email_id": "em_123",
    "add": [
      "Billing"
    ],
    "remove": [
      "Support"
    ]
  }
}

Borradores, adjuntos e identidades de remitente

Solo lecturalist_sending_identities
GET /sending-identities

Listar las identidades de remitente verificadas

Direcciones y dominios desde los que este espacio de trabajo puede enviar ahora mismo (dominios verificados, su From predeterminado y las direcciones de entrada activas). Llámela antes de send_email para elegir un from válido.

Sin parámetros.

Devuelve{domains: [nombres de dominios verificados], addresses: [direcciones de remitente], localParts: [...]}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "list_sending_identities",
  "arguments": {}
}
Cambia el estadocreate_draft
POST /drafts

Crear un borrador

Crea un borrador del editor. Los borradores contienen adjuntos: cree un borrador, use upload_attachment y después send_email con draft_id. No envía nada.

ParámetroTipoObligatoriaDescripción
fromstringnoDirección del remitente en un dominio verificado (puede estar vacía mientras se redacta).
tostring[]noDestinatarios. (0–100 elementos)
ccstring[]noDestinatarios en copia. (0–100 elementos)
bccstring[]noDestinatarios en copia oculta. (0–100 elementos)
subjectstringnoLínea de asunto. (máx. 998 caracteres)
htmlstringnoCuerpo HTML.
textstringnoCuerpo en texto sin formato.
reply_to_email_idstringnoID del correo al que responde este borrador.
thread_idstringnoID del hilo al que pertenece este borrador.
DevuelveObjeto de borrador {id: dr_…, from, to, cc, bcc, subject, html, text, attachments: []}.
Ejemplo de params de tools/call
{
  "name": "create_draft",
  "arguments": {
    "from": "hello@example.com",
    "to": [
      "owner@example.com"
    ],
    "subject": "Invoice"
  }
}
Solo lecturalist_drafts
GET /drafts

Listar borradores

Lista los borradores del editor, los actualizados más recientemente primero. Paginado: el resultado incluye pagination {offset, limit, returned, total?, has_more, next_offset}.

ParámetroTipoObligatoriaDescripción
limitintegernoTamaño de página. Por defecto, 50. (predeterminado 50; 1–200)
offsetintegernoNúmero de registros que omitir. Use pagination.next_offset de la página anterior. (predeterminado 0; 0–…)
Devuelve{data: [borradores], count, pagination}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "list_drafts",
  "arguments": {}
}
Solo lecturaget_draft
GET /drafts/:draft_id

Obtener un borrador

Recupera un borrador con los metadatos de sus adjuntos.

ParámetroTipoObligatoriaDescripción
draft_idstringsíID del borrador (empieza por dr_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
DevuelveObjeto de borrador con attachments.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "get_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
Cambia el estadoupdate_draft
PUT /drafts/:draft_id

Reemplazar el contenido de un borrador

Reemplaza el contenido y los destinatarios de un borrador. Es un reemplazo completo: los campos que omita se vacían, así que lea primero get_draft y envíe todos los campos que quiera conservar. Los adjuntos no se ven afectados.

ParámetroTipoObligatoriaDescripción
draft_idstringsíID del borrador (empieza por dr_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
fromstringnoDirección del remitente en un dominio verificado (puede estar vacía mientras se redacta).
tostring[]noDestinatarios. (0–100 elementos)
ccstring[]noDestinatarios en copia. (0–100 elementos)
bccstring[]noDestinatarios en copia oculta. (0–100 elementos)
subjectstringnoLínea de asunto. (máx. 998 caracteres)
htmlstringnoCuerpo HTML.
textstringnoCuerpo en texto sin formato.
reply_to_email_idstringnoID del correo al que responde este borrador.
thread_idstringnoID del hilo al que pertenece este borrador.
DevuelveEl objeto de borrador actualizado.
AnotacionesidempotentHint
Ejemplo de params de tools/call
{
  "name": "update_draft",
  "arguments": {
    "draft_id": "dr_123",
    "from": "hello@example.com",
    "to": [
      "owner@example.com"
    ],
    "subject": "Invoice (updated)",
    "text": "Attached."
  }
}
Destructivadelete_draft
DELETE /drafts/:draft_id

Descartar un borrador

DESTRUCTIVE: descarta un borrador y elimina de forma permanente sus adjuntos almacenados.

ParámetroTipoObligatoriaDescripción
draft_idstringsíID del borrador (empieza por dr_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
Devuelve{ok: true}.
AnotacionesdestructiveHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "delete_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
Cambia el estadoupload_attachment
POST /drafts/:draft_id/attachments

Subir un adjunto a un borrador

Sube un archivo a un borrador (máx. 10 archivos y 10 MB en total por mensaje). Proporcione content_base64 o un file_path local. Los adjuntos requieren un plan de pago en el momento del envío.

Proporcione al menos uno de: content_base64, file_path.

ParámetroTipoObligatoriaDescripción
draft_idstringsíID del borrador (empieza por dr_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
filenamestringnoNombre de archivo que ve el destinatario. Por defecto, el nombre base de file_path. (máx. 255 caracteres)
content_typestringnoTipo MIME, p. ej. application/pdf. Por defecto, application/octet-stream.
content_base64stringnoContenido del archivo en base64 estándar.
file_pathstringnoRuta absoluta de un archivo local que el proceso del servidor MCP pueda leer.
Devuelve{id: att_…, filename, contentType, sizeBytes, available}.
Ejemplo de params de tools/call
{
  "name": "upload_attachment",
  "arguments": {
    "draft_id": "dr_123",
    "filename": "invoice.pdf",
    "content_type": "application/pdf",
    "file_path": "/tmp/invoice.pdf"
  }
}
Solo lecturadownload_attachment
GET /attachments/:attachment_id

Descargar un adjunto

Descarga un adjunto privado (enviado, recibido o de un borrador). Devuelve el contenido en base64, o escribe el archivo cuando se define save_to_path (se niega a sobrescribir salvo que overwrite sea true).

ParámetroTipoObligatoriaDescripción
attachment_idstringsíID del adjunto (empieza por att_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
save_to_pathstringnoRuta local absoluta opcional en la que escribir el archivo en lugar de devolverlo en base64.
overwritebooleannoPermite reemplazar un archivo existente en save_to_path. Por defecto, false.
Devuelve{attachment_id, filename, content_type, size_bytes, content_base64} o {attachment_id, filename, content_type, size_bytes, saved_to}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "download_attachment",
  "arguments": {
    "attachment_id": "att_123",
    "save_to_path": "/tmp/invoice.pdf"
  }
}
Destructivadelete_attachment
DELETE /attachments/:attachment_id

Eliminar un adjunto

DESTRUCTIVE: elimina de forma permanente un adjunto almacenado (por ejemplo, para quitar un archivo de un borrador antes de enviarlo).

ParámetroTipoObligatoriaDescripción
attachment_idstringsíID del adjunto (empieza por att_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
Devuelve{ok: true}.
AnotacionesdestructiveHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "delete_attachment",
  "arguments": {
    "attachment_id": "att_123"
  }
}

Plantillas alojadas

Solo lecturalist_templates
GET /templates

Listar plantillas alojadas

Lista las plantillas de correo alojadas con su estado de publicación y su uso. Paginado: el resultado incluye pagination {offset, limit, returned, total?, has_more, next_offset}.

ParámetroTipoObligatoriaDescripción
lifecyclestringnoactive (predeterminado), archived o all. (uno de active, archived, all)
querystringnoBuscar por nombre o clave. (máx. 120 caracteres)
limitintegernoTamaño de página. Por defecto, 50. (predeterminado 50; 1–200)
offsetintegernoNúmero de registros que omitir. Use pagination.next_offset de la página anterior. (predeterminado 0; 0–…)
Devuelve{data: [plantillas], count, pagination}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "list_templates",
  "arguments": {
    "lifecycle": "active"
  }
}
Cambia el estadocreate_template
POST /templates

Crear una plantilla alojada

Crea una plantilla con un borrador editable, opcionalmente a partir de una plantilla inicial (welcome, reset, receipt o blank). Publíquela antes de enviar por clave.

ParámetroTipoObligatoriaDescripción
namestringsíNombre legible. (máx. 120 caracteres)
keystringnoClave de envío estable: letras minúsculas, números y guiones; empieza por una letra (2–64 caracteres). Si se omite, se deriva del nombre.
starterstringnoContenido inicial. (uno de blank, welcome, reset, receipt)
Devuelve{template, draft, activeVersion, versions, usage}.
Ejemplo de params de tools/call
{
  "name": "create_template",
  "arguments": {
    "name": "Account welcome",
    "key": "account-welcome",
    "starter": "welcome"
  }
}
Solo lecturaget_template
GET /templates/:template_id

Obtener una plantilla

Recupera el borrador actual de una plantilla (con revision), la versión publicada activa, el historial de versiones y el uso. Acepta ID o clave.

ParámetroTipoObligatoriaDescripción
template_idstringsíID de la plantilla (tmpl_…) o clave. (máx. 128 caracteres)
Devuelve{template, draft: {id, revision, subjectTemplate, htmlTemplate, textTemplate, variables, sampleData, …} | null, activeVersion, versions, usage}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "get_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Cambia el estadoupdate_template_draft
PUT /templates/:template_id/draft

Guardar el borrador de una plantilla

Guarda el borrador editable de la plantilla con concurrencia optimista: pase la revision actual obtenida de get_template (409 significa que otra persona guardó antes; vuelva a leer y reintente). Es un reemplazo completo del contenido del borrador: los campos omitidos se vacían, así que envíe todos los campos que quiera conservar. Use marcadores {{variable}}.

ParámetroTipoObligatoriaDescripción
template_idstringsíID o clave de la plantilla. (máx. 128 caracteres)
revisionintegersíRevisión actual del borrador, obtenida de get_template. (1–…)
namestringnoNombre de la plantilla. (máx. 120 caracteres)
subject_templatestringnoAsunto con marcadores. (máx. 998 caracteres)
preheader_templatestringnoTexto de vista previa. (máx. 240 caracteres)
html_templatestringnoCuerpo HTML con marcadores.
text_templatestringnoCuerpo en texto sin formato con marcadores.
fromstringnoRemitente predeterminado para los envíos de esta plantilla.
reply_tostringnoReply-To predeterminado.
variablesobject[]noContrato de variables tipadas. Cada elemento: {key (minúsculas/guiones bajos), label, type: text|number|url|boolean, required (predeterminado true), fallback, description}.
variables[].keystringsí
variables[].labelstringno
variables[].typestringno(uno de text, number, url, boolean)
variables[].requiredbooleanno
variables[].fallbackanyno
variables[].descriptionstringno
sample_dataobjectnoValores de ejemplo usados en vistas previas y pruebas.
Devuelve{template, draft: {revision: next}, validation: {valid, findings}}.
Ejemplo de params de tools/call
{
  "name": "update_template_draft",
  "arguments": {
    "template_id": "account-welcome",
    "revision": 3,
    "name": "Account welcome",
    "subject_template": "Welcome, {{first_name}}",
    "text_template": "Hi {{first_name}}",
    "variables": [
      {
        "key": "first_name",
        "type": "text",
        "required": true
      }
    ],
    "sample_data": {
      "first_name": "Asha"
    }
  }
}
Cambia el estadocreate_template_draft
POST /templates/:template_id/draft

Iniciar un borrador nuevo a partir de la versión publicada

Crea un borrador editable nuevo copiado de la versión publicada actual (409 si ya existe un borrador o no hay nada publicado).

ParámetroTipoObligatoriaDescripción
template_idstringsíID o clave de la plantilla. (máx. 128 caracteres)
Devuelve{draft}.
Ejemplo de params de tools/call
{
  "name": "create_template_draft",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Solo lecturarender_template
POST /templates/:template_id/render

Renderizar la vista previa de una plantilla

Renderiza la salida exacta del servidor (asunto, html, texto) para el borrador, la versión publicada o una versión concreta con los datos indicados. No envía nada. Devuelve 422 con findings cuando los datos incumplen el contrato de variables.

ParámetroTipoObligatoriaDescripción
template_idstringsíID o clave de la plantilla. (máx. 128 caracteres)
version_idstringnoID de versión opcional; por defecto, el borrador y, si no hay, la versión publicada.
dataobjectnoValores de las variables; por defecto, los datos de ejemplo de la versión.
Devuelve{subject, html, text, preheader, versionId, versionNumber, isDraft, findings}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "render_template",
  "arguments": {
    "template_id": "account-welcome",
    "data": {
      "first_name": "Asha"
    }
  }
}
Envía correo realsend_template_test
POST /templates/:template_id/test

Enviar un correo de prueba de una plantilla

SENDS REAL EMAIL. Envía a los destinatarios indicados una instantánea del borrador (o de una versión concreta) con el prefijo [Test]. Cuenta para el uso; los espacios de trabajo en prueba solo pueden enviar al correo de la cuenta o a una dirección del simulador de SES.

ParámetroTipoObligatoriaDescripción
template_idstringsíID o clave de la plantilla. (máx. 128 caracteres)
tostring[]síDestinatarios de la prueba. (1–100 elementos)
fromstringnoRemitente en un dominio verificado; por defecto, el From de la plantilla.
version_idstringnoID de versión opcional.
dataobjectnoValores de las variables; por defecto, los datos de ejemplo.
Devuelve{id: em_…, providerMessageId, threadId, isTest: true}.
Ejemplo de params de tools/call
{
  "name": "send_template_test",
  "arguments": {
    "template_id": "account-welcome",
    "to": [
      "owner@example.com"
    ]
  }
}
Cambia el estadopublish_template
POST /templates/:template_id/publish

Publicar una versión de plantilla

Publica el borrador actual como una versión inmutable que usará send_email con template.key. Falla con findings 422 si hay errores de validación, o con 409 si rompería el contrato de variables en vigor de una plantilla que ya se usa en producción.

ParámetroTipoObligatoriaDescripción
template_idstringsíID o clave de la plantilla. (máx. 128 caracteres)
Devuelve{template, published}.
Ejemplo de params de tools/call
{
  "name": "publish_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Cambia el estadoarchive_template
POST /templates/:template_id/archive

Archivar una plantilla

Detiene los envíos nuevos que usan esta plantilla (el historial se conserva; se puede revertir con restore_template). Cualquier integración que envíe con esta clave empezará a fallar con 404.

ParámetroTipoObligatoriaDescripción
template_idstringsíID o clave de la plantilla. (máx. 128 caracteres)
Devuelve{template}.
AnotacionesidempotentHint
Ejemplo de params de tools/call
{
  "name": "archive_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Cambia el estadorestore_template
POST /templates/:template_id/restore

Restaurar una plantilla archivada

Vuelve a activar una plantilla archivada.

ParámetroTipoObligatoriaDescripción
template_idstringsíID o clave de la plantilla. (máx. 128 caracteres)
Devuelve{template}.
AnotacionesidempotentHint
Ejemplo de params de tools/call
{
  "name": "restore_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}

Dominios y DNS

Solo lecturalist_domains
GET /domains

Listar dominios

Lista los dominios de envío con el setup_status agregado (verified | checking | pending), el estado DNS de cada registro y el estado de entrada. Puede ser lento: los dominios no verificados se vuelven a comprobar en tiempo real. Paginado: el resultado incluye pagination {offset, limit, returned, total?, has_more, next_offset}.

ParámetroTipoObligatoriaDescripción
limitintegernoTamaño de página. Por defecto, 50. (predeterminado 50; 1–200)
offsetintegernoNúmero de registros que omitir. Use pagination.next_offset de la página anterior. (predeterminado 0; 0–…)
Devuelve{data: [dominios con registros], count, pagination}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "list_domains",
  "arguments": {}
}
Solo lecturaget_domain
GET /domains/:domain_id

Obtener los detalles de configuración de un dominio

Recupera un dominio con los registros DNS exactos que hay que publicar (tipo, nombre, valor), el estado en tiempo real de cada registro según dos resolvedores públicos, dns_issues con sus correcciones y el estado de entrada.

ParámetroTipoObligatoriaDescripción
domain_idstringsíID del dominio (empieza por dom_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
Devuelve{id, name, status, setup_status, dns_propagating, records: [{type, name, value, verified, dns_state}], dns_issues: [{code, message, …}], inbound_domain, inbound_status}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "get_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Cambia el estadoadd_domain
POST /domains

Agregar un dominio de envío

Registra para el envío un dominio que usted controla. Devuelve los registros DNS (CNAME de SES Easy DKIM) que el propietario debe publicar. No modifica el DNS por sí mismo. Cuenta para el límite de dominios del plan.

ParámetroTipoObligatoriaDescripción
namestringsíNombre de dominio sin más, p. ej. example.com o mail.example.com. (máx. 253 caracteres)
default_fromstringnoDirección de remitente predeterminada opcional en este dominio.
Devuelve{id: dom_…, name, status: pending, records: [...], ses: {configured}}.
Ejemplo de params de tools/call
{
  "name": "add_domain",
  "arguments": {
    "name": "example.com"
  }
}
Cambia el estadoverify_domain
POST /domains/:domain_id/verify

Verificar un dominio

Ejecuta ahora una comprobación de verificación SES/DNS en tiempo real. Se puede repetir sin riesgo; consulte cada 30–60 s después de cambios en el DNS (la propagación puede tardar de minutos a horas). El envío se permite cuando el estado es verified.

ParámetroTipoObligatoriaDescripción
domain_idstringsíID del dominio (empieza por dom_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
Devuelve{domain, checks: {ses, dkim, dkim_status}, status: verified|pending}.
AnotacionesidempotentHint
Ejemplo de params de tools/call
{
  "name": "verify_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Destructivadelete_domain
DELETE /domains/:domain_id

Eliminar un dominio

DESTRUCTIVE: quita el dominio del espacio de trabajo, incluida su ruta de recepción de correo entrante. Los envíos desde él fallan inmediatamente después. No elimina los registros DNS en su proveedor de DNS.

ParámetroTipoObligatoriaDescripción
domain_idstringsíID del dominio (empieza por dom_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
Devuelve{ok: true}.
AnotacionesdestructiveHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "delete_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Solo lecturaget_dns_provider
GET /dns/provider

Detectar el proveedor de DNS y los hosts de los registros

Detecta el proveedor de DNS autoritativo del dominio y devuelve el host relativo que hay que escribir en ese proveedor para cada registro, el registro DMARC recomendado, las indicaciones de MX de entrada y si está disponible la configuración con un clic (Domain Connect).

ParámetroTipoObligatoriaDescripción
domain_idstringsíID del dominio (empieza por dom_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
Devuelve{detectionStatus, detected, zone, nameservers, recordHosts: {recordId: host}, inbound, recommendations, authentication, providers: {domainConnect: {available, providerName}}}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "get_dns_provider",
  "arguments": {
    "domain_id": "dom_123"
  }
}

Correo entrante

Cambia el estadosetup_inbound
POST /domains/:domain_id/inbound/setup

Habilitar la recepción de correo entrante para un dominio

Habilita la recepción de correo entrante de SES para un dominio verificado. Usa el dominio raíz cuando no tiene un MX en conflicto; de lo contrario, inbound.<domain>. Devuelve el registro MX que el propietario debe publicar; no edita el DNS.

ParámetroTipoObligatoriaDescripción
domain_idstringsíID del dominio (empieza por dom_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
Devuelve{domain: dominio de recepción, status: dns_pending|ready, record: {type: MX, name, value}}.
AnotacionesidempotentHint
Ejemplo de params de tools/call
{
  "name": "setup_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Cambia el estadoverify_inbound
POST /domains/:domain_id/inbound/verify

Verificar el MX de entrada

Vuelve a comprobar el registro MX de entrada. El estado pasa a ready cuando ambos resolvedores públicos lo ven.

ParámetroTipoObligatoriaDescripción
domain_idstringsíID del dominio (empieza por dom_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
Devuelve{domain, status: ready|dns_pending|propagating|checking, record}.
AnotacionesidempotentHint
Ejemplo de params de tools/call
{
  "name": "verify_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Solo lecturalist_inboxes
GET /inboxes

Listar direcciones de entrada

Lista las direcciones de recepción, opcionalmente de un solo dominio. Paginado: el resultado incluye pagination {offset, limit, returned, total?, has_more, next_offset}.

ParámetroTipoObligatoriaDescripción
domain_idstringnoFiltro opcional por ID de dominio.
limitintegernoTamaño de página. Por defecto, 50. (predeterminado 50; 1–200)
offsetintegernoNúmero de registros que omitir. Use pagination.next_offset de la página anterior. (predeterminado 0; 0–…)
Devuelve{data: [{id, address, name, status, domainId}], count, pagination}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "list_inboxes",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Solo lecturaget_inbox
GET /inboxes/:inbox_id

Obtener una bandeja de entrada

Recupera una dirección de entrada.

ParámetroTipoObligatoriaDescripción
inbox_idstringsíID de la bandeja de entrada (empieza por inb_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
DevuelveObjeto de bandeja de entrada.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "get_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}
Cambia el estadocreate_inbox
POST /inboxes

Crear una dirección de entrada

Crea una dirección como support@<receiving domain> en un dominio cuyo estado de entrada sea ready (ejecute antes setup_inbound y verify_inbound). El correo recibido aparece en list_emails con direction in.

ParámetroTipoObligatoriaDescripción
domain_idstringsíID del dominio (empieza por dom_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
local_partstringsíParte anterior a la @, p. ej. support. (máx. 64 caracteres)
namestringnoNombre visible opcional.
Devuelve{id: inb_…, address, name, status: active}.
Ejemplo de params de tools/call
{
  "name": "create_inbox",
  "arguments": {
    "domain_id": "dom_123",
    "local_part": "support",
    "name": "Support"
  }
}
Cambia el estadoupdate_inbox
PATCH /inboxes/:inbox_id

Renombrar, habilitar o deshabilitar una bandeja de entrada

Cambia el nombre de una bandeja de entrada o establece su estado en active / disabled.

ParámetroTipoObligatoriaDescripción
inbox_idstringsíID de la bandeja de entrada (empieza por inb_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
namestringnoNombre visible nuevo.
statusstringnoEstado nuevo. (uno de active, disabled)
DevuelveLa bandeja de entrada actualizada.
AnotacionesidempotentHint
Ejemplo de params de tools/call
{
  "name": "update_inbox",
  "arguments": {
    "inbox_id": "inb_123",
    "status": "disabled"
  }
}
Envía correo realset_inbox_forwarding
PUT /inboxes/:inbox_id/forwarding

Reenviar una bandeja de entrada a otra dirección

SENDS REAL EMAIL cuando se reenvía a alguien distinto del propietario de la cuenta: define adónde se reenvía el correo recibido en una bandeja de entrada. La dirección del propio propietario se activa de inmediato; cualquier otra dirección recibe un correo de confirmación y el reenvío queda en pending hasta que alguien lo confirme allí. Pase forward_to: null para desactivar el reenvío. Las copias reenviadas salen desde la dirección de la bandeja de entrada, con el remitente original como Reply-To.

ParámetroTipoObligatoriaDescripción
inbox_idstringsíID de la bandeja de entrada (empieza por inb_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
forward_tostring,nullsíDirección de correo de destino del reenvío, o null para desactivarlo. (máx. 254 caracteres)
DevuelveLa bandeja de entrada con forwardTo y forwardStatus (off, pending o active).
AnotacionesidempotentHint
Ejemplo de params de tools/call
{
  "name": "set_inbox_forwarding",
  "arguments": {
    "inbox_id": "inb_123",
    "forward_to": "team@example.net"
  }
}
Destructivadelete_inbox
DELETE /inboxes/:inbox_id

Eliminar una bandeja de entrada

DESTRUCTIVE: elimina una dirección de entrada. El correo ya recibido se conserva; el correo nuevo a esa dirección deja de archivarse en ella.

ParámetroTipoObligatoriaDescripción
inbox_idstringsíID de la bandeja de entrada (empieza por inb_), tal como lo devuelve una herramienta de listado o de creación. (máx. 128 caracteres)
Devuelve{ok: true}.
AnotacionesdestructiveHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "delete_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}

Entregabilidad, rebotes y supresiones

Solo lecturadeliverability_stats
GET /deliverability/stats

Obtener estadísticas de entrega de 30 días

Totales de 30 días de todo el espacio de trabajo: sent, delivery, bounce, complaint, reject, open, click y deliveryRate (%).

Sin parámetros.

Devuelve{window: 30d, sent, delivery, bounce, complaint, reject, open, click, deliveryRate}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "deliverability_stats",
  "arguments": {}
}
Solo lecturalist_sender_reputation
GET /deliverability/reputation

Listar la reputación del remitente

Estado de reputación por dirección From exacta: active, throttled (límite diario más bajo) o paused (los envíos devuelven 423), con el motivo y el límite diario. Revíselo cuando los envíos fallen con 423 o 429. Paginado: el resultado incluye pagination {offset, limit, returned, total?, has_more, next_offset}.

ParámetroTipoObligatoriaDescripción
limitintegernoTamaño de página. Por defecto, 50. (predeterminado 50; 1–200)
offsetintegernoNúmero de registros que omitir. Use pagination.next_offset de la página anterior. (predeterminado 0; 0–…)
Devuelve{data: [{sender, status, dailyLimit, reason, cleanSince, warnedAt, pausedAt, evaluatedAt}], count, pagination}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "list_sender_reputation",
  "arguments": {}
}
Solo lecturalist_suppressions
GET /suppressions

Listar supresiones

Lista de supresión del espacio de trabajo: destinatarios bloqueados tras un rebote permanente o una queja por spam. Los envíos a ellos fallan con 422. Paginado: el resultado incluye pagination {offset, limit, returned, total?, has_more, next_offset}.

ParámetroTipoObligatoriaDescripción
limitintegernoTamaño de página. Por defecto, 50. (predeterminado 50; 1–200)
offsetintegernoNúmero de registros que omitir. Use pagination.next_offset de la página anterior. (predeterminado 0; 0–…)
Devuelve{data: [{email, reason, detail, created_at}], count, pagination}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "list_suppressions",
  "arguments": {}
}
Destructivaremove_suppression
DELETE /suppressions/:email

Quitar una supresión por rebote

DESTRUCTIVE (debilita un bloqueo de seguridad): quita una supresión por rebote para que se pueda volver a escribir a la dirección. Hágalo solo cuando la persona confirme que la dirección vuelve a ser válida. Las supresiones por queja no se pueden quitar (409).

ParámetroTipoObligatoriaDescripción
emailstringsíDirección del destinatario suprimido. (máx. 320 caracteres)
Devuelve{ok: true}.
AnotacionesdestructiveHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "remove_suppression",
  "arguments": {
    "email": "fixed-mailbox@example.net"
  }
}
Solo lecturalist_blocked_recipients
GET /blocked-recipients

Listar destinatarios bloqueados

Todos los destinatarios que SendHQ rechazará: rebotes, quejas y bajas de marketing con alcance por dominio, con un resumen por tipo. Lee hasta los 500 más recientes. Paginado: el resultado incluye pagination {offset, limit, returned, total?, has_more, next_offset}.

ParámetroTipoObligatoriaDescripción
limitintegernoTamaño de página. Por defecto, 50. (predeterminado 50; 1–200)
offsetintegernoNúmero de registros que omitir. Use pagination.next_offset de la página anterior. (predeterminado 0; 0–…)
Devuelve{data: [{email, domain, kind: bounce|complaint|unsubscribe, reason, detail, source, status, created_at}], count, summary: {total, bounce, complaint, unsubscribe}, pagination}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "list_blocked_recipients",
  "arguments": {}
}

Cuenta, uso, analíticas y claves

Solo lecturaget_account
GET /account

Obtener la cuenta, el uso y la facturación

Correo del propietario de la cuenta, plan/nivel de acceso, entregas a destinatarios usadas en el periodo actual frente a la cuota, dominios usados frente al límite, transferencia de adjuntos, resumen de reputación, estado de la suscripción, planes publicados y recuentos del espacio de trabajo. Úselo para comprobar la cuota restante o a quién puede entregar la prueba (el correo de la cuenta).

Sin parámetros.

Devuelve{user: {email, …}, usage: {domainsUsed, domainLimit, recipientDeliveries, emailQuotaMonth, attachmentBytes, attachmentByteLimit, periodKey}, access: {tier, planCode}, reputation, infrastructure, billing: {status, subscriptions, …}, plans, workspace: {mailer, stats}}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "get_account",
  "arguments": {}
}
Solo lecturaget_analytics
GET /analytics

Obtener analíticas de envío

Analíticas del panel de los últimos 7, 30 o 90 días: totales de enviados/recibidos/entregados/rebotados/bloqueados/abiertos/con clic/quejas, una línea de tiempo diaria, los principales dominios de envío y los asuntos más frecuentes.

ParámetroTipoObligatoriaDescripción
daysintegernoVentana en días: 7, 30 (predeterminado) o 90. (uno de 7, 30, 90)
Devuelve{window, days, metrics, timeline: [{day, sent, received}], domains, topContent}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "get_analytics",
  "arguments": {
    "days": 30
  }
}
Solo lecturalist_api_keys
GET /keys

Listar los metadatos de las claves de API

Lista los nombres de las claves de API, los prefijos no secretos y las fechas de último uso. Solo lectura: este servidor MCP no puede crear, rotar ni revocar claves; eso lo hace una persona en el panel. Paginado: el resultado incluye pagination {offset, limit, returned, total?, has_more, next_offset}.

ParámetroTipoObligatoriaDescripción
limitintegernoTamaño de página. Por defecto, 50. (predeterminado 50; 1–200)
offsetintegernoNúmero de registros que omitir. Use pagination.next_offset de la página anterior. (predeterminado 0; 0–…)
Devuelve{data: [{id, name, prefix, lastUsedAt, createdAt}], count, pagination}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "list_api_keys",
  "arguments": {}
}
Solo lecturaget_service_health
GET /health

Comprobar el estado del servicio SendHQ

Comprueba que la API de SendHQ está operativa y qué proveedor de correo está activo. No necesita una clave de API válida.

Sin parámetros.

Devuelve{ok, service, mailer}.
AnotacionesreadOnlyHint idempotentHint
Ejemplo de params de tools/call
{
  "name": "get_service_health",
  "arguments": {}
}

Inventario de cobertura de la API

Cada operación de la API pública y la herramienta que la cubre. Todo lo que un usuario puede hacer en el panel y que tiene API está cubierto; las exclusiones que se indican abajo son deliberadas.

EndpointHerramientaNotas
POST /emailssend_emailEnviar un correo
POST /emails/batchsend_batchEnviar hasta 100 mensajes personalizados
GET /emailslist_emailsListar el correo enviado y recibido
GET /emails/:idget_emailObtener un correo y sus adjuntos
PATCH /emails/:idmark_emailActualizar leído, archivado, spam, categoría o importancia
POST /emails/:id/labelslabel_emailAgregar o quitar etiquetas de un correo
DELETE /emails/:iddelete_emailEliminar un correo conservado
GET /emails/:id/eventslist_email_eventsListar los eventos de entrega de un correo
GET /threads/:idget_threadObtener una conversación en orden cronológico
GET /labelslist_labelsListar etiquetas con recuentos de mensajes y reglas de archivado
POST /labelscreate_labelCrear una etiqueta, opcionalmente con reglas de archivado automático
GET /labels/:idget_labelObtener una etiqueta por ID o nombre
PATCH /labels/:idupdate_labelRenombrar, cambiar el color o convertir una etiqueta en categoría
DELETE /labels/:iddelete_labelEliminar una etiqueta sin eliminar su correo
POST /labels/:id/rulescreate_label_ruleAgregar una regla de archivado automático a una etiqueta
DELETE /labels/:id/rules/:rule_iddelete_label_ruleEliminar una regla de archivado automático
POST /draftscreate_draftCrear un borrador del editor
GET /draftslist_draftsListar los borradores del editor
GET /drafts/:idget_draftObtener un borrador y sus adjuntos
PUT /drafts/:idupdate_draftReemplazar el contenido de un borrador
DELETE /drafts/:iddelete_draftDescartar un borrador
POST /drafts/:id/attachmentsupload_attachmentSubir un adjunto a un borrador
GET /attachments/:iddownload_attachmentDescargar un adjunto privado
DELETE /attachments/:iddelete_attachmentEliminar un adjunto privado
GET /sending-identitieslist_sending_identitiesListar las identidades de remitente verificadas
GET /templateslist_templatesListar plantillas alojadas
POST /templatescreate_templateCrear una plantilla alojada
GET /templates/:idget_templateObtener borradores, versiones y uso
PUT /templates/:id/draftupdate_template_draftGuardar automáticamente el borrador de una plantilla
POST /templates/:id/draftcreate_template_draftCrear un borrador nuevo a partir de la versión publicada
POST /templates/:id/renderrender_templateRenderizar la salida exacta del servidor
POST /templates/:id/testsend_template_testEnviar una instantánea de prueba
POST /templates/:id/publishpublish_templatePublicar una versión inmutable de la plantilla
POST /templates/:id/archivearchive_templateArchivar una plantilla
POST /templates/:id/restorerestore_templateRestaurar una plantilla archivada
POST /domainsadd_domainAgregar un dominio de envío
GET /domainslist_domainsListar dominios y el estado DNS en caché
GET /domains/:idget_domainObtener los detalles de configuración de un dominio
POST /domains/:id/verifyverify_domainActualizar la verificación de SES y DNS
POST /domains/:id/inbound/setupsetup_inboundHabilitar la recepción de correo entrante de SES
POST /domains/:id/inbound/verifyverify_inboundVerificar el enrutamiento MX de entrada
DELETE /domains/:iddelete_domainEliminar un dominio
GET /dns/providerget_dns_providerDetectar el proveedor de DNS autoritativo y los hosts relativos de los registros
GET /dns/domain-connect/connectget_domain_connect_linkCrear un enlace de consentimiento de Domain Connect para la configuración DNS con un clic
POST /inboxescreate_inboxCrear una dirección de entrada
GET /inboxeslist_inboxesListar direcciones de entrada
GET /inboxes/:idget_inboxObtener una dirección de entrada
PATCH /inboxes/:idupdate_inboxRenombrar, habilitar o deshabilitar una bandeja de entrada
PUT /inboxes/:id/forwardingset_inbox_forwardingReenviar el correo recibido en una bandeja de entrada a otra dirección
DELETE /inboxes/:iddelete_inboxEliminar una bandeja de entrada conservando los mensajes
GET /deliverability/statsdeliverability_statsObtener las estadísticas de entrega de 30 días
GET /deliverability/reputationlist_sender_reputationListar el estado de reputación por identidad de remitente exacta
GET /suppressionslist_suppressionsListar las supresiones del espacio de trabajo
DELETE /suppressions/:emailremove_suppressionQuitar una supresión por rebote que cumpla los requisitos
GET /blocked-recipientslist_blocked_recipientsListar rebotes, quejas y bajas
GET /accountget_accountObtener la cuenta, el uso, el estado de facturación y los recuentos del espacio de trabajo con una clave de API
GET /analyticsget_analyticsObtener las analíticas de envío del panel de 7, 30 o 90 días
GET /profileget_accountGemelo de GET /account solo para sesiones; el servidor MCP lee la ruta con clave de API.
POST /billing/checkoutno expuestoPor diseño, los cambios de facturación solo se hacen con sesión y requieren al propietario de la cuenta en el panel. El estado de facturación se puede leer con get_account.
POST /billing/cancelno expuestoPor diseño, los cambios de facturación solo se hacen con sesión y requieren al propietario de la cuenta en el panel. El estado de facturación se puede leer con get_account.
POST /keysno expuestoExcluido deliberadamente: un agente no debe emitir ni destruir credenciales. Las claves las gestiona una persona en el panel.
GET /keyslist_api_keysListar los metadatos de las claves de API
DELETE /keys/:idno expuestoExcluido deliberadamente: un agente no debe emitir ni destruir credenciales. Las claves las gestiona una persona en el panel.

No disponible deliberadamente

CapacidadEndpointsMotivo
Crear, rotar, revocar o eliminar claves de APIPOST /keys, DELETE /keys/:idExcluido deliberadamente: un agente no debe emitir ni destruir credenciales. Las claves las gestiona una persona en el panel.
Iniciar una página de pago o cancelar una suscripciónPOST /billing/checkout, POST /billing/cancelPor diseño, los cambios de facturación solo se hacen con sesión y requieren al propietario de la cuenta en el panel. El estado de facturación se puede leer con get_account.
DNS con un clic de Cloudflare (OAuth)GET /api/dns/cloudflare/connectRequiere una sesión interactiva del navegador y el consentimiento OAuth de Cloudflare. En su lugar, use los registros de get_domain, los hosts de get_dns_provider o get_domain_connect_link.
Registro, inicio de sesión, cierre de sesión, vinculación de cuenta de Google/api/auth/*Autenticación humana en el navegador; el servidor MCP se autentica con una clave de API.
Formulario de contacto con soportePOST /api/contactFormulario público del sitio de marketing para personas, no una operación del espacio de trabajo.

Catálogo legible por máquinas: /docs/mcp/tools.json (esquemas, anotaciones, correspondencia con endpoints, exclusiones). Versión Markdown de esta página: /docs/mcp.md. Con la CLI instalada, sendhq commands --format json imprime el mismo catálogo.