Para agentes de IA

Servidor MCP do SendHQ

Dê a um agente de IA controle total e seguro de um workspace do SendHQ: envie e receba e-mails, verifique domínios, publique templates e investigue a entregabilidade com 59 ferramentas estritamente tipadas. Escrito primeiro para agentes; humanos também são bem-vindos.

59 ferramentastransporte stdio, um único comando0 ferramentas de gerenciamento de chaves
Instalar e 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

O que é este servidor

O servidor MCP do SendHQ permite que um agente de IA opere um workspace do SendHQ por meio do Model Context Protocol: enviar e-mails (individuais, em lote, com template, respostas, anexos, novas tentativas idempotentes), ler e pesquisar e-mails enviados e recebidos (assuntos, corpos e nomes de anexos) e seus eventos de entrega, organizar e-mails em marcadores com regras de arquivamento automático, gerenciar rascunhos e anexos privados, criar e publicar templates hospedados, adicionar e verificar domínios e seu DNS, configurar o recebimento de e-mails e endereços de entrada, inspecionar entregabilidade, bounces, reclamações e supressões, e ler uso da conta, estado de cobrança, análises e metadados de chaves de API.

É um servidor stdio local, embutido no binário da CLI sendhq. Seu cliente MCP inicia sendhq mcp como processo filho e fala JSON-RPC por stdin/stdout. Cada chamada de ferramenta vira uma requisição documentada à API REST do SendHQ em https://sendhq.cc/api/v1, autenticada com a chave de API do seu workspace; portanto, o servidor MCP tem exatamente as permissões dessa chave e nenhuma a mais.

  • 59 ferramentas em 8 grupos, geradas a partir de um único catálogo que também é publicado como tools.json.
  • JSON Schemas estritos: argumentos desconhecidos, tipos errados e campos obrigatórios ausentes são rejeitados localmente, antes de qualquer coisa chegar ao SendHQ.
  • Erros estruturados com um code estável, o status HTTP, uma explanation, um remedy concreto e a indicação de que tentar novamente pode ajudar ou não.
  • Toda ferramenta que envia e-mail real ou destrói dados avisa isso nas primeiras palavras da descrição e traz anotações de segurança do MCP.
  • O modo --read-only oculta todas as ferramentas de envio e de alteração.
  • Nada é registrado em log. O stdout carrega apenas mensagens do protocolo; a chave de API e o conteúdo das mensagens nunca chegam a um log.
Não é o endpoint MCP da documentação.O SendHQ também hospeda um pequeno endpoint MCP de documentação, somente leitura, em https://sendhq.cc/api/mcp (consulta de preços e documentação, sem acesso à conta). O servidor desta página é o completo, com escopo de conta; ele roda localmente ou como o conector hospedado abaixo.

Use o SendHQ no Claude e no ChatGPT

Não é preciso instalar nada: o SendHQ também executa este servidor como conector hospedado em https://mcp.sendhq.cc/mcp, com as mesmas ferramentas. Você entra com sua conta do SendHQ em vez de colar uma chave.

Claude

  1. Abra Settings → Connectors e encontre o SendHQ no diretório, ou escolha Add custom connector e cole https://mcp.sendhq.cc/mcp.
  2. Clique em Connect, entre no SendHQ, revise o acesso e clique em Allow.
  3. Peça ao Claude para verificar sua caixa de entrada, enviar um e-mail do seu domínio verificado ou explicar um bounce.

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.

Aprovação e desconexão

  • The request_feature tool sends a feature request to the SendHQ team with your account details, so we can follow up by email.
  • As ferramentas que enviam e-mail real ou excluem dados são identificadas como tal. Se o assistente pergunta antes é uma configuração por ferramenta no próprio assistente: no Claude, escolha Needs approval para essas ferramentas em Settings → Connectors → SendHQ.
  • O conector recebe a própria chave de API, com o nome do assistente (por exemplo, “Claude (AI connector)”). Exclua-a em API Keys para desconectar imediatamente.
  • Ele não pode criar nem revogar chaves de API, nem alterar a cobrança. Os anexos são enviados e retornados em base64; não há acesso a arquivos locais.
  • Workspaces sem plano pago (teste de integração) só podem entregar para o e-mail da conta ou para um endereço do simulador do AWS SES.

Dúvidas: postmaster@sendhq.cc. Privacidade: sendhq.cc/privacy.

Instalação

Instale o binário sendhq (Linux, macOS e Windows em x86-64 e arm64). O instalador verifica o checksum da versão e coloca o binário em ~/.local/bin por padrão.

macOS e Linux
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
Windows PowerShell
irm https://downloads.sendhq.cc/install.ps1 | iex
Verifique a instalação
sendhq version
SENDHQ_API_KEY=re_your_key sendhq doctor

Crie uma chave de API no painel em https://sendhq.cc/app#/keys. O servidor MCP não pode criar chaves. O único comando que executa o servidor é:

Execute o servidor stdio
SENDHQ_API_KEY=re_your_key sendhq mcp

Normalmente você nunca o executa manualmente: o cliente MCP o inicia. Quando executado em um terminal, ele fica aguardando JSON-RPC no stdin.

Configure seu 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

Adicione --scope user para disponibilizá-lo em todos os projetos, ou --scope project para gravá-lo no .mcp.json do projeto. Em um .mcp.json compartilhado, referencie a chave pelo ambiente em vez de fazer commit dela; o Claude Code expande ${VAR} no .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" }

Ou pela linha de comando: 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\) e reinicie o app. Aplicativos de desktop não herdam o PATH do seu shell; use o caminho absoluto do binário (which sendhq).

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

Qualquer outro cliente MCP

Configure um servidor stdio com o comando sendhq, os argumentos ["mcp"] (opcionalmente "--read-only") e as variáveis de ambiente abaixo. O servidor aceita as versões 2024-11-05, 2025-03-26, 2025-06-18 e 2025-11-25 do protocolo MCP e implementa initialize, ping, tools/list e tools/call. Os resultados das ferramentas trazem um bloco de texto JSON e também structuredContent.

Teste rápido de stdio bruto (envie por pipe para 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":{}}}

Não há transporte HTTP hospedado para o servidor com escopo de conta. Um endpoint MCP remoto com permissão de escrita exigiria OAuth por usuário, que o SendHQ não oferece; o binário local mantém a chave na máquina que já a possui.

Ambiente e flags

Variável ou flagObrigatórioSignificado
SENDHQ_API_KEYsimChave de API do workspace (re_…). Todas as ferramentas, exceto get_service_health, precisam dela. Sem ela, o servidor ainda inicia e toda chamada retorna um auth_error estruturado explicando como corrigir.
SENDHQ_API_BASE_URLnãoURL base da API. Padrão: https://sendhq.cc/api/v1. Use apenas em um deploy local ou de staging. SENDHQ_BASE_URL é aceita como alias antigo.
SENDHQ_MCP_READ_ONLYnão1, true ou yes se comporta como --read-only.
--read-onlynãoExpõe apenas as ferramentas que não enviam e-mail nem alteram estado. As ferramentas ocultas também são recusadas se chamadas pelo nome.
SENDHQ_PROFILE / --profilenãoUsa uma chave armazenada por sendhq auth login no chaveiro do sistema operacional em vez de SENDHQ_API_KEY. A variável de ambiente prevalece quando ambas existem.

A chave é enviada somente no cabeçalho Authorization: Bearer para a URL base configurada. Ela nunca é impressa, registrada em log, repetida em erros nem incluída nos resultados das ferramentas.

Modelo de segurança para agentes

  • Envia e-mail real. send_email, send_batch e send_template_test entregam e-mails a pessoas reais e consomem créditos de entrega. As descrições delas começam com SENDS REAL EMAIL. Chame-as somente quando o usuário tiver pedido explicitamente o envio daquela mensagem específica, com destinatários, remetente e conteúdo confirmados.
  • Destrutivas. delete_email, delete_draft, delete_attachment, delete_domain, delete_inbox e remove_suppression são marcadas com destructiveHint: true e suas descrições começam com DESTRUCTIVE. Confirme antes com o usuário. remove_suppression enfraquece um bloqueio de segurança e só é apropriada quando uma pessoa confirma que o endereço voltou a funcionar.
  • Altera estado. Criar ou atualizar rascunhos, templates, domínios e caixas de entrada, publicar templates e iniciar a verificação alteram o workspace, mas não enviam e-mails.
  • Somente leitura. Todo o resto é readOnlyHint: true e pode ser chamado livremente.
  • O DNS nunca é alterado por este servidor. add_domain retorna registros para uma pessoa publicar; get_domain_connect_link retorna uma URL de consentimento que uma pessoa precisa abrir e aprovar no provedor de DNS.
  • A cobrança nunca é alterada por este servidor. get_account lê apenas o plano, o uso e o estado da assinatura.
  • Workspaces sem plano pago (teste de integração) só podem entregar para o e-mail do dono da conta (get_account → user.email) ou para um endereço do simulador do AWS SES, como success@simulator.amazonses.com, e não podem enviar anexos.
  • Aceito não é entregue. Um envio bem-sucedido retorna um ID; as evidências de entrega, bounce e reclamação chegam depois em list_email_events. Nunca afirme que o e-mail chegou à caixa de entrada nem que alguém leu a mensagem.
  • Não troque o endereço De para contornar uma pausa 423 e nunca adicione de novo destinatários que se descadastraram ou reclamaram.

Chaves de API estão fora do escopo

Por design, não há ferramentas que criem, modifiquem, rotacionem, revoguem ou excluam chaves de API. Um agente não deve emitir nem destruir credenciais. list_api_keys retorna apenas nomes, prefixos não secretos e horários do último uso. O gerenciamento de chaves fica no painel, com uma pessoa autenticada.

Fluxos de trabalho

1. Primeiro envio

  1. get_service_health confirma que a API está acessível (funciona sem chave).
  2. get_account mostra o plano (access.tier), a cota restante e user.email. No teste, esse e-mail é o único destinatário real permitido.
  3. list_sending_identities lista os endereços De que você pode usar. Se estiver vazia, faça primeiro o fluxo de domínio.
  4. Confirme remetente, destinatário, assunto e corpo com o usuário e, depois, use send_email com um idempotency_key.
  5. list_email_events com o id retornado mostra delivery, bounce, complaint ou reject assim que o provedor informa (em geral, de segundos a minutos).
Primeiro envio
{
  "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. Verificação de domínio de ponta a ponta

  1. add_domain com name: "example.com". O resultado inclui os registros DNS (CNAMEs de DKIM, verificação do SES, SPF, DMARC recomendado).
  2. get_dns_provider com o domain_id detecta o provedor de DNS autoritativo e retorna o host relativo exato a informar para cada registro nesse provedor.
  3. Se providers.domainConnect.available for true, get_domain_connect_link retorna uma URL de consentimento. Entregue-a a uma pessoa; nada muda até que ela aprove no provedor. Caso contrário, entregue à pessoa os registros a publicar. Nunca publique um segundo registro SPF: incorpore include:amazonses.com ao valor v=spf1 existente.
  4. verify_domain verifica de novo o DNS e o SES. O status passa por pending, checking e propagating até verified. Consulte verify_domain ou get_domain a cada 30 a 60 segundos; o DNS pode levar de minutos a horas.
  5. Quando status for verified, os endereços do domínio aparecem em list_sending_identities.

3. Bounces, reclamações e supressões

  1. list_blocked_recipients retorna todos os endereços bloqueados com o motivo (bounce, complaint, unsubscribe) e uma contagem resumida.
  2. list_suppressions retorna as supressões por hard bounce e por reclamação; deliverability_stats traz as taxas de entrega, bounce e reclamação dos últimos 30 dias; list_sender_reputation mostra quais endereços De estão com o ritmo reduzido ou pausados.
  3. Um envio que contém um destinatário suprimido falha com 422 recipient_suppressed. Remova esse destinatário e envie de novo.
  4. Somente quando uma pessoa confirmar que uma caixa postal que deu bounce voltou a funcionar, chame remove_suppression. Supressões por reclamação são permanentes (409 complaint_suppression_locked).

4. Receber e-mails de entrada

  1. O domínio (muitas vezes um subdomínio, como inbound.example.com) precisa estar verificado.
  2. setup_inbound provisiona o recebimento e retorna um registro MX. Uma pessoa o publica.
  3. verify_inbound até que status seja ready.
  4. create_inbox com domain_id e local_part (por exemplo, support) cria support@inbound.example.com.
  5. Consulte list_emails com direction: "in" e unread: true (opcionalmente inbox_id). Leia uma mensagem com get_email, a conversa com get_thread, os anexos com download_attachment e marque-a como tratada com mark_email (read: true).
  6. Responda na mesma thread com send_email e reply_to_email_id; o SendHQ define In-Reply-To, References e a thread.

5. Webhooks e notificações de eventos

Atualmente, o SendHQ não oferece webhooks configuráveis pelo cliente, portanto não há uma ferramenta de webhook. As notificações dos provedores são processadas dentro do SendHQ e expostas por meio de leituras. Em vez disso, faça polling: list_email_events para o resultado de uma mensagem, list_emails com status (por exemplo, bounced) ou after para mudanças recentes, list_emails com direction: "in" e unread: true para novos e-mails de entrada e list_blocked_recipients para novas supressões. Consulte no máximo cerca de uma vez por minuto para cada pergunta.

6. Diagnosticar uma falha de entrega

  1. Encontre a mensagem: list_emails com direction: "out" e to ou query, ou get_email se você tiver o ID. status: failed significa que o SendHQ ou o provedor a rejeitou na submissão; o erro do e-mail explica o motivo.
  2. list_email_events: bounce (permanente ou transitório, com o diagnóstico do provedor), complaint, reject ou delivery. Nenhum evento ainda significa que o provedor não informou nada; aguarde e verifique de novo.
  3. Se a própria chamada de envio falhou, leia o code do erro: sender_domain_unverified → conclua a verificação do domínio; recipient_suppressed → o endereço já teve hard bounce ou reclamação; sender_paused → inspecione list_sender_reputation e corrija a origem da lista; trial_recipient_restricted → limites do teste; quota_exhausted → uso em get_account.
  4. get_domain verifica se DKIM, SPF e DMARC ainda estão publicados; deliverability_stats mostra se o problema é uma única mensagem ou uma tendência.
  5. Relate o que as evidências mostram. Um evento delivery significa que o servidor do destinatário aceitou a mensagem, não que ela chegou à caixa de entrada nem que foi lida.

7. Tenha uma categoria de tarefas (marcadores)

  1. create_label com name (por exemplo, Agent/Orders) e skip_inbox: true. Isso transforma o marcador em uma categoria: os e-mails recebidos que a recebem são arquivados e aparecem apenas no marcador, nunca na Caixa de entrada da pessoa.
  2. Envie e-mails de tarefas com send_email (ou send_batch) e labels: ["Agent/Orders"]. As respostas a essa conversa herdam o marcador automaticamente e não vão para a Caixa de entrada.
  3. Para e-mails que começam fora das suas conversas, adicione uma regra de arquivamento: create_label_rule com inbox_id (um endereço dedicado, como orders@…), from, to ou subject. Passe apply_to_existing: true para arquivar e-mails já recebidos.
  4. Trabalhe a categoria: list_emails com label: "Agent/Orders", direction: "in" e unread: true; leia com get_email ou get_thread, responda com send_email e reply_to_email_id e use mark_email com read: true quando concluir.
  5. Mova uma mensagem avulsa para dentro ou para fora com label_email (add / remove). Adicionar o marcador de uma categoria a uma mensagem recebida também a arquiva.
  6. Opcionalmente, set_inbox_forwarding envia uma cópia de tudo o que um endereço de recebimento recebe para outra caixa postal (o destino confirma antes por e-mail).
Enviar para uma categoria
{
  "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. Anexos e templates

Anexe até 10 arquivos com attachments de send_email (cada um precisa de content_base64 ou de um file_path local; filename assume por padrão o nome-base do arquivo) em um plano pago. Para templates hospedados: create_template → update_template_draft → render_template para pré-visualizar com dados de exemplo → send_template_test (envia um teste real) → publish_template e, depois, envie com send_email ou send_batch usando template: {key, data} e exatamente um destinatário em to.

Resultados, paginação e erros

Uma chamada bem-sucedida retorna o objeto JSON da API como structuredContent e como bloco de texto JSON. Toda ferramenta list_* aceita limit (1–200, padrão 50) e offset, e adiciona um objeto pagination. Continue chamando com offset: pagination.next_offset enquanto has_more for true.

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

Uma chamada com falha retorna isError: true com um erro estruturado. Siga o remedy em vez de tentar novamente às cegas; só tente de novo quando retryable for true.

Erro estruturado de ferramenta
{
  "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 erro opcionais: request_id (informe-o ao suporte), retry_after_seconds, problems (lista de violações de schema para invalid_arguments) e idempotent_replayed (veja Idempotência).

Idempotência

send_email e send_batch aceitam idempotency_key (máx. 200 caracteres), enviado como o cabeçalho Idempotency-Key. Gere uma chave estável por mensagem lógica, por exemplo invoice-4812-receipt.

  • Uma nova tentativa deve reutilizar a mesma chave E um corpo de requisição idêntico. A mesma chave com qualquer alteração (destinatário, assunto, corpo, cabeçalho, dados do template, até valores de argumentos) retorna 409 idempotency_conflict.
  • Mesma chave, mesmo corpo, original já concluído: o SendHQ retorna o resultado armazenado sem enviar de novo. É assim que você tenta novamente com segurança após um timeout ou network_error.
  • Mesma chave enquanto o original ainda está em execução: 409 idempotency_in_progress, com nova tentativa possível após uma curta espera.
  • Uma nova mensagem lógica exige uma nova chave.
  • Falhas armazenadas também são reproduzidas. Se a primeira tentativa falhou, tentar de novo com a mesma chave retorna essa mesma falha com idempotent_replayed: true e retryable: false. Verifique list_emails (direction: out) para confirmar que nada saiu, corrija a causa e envie com uma nova chave.
  • O servidor nunca repete um POST por conta própria. Apenas chamadas GET somente leitura são repetidas automaticamente (até 3 tentativas em erros de rede, 429 e 5xx).
  • send_email com attachments inline não pode receber um idempotency_key, porque executa várias requisições. Para envios de anexos seguros para novas tentativas: create_draft → upload_attachment → send_email com draft_id e idempotency_key.
Envio seguro para novas tentativas (repita exatamente em caso de 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"
  }
}

Limites de taxa e cotas

O SendHQ não publica um limite fixo de requisições por segundo para a API. Os limites que um agente realmente encontra são limites de uso, retornados como 429:

  • Entregas mensais a destinatários por plano. Cada endereço em To, Cc e Bcc conta como uma entrega. Veja get_account → usage.recipientDeliveries vs. usage.emailQuotaMonth.
  • Destinatários diários por endereço De exato, definidos pelo estado de reputação desse remetente (list_sender_reputation → dailyLimit, 2.000 por padrão nos planos pagos).
  • Teste de integração: 100 destinatários no total, apenas para o e-mail da conta ou endereços do simulador do SES.
  • Anexos: no máximo 10 arquivos e 10 MB por mensagem; 10 GB de transferência de anexos ponderada por destinatário por mês nos planos pagos.
  • Por requisição: To + Cc + Bcc até 100 endereços; send_batch até 100 mensagens.
  • Disjuntor de reputação: em uma janela móvel de 7 dias, bounces ou reclamações acima do limite reduzem o ritmo ou pausam um endereço De (423 sender_paused). Ele se recupera automaticamente quando as taxas caem.

quota_exhausted não permite nova tentativa até que o período seja reiniciado ou o plano mude. rate_limited permite nova tentativa após retry_after_seconds; em envios, tente de novo com o mesmo idempotency_key e o corpo idêntico.

Catálogo de erros

code é estável; ramifique por ele e não por message.

codeHTTPRepetir?O que significa e o que fazer
invalid_arguments—nãoOs argumentos falharam no JSON Schema da ferramenta localmente; nada chegou ao SendHQ. Corrija os campos listados em problems.
auth_error401nãoChave de API ausente, revogada ou incorreta. Defina SENDHQ_API_KEY para o processo do servidor; uma pessoa cria as chaves no painel.
trial_recipient_restricted402nãoO teste de integração só pode entregar para o e-mail da conta ou para um endereço do simulador do SES. Envie para lá, ou o dono ativa um plano pago.
payment_required402nãoO recurso exige um plano pago (por exemplo, anexos). Envie sem ele ou faça upgrade.
sender_domain_not_owned403nãoO domínio De não está neste workspace. Use list_sending_identities ou add_domain.
sender_domain_unverified403nãoO domínio De ainda não foi verificado. get_domain, publique os registros que faltam, verify_domain.
domain_limit_reached403nãoLimite de domínios do plano atingido. Remova um domínio sem uso (com aprovação) ou faça upgrade.
marketing_not_enabled403nãoA classe de marketing não está habilitada para este domínio ou plano. Use transactional somente se a mensagem realmente for transacional.
forbidden403nãoA política não permite a operação. Ajuste a requisição.
not_found404nãoO ID não está neste workspace. Liste o recurso para encontrar o ID correto; restaure antes os templates arquivados.
idempotency_conflict409nãoChave reutilizada com um corpo diferente. Reenvie exatamente o original ou use uma nova chave para uma nova mensagem.
idempotency_in_progress409simA requisição original ainda está em execução. Aguarde e tente de novo com a mesma chave e o mesmo corpo.
revision_conflict409nãoO rascunho do template mudou desde que você o leu. get_template, faça o merge e salve de novo.
complaint_suppression_locked409nãoO destinatário reclamou. Nunca mais envie e-mail para ele.
inbound_not_ready409nãoO recebimento de e-mails de entrada não está pronto. setup_inbound, publique o MX, verify_inbound.
conflict409nãoO recurso já existe ou está no estado errado. Leia-o e ajuste.
attachments_too_large413nãoMais de 10 arquivos ou 10 MB. Remova ou reduza os anexos.
recipient_suppressed422nãoUm destinatário teve hard bounce ou reclamou antes. Remova-o; veja list_blocked_recipients.
recipient_unsubscribed422nãoUm destinatário optou por não receber e-mails de marketing. Remova-o permanentemente.
validation_failed422nãoConteúdo rejeitado, por exemplo dados de template que quebram o contrato de variáveis. Corrija a entrada.
sender_paused423nãoEste endereço De está pausado pelo disjuntor de bounces/reclamações de 7 dias. Pare, corrija a lista e aguarde a recuperação automática.
quota_exhausted429nãoLimite mensal, diário por remetente, de anexos ou do teste atingido. Verifique get_account; aguarde a renovação ou faça upgrade.
rate_limited429simReduza o ritmo; aguarde retry_after_seconds. Em envios: mesma chave, mesmo corpo.
server_error5xxsimFalha temporária do SendHQ ou do provedor. Use backoff e tente de novo; em envios, com a mesma chave e o mesmo corpo. Se idempotent_replayed for true, use uma nova chave depois de confirmar que nada foi enviado.
network_error—simRequisição ou resposta perdida. Tente de novo; em envios, o mesmo idempotency_key torna isso seguro.
invalid_request400nãoRequisição malformada. Leia message e corrija.
tool_error—nãoFalha local dentro do servidor MCP (por exemplo, um file_path ilegível). Leia message.

Referência das ferramentas

Todas as ferramentas com sua classe de segurança, o endpoint REST que chamam, os parâmetros, o formato de retorno e um exemplo de objeto de params de tools/call. Os parâmetros são exatos: o servidor rejeita qualquer coisa que não esteja listada.

E-mails e threads: send_email, send_batch, list_emails, get_email, mark_email, delete_email, list_email_events, get_thread
Marcadores e regras de arquivamento automático: list_labels, get_label, create_label, update_label, delete_label, create_label_rule, delete_label_rule, label_email
Rascunhos, anexos e identidades de remetente: list_sending_identities, create_draft, list_drafts, get_draft, update_draft, delete_draft, upload_attachment, download_attachment, delete_attachment
Templates hospedados: list_templates, create_template, get_template, update_template_draft, create_template_draft, render_template, send_template_test, publish_template, archive_template, restore_template
Domínios e DNS: list_domains, get_domain, add_domain, verify_domain, delete_domain, get_dns_provider, get_domain_connect_link
E-mail de entrada: setup_inbound, verify_inbound, list_inboxes, get_inbox, create_inbox, update_inbox, set_inbox_forwarding, delete_inbox
Entregabilidade, bounces e supressões: deliverability_stats, list_sender_reputation, list_suppressions, remove_suppression, list_blocked_recipients
Conta, uso, análises e chaves: get_account, get_analytics, list_api_keys, get_service_health

E-mails e threads

Envia e-mail realsend_email
POST /emails

Enviar um e-mail

ENVIA E-MAIL REAL. Envia uma mensagem de um domínio verificado: html/texto bruto, um template hospedado publicado, uma resposta em uma thread existente ou uma mensagem com anexos. Passe idempotency_key para que uma nova tentativa não envie duas vezes; a nova tentativa deve reutilizar a mesma chave E uma requisição idêntica, caso contrário o SendHQ retorna 409. attachments é uma conveniência que cria um rascunho, faz o upload de cada arquivo e envia com esse rascunho; não pode ser combinado com idempotency_key nem com draft_id (use create_draft + upload_attachment + send_email com draft_id para envios de anexos seguros para novas tentativas). Workspaces sem plano pago (teste de integração) só podem entregar para o e-mail da conta ou para um endereço do simulador do AWS SES, e não podem enviar anexos.

Informe pelo menos um destes: html, text, template.

ParâmetroTipoObrigatórioDescrição
fromstringsimRemetente, por exemplo Acme <hello@example.com>. O domínio precisa estar verificado neste workspace (veja list_sending_identities). (máx. 998 caracteres)
tostring[]simDestinatários. Cada entrada é um endereço, opcionalmente com nome de exibição. To+cc+bcc podem somar no máximo 100; cada destino consome um crédito de entrega. (1–100 itens)
ccstring[]nãoDestinatários em cópia. (0–100 itens)
bccstring[]nãoDestinatários em cópia oculta. (0–100 itens)
subjectstringnãoLinha de assunto. Omita ao enviar um template. (máx. 998 caracteres)
textstringnãoCorpo em texto simples. Informe text, html ou template.
htmlstringnãoCorpo em HTML. O SendHQ o sanitiza e gera o texto quando text é omitido.
reply_tostringnãoEndereço de Reply-To.
headersobjectnãoCabeçalhos personalizados seguros extras (valores em string), por exemplo {"X-Entity-Ref-ID": "123"}. Cabeçalhos de roteamento como From/To/Message-ID são controlados pelo SendHQ.
message_classstringnãotransactional (padrão) ou marketing. Marketing exige um plano ou domínio com marketing habilitado e adiciona o tratamento de descadastro. (um de transactional, marketing)
reply_to_email_idstringnãoResponde dentro de uma conversa existente: o ID em_… da mensagem que está sendo respondida. O SendHQ define In-Reply-To/References e a thread.
thread_idstringnãoID explícito da thread em que a mensagem será arquivada.
draft_idstringnãoEnvia os anexos de um rascunho armazenado com esta mensagem (dr_…). O rascunho é excluído após um envio bem-sucedido.
templateobjectnãoEnvia um template hospedado publicado em vez de html/texto bruto. Exige exatamente um destinatário em to e nenhum cc/bcc; o template fornece o assunto. Informe pelo menos um destes: id, key.
template.idstringnãoID do template (tmpl_…). Informe id ou key.
template.keystringnãoChave do template, como account-welcome. Informe id ou key.
template.version_idstringnãoID de release publicada opcional (tmplv_…). Por padrão, é a release publicada atual.
template.dataobjectnãoValores das variáveis tipadas do template.
labelsstring[]nãoNomes de marcadores ou IDs lbl_… em que esta mensagem será arquivada. Nomes desconhecidos são criados. As respostas na conversa herdam os marcadores, e um marcador de categoria (skip_inbox) mantém essas respostas fora da Caixa de entrada. Máx. 10. (0–10 itens)
idempotency_keystringnãoCabeçalho Idempotency-Key (máx. 200 caracteres). Reutilize-o apenas para tentar de novo exatamente esta requisição. (máx. 200 caracteres)
attachmentsobject[]nãoArquivos a anexar (máx. 10 arquivos, 10 MB no total). Cada um precisa de content_base64 (mais filename) ou de um file_path local. (0–10 itens) Informe pelo menos um destes: content_base64, file_path.
attachments[].filenamestringnãoNome do arquivo exibido ao destinatário. Obrigatório com content_base64; por padrão, é o nome-base de file_path. (máx. 255 caracteres)
attachments[].content_typestringnãoTipo MIME, por exemplo application/pdf. O padrão é application/octet-stream.
attachments[].content_base64stringnãoConteúdo do arquivo em base64 padrão.
attachments[].file_pathstringnãoCaminho absoluto de um arquivo local legível pelo processo do servidor MCP.
Retorno{id: em_…, providerMessageId, threadId, templateId, templateVersionId, isTest}. Aceito não é entregue: acompanhe com list_email_events.
Exemplo 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"
  }
}
Envia e-mail realsend_batch
POST /emails/batch

Enviar um lote de e-mails individualizados

ENVIA E-MAIL REAL. Envia de 1 a 100 mensagens independentes em uma única requisição (use para personalização de template por destinatário). Cada item tem o mesmo formato de send_email (sem attachments/idempotency_key). Os itens têm sucesso ou falha individualmente: HTTP 207 significa sucesso parcial; inspecione data[i].ok e data[i].error de cada um. Um único idempotency_key cobre todo o corpo do lote.

ParâmetroTipoObrigatórioDescrição
emailsobject[]simMensagens a enviar. (1–100 itens) Informe pelo menos um destes: html, text, template.
idempotency_keystringnãoIdempotency-Key para todo o lote (máx. 200 caracteres). (máx. 200 caracteres)
Retorno{data: [{index, ok, id?, error?: {message, status}}], count, successful, failed}.
Exemplo 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"
  }
}
Somente leituralist_emails
GET /emails

Listar e pesquisar e-mails

Lista e-mails enviados (direction: out) e recebidos (direction: in) do mais novo para o mais antigo, com filtros. Os e-mails recebidos são classificados: leia a caixa de entrada da pessoa com direction: in, archived: false, category: primary; faça a triagem com important: true; o spam fica oculto, a menos que category: spam ou include_spam: true. Paginado: o resultado inclui pagination {offset, limit, returned, total?, has_more, next_offset}.

ParâmetroTipoObrigatórioDescrição
directionstringnãoin para recebidos, out para enviados. (um de in, out)
statusstringnãoFiltro de status, por exemplo queued, sent, delivered, bounced, complained, failed.
domainstringnãoApenas mensagens deste domínio, ou de uma lista de domínios separados por vírgula (corresponde a qualquer um).
inbox_idstringnãoApenas mensagens recebidas por esta caixa de entrada (inb_…).
labelstringnãoApenas mensagens com este marcador: um ID de marcador lbl_… ou o nome exato, ou uma lista separada por vírgula (corresponde a qualquer um). Use list_labels para ver as pastas.
archivedbooleannãofalse = a visualização da Caixa de entrada (e-mails recebidos não arquivados), true = apenas arquivados. Omita para todos os e-mails.
categorystringnãoprimary (pessoas), updates (newsletters, envios em massa, automáticos) ou spam; ou uma lista separada por vírgula. O spam fica oculto, a menos que solicitado.
importantbooleannãotrue = apenas mensagens marcadas como importantes (respostas a conversas que você iniciou e remetentes marcados como importantes).
include_spambooleannãoInclui spam nos resultados (para pesquisas em todas as pastas).
fromstringnãoO endereço do remetente contém este valor.
tostringnãoO endereço do destinatário contém este valor.
unreadbooleannãotrue = apenas não lidas, false = apenas lidas.
afterstringnãoTimestamp ISO-8601; apenas mensagens criadas depois dele. (date-time)
beforestringnãoTimestamp ISO-8601; apenas mensagens criadas antes dele. (date-time)
querystringnãoPesquisa de texto livre em assuntos, corpos, endereços de remetente/destinatário e nomes de arquivos de anexos. (máx. 200 caracteres)
limitintegernãoTamanho da página. O padrão é 50. (padrão 50; 1–200)
offsetintegernãoNúmero de registros a ignorar. Use pagination.next_offset da página anterior. (padrão 0; 0–…)
Retorno{data: [resumos de e-mails], count, pagination}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "list_emails",
  "arguments": {
    "direction": "in",
    "unread": true,
    "limit": 25
  }
}
Somente leituraget_email
GET /emails/:email_id

Obter um e-mail

Recupera uma mensagem com cabeçalhos, corpo html/texto, status, metadados da thread e metadados dos anexos (baixe os bytes com download_attachment).

ParâmetroTipoObrigatórioDescrição
email_idstringsimID do e-mail (começa com em_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
RetornoObjeto de e-mail: {id, direction, status, from, to, cc, bcc, subject, html, text, threadId, messageId, providerMessageId, readAt, createdAt, attachments: [{id, filename, contentType, sizeBytes, available}]}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "get_email",
  "arguments": {
    "email_id": "em_123"
  }
}
Altera estadomark_email
PATCH /emails/:email_id

Marcar como lido, arquivado, spam ou importante

Atualiza uma mensagem: read, archived, category (primary, updates, spam; apenas e-mails recebidos) e important. Denunciar spam ou marcar como importante ensina o SendHQ sobre esse remetente para os próximos e-mails; passe learn: false para alterar apenas esta mensagem. Informe pelo menos um campo.

ParâmetroTipoObrigatórioDescrição
email_idstringsimID do e-mail (começa com em_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
readbooleannãotrue = lida, false = não lida.
archivedbooleannãotrue = arquivar (não vai para a Caixa de entrada), false = mover de volta para a Caixa de entrada.
categorystringnãoMove uma mensagem recebida para primary, updates ou spam. (um de primary, updates, spam)
importantbooleannãoMarca ou desmarca a mensagem como importante.
learnbooleannãofalse = não memorizar este veredito para o remetente (padrão true).
RetornoO objeto de e-mail atualizado.
AnotaçõesidempotentHint
Exemplo de params de tools/call
{
  "name": "mark_email",
  "arguments": {
    "email_id": "em_123",
    "read": true
  }
}
Destrutivadelete_email
DELETE /emails/:email_id

Excluir um e-mail

DESTRUTIVA: exclui permanentemente do SendHQ uma mensagem retida e seus anexos armazenados. Não recolhe uma mensagem que já foi entregue.

ParâmetroTipoObrigatórioDescrição
email_idstringsimID do e-mail (começa com em_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
Retorno{ok: true}.
AnotaçõesdestructiveHint idempotentHint
Exemplo de params de tools/call
{
  "name": "delete_email",
  "arguments": {
    "email_id": "em_123"
  }
}
Somente leituralist_email_events
GET /emails/:email_id/events

Listar eventos de entrega de um e-mail

Eventos do provedor para uma mensagem enviada: delivery, bounce, complaint, reject, open, click. Esta é a evidência de que uma mensagem foi entregue ou do motivo da falha. Paginado: o resultado inclui pagination {offset, limit, returned, total?, has_more, next_offset}.

ParâmetroTipoObrigatórioDescrição
email_idstringsimID do e-mail (começa com em_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
limitintegernãoTamanho da página. O padrão é 50. (padrão 50; 1–200)
offsetintegernãoNúmero de registros a ignorar. Use pagination.next_offset da página anterior. (padrão 0; 0–…)
Retorno{data: [{event_type, recipient, reason, created_at, …}], count, pagination}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "list_email_events",
  "arguments": {
    "email_id": "em_123"
  }
}
Somente leituraget_thread
GET /threads/:thread_id

Obter uma conversa

Recupera todas as mensagens de uma conversa em ordem cronológica (enviadas e recebidas), cada uma com os metadados dos anexos.

ParâmetroTipoObrigatórioDescrição
thread_idstringsimID da thread (em geral, o ID em_… da primeira mensagem; veja threadId em qualquer e-mail). (máx. 128 caracteres)
Retorno{id, subject, data: [e-mails]}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "get_thread",
  "arguments": {
    "thread_id": "em_123"
  }
}

Marcadores e regras de arquivamento automático

Somente leituralist_labels
GET /labels

Listar marcadores

Lista os marcadores (pastas) do workspace com as contagens total e de não lidos e suas regras de arquivamento automático. Paginado: o resultado inclui pagination {offset, limit, returned, total?, has_more, next_offset}.

ParâmetroTipoObrigatórioDescrição
limitintegernãoTamanho da página. O padrão é 50. (padrão 50; 1–200)
offsetintegernãoNúmero de registros a ignorar. Use pagination.next_offset da página anterior. (padrão 0; 0–…)
Retorno{data: [{id, name, color, totalCount, unreadCount, rules: [...]}], count, pagination}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "list_labels",
  "arguments": {}
}
Somente leituraget_label
GET /labels/:label_id

Obter um marcador

Recupera um marcador com contagens e regras de arquivamento automático.

ParâmetroTipoObrigatórioDescrição
label_idstringsimID do marcador (começa com lbl_) ou o nome exato do marcador. (máx. 128 caracteres)
RetornoObjeto de marcador.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "get_label",
  "arguments": {
    "label_id": "Billing"
  }
}
Altera estadocreate_label
POST /labels

Criar um marcador

Cria um marcador no estilo de pasta. Defina skip_inbox: true para transformá-lo em uma categoria que pertence a um agente: envie com labels: [name] e as respostas são arquivadas no marcador e mantidas fora da Caixa de entrada. Regras opcionais de arquivamento automático arquivam e-mails novos enviados/recebidos (todas as condições de uma regra precisam corresponder). Defina apply_to_existing para arquivar também os e-mails retidos.

ParâmetroTipoObrigatórioDescrição
namestringsimNome do marcador, por exemplo Billing ou Clients/Acme. Único por workspace (sem diferenciar maiúsculas de minúsculas). (máx. 64 caracteres)
colorstringnãoCor hexadecimal, como #1a73e8. Opcional.
skip_inboxbooleannãoModo categoria: os e-mails recebidos que recebem este marcador (por regra, por resposta a uma conversa enviada com este marcador ou manualmente) são arquivados e aparecem apenas no marcador, não na Caixa de entrada.
rulesobject[]nãoRegras opcionais de arquivamento automático (máx. 20). Cada uma precisa de pelo menos um entre inbox_id, from, to, subject. (0–20 itens)
rules[].directionstringnãoApenas e-mails in (recebidos) ou out (enviados). Omita para ambos. (um de in, out)
rules[].inbox_idstringnãoApenas e-mails recebidos por esta caixa de entrada (inb_…). Arquiva cada endereço de recebimento em sua própria pasta.
rules[].fromstringnãoO remetente contém este texto (sem diferenciar maiúsculas de minúsculas), por exemplo @stripe.com. (máx. 200 caracteres)
rules[].tostringnãoTo/Cc contém este texto (sem diferenciar maiúsculas de minúsculas). (máx. 200 caracteres)
rules[].subjectstringnãoO assunto contém este texto (sem diferenciar maiúsculas de minúsculas). (máx. 200 caracteres)
rules[].skip_inboxbooleannãoArquiva os e-mails recebidos correspondentes para que apareçam apenas na pasta do marcador, não na Caixa de entrada.
apply_to_existingbooleannãoArquiva também os e-mails já retidos que correspondem às regras.
RetornoO marcador criado, com as regras.
Exemplo de params de tools/call
{
  "name": "create_label",
  "arguments": {
    "name": "Agent/Orders",
    "skip_inbox": true,
    "rules": [
      {
        "from": "@stripe.com"
      }
    ]
  }
}
Altera estadoupdate_label
PATCH /labels/:label_id

Renomear, mudar a cor ou transformar um marcador em categoria

Renomeia um marcador, muda sua cor ou alterna o modo categoria (skip_inbox). Ativar o modo categoria arquiva os e-mails recebidos que já estão no marcador.

ParâmetroTipoObrigatórioDescrição
label_idstringsimID do marcador (começa com lbl_) ou o nome exato do marcador. (máx. 128 caracteres)
namestringnãoNovo nome. (máx. 64 caracteres)
colorstringnãoNova cor hexadecimal.
skip_inboxbooleannãoModo categoria: os e-mails recebidos que recebem este marcador (por regra, por resposta a uma conversa enviada com este marcador ou manualmente) são arquivados e aparecem apenas no marcador, não na Caixa de entrada.
RetornoMarcador atualizado.
AnotaçõesidempotentHint
Exemplo de params de tools/call
{
  "name": "update_label",
  "arguments": {
    "label_id": "lbl_123",
    "name": "Finance/Billing"
  }
}
Destrutivadelete_label
DELETE /labels/:label_id

Excluir um marcador

DESTRUTIVA: exclui um marcador e suas regras. O e-mail em si é mantido; ele apenas perde este marcador.

ParâmetroTipoObrigatórioDescrição
label_idstringsimID do marcador (começa com lbl_) ou o nome exato do marcador. (máx. 128 caracteres)
Retorno{ok: true}.
AnotaçõesdestructiveHint idempotentHint
Exemplo de params de tools/call
{
  "name": "delete_label",
  "arguments": {
    "label_id": "lbl_123"
  }
}
Altera estadocreate_label_rule
POST /labels/:label_id/rules

Adicionar uma regra de arquivamento automático

Adiciona uma regra a um marcador para que os novos e-mails correspondentes sejam arquivados automaticamente. Todas as condições definidas precisam corresponder. Use inbox_id para dar a um endereço de recebimento a própria pasta; adicione skip_inbox para mantê-lo fora da Caixa de entrada.

ParâmetroTipoObrigatórioDescrição
label_idstringsimID do marcador (começa com lbl_) ou o nome exato do marcador. (máx. 128 caracteres)
directionstringnãoApenas e-mails in (recebidos) ou out (enviados). Omita para ambos. (um de in, out)
inbox_idstringnãoApenas e-mails recebidos por esta caixa de entrada (inb_…). Arquiva cada endereço de recebimento em sua própria pasta.
fromstringnãoO remetente contém este texto (sem diferenciar maiúsculas de minúsculas), por exemplo @stripe.com. (máx. 200 caracteres)
tostringnãoTo/Cc contém este texto (sem diferenciar maiúsculas de minúsculas). (máx. 200 caracteres)
subjectstringnãoO assunto contém este texto (sem diferenciar maiúsculas de minúsculas). (máx. 200 caracteres)
skip_inboxbooleannãoArquiva os e-mails recebidos correspondentes para que apareçam apenas na pasta do marcador, não na Caixa de entrada.
apply_to_existingbooleannãoArquiva também os e-mails já retidos que correspondem.
Retorno{id: lrule_…, labelId, direction, inboxId, from, to, subject, skipInbox}.
Exemplo de params de tools/call
{
  "name": "create_label_rule",
  "arguments": {
    "label_id": "Billing",
    "inbox_id": "inb_123",
    "skip_inbox": true
  }
}
Destrutivadelete_label_rule
DELETE /labels/:label_id/rules/:rule_id

Excluir uma regra de arquivamento automático

DESTRUTIVA: remove uma regra de arquivamento automático. Os e-mails já arquivados mantêm o marcador.

ParâmetroTipoObrigatórioDescrição
label_idstringsimID do marcador (começa com lbl_) ou o nome exato do marcador. (máx. 128 caracteres)
rule_idstringsimID da regra (começa com lrule_), obtido em get_label. (máx. 128 caracteres)
Retorno{ok: true}.
AnotaçõesdestructiveHint idempotentHint
Exemplo de params de tools/call
{
  "name": "delete_label_rule",
  "arguments": {
    "label_id": "lbl_123",
    "rule_id": "lrule_123"
  }
}
Altera estadolabel_email
POST /emails/:email_id/labels

Adicionar ou remover marcadores de um e-mail

Move uma mensagem entre pastas: adiciona e/ou remove marcadores por nome ou por ID lbl_…. Nomes desconhecidos em add são criados, a menos que create seja false.

ParâmetroTipoObrigatórioDescrição
email_idstringsimID do e-mail (começa com em_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
addstring[]nãoMarcadores a adicionar. (0–10 itens)
removestring[]nãoMarcadores a remover. (0–10 itens)
createbooleannãoCria os marcadores desconhecidos em add (padrão true).
RetornoO e-mail atualizado com labels.
AnotaçõesidempotentHint
Exemplo de params de tools/call
{
  "name": "label_email",
  "arguments": {
    "email_id": "em_123",
    "add": [
      "Billing"
    ],
    "remove": [
      "Support"
    ]
  }
}

Rascunhos, anexos e identidades de remetente

Somente leituralist_sending_identities
GET /sending-identities

Listar identidades de remetente verificadas

Endereços e domínios a partir dos quais este workspace pode enviar agora (domínios verificados, seu De padrão e endereços de caixas de entrada ativas). Chame antes de send_email para escolher um from válido.

Sem parâmetros.

Retorno{domains: [nomes de domínios verificados], addresses: [endereços de remetente], localParts: [...]}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "list_sending_identities",
  "arguments": {}
}
Altera estadocreate_draft
POST /drafts

Criar um rascunho

Cria um rascunho do compositor. Os rascunhos guardam anexos: crie um rascunho, use upload_attachment e depois send_email com draft_id. Não envia nada.

ParâmetroTipoObrigatórioDescrição
fromstringnãoEndereço de remetente em um domínio verificado (pode ficar vazio durante a edição).
tostring[]nãoDestinatários. (0–100 itens)
ccstring[]nãoDestinatários em cópia. (0–100 itens)
bccstring[]nãoDestinatários em cópia oculta. (0–100 itens)
subjectstringnãoLinha de assunto. (máx. 998 caracteres)
htmlstringnãoCorpo em HTML.
textstringnãoCorpo em texto simples.
reply_to_email_idstringnãoID do e-mail ao qual este rascunho responde.
thread_idstringnãoID da thread à qual este rascunho pertence.
RetornoObjeto de rascunho {id: dr_…, from, to, cc, bcc, subject, html, text, attachments: []}.
Exemplo de params de tools/call
{
  "name": "create_draft",
  "arguments": {
    "from": "hello@example.com",
    "to": [
      "owner@example.com"
    ],
    "subject": "Invoice"
  }
}
Somente leituralist_drafts
GET /drafts

Listar rascunhos

Lista os rascunhos do compositor, do atualizado mais recentemente para o mais antigo. Paginado: o resultado inclui pagination {offset, limit, returned, total?, has_more, next_offset}.

ParâmetroTipoObrigatórioDescrição
limitintegernãoTamanho da página. O padrão é 50. (padrão 50; 1–200)
offsetintegernãoNúmero de registros a ignorar. Use pagination.next_offset da página anterior. (padrão 0; 0–…)
Retorno{data: [rascunhos], count, pagination}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "list_drafts",
  "arguments": {}
}
Somente leituraget_draft
GET /drafts/:draft_id

Obter um rascunho

Recupera um rascunho com os metadados dos anexos.

ParâmetroTipoObrigatórioDescrição
draft_idstringsimID do rascunho (começa com dr_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
RetornoObjeto de rascunho com attachments.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "get_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
Altera estadoupdate_draft
PUT /drafts/:draft_id

Substituir o conteúdo do rascunho

Substitui o conteúdo e os destinatários de um rascunho. É uma substituição completa: os campos omitidos são apagados; portanto, leia get_draft primeiro e envie todos os campos que quiser manter. Os anexos não são afetados.

ParâmetroTipoObrigatórioDescrição
draft_idstringsimID do rascunho (começa com dr_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
fromstringnãoEndereço de remetente em um domínio verificado (pode ficar vazio durante a edição).
tostring[]nãoDestinatários. (0–100 itens)
ccstring[]nãoDestinatários em cópia. (0–100 itens)
bccstring[]nãoDestinatários em cópia oculta. (0–100 itens)
subjectstringnãoLinha de assunto. (máx. 998 caracteres)
htmlstringnãoCorpo em HTML.
textstringnãoCorpo em texto simples.
reply_to_email_idstringnãoID do e-mail ao qual este rascunho responde.
thread_idstringnãoID da thread à qual este rascunho pertence.
RetornoObjeto de rascunho atualizado.
AnotaçõesidempotentHint
Exemplo 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."
  }
}
Destrutivadelete_draft
DELETE /drafts/:draft_id

Descartar um rascunho

DESTRUTIVA: descarta um rascunho e exclui permanentemente seus anexos armazenados.

ParâmetroTipoObrigatórioDescrição
draft_idstringsimID do rascunho (começa com dr_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
Retorno{ok: true}.
AnotaçõesdestructiveHint idempotentHint
Exemplo de params de tools/call
{
  "name": "delete_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
Altera estadoupload_attachment
POST /drafts/:draft_id/attachments

Fazer upload de um anexo para um rascunho

Faz o upload de um arquivo para um rascunho (máx. 10 arquivos e 10 MB no total por mensagem). Informe content_base64 ou um file_path local. Os anexos exigem um plano pago no momento do envio.

Informe pelo menos um destes: content_base64, file_path.

ParâmetroTipoObrigatórioDescrição
draft_idstringsimID do rascunho (começa com dr_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
filenamestringnãoNome do arquivo exibido ao destinatário. Por padrão, é o nome-base de file_path. (máx. 255 caracteres)
content_typestringnãoTipo MIME, por exemplo application/pdf. O padrão é application/octet-stream.
content_base64stringnãoConteúdo do arquivo em base64 padrão.
file_pathstringnãoCaminho absoluto de um arquivo local legível pelo processo do servidor MCP.
Retorno{id: att_…, filename, contentType, sizeBytes, available}.
Exemplo 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"
  }
}
Somente leituradownload_attachment
GET /attachments/:attachment_id

Baixar um anexo

Baixa um anexo privado (enviado, recebido ou de rascunho). Retorna o conteúdo em base64 ou grava o arquivo quando save_to_path é definido (recusa sobrescrever, a menos que overwrite seja true).

ParâmetroTipoObrigatórioDescrição
attachment_idstringsimID do anexo (começa com att_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
save_to_pathstringnãoCaminho local absoluto opcional para gravar o arquivo em vez de retornar base64.
overwritebooleannãoPermite substituir um arquivo existente em save_to_path. O padrão é false.
Retorno{attachment_id, filename, content_type, size_bytes, content_base64} ou {attachment_id, filename, content_type, size_bytes, saved_to}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "download_attachment",
  "arguments": {
    "attachment_id": "att_123",
    "save_to_path": "/tmp/invoice.pdf"
  }
}
Destrutivadelete_attachment
DELETE /attachments/:attachment_id

Excluir um anexo

DESTRUTIVA: exclui permanentemente um anexo armazenado (por exemplo, para remover um arquivo de um rascunho antes de enviar).

ParâmetroTipoObrigatórioDescrição
attachment_idstringsimID do anexo (começa com att_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
Retorno{ok: true}.
AnotaçõesdestructiveHint idempotentHint
Exemplo de params de tools/call
{
  "name": "delete_attachment",
  "arguments": {
    "attachment_id": "att_123"
  }
}

Templates hospedados

Somente leituralist_templates
GET /templates

Listar templates hospedados

Lista os templates de e-mail hospedados com estado de publicação e uso. Paginado: o resultado inclui pagination {offset, limit, returned, total?, has_more, next_offset}.

ParâmetroTipoObrigatórioDescrição
lifecyclestringnãoactive (padrão), archived ou all. (um de active, archived, all)
querystringnãoPesquisa por nome ou chave. (máx. 120 caracteres)
limitintegernãoTamanho da página. O padrão é 50. (padrão 50; 1–200)
offsetintegernãoNúmero de registros a ignorar. Use pagination.next_offset da página anterior. (padrão 0; 0–…)
Retorno{data: [templates], count, pagination}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "list_templates",
  "arguments": {
    "lifecycle": "active"
  }
}
Altera estadocreate_template
POST /templates

Criar um template hospedado

Cria um template com um rascunho editável, opcionalmente a partir de um modelo inicial (welcome, reset, receipt ou blank). Publique-o antes de enviar por chave.

ParâmetroTipoObrigatórioDescrição
namestringsimNome legível. (máx. 120 caracteres)
keystringnãoChave de envio estável: letras minúsculas, números e hifens; começa com uma letra (2–64 caracteres). Derivada do nome quando omitida.
starterstringnãoConteúdo inicial. (um de blank, welcome, reset, receipt)
Retorno{template, draft, activeVersion, versions, usage}.
Exemplo de params de tools/call
{
  "name": "create_template",
  "arguments": {
    "name": "Account welcome",
    "key": "account-welcome",
    "starter": "welcome"
  }
}
Somente leituraget_template
GET /templates/:template_id

Obter um template

Recupera o rascunho atual de um template (com revision), a release publicada ativa, o histórico de releases e o uso. Aceita ID ou chave.

ParâmetroTipoObrigatórioDescrição
template_idstringsimID do template (tmpl_…) ou chave. (máx. 128 caracteres)
Retorno{template, draft: {id, revision, subjectTemplate, htmlTemplate, textTemplate, variables, sampleData, …} | null, activeVersion, versions, usage}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "get_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Altera estadoupdate_template_draft
PUT /templates/:template_id/draft

Salvar um rascunho de template

Salva o rascunho editável do template usando concorrência otimista: passe o revision atual obtido em get_template (409 significa que outra pessoa salvou primeiro; leia de novo e tente novamente). É uma substituição completa do conteúdo do rascunho: os campos omitidos são apagados; portanto, envie todos os campos que quiser manter. Use placeholders {{variable}}.

ParâmetroTipoObrigatórioDescrição
template_idstringsimID ou chave do template. (máx. 128 caracteres)
revisionintegersimRevisão atual do rascunho, obtida em get_template. (1–…)
namestringnãoNome do template. (máx. 120 caracteres)
subject_templatestringnãoAssunto com placeholders. (máx. 998 caracteres)
preheader_templatestringnãoTexto de pré-visualização. (máx. 240 caracteres)
html_templatestringnãoCorpo em HTML com placeholders.
text_templatestringnãoCorpo em texto simples com placeholders.
fromstringnãoRemetente padrão para os envios deste template.
reply_tostringnãoReply-To padrão.
variablesobject[]nãoContrato de variáveis tipadas. Cada item: {key (minúsculas/sublinhados), label, type: text|number|url|boolean, required (padrão true), fallback, description}.
variables[].keystringsim
variables[].labelstringnão
variables[].typestringnão(um de text, number, url, boolean)
variables[].requiredbooleannão
variables[].fallbackanynão
variables[].descriptionstringnão
sample_dataobjectnãoValores de exemplo usados em pré-visualizações e testes.
Retorno{template, draft: {revision: next}, validation: {valid, findings}}.
Exemplo 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"
    }
  }
}
Altera estadocreate_template_draft
POST /templates/:template_id/draft

Iniciar um novo rascunho a partir da release publicada

Cria um novo rascunho editável copiado da release publicada atual (409 se já existir um rascunho ou se nada estiver publicado).

ParâmetroTipoObrigatórioDescrição
template_idstringsimID ou chave do template. (máx. 128 caracteres)
Retorno{draft}.
Exemplo de params de tools/call
{
  "name": "create_template_draft",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Somente leiturarender_template
POST /templates/:template_id/render

Renderizar uma pré-visualização de template

Renderiza a saída exata do servidor (subject, html, text) para o rascunho, a release publicada ou uma versão específica com os dados informados. Não envia. Retorna 422 com findings quando os dados violam o contrato de variáveis.

ParâmetroTipoObrigatórioDescrição
template_idstringsimID ou chave do template. (máx. 128 caracteres)
version_idstringnãoID de versão opcional; por padrão, usa o rascunho e, depois, a release publicada.
dataobjectnãoValores das variáveis; por padrão, os dados de exemplo da versão.
Retorno{subject, html, text, preheader, versionId, versionNumber, isDraft, findings}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "render_template",
  "arguments": {
    "template_id": "account-welcome",
    "data": {
      "first_name": "Asha"
    }
  }
}
Envia e-mail realsend_template_test
POST /templates/:template_id/test

Enviar um e-mail de teste de template

ENVIA E-MAIL REAL. Envia um snapshot do rascunho (ou de uma versão informada) com o prefixo [Test] para os destinatários informados. Conta no uso; workspaces em teste só podem enviar para o e-mail da conta ou para um endereço do simulador do SES.

ParâmetroTipoObrigatórioDescrição
template_idstringsimID ou chave do template. (máx. 128 caracteres)
tostring[]simDestinatários do teste. (1–100 itens)
fromstringnãoRemetente em um domínio verificado; por padrão, o De do template.
version_idstringnãoID de versão opcional.
dataobjectnãoValores das variáveis; por padrão, os dados de exemplo.
Retorno{id: em_…, providerMessageId, threadId, isTest: true}.
Exemplo de params de tools/call
{
  "name": "send_template_test",
  "arguments": {
    "template_id": "account-welcome",
    "to": [
      "owner@example.com"
    ]
  }
}
Altera estadopublish_template
POST /templates/:template_id/publish

Publicar uma release de template

Publica o rascunho atual como uma release imutável que send_email com template.key usará. Falha com 422 e findings em caso de erros de validação, ou com 409 se quebrasse o contrato de variáveis ativo de um template já usado em produção.

ParâmetroTipoObrigatórioDescrição
template_idstringsimID ou chave do template. (máx. 128 caracteres)
Retorno{template, published}.
Exemplo de params de tools/call
{
  "name": "publish_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Altera estadoarchive_template
POST /templates/:template_id/archive

Arquivar um template

Interrompe novos envios que usam este template (o histórico é mantido; reversível com restore_template). Qualquer integração que envie com esta chave passará a falhar com 404.

ParâmetroTipoObrigatórioDescrição
template_idstringsimID ou chave do template. (máx. 128 caracteres)
Retorno{template}.
AnotaçõesidempotentHint
Exemplo de params de tools/call
{
  "name": "archive_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Altera estadorestore_template
POST /templates/:template_id/restore

Restaurar um template arquivado

Torna um template arquivado ativo de novo.

ParâmetroTipoObrigatórioDescrição
template_idstringsimID ou chave do template. (máx. 128 caracteres)
Retorno{template}.
AnotaçõesidempotentHint
Exemplo de params de tools/call
{
  "name": "restore_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}

Domínios e DNS

Somente leituralist_domains
GET /domains

Listar domínios

Lista os domínios de envio com setup_status agregado (verified | checking | pending), estado do DNS por registro e status de entrada. Pode ser lento: domínios não verificados são verificados de novo em tempo real. Paginado: o resultado inclui pagination {offset, limit, returned, total?, has_more, next_offset}.

ParâmetroTipoObrigatórioDescrição
limitintegernãoTamanho da página. O padrão é 50. (padrão 50; 1–200)
offsetintegernãoNúmero de registros a ignorar. Use pagination.next_offset da página anterior. (padrão 0; 0–…)
Retorno{data: [domínios com registros], count, pagination}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "list_domains",
  "arguments": {}
}
Somente leituraget_domain
GET /domains/:domain_id

Obter os detalhes de configuração de um domínio

Recupera um domínio com os registros DNS exatos a publicar (type, name, value), o estado em tempo real de cada registro em dois resolvedores públicos, dns_issues com correções e o status de entrada.

ParâmetroTipoObrigatórioDescrição
domain_idstringsimID do domínio (começa com dom_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
Retorno{id, name, status, setup_status, dns_propagating, records: [{type, name, value, verified, dns_state}], dns_issues: [{code, message, …}], inbound_domain, inbound_status}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "get_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Altera estadoadd_domain
POST /domains

Adicionar um domínio de envio

Registra um domínio que você controla para envio. Retorna os registros DNS (CNAMEs de DKIM Easy do SES) que o dono precisa publicar. Não altera o DNS. Conta no limite de domínios do plano.

ParâmetroTipoObrigatórioDescrição
namestringsimNome de domínio simples, por exemplo example.com ou mail.example.com. (máx. 253 caracteres)
default_fromstringnãoEndereço de remetente padrão opcional neste domínio.
Retorno{id: dom_…, name, status: pending, records: [...], ses: {configured}}.
Exemplo de params de tools/call
{
  "name": "add_domain",
  "arguments": {
    "name": "example.com"
  }
}
Altera estadoverify_domain
POST /domains/:domain_id/verify

Verificar um domínio

Executa agora uma verificação em tempo real do SES/DNS. É seguro repetir; consulte a cada 30–60 s após alterações de DNS (a propagação pode levar de minutos a horas). O envio é permitido quando o status é verified.

ParâmetroTipoObrigatórioDescrição
domain_idstringsimID do domínio (começa com dom_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
Retorno{domain, checks: {ses, dkim, dkim_status}, status: verified|pending}.
AnotaçõesidempotentHint
Exemplo de params de tools/call
{
  "name": "verify_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Destrutivadelete_domain
DELETE /domains/:domain_id

Excluir um domínio

DESTRUTIVA: remove o domínio do workspace, inclusive sua rota de recebimento de entrada. Os envios a partir dele passam a falhar imediatamente. Não exclui registros DNS no seu provedor de DNS.

ParâmetroTipoObrigatórioDescrição
domain_idstringsimID do domínio (começa com dom_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
Retorno{ok: true}.
AnotaçõesdestructiveHint idempotentHint
Exemplo de params de tools/call
{
  "name": "delete_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Somente leituraget_dns_provider
GET /dns/provider

Detectar o provedor de DNS e os hosts dos registros

Detecta o provedor de DNS autoritativo do domínio e retorna o host relativo a digitar nesse provedor para cada registro, o registro DMARC recomendado, orientações de MX de entrada e se a configuração com um clique (Domain Connect) está disponível.

ParâmetroTipoObrigatórioDescrição
domain_idstringsimID do domínio (começa com dom_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
Retorno{detectionStatus, detected, zone, nameservers, recordHosts: {recordId: host}, inbound, recommendations, authentication, providers: {domainConnect: {available, providerName}}}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "get_dns_provider",
  "arguments": {
    "domain_id": "dom_123"
  }
}

E-mail de entrada

Altera estadosetup_inbound
POST /domains/:domain_id/inbound/setup

Habilitar o recebimento de e-mails de entrada em um domínio

Provisiona o recebimento de entrada do SES para um domínio verificado. Usa o domínio raiz quando ele não tem MX conflitante; caso contrário, inbound.<domain>. Retorna o registro MX que o dono precisa publicar; não edita o DNS.

ParâmetroTipoObrigatórioDescrição
domain_idstringsimID do domínio (começa com dom_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
Retorno{domain: domínio de recebimento, status: dns_pending|ready, record: {type: MX, name, value}}.
AnotaçõesidempotentHint
Exemplo de params de tools/call
{
  "name": "setup_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Altera estadoverify_inbound
POST /domains/:domain_id/inbound/verify

Verificar o MX de entrada

Verifica de novo o registro MX de entrada. O status passa a ready quando os dois resolvedores públicos o enxergam.

ParâmetroTipoObrigatórioDescrição
domain_idstringsimID do domínio (começa com dom_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
Retorno{domain, status: ready|dns_pending|propagating|checking, record}.
AnotaçõesidempotentHint
Exemplo de params de tools/call
{
  "name": "verify_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Somente leituralist_inboxes
GET /inboxes

Listar endereços de entrada

Lista os endereços de recebimento, opcionalmente de um domínio. Paginado: o resultado inclui pagination {offset, limit, returned, total?, has_more, next_offset}.

ParâmetroTipoObrigatórioDescrição
domain_idstringnãoFiltro opcional por ID de domínio.
limitintegernãoTamanho da página. O padrão é 50. (padrão 50; 1–200)
offsetintegernãoNúmero de registros a ignorar. Use pagination.next_offset da página anterior. (padrão 0; 0–…)
Retorno{data: [{id, address, name, status, domainId}], count, pagination}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "list_inboxes",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Somente leituraget_inbox
GET /inboxes/:inbox_id

Obter uma caixa de entrada

Recupera um endereço de entrada.

ParâmetroTipoObrigatórioDescrição
inbox_idstringsimID da caixa de entrada (começa com inb_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
RetornoObjeto de caixa de entrada.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "get_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}
Altera estadocreate_inbox
POST /inboxes

Criar um endereço de entrada

Cria um endereço como support@<receiving domain> em um domínio cujo status de entrada seja ready (execute antes setup_inbound e verify_inbound). Os e-mails recebidos aparecem em list_emails com direction in.

ParâmetroTipoObrigatórioDescrição
domain_idstringsimID do domínio (começa com dom_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
local_partstringsimParte antes do @, por exemplo support. (máx. 64 caracteres)
namestringnãoNome de exibição opcional.
Retorno{id: inb_…, address, name, status: active}.
Exemplo de params de tools/call
{
  "name": "create_inbox",
  "arguments": {
    "domain_id": "dom_123",
    "local_part": "support",
    "name": "Support"
  }
}
Altera estadoupdate_inbox
PATCH /inboxes/:inbox_id

Renomear, ativar ou desativar uma caixa de entrada

Renomeia uma caixa de entrada ou define seu status como active / disabled.

ParâmetroTipoObrigatórioDescrição
inbox_idstringsimID da caixa de entrada (começa com inb_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
namestringnãoNovo nome de exibição.
statusstringnãoNovo status. (um de active, disabled)
RetornoCaixa de entrada atualizada.
AnotaçõesidempotentHint
Exemplo de params de tools/call
{
  "name": "update_inbox",
  "arguments": {
    "inbox_id": "inb_123",
    "status": "disabled"
  }
}
Envia e-mail realset_inbox_forwarding
PUT /inboxes/:inbox_id/forwarding

Encaminhar uma caixa de entrada para outro endereço

ENVIA E-MAIL REAL ao encaminhar para alguém que não seja o dono da conta: define para onde os e-mails recebidos de uma caixa de entrada são encaminhados. O endereço do próprio dono é ativado imediatamente; qualquer outro endereço recebe um e-mail de confirmação e o encaminhamento permanece pending até que alguém de lá confirme. Passe forward_to: null para desativar o encaminhamento. As cópias encaminhadas vêm do endereço da caixa de entrada, com o remetente original como Reply-To.

ParâmetroTipoObrigatórioDescrição
inbox_idstringsimID da caixa de entrada (começa com inb_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
forward_tostring,nullsimEndereço de e-mail de destino do encaminhamento, ou null para desativá-lo. (máx. 254 caracteres)
RetornoCaixa de entrada com forwardTo e forwardStatus (off, pending ou active).
AnotaçõesidempotentHint
Exemplo de params de tools/call
{
  "name": "set_inbox_forwarding",
  "arguments": {
    "inbox_id": "inb_123",
    "forward_to": "team@example.net"
  }
}
Destrutivadelete_inbox
DELETE /inboxes/:inbox_id

Excluir uma caixa de entrada

DESTRUTIVA: exclui um endereço de entrada. Os e-mails já recebidos são retidos; os novos e-mails para o endereço deixam de ser arquivados nele.

ParâmetroTipoObrigatórioDescrição
inbox_idstringsimID da caixa de entrada (começa com inb_), conforme retornado por uma ferramenta de listagem ou criação. (máx. 128 caracteres)
Retorno{ok: true}.
AnotaçõesdestructiveHint idempotentHint
Exemplo de params de tools/call
{
  "name": "delete_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}

Entregabilidade, bounces e supressões

Somente leituradeliverability_stats
GET /deliverability/stats

Obter estatísticas de entrega dos últimos 30 dias

Totais de 30 dias de todo o workspace: sent, delivery, bounce, complaint, reject, open, click e deliveryRate (%).

Sem parâmetros.

Retorno{window: 30d, sent, delivery, bounce, complaint, reject, open, click, deliveryRate}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "deliverability_stats",
  "arguments": {}
}
Somente leituralist_sender_reputation
GET /deliverability/reputation

Listar a reputação do remetente

Estado de reputação por endereço De exato: active, throttled (limite diário menor) ou paused (os envios retornam 423), com o motivo e o limite diário. Verifique isto quando os envios falharem com 423 ou 429. Paginado: o resultado inclui pagination {offset, limit, returned, total?, has_more, next_offset}.

ParâmetroTipoObrigatórioDescrição
limitintegernãoTamanho da página. O padrão é 50. (padrão 50; 1–200)
offsetintegernãoNúmero de registros a ignorar. Use pagination.next_offset da página anterior. (padrão 0; 0–…)
Retorno{data: [{sender, status, dailyLimit, reason, cleanSince, warnedAt, pausedAt, evaluatedAt}], count, pagination}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "list_sender_reputation",
  "arguments": {}
}
Somente leituralist_suppressions
GET /suppressions

Listar supressões

Lista de supressão do workspace: destinatários bloqueados após um bounce permanente ou uma reclamação de spam. Os envios para eles falham com 422. Paginado: o resultado inclui pagination {offset, limit, returned, total?, has_more, next_offset}.

ParâmetroTipoObrigatórioDescrição
limitintegernãoTamanho da página. O padrão é 50. (padrão 50; 1–200)
offsetintegernãoNúmero de registros a ignorar. Use pagination.next_offset da página anterior. (padrão 0; 0–…)
Retorno{data: [{email, reason, detail, created_at}], count, pagination}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "list_suppressions",
  "arguments": {}
}
Destrutivaremove_suppression
DELETE /suppressions/:email

Remover uma supressão por bounce

DESTRUTIVA (enfraquece um bloqueio de segurança): remove uma supressão por bounce para que o endereço possa receber e-mails de novo. Faça isso somente quando uma pessoa confirmar que o endereço agora é válido. Supressões por reclamação não podem ser removidas (409).

ParâmetroTipoObrigatórioDescrição
emailstringsimEndereço do destinatário suprimido. (máx. 320 caracteres)
Retorno{ok: true}.
AnotaçõesdestructiveHint idempotentHint
Exemplo de params de tools/call
{
  "name": "remove_suppression",
  "arguments": {
    "email": "fixed-mailbox@example.net"
  }
}
Somente leituralist_blocked_recipients
GET /blocked-recipients

Listar destinatários bloqueados

Todos os destinatários que o SendHQ vai recusar: bounces, reclamações e descadastros de marketing por domínio, com um resumo por tipo. Lê até os 500 mais recentes. Paginado: o resultado inclui pagination {offset, limit, returned, total?, has_more, next_offset}.

ParâmetroTipoObrigatórioDescrição
limitintegernãoTamanho da página. O padrão é 50. (padrão 50; 1–200)
offsetintegernãoNúmero de registros a ignorar. Use pagination.next_offset da página anterior. (padrão 0; 0–…)
Retorno{data: [{email, domain, kind: bounce|complaint|unsubscribe, reason, detail, source, status, created_at}], count, summary: {total, bounce, complaint, unsubscribe}, pagination}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "list_blocked_recipients",
  "arguments": {}
}

Conta, uso, análises e chaves

Somente leituraget_account
GET /account

Obter conta, uso e cobrança

E-mail do dono da conta, plano/nível de acesso, entregas a destinatários no período atual usadas vs. cota, domínios usados vs. limite, transferência de anexos, resumo de reputação, estado da assinatura, planos publicados e contagens do workspace. Use para verificar a cota restante ou para quem o teste pode entregar (o e-mail da conta).

Sem parâmetros.

Retorno{user: {email, …}, usage: {domainsUsed, domainLimit, recipientDeliveries, emailQuotaMonth, attachmentBytes, attachmentByteLimit, periodKey}, access: {tier, planCode}, reputation, infrastructure, billing: {status, subscriptions, …}, plans, workspace: {mailer, stats}}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "get_account",
  "arguments": {}
}
Somente leituraget_analytics
GET /analytics

Obter análises de envio

Análises do painel dos últimos 7, 30 ou 90 dias: totais de enviados/recebidos/entregues/bounces/bloqueados/abertos/cliques/reclamações, uma linha do tempo diária, os principais domínios de envio e os principais assuntos.

ParâmetroTipoObrigatórioDescrição
daysintegernãoJanela em dias: 7, 30 (padrão) ou 90. (um de 7, 30, 90)
Retorno{window, days, metrics, timeline: [{day, sent, received}], domains, topContent}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "get_analytics",
  "arguments": {
    "days": 30
  }
}
Somente leituralist_api_keys
GET /keys

Listar metadados de chaves de API

Lista nomes de chaves de API, prefixos não secretos e horários do último uso. Somente leitura: este servidor MCP não pode criar, rotacionar nem revogar chaves; uma pessoa faz isso no painel. Paginado: o resultado inclui pagination {offset, limit, returned, total?, has_more, next_offset}.

ParâmetroTipoObrigatórioDescrição
limitintegernãoTamanho da página. O padrão é 50. (padrão 50; 1–200)
offsetintegernãoNúmero de registros a ignorar. Use pagination.next_offset da página anterior. (padrão 0; 0–…)
Retorno{data: [{id, name, prefix, lastUsedAt, createdAt}], count, pagination}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "list_api_keys",
  "arguments": {}
}
Somente leituraget_service_health
GET /health

Verificar a saúde do serviço SendHQ

Verifica se a API do SendHQ está no ar e qual provedor de e-mail está ativo. Não precisa de uma chave de API válida.

Sem parâmetros.

Retorno{ok, service, mailer}.
AnotaçõesreadOnlyHint idempotentHint
Exemplo de params de tools/call
{
  "name": "get_service_health",
  "arguments": {}
}

Inventário de cobertura da API

Todas as operações da API pública e a ferramenta que as cobre. Tudo o que uma pessoa pode fazer no painel e que tem uma API está coberto; as exclusões abaixo são deliberadas.

EndpointFerramentaObservações
POST /emailssend_emailEnviar um e-mail
POST /emails/batchsend_batchEnviar até 100 mensagens individualizadas
GET /emailslist_emailsListar e-mails enviados e recebidos
GET /emails/:idget_emailRecuperar um e-mail e seus anexos
PATCH /emails/:idmark_emailAtualizar lido, arquivado, spam, categoria ou importância
POST /emails/:id/labelslabel_emailAdicionar ou remover marcadores de um e-mail
DELETE /emails/:iddelete_emailExcluir um e-mail retido
GET /emails/:id/eventslist_email_eventsListar eventos de entrega de um e-mail
GET /threads/:idget_threadRecuperar uma conversa em ordem cronológica
GET /labelslist_labelsListar marcadores com contagens de mensagens e regras de arquivamento
POST /labelscreate_labelCriar um marcador, opcionalmente com regras de arquivamento automático
GET /labels/:idget_labelRecuperar um marcador por ID ou nome
PATCH /labels/:idupdate_labelRenomear, mudar a cor ou transformar um marcador em categoria
DELETE /labels/:iddelete_labelExcluir um marcador sem excluir seus e-mails
POST /labels/:id/rulescreate_label_ruleAdicionar uma regra de arquivamento automático a um marcador
DELETE /labels/:id/rules/:rule_iddelete_label_ruleExcluir uma regra de arquivamento automático
POST /draftscreate_draftCriar um rascunho do compositor
GET /draftslist_draftsListar rascunhos do compositor
GET /drafts/:idget_draftRecuperar um rascunho e seus anexos
PUT /drafts/:idupdate_draftSubstituir o conteúdo do rascunho
DELETE /drafts/:iddelete_draftDescartar um rascunho
POST /drafts/:id/attachmentsupload_attachmentFazer upload de um anexo para um rascunho
GET /attachments/:iddownload_attachmentBaixar um anexo privado
DELETE /attachments/:iddelete_attachmentExcluir um anexo privado
GET /sending-identitieslist_sending_identitiesListar identidades de remetente verificadas
GET /templateslist_templatesListar templates hospedados
POST /templatescreate_templateCriar um template hospedado
GET /templates/:idget_templateRecuperar rascunhos, releases e uso
PUT /templates/:id/draftupdate_template_draftSalvar automaticamente um rascunho de template
POST /templates/:id/draftcreate_template_draftCriar um novo rascunho a partir da release publicada
POST /templates/:id/renderrender_templateRenderizar a saída exata do servidor
POST /templates/:id/testsend_template_testEnviar um snapshot de teste
POST /templates/:id/publishpublish_templatePublicar uma release imutável de template
POST /templates/:id/archivearchive_templateArquivar um template
POST /templates/:id/restorerestore_templateRestaurar um template arquivado
POST /domainsadd_domainAdicionar um domínio de envio
GET /domainslist_domainsListar domínios e o estado de DNS em cache
GET /domains/:idget_domainRecuperar os detalhes de configuração de um domínio
POST /domains/:id/verifyverify_domainAtualizar a verificação do SES e do DNS
POST /domains/:id/inbound/setupsetup_inboundProvisionar o recebimento de entrada do SES
POST /domains/:id/inbound/verifyverify_inboundVerificar o roteamento do MX de entrada
DELETE /domains/:iddelete_domainExcluir um domínio
GET /dns/providerget_dns_providerDetectar o provedor de DNS autoritativo e os hosts relativos dos registros
GET /dns/domain-connect/connectget_domain_connect_linkCriar um link de consentimento do Domain Connect para configuração de DNS com um clique
POST /inboxescreate_inboxCriar um endereço de entrada
GET /inboxeslist_inboxesListar endereços de entrada
GET /inboxes/:idget_inboxRecuperar um endereço de entrada
PATCH /inboxes/:idupdate_inboxRenomear, ativar ou desativar uma caixa de entrada
PUT /inboxes/:id/forwardingset_inbox_forwardingEncaminhar os e-mails recebidos de uma caixa de entrada para outro endereço
DELETE /inboxes/:iddelete_inboxExcluir uma caixa de entrada mantendo as mensagens
GET /deliverability/statsdeliverability_statsRecuperar estatísticas de entrega dos últimos 30 dias
GET /deliverability/reputationlist_sender_reputationListar o estado de reputação por identidade de remetente exata
GET /suppressionslist_suppressionsListar as supressões do workspace
DELETE /suppressions/:emailremove_suppressionRemover uma supressão por bounce elegível
GET /blocked-recipientslist_blocked_recipientsListar bounces, reclamações e descadastros
GET /accountget_accountRecuperar conta, uso, estado de cobrança e contagens do workspace com uma chave de API
GET /analyticsget_analyticsRecuperar as análises de envio do painel para 7, 30 ou 90 dias
GET /profileget_accountEquivalente de GET /account apenas para sessão; o servidor MCP lê a rota da chave de API.
POST /billing/checkoutnão expostoAs alterações de cobrança são apenas por sessão, por design, e exigem o dono da conta no painel. O estado de cobrança pode ser lido com get_account.
POST /billing/cancelnão expostoAs alterações de cobrança são apenas por sessão, por design, e exigem o dono da conta no painel. O estado de cobrança pode ser lido com get_account.
POST /keysnão expostoExcluída deliberadamente: um agente não deve emitir nem destruir credenciais. As chaves são gerenciadas por uma pessoa no painel.
GET /keyslist_api_keysListar metadados de chaves de API
DELETE /keys/:idnão expostoExcluída deliberadamente: um agente não deve emitir nem destruir credenciais. As chaves são gerenciadas por uma pessoa no painel.

Deliberadamente indisponível

RecursoEndpointsMotivo
Criar, rotacionar, revogar ou excluir chaves de APIPOST /keys, DELETE /keys/:idExcluída deliberadamente: um agente não deve emitir nem destruir credenciais. As chaves são gerenciadas por uma pessoa no painel.
Iniciar um checkout ou cancelar uma assinaturaPOST /billing/checkout, POST /billing/cancelAs alterações de cobrança são apenas por sessão, por design, e exigem o dono da conta no painel. O estado de cobrança pode ser lido com get_account.
Configuração de DNS com um clique da Cloudflare (OAuth)GET /api/dns/cloudflare/connectExige uma sessão interativa no navegador e o consentimento OAuth da Cloudflare. Use os registros de get_domain, os hosts de get_dns_provider ou get_domain_connect_link.
Cadastro, login, logout e vinculação de conta Google/api/auth/*Autenticação humana no navegador; o servidor MCP se autentica com uma chave de API.
Formulário de contato com o suportePOST /api/contactFormulário público do site de marketing, para pessoas, não uma operação do workspace.

Catálogo legível por máquina: /docs/mcp/tools.json (schemas, anotações, mapeamento de endpoints, exclusões). Versão em Markdown desta página: /docs/mcp.md. Com a CLI instalada, sendhq commands --format json imprime o mesmo catálogo.