Per agenti AI

Server MCP di SendHQ

Dai a un agente AI il controllo completo e sicuro di un workspace SendHQ: invia e ricevi email, verifica domini, pubblica template e indaga sulla deliverability con 59 strumenti a tipizzazione rigorosa. Scritto prima di tutto per gli agenti; gli umani sono benvenuti.

59 strumentitrasporto stdio, un solo comando0 strumenti di gestione delle chiavi
Installa e collega (Claude Code)
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
claude mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp

Che cos'è questo server

Il server MCP di SendHQ permette a un agente AI di gestire un workspace SendHQ tramite il Model Context Protocol: inviare email (singole, batch, da template, risposte, allegati, nuovi tentativi idempotenti), leggere e cercare la posta inviata e ricevuta (oggetti, corpi e nomi degli allegati) e i relativi eventi di consegna, organizzare la posta in etichette con regole di archiviazione automatica, gestire bozze e allegati privati, creare e pubblicare template ospitati, aggiungere e verificare domini e il relativo DNS, configurare la ricezione e gli indirizzi in entrata, consultare deliverability, bounce, segnalazioni di spam e soppressioni, e leggere utilizzo dell'account, stato della fatturazione, analytics e metadati delle chiavi API.

È un server stdio locale integrato nel binario della CLI sendhq. Il tuo client MCP avvia sendhq mcp come processo figlio e comunica in JSON-RPC su stdin/stdout. Ogni chiamata a uno strumento diventa una richiesta documentata all'API REST di SendHQ su https://sendhq.cc/api/v1, autenticata con la chiave API del tuo workspace: il server MCP ha quindi esattamente i permessi di quella chiave, non uno di più.

  • 59 strumenti in 8 gruppi, generati da un unico catalogo pubblicato anche come tools.json.
  • JSON Schema rigorosi: argomenti sconosciuti, tipi errati e campi obbligatori mancanti vengono rifiutati in locale, prima che qualcosa arrivi a SendHQ.
  • Errori strutturati con un code stabile, lo status HTTP, una explanation, un remedy concreto e l'indicazione se un nuovo tentativo può essere utile.
  • Ogni strumento che invia email reali o distrugge dati lo dichiara nelle prime parole della sua descrizione e riporta le annotazioni di sicurezza MCP.
  • La modalità --read-only nasconde tutti gli strumenti che inviano o modificano dati.
  • Non viene registrato nulla. stdout trasporta solo messaggi di protocollo; la chiave API e il contenuto dei messaggi non finiscono mai in un log.
Non è l'endpoint MCP della documentazione.SendHQ ospita anche un piccolo endpoint MCP di sola lettura per la documentazione su https://sendhq.cc/api/mcp (consultazione di prezzi e documentazione, nessun accesso all'account). Il server descritto in questa pagina è quello completo, con ambito limitato all'account; gira in locale oppure come connettore ospitato descritto più sotto.

Usare SendHQ in Claude e ChatGPT

Nessuna installazione necessaria: SendHQ esegue questo server anche come connettore ospitato su https://mcp.sendhq.cc/mcp, con gli stessi strumenti. Accedi con il tuo account SendHQ invece di incollare una chiave.

Claude

  1. Apri Impostazioni → Connettori e cerca SendHQ nella directory, oppure scegli Aggiungi connettore personalizzato e incolla https://mcp.sendhq.cc/mcp.
  2. Fai clic su Connetti, accedi a SendHQ, controlla l'accesso richiesto e fai clic su Consenti.
  3. Chiedi a Claude di controllare la tua inbox, inviare un'email dal tuo dominio verificato o spiegarti un 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.

Approvazione e disconnessione

  • The request_feature tool sends a feature request to the SendHQ team with your account details, so we can follow up by email.
  • Gli strumenti che inviano email reali o eliminano dati sono etichettati come tali. Se l'assistente debba chiederti conferma prima si imposta per singolo strumento nell'assistente: in Claude, scegli Richiede approvazione per quegli strumenti in Impostazioni → Connettori → SendHQ.
  • Il connettore riceve una propria chiave API, con il nome dell'assistente (ad esempio “Claude (AI connector)”). Eliminala in Chiavi API per disconnetterlo immediatamente.
  • Non può creare né revocare chiavi API né modificare la fatturazione. Gli allegati vengono inviati e restituiti in base64; non c'è accesso ai file locali.
  • I workspace non a pagamento (prova di integrazione) possono consegnare solo all'email dell'account o a un indirizzo del simulatore di AWS SES.

Domande: postmaster@sendhq.cc. Privacy: sendhq.cc/privacy.

Installazione

Installa il binario sendhq (Linux, macOS e Windows su x86-64 e arm64). L'installer verifica il checksum della release e, per impostazione predefinita, colloca il binario in ~/.local/bin.

macOS e Linux
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
Windows PowerShell
irm https://downloads.sendhq.cc/install.ps1 | iex
Verifica l'installazione
sendhq version
SENDHQ_API_KEY=re_your_key sendhq doctor

Crea una chiave API nella dashboard su https://sendhq.cc/app#/keys. Il server MCP non può creare chiavi. L'unico comando che avvia il server è:

Avvia il server stdio
SENDHQ_API_KEY=re_your_key sendhq mcp

Di solito non lo esegui mai a mano: è il client MCP ad avviarlo. Se lo lanci in un terminale, resta in attesa di JSON-RPC su stdin.

Configura il tuo client

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

Aggiungi --scope user per renderlo disponibile in tutti i progetti, oppure --scope project per scriverlo nel file .mcp.json del progetto. Per un .mcp.json condiviso, fai riferimento alla chiave tramite l'ambiente invece di committarla; Claude Code espande ${VAR} in .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" }

Oppure da riga di comando: codex mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp.

Claude Desktop

Modifica claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\) e riavvia l'app. Le app desktop non ereditano il PATH della tua shell, quindi usa il percorso assoluto 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"
      }
    }
  }
}

Qualsiasi altro client MCP

Configura un server stdio con il comando sendhq, gli argomenti ["mcp"] (facoltativamente "--read-only") e le variabili d'ambiente riportate sotto. Il server supporta le versioni del protocollo MCP 2024-11-05, 2025-03-26, 2025-06-18 e 2025-11-25, e implementa initialize, ping, tools/list e tools/call. I risultati degli strumenti contengono sia un blocco di testo JSON sia structuredContent.

Smoke test stdio grezzo (da passare in pipe 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":{}}}

Non esiste un trasporto HTTP ospitato per il server con ambito limitato all'account. Un endpoint MCP remoto con permessi di scrittura richiederebbe OAuth per utente, che SendHQ non offre; il binario locale tiene la chiave sulla macchina che già la custodisce.

Ambiente e flag

Variabile o flagObbligatorioSignificato
SENDHQ_API_KEYsìChiave API del workspace (re_…). Serve a tutti gli strumenti tranne get_service_health. Senza di essa il server si avvia comunque, ma ogni chiamata restituisce un auth_error strutturato che spiega come risolvere.
SENDHQ_API_BASE_URLnoURL di base dell'API. Predefinito: https://sendhq.cc/api/v1. Usalo solo per un deployment locale o di staging. SENDHQ_BASE_URL è accettato come alias legacy.
SENDHQ_MCP_READ_ONLYno1, true o yes equivalgono a --read-only.
--read-onlynoEspone solo gli strumenti che non inviano email e non modificano lo stato. Anche gli strumenti nascosti vengono rifiutati se chiamati per nome.
SENDHQ_PROFILE / --profilenoUsa una chiave salvata da sendhq auth login nel keyring del sistema operativo invece di SENDHQ_API_KEY. Se esistono entrambe, prevale la variabile d'ambiente.

La chiave viene inviata solo come intestazione Authorization: Bearer all'URL di base configurato. Non viene mai stampata, registrata nei log, ripetuta negli errori o inclusa nei risultati degli strumenti.

Modello di sicurezza per gli agenti

  • Invia email reali. send_email, send_batch e send_template_test consegnano posta a persone reali e consumano crediti di consegna. Le loro descrizioni iniziano con SENDS REAL EMAIL. Chiamali solo quando l'utente ha chiesto esplicitamente di inviare quel messaggio specifico, con destinatari, mittente e contenuto confermati.
  • Distruttivi. delete_email, delete_draft, delete_attachment, delete_domain, delete_inbox e remove_suppression sono contrassegnati con destructiveHint: true e le loro descrizioni iniziano con DESTRUCTIVE. Chiedi prima conferma all'utente. remove_suppression indebolisce un blocco di sicurezza ed è appropriato solo quando una persona conferma che l'indirizzo funziona di nuovo.
  • Modificano lo stato. Creare o aggiornare bozze, template, domini e inbox, pubblicare template e avviare la verifica modificano il workspace, ma non inviano posta.
  • Sola lettura. Tutto il resto è readOnlyHint: true e si può chiamare liberamente.
  • Questo server non modifica mai il DNS. add_domain restituisce i record che una persona deve pubblicare; get_domain_connect_link restituisce un URL di consenso che una persona deve aprire e approvare presso il proprio provider DNS.
  • Questo server non modifica mai la fatturazione. get_account legge solo piano, utilizzo e stato dell'abbonamento.
  • I workspace non a pagamento (prova di integrazione) possono consegnare solo all'email del titolare dell'account (get_account → user.email) o a un indirizzo del simulatore di AWS SES come success@simulator.amazonses.com, e non possono inviare allegati.
  • Accettato non significa consegnato. Un invio riuscito restituisce un ID; le prove di consegna, bounce e segnalazione di spam arrivano più tardi in list_email_events. Non affermare mai che un messaggio è arrivato in inbox o che una persona lo ha letto.
  • Non passare a un altro indirizzo From per aggirare una pausa 423, e non aggiungere mai di nuovo destinatari che si sono disiscritti o hanno segnalato spam.

Le chiavi API sono escluse

Per scelta progettuale non esistono strumenti che creano, modificano, ruotano, revocano o eliminano chiavi API. Un agente non deve generare né distruggere credenziali. list_api_keys restituisce solo nomi, prefissi non segreti e data dell'ultimo utilizzo. La gestione delle chiavi resta nella dashboard, in mano a una persona che ha effettuato l'accesso.

Flussi di lavoro

1. Primo invio

  1. get_service_health conferma che l'API è raggiungibile (funziona senza chiave).
  2. get_account mostra il piano (access.tier), la quota residua e user.email. Durante la prova, quell'email è l'unico destinatario reale consentito.
  3. list_sending_identities elenca gli indirizzi From che puoi usare. Se è vuoto, completa prima il flusso del dominio.
  4. Conferma con l'utente mittente, destinatario, oggetto e corpo, poi chiama send_email con una idempotency_key.
  5. list_email_events con l'id restituito mostra delivery, bounce, complaint o reject non appena il provider lo segnala (di solito da pochi secondi a qualche minuto).
Primo invio
{
  "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 del dominio dall'inizio alla fine

  1. add_domain con name: "example.com". Il risultato include i record DNS (CNAME DKIM, verifica SES, SPF, DMARC consigliato).
  2. get_dns_provider con il domain_id rileva il provider DNS autoritativo e restituisce l'host relativo esatto da inserire per ogni record presso quel provider.
  3. Se providers.domainConnect.available è true, get_domain_connect_link restituisce un URL di consenso. Passalo alla persona: non cambia nulla finché non approva presso il provider. Altrimenti, dai alla persona i record da pubblicare. Non pubblicare mai un secondo record SPF: unisci include:amazonses.com al valore v=spf1 esistente.
  4. verify_domain ricontrolla DNS e SES. Lo stato passa da pending, checking e propagating a verified. Interroga verify_domain o get_domain ogni 30–60 secondi; il DNS può richiedere da qualche minuto a qualche ora.
  5. Quando status è verified, gli indirizzi del dominio compaiono in list_sending_identities.

3. Bounce, segnalazioni di spam e soppressioni

  1. list_blocked_recipients restituisce ogni indirizzo bloccato con il relativo motivo (bounce, complaint, unsubscribe) e un conteggio riassuntivo.
  2. list_suppressions restituisce le soppressioni per hard bounce e per segnalazione di spam; deliverability_stats fornisce i tassi di consegna, bounce e segnalazioni di spam degli ultimi 30 giorni; list_sender_reputation mostra quali indirizzi From sono rallentati o in pausa.
  3. Un invio che contiene un destinatario soppresso fallisce con 422 recipient_suppressed. Rimuovi quel destinatario e invia di nuovo.
  4. Chiama remove_suppression solo quando una persona conferma che una casella in bounce ora funziona. Le soppressioni per segnalazione di spam sono permanenti (409 complaint_suppression_locked).

4. Ricevere email in entrata

  1. Il dominio (spesso un sottodominio come inbound.example.com) deve essere verificato.
  2. setup_inbound predispone la ricezione e restituisce un record MX, che una persona pubblica.
  3. verify_inbound finché status non è ready.
  4. create_inbox con domain_id e local_part (ad esempio support) crea support@inbound.example.com.
  5. Interroga periodicamente list_emails con direction: "in" e unread: true (facoltativamente inbox_id). Leggi un messaggio con get_email, la sua conversazione con get_thread, gli allegati con download_attachment, e segnalo come gestito con mark_email (read: true).
  6. Rispondi nel thread con send_email e reply_to_email_id; SendHQ imposta In-Reply-To, References e il thread.

5. Webhook e notifiche degli eventi

Al momento SendHQ non offre webhook configurabili dai clienti, quindi non esiste uno strumento per i webhook. Le notifiche del provider vengono elaborate all'interno di SendHQ ed esposte tramite letture. Usa invece il polling: list_email_events per l'esito di un messaggio, list_emails con status (ad esempio bounced) o after per le modifiche recenti, list_emails con direction: "in" e unread: true per la nuova posta in entrata e list_blocked_recipients per le nuove soppressioni. Non interrogare più di circa una volta al minuto per ogni domanda.

6. Diagnosticare un errore di consegna

  1. Trova il messaggio: list_emails con direction: "out" e to o query, oppure get_email se hai l'ID. status: failed significa che SendHQ o il provider lo ha rifiutato all'invio; l'errore dell'email spiega il motivo.
  2. list_email_events: bounce (permanente o transitorio, con la diagnostica del provider), complaint, reject o delivery. Se non ci sono ancora eventi, il provider non ha ancora segnalato nulla: attendi e ricontrolla.
  3. Se è fallita la chiamata di invio stessa, leggi il code dell'errore: sender_domain_unverified → completa la verifica del dominio; recipient_suppressed → l'indirizzo ha già generato un hard bounce o una segnalazione di spam; sender_paused → controlla list_sender_reputation e correggi l'origine della lista; trial_recipient_restricted → limiti della prova; quota_exhausted → utilizzo in get_account.
  4. get_domain controlla che DKIM, SPF e DMARC siano ancora pubblicati; deliverability_stats mostra se il problema riguarda un solo messaggio o è una tendenza.
  5. Riporta ciò che mostrano le prove. Un evento delivery significa che il server del destinatario ha accettato il messaggio, non che è arrivato in inbox o è stato letto.

7. Gestire un bucket di lavoro (etichette)

  1. create_label con name (ad esempio Agent/Orders) e skip_inbox: true. Così l'etichetta diventa un bucket: la posta ricevuta che la ottiene viene archiviata, quindi compare solo nell'etichetta e mai nella Inbox della persona.
  2. Invia la posta di lavoro con send_email (o send_batch) e labels: ["Agent/Orders"]. Le risposte a quella conversazione ereditano automaticamente l'etichetta e saltano la Inbox.
  3. Per la posta che nasce fuori dalle tue conversazioni, aggiungi una regola di archiviazione: create_label_rule con inbox_id (un indirizzo dedicato come orders@…), from, to o subject. Passa apply_to_existing: true per archiviare anche la posta già ricevuta.
  4. Lavora sul bucket: list_emails con label: "Agent/Orders", direction: "in" e unread: true; leggi con get_email o get_thread, rispondi con send_email e reply_to_email_id, e chiama mark_email read: true una volta gestito.
  5. Sposta un messaggio fuori posto dentro o fuori con label_email (add / remove). Aggiungere l'etichetta di un bucket a un messaggio ricevuto lo archivia anche.
  6. Facoltativamente, set_inbox_forwarding invia a un'altra casella una copia di tutto ciò che riceve un indirizzo (la destinazione conferma prima via email).
Inviare in un bucket
{
  "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. Allegati e template

Con un piano a pagamento, allega fino a 10 file con attachments di send_email (ognuno richiede content_base64 o un file_path locale; filename ha come valore predefinito il nome base del file). Per i template ospitati: create_template → update_template_draft → render_template per l'anteprima con dati di esempio → send_template_test (invia un test reale) → publish_template, quindi invia con send_email o send_batch usando template: {key, data} ed esattamente un destinatario to.

Risultati, paginazione ed errori

Una chiamata riuscita restituisce l'oggetto JSON dell'API come structuredContent e come blocco di testo JSON. Ogni strumento list_* accetta limit (1–200, predefinito 50) e offset, e aggiunge un oggetto pagination. Continua a chiamarlo con offset: pagination.next_offset finché has_more è true.

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

Una chiamata non riuscita restituisce isError: true con un errore strutturato. Segui remedy invece di ritentare alla cieca; ritenta solo quando retryable è true.

Errore strutturato dello strumento
{
  "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."
  }
}

Campi di errore facoltativi: request_id (da citare al supporto), retry_after_seconds, problems (elenco delle violazioni di schema per invalid_arguments) e idempotent_replayed (vedi Idempotenza).

Idempotenza

send_email e send_batch accettano idempotency_key (massimo 200 caratteri), inviata come intestazione Idempotency-Key. Genera una chiave stabile per ogni messaggio logico, ad esempio invoice-4812-receipt.

  • Un nuovo tentativo deve riutilizzare la stessa chiave E un corpo della richiesta identico. La stessa chiave con una qualsiasi modifica (destinatario, oggetto, corpo, intestazione, dati del template, perfino i valori degli argomenti) restituisce 409 idempotency_conflict.
  • Stessa chiave, stesso corpo, originale completato: SendHQ restituisce il risultato memorizzato senza inviare di nuovo. È così che ritenti in sicurezza dopo un timeout o un network_error.
  • Stessa chiave mentre l'originale è ancora in esecuzione: 409 idempotency_in_progress, ritentabile dopo una breve attesa.
  • Un nuovo messaggio logico richiede una nuova chiave.
  • Anche gli errori memorizzati vengono riprodotti. Se il primo tentativo è fallito, ritentare con la stessa chiave restituisce lo stesso errore con idempotent_replayed: true e retryable: false. Controlla list_emails (direction: out) per confermare che non sia partito nulla, correggi la causa e poi invia con una chiave nuova.
  • Il server non ritenta mai una POST di sua iniziativa. Solo le chiamate GET di sola lettura vengono ritentate automaticamente (fino a 3 tentativi in caso di errori di rete, 429 e 5xx).
  • send_email con attachments inline non accetta una idempotency_key, perché esegue più richieste. Per inviare allegati in modo sicuro rispetto ai nuovi tentativi: create_draft → upload_attachment → send_email con draft_id e idempotency_key.
Invio sicuro da ritentare (ripetilo identico in caso di 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"
  }
}

Limiti di frequenza e quote

SendHQ non pubblica un limite fisso di richieste al secondo (rate limit) per l'API. I limiti che un agente incontra davvero sono limiti di utilizzo, restituiti come 429:

  • Consegne mensili per destinatario per piano. Ogni indirizzo To, Cc e Bcc conta come una consegna. Confronta get_account → usage.recipientDeliveries con usage.emailQuotaMonth.
  • Destinatari giornalieri per indirizzo From esatto, stabiliti dallo stato di reputazione di quel mittente (list_sender_reputation → dailyLimit, 2.000 per impostazione predefinita sui piani a pagamento).
  • Prova di integrazione: 100 destinatari in totale, solo verso l'email dell'account o gli indirizzi del simulatore SES.
  • Allegati: al massimo 10 file e 10 MB per messaggio; 10 GB al mese di trasferimento di allegati ponderato per destinatario sui piani a pagamento.
  • Per richiesta: To + Cc + Bcc fino a 100 indirizzi; send_batch fino a 100 messaggi.
  • Circuit breaker della reputazione: in una finestra mobile di 7 giorni, bounce o segnalazioni di spam sopra soglia rallentano o mettono in pausa un indirizzo From (423 sender_paused). Si ripristina automaticamente quando i tassi scendono.

quota_exhausted non è ritentabile finché il periodo non si azzera o il piano non cambia. rate_limited è ritentabile dopo retry_after_seconds; per gli invii, ritenta con la stessa idempotency_key e un corpo identico.

Catalogo degli errori

code è stabile: basa la logica su di esso, non su message.

codeHTTPRitentare?Significato e cosa fare
invalid_arguments—noGli argomenti non hanno superato in locale il JSON Schema dello strumento; nulla è arrivato a SendHQ. Correggi i campi elencati in problems.
auth_error401noChiave API mancante, revocata o errata. Imposta SENDHQ_API_KEY per il processo del server; le chiavi le crea una persona nella dashboard.
trial_recipient_restricted402noLa prova di integrazione può consegnare solo all'email dell'account o a un indirizzo del simulatore SES. Invia lì, oppure il titolare attiva un piano a pagamento.
payment_required402noLa funzionalità richiede un piano a pagamento (ad esempio gli allegati). Invia senza, oppure passa a un piano superiore.
sender_domain_not_owned403noIl dominio mittente non appartiene a questo workspace. Usa list_sending_identities o add_domain.
sender_domain_unverified403noIl dominio mittente non è ancora verificato. get_domain, pubblica i record mancanti, verify_domain.
domain_limit_reached403noRaggiunto il limite di domini del piano. Rimuovi un dominio inutilizzato (con approvazione) o passa a un piano superiore.
marketing_not_enabled403noLa classe marketing non è abilitata per questo dominio o piano. Usa transactional solo se il messaggio lo è davvero.
forbidden403noLa policy non consente l'operazione. Modifica la richiesta.
not_found404noL'ID non appartiene a questo workspace. Elenca la risorsa per trovare l'ID corretto; ripristina prima i template archiviati.
idempotency_conflict409noChiave riutilizzata con un corpo diverso. Reinvia l'originale esatto, oppure usa una nuova chiave per un nuovo messaggio.
idempotency_in_progress409sìLa richiesta originale è ancora in esecuzione. Attendi, poi ritenta con la stessa chiave e lo stesso corpo.
revision_conflict409noLa bozza del template è cambiata da quando l'hai letta. get_template, unisci le modifiche, salva di nuovo.
complaint_suppression_locked409noIl destinatario ha segnalato spam. Non inviargli mai più email.
inbound_not_ready409noLa ricezione in entrata non è pronta. setup_inbound, pubblica l'MX, verify_inbound.
conflict409noLa risorsa esiste già o è nello stato sbagliato. Leggila e adegua la richiesta.
attachments_too_large413noPiù di 10 file o 10 MB. Rimuovi o riduci gli allegati.
recipient_suppressed422noUn destinatario ha già generato un hard bounce o una segnalazione di spam. Rimuovilo; vedi list_blocked_recipients.
recipient_unsubscribed422noUn destinatario si è disiscritto dalla posta di marketing. Rimuovilo in modo permanente.
validation_failed422noContenuto rifiutato, ad esempio dati del template che violano il contratto delle variabili. Correggi l'input.
sender_paused423noQuesto indirizzo From è in pausa per il circuit breaker di bounce/segnalazioni di spam a 7 giorni. Fermati, correggi la lista, attendi il ripristino automatico.
quota_exhausted429noRaggiunto il limite mensile, giornaliero per mittente, degli allegati o della prova. Controlla get_account; attendi l'azzeramento o passa a un piano superiore.
rate_limited429sìRallenta; attendi retry_after_seconds. Invii: stessa chiave, stesso corpo.
server_error5xxsìErrore temporaneo di SendHQ o del provider. Applica un backoff e ritenta; per gli invii usa la stessa chiave e lo stesso corpo. Se idempotent_replayed è true, usa una nuova chiave dopo aver confermato che non è stato inviato nulla.
network_error—sìRichiesta o risposta persa. Ritenta; per gli invii la stessa idempotency_key lo rende sicuro.
invalid_request400noRichiesta malformata. Leggi message e correggila.
tool_error—noErrore locale all'interno del server MCP (ad esempio un file_path illeggibile). Leggi message.

Riferimento degli strumenti

Ogni strumento con la sua classe di sicurezza, l'endpoint REST che chiama, i parametri, la struttura della risposta e un oggetto params di esempio per tools/call. I parametri sono esatti: il server rifiuta tutto ciò che non è elencato.

Email e thread: send_email, send_batch, list_emails, get_email, mark_email, delete_email, list_email_events, get_thread
Etichette e regole di archiviazione automatica: list_labels, get_label, create_label, update_label, delete_label, create_label_rule, delete_label_rule, label_email
Bozze, allegati e identità mittente: list_sending_identities, create_draft, list_drafts, get_draft, update_draft, delete_draft, upload_attachment, download_attachment, delete_attachment
Template ospitati: list_templates, create_template, get_template, update_template_draft, create_template_draft, render_template, send_template_test, publish_template, archive_template, restore_template
Domini e DNS: list_domains, get_domain, add_domain, verify_domain, delete_domain, get_dns_provider, get_domain_connect_link
Email in entrata: setup_inbound, verify_inbound, list_inboxes, get_inbox, create_inbox, update_inbox, set_inbox_forwarding, delete_inbox
Deliverability, bounce e soppressioni: deliverability_stats, list_sender_reputation, list_suppressions, remove_suppression, list_blocked_recipients
Account, utilizzo, analytics e chiavi: get_account, get_analytics, list_api_keys, get_service_health

Email e thread

Invia email realisend_email
POST /emails

Invia un'email

SENDS REAL EMAIL. Invia un messaggio da un dominio verificato: html/testo diretto, un template ospitato pubblicato, una risposta in un thread esistente o un messaggio con allegati. Passa idempotency_key così un nuovo tentativo non può inviare due volte; un nuovo tentativo deve riutilizzare la stessa chiave E una richiesta identica, altrimenti SendHQ restituisce 409. attachments è una scorciatoia che crea una bozza, carica ogni file e invia con quella bozza; non può essere combinato con idempotency_key o draft_id (per inviare allegati in modo sicuro rispetto ai nuovi tentativi usa create_draft + upload_attachment + send_email con draft_id). I workspace non a pagamento (prova di integrazione) possono consegnare solo all'email dell'account o a un indirizzo del simulatore di AWS SES, e non possono inviare allegati.

Fornisci almeno uno tra: html, text, template.

ParametroTipoObbligatorioDescrizione
fromstringsìMittente, ad es. Acme <hello@example.com>. Il dominio deve essere verificato in questo workspace (vedi list_sending_identities). (max 998 caratteri)
tostring[]sìDestinatari. Ogni voce è un indirizzo, facoltativamente con un nome visualizzato. To+cc+bcc possono essere al massimo 100 in totale; ogni destinazione consuma un credito di consegna. (1–100 elementi)
ccstring[]noDestinatari in copia. (0–100 elementi)
bccstring[]noDestinatari in copia nascosta. (0–100 elementi)
subjectstringnoOggetto. Omettilo quando invii un template. (max 998 caratteri)
textstringnoCorpo in testo semplice. Fornisci text, html o template.
htmlstringnoCorpo HTML. SendHQ lo sanifica e ne ricava il testo quando text è omesso.
reply_tostringnoIndirizzo Reply-To.
headersobjectnoIntestazioni personalizzate sicure aggiuntive (valori stringa), ad es. {"X-Entity-Ref-ID": "123"}. Le intestazioni di instradamento come From/To/Message-ID sono gestite da SendHQ.
message_classstringnotransactional (predefinito) o marketing. Marketing richiede un piano o un dominio abilitato al marketing e aggiunge la gestione delle disiscrizioni. (uno tra transactional, marketing)
reply_to_email_idstringnoRispondi all'interno di una conversazione esistente: l'ID em_… del messaggio a cui rispondi. SendHQ imposta In-Reply-To/References e il thread.
thread_idstringnoID esplicito del thread in cui archiviare il messaggio.
draft_idstringnoInvia con questo messaggio gli allegati di una bozza salvata (dr_…). La bozza viene eliminata dopo un invio riuscito.
templateobjectnoInvia un template ospitato pubblicato invece di html/testo diretto. Richiede esattamente un destinatario to e nessun cc/bcc; l'oggetto lo fornisce il template. Fornisci almeno uno tra: id, key.
template.idstringnoID del template (tmpl_…). Fornisci id o key.
template.keystringnoChiave del template, ad esempio account-welcome. Fornisci id o key.
template.version_idstringnoID facoltativo della release pubblicata (tmplv_…). Per impostazione predefinita usa la release pubblicata corrente.
template.dataobjectnoValori per le variabili tipizzate del template.
labelsstring[]noNomi di etichetta o ID lbl_… in cui archiviare questo messaggio. I nomi sconosciuti vengono creati. Le risposte nella conversazione ereditano le etichette, e l'etichetta di un bucket (skip_inbox) tiene quelle risposte fuori dalla Inbox. Max 10. (0–10 elementi)
idempotency_keystringnoIntestazione Idempotency-Key (max 200 caratteri). Riutilizzala solo per ritentare esattamente questa richiesta. (max 200 caratteri)
attachmentsobject[]noFile da allegare (max 10 file, 10 MB in totale). Ognuno richiede content_base64 (più filename) o un file_path locale. (0–10 elementi) Fornisci almeno uno tra: content_base64, file_path.
attachments[].filenamestringnoNome del file mostrato al destinatario. Obbligatorio con content_base64; per impostazione predefinita è il nome base di file_path. (max 255 caratteri)
attachments[].content_typestringnoTipo MIME, ad es. application/pdf. Predefinito: application/octet-stream.
attachments[].content_base64stringnoContenuto del file in base64 standard.
attachments[].file_pathstringnoPercorso assoluto di un file locale leggibile dal processo del server MCP.
Restituisce{id: em_…, providerMessageId, threadId, templateId, templateVersionId, isTest}. Accettato non significa consegnato: verifica poi con list_email_events.
Esempio di params per 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"
  }
}
Invia email realisend_batch
POST /emails/batch

Invia un batch di email personalizzate

SENDS REAL EMAIL. Invia da 1 a 100 messaggi indipendenti in una sola richiesta (usalo per personalizzare il template per ogni destinatario). Ogni elemento ha la stessa struttura di send_email (senza attachments/idempotency_key). Gli elementi riescono o falliscono singolarmente: HTTP 207 indica un successo parziale; controlla ogni data[i].ok e data[i].error. Una sola idempotency_key copre l'intero corpo del batch.

ParametroTipoObbligatorioDescrizione
emailsobject[]sìMessaggi da inviare. (1–100 elementi) Fornisci almeno uno tra: html, text, template.
idempotency_keystringnoIdempotency-Key per l'intero batch (max 200 caratteri). (max 200 caratteri)
Restituisce{data: [{index, ok, id?, error?: {message, status}}], count, successful, failed}.
Esempio di params per 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"
  }
}
Sola letturalist_emails
GET /emails

Elenca e cerca le email

Elenca le email inviate (direction: out) e ricevute (direction: in), dalle più recenti, con filtri. La posta ricevuta è classificata: leggi la inbox della persona con direction: in, archived: false, category: primary; fai triage con important: true; lo spam è nascosto a meno di category: spam o include_spam: true. Paginato: il risultato include pagination {offset, limit, returned, total?, has_more, next_offset}.

ParametroTipoObbligatorioDescrizione
directionstringnoin per la posta ricevuta, out per quella inviata. (uno tra in, out)
statusstringnoFiltro di stato, ad es. queued, sent, delivered, bounced, complained, failed.
domainstringnoSolo i messaggi di questo dominio, o di un elenco di domini separati da virgole (corrispondenza con uno qualsiasi).
inbox_idstringnoSolo i messaggi ricevuti da questa inbox (inb_…).
labelstringnoSolo i messaggi con questa etichetta: un ID lbl_… o il nome esatto, oppure un elenco separato da virgole (corrispondenza con uno qualsiasi). Usa list_labels per vedere le cartelle.
archivedbooleannofalse = la vista Inbox (posta ricevuta non archiviata), true = solo archiviata. Omettilo per tutta la posta.
categorystringnoprimary (persone), updates (newsletter, invii massivi, automatici) o spam; oppure un elenco separato da virgole. Lo spam è nascosto se non richiesto.
importantbooleannotrue = solo i messaggi contrassegnati come importanti (risposte a conversazioni avviate da te e mittenti segnati come importanti).
include_spambooleannoIncludi lo spam nei risultati (per ricerche in tutte le cartelle).
fromstringnoL'indirizzo del mittente contiene questo valore.
tostringnoL'indirizzo del destinatario contiene questo valore.
unreadbooleannotrue = solo non letti, false = solo letti.
afterstringnoTimestamp ISO-8601; solo i messaggi creati dopo. (date-time)
beforestringnoTimestamp ISO-8601; solo i messaggi creati prima. (date-time)
querystringnoRicerca a testo libero in oggetti, corpi, indirizzi di mittente/destinatario e nomi file degli allegati. (max 200 caratteri)
limitintegernoDimensione della pagina. Predefinita: 50. (predefinito 50; 1–200)
offsetintegernoNumero di record da saltare. Usa pagination.next_offset della pagina precedente. (predefinito 0; 0–…)
Restituisce{data: [riepiloghi delle email], count, pagination}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "list_emails",
  "arguments": {
    "direction": "in",
    "unread": true,
    "limit": 25
  }
}
Sola letturaget_email
GET /emails/:email_id

Recupera un'email

Recupera un messaggio con intestazioni, corpo html/testo, stato, metadati del thread e metadati degli allegati (scarica i byte con download_attachment).

ParametroTipoObbligatorioDescrizione
email_idstringsìID dell'email (inizia con em_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
RestituisceOggetto email: {id, direction, status, from, to, cc, bcc, subject, html, text, threadId, messageId, providerMessageId, readAt, createdAt, attachments: [{id, filename, contentType, sizeBytes, available}]}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "get_email",
  "arguments": {
    "email_id": "em_123"
  }
}
Modifica lo statomark_email
PATCH /emails/:email_id

Segna come letto, archiviato, spam o importante

Aggiorna un messaggio: read, archived, category (primary, updates, spam; solo posta ricevuta) e important. Segnalare spam o contrassegnare come importante insegna a SendHQ qualcosa su quel mittente per la posta futura; passa learn: false per modificare solo questo messaggio. Passa almeno un campo.

ParametroTipoObbligatorioDescrizione
email_idstringsìID dell'email (inizia con em_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
readbooleannotrue = letto, false = non letto.
archivedbooleannotrue = archivia (salta la Inbox), false = riporta nella Inbox.
categorystringnoSposta un messaggio ricevuto in primary, updates o spam. (uno tra primary, updates, spam)
importantbooleannoContrassegna o rimuovi il contrassegno di importante dal messaggio.
learnbooleannofalse = non memorizzare questa valutazione per il mittente (predefinito true).
RestituisceL'oggetto email aggiornato.
AnnotazioniidempotentHint
Esempio di params per tools/call
{
  "name": "mark_email",
  "arguments": {
    "email_id": "em_123",
    "read": true
  }
}
Distruttivodelete_email
DELETE /emails/:email_id

Elimina un'email

DESTRUCTIVE: elimina definitivamente da SendHQ un messaggio conservato e i suoi allegati archiviati. Non richiama un messaggio già consegnato.

ParametroTipoObbligatorioDescrizione
email_idstringsìID dell'email (inizia con em_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
Restituisce{ok: true}.
AnnotazionidestructiveHint idempotentHint
Esempio di params per tools/call
{
  "name": "delete_email",
  "arguments": {
    "email_id": "em_123"
  }
}
Sola letturalist_email_events
GET /emails/:email_id/events

Elenca gli eventi di consegna di un'email

Eventi del provider per un messaggio inviato: delivery, bounce, complaint, reject, open, click. Sono le prove che dicono se un messaggio è stato consegnato o perché non lo è stato. Paginato: il risultato include pagination {offset, limit, returned, total?, has_more, next_offset}.

ParametroTipoObbligatorioDescrizione
email_idstringsìID dell'email (inizia con em_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
limitintegernoDimensione della pagina. Predefinita: 50. (predefinito 50; 1–200)
offsetintegernoNumero di record da saltare. Usa pagination.next_offset della pagina precedente. (predefinito 0; 0–…)
Restituisce{data: [{event_type, recipient, reason, created_at, …}], count, pagination}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "list_email_events",
  "arguments": {
    "email_id": "em_123"
  }
}
Sola letturaget_thread
GET /threads/:thread_id

Recupera una conversazione

Recupera tutti i messaggi di una conversazione in ordine cronologico (inviati e ricevuti), ognuno con i metadati degli allegati.

ParametroTipoObbligatorioDescrizione
thread_idstringsìID del thread (di solito l'ID em_… del primo messaggio; vedi threadId su qualsiasi email). (max 128 caratteri)
Restituisce{id, subject, data: [email]}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "get_thread",
  "arguments": {
    "thread_id": "em_123"
  }
}

Etichette e regole di archiviazione automatica

Sola letturalist_labels
GET /labels

Elenca le etichette

Elenca le etichette (cartelle) del workspace con il numero totale e di non letti e le relative regole di archiviazione automatica. Paginato: il risultato include pagination {offset, limit, returned, total?, has_more, next_offset}.

ParametroTipoObbligatorioDescrizione
limitintegernoDimensione della pagina. Predefinita: 50. (predefinito 50; 1–200)
offsetintegernoNumero di record da saltare. Usa pagination.next_offset della pagina precedente. (predefinito 0; 0–…)
Restituisce{data: [{id, name, color, totalCount, unreadCount, rules: [...]}], count, pagination}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "list_labels",
  "arguments": {}
}
Sola letturaget_label
GET /labels/:label_id

Recupera un'etichetta

Recupera un'etichetta con i conteggi e le regole di archiviazione automatica.

ParametroTipoObbligatorioDescrizione
label_idstringsìID dell'etichetta (inizia con lbl_) o il nome esatto dell'etichetta. (max 128 caratteri)
RestituisceOggetto etichetta.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "get_label",
  "arguments": {
    "label_id": "Billing"
  }
}
Modifica lo statocreate_label
POST /labels

Crea un'etichetta

Crea un'etichetta in stile cartella. Imposta skip_inbox: true per trasformarla in un bucket di proprietà di un agente: invia con labels: [name] e le risposte vengono archiviate nell'etichetta e tenute fuori dalla Inbox. Le regole facoltative di archiviazione automatica archiviano la nuova posta inviata/ricevuta (ogni condizione di una regola deve corrispondere). Imposta apply_to_existing per archiviare anche la posta già conservata.

ParametroTipoObbligatorioDescrizione
namestringsìNome dell'etichetta, ad es. Billing o Clients/Acme. Univoco per workspace (senza distinzione tra maiuscole e minuscole). (max 64 caratteri)
colorstringnoColore esadecimale, ad esempio #1a73e8. Facoltativo.
skip_inboxbooleannoModalità bucket: la posta ricevuta che ottiene questa etichetta (tramite una regola, rispondendo a una conversazione inviata con questa etichetta o a mano) viene archiviata, così compare solo nell'etichetta e non nella Inbox.
rulesobject[]noRegole facoltative di archiviazione automatica (max 20). Ognuna richiede almeno uno tra inbox_id, from, to, subject. (0–20 elementi)
rules[].directionstringnoSolo posta in (ricevuta) o out (inviata). Omettilo per entrambe. (uno tra in, out)
rules[].inbox_idstringnoSolo la posta ricevuta da questa inbox (inb_…). Archivia ogni indirizzo di ricezione nella propria cartella.
rules[].fromstringnoIl mittente contiene questo testo (senza distinzione tra maiuscole e minuscole), ad es. @stripe.com. (max 200 caratteri)
rules[].tostringnoTo/Cc contiene questo testo (senza distinzione tra maiuscole e minuscole). (max 200 caratteri)
rules[].subjectstringnoL'oggetto contiene questo testo (senza distinzione tra maiuscole e minuscole). (max 200 caratteri)
rules[].skip_inboxbooleannoArchivia la posta ricevuta corrispondente, così compare solo nella cartella dell'etichetta e non nella Inbox.
apply_to_existingbooleannoArchivia anche la posta già conservata che corrisponde alle regole.
RestituisceL'etichetta creata con le regole.
Esempio di params per tools/call
{
  "name": "create_label",
  "arguments": {
    "name": "Agent/Orders",
    "skip_inbox": true,
    "rules": [
      {
        "from": "@stripe.com"
      }
    ]
  }
}
Modifica lo statoupdate_label
PATCH /labels/:label_id

Rinomina un'etichetta, cambiane il colore o rendila un bucket

Rinomina un'etichetta, cambiane il colore o attiva/disattiva la modalità bucket (skip_inbox). Attivare la modalità bucket archivia la posta ricevuta già presente nell'etichetta.

ParametroTipoObbligatorioDescrizione
label_idstringsìID dell'etichetta (inizia con lbl_) o il nome esatto dell'etichetta. (max 128 caratteri)
namestringnoNuovo nome. (max 64 caratteri)
colorstringnoNuovo colore esadecimale.
skip_inboxbooleannoModalità bucket: la posta ricevuta che ottiene questa etichetta (tramite una regola, rispondendo a una conversazione inviata con questa etichetta o a mano) viene archiviata, così compare solo nell'etichetta e non nella Inbox.
RestituisceL'etichetta aggiornata.
AnnotazioniidempotentHint
Esempio di params per tools/call
{
  "name": "update_label",
  "arguments": {
    "label_id": "lbl_123",
    "name": "Finance/Billing"
  }
}
Distruttivodelete_label
DELETE /labels/:label_id

Elimina un'etichetta

DESTRUCTIVE: elimina un'etichetta e le sue regole. Le email vengono mantenute; perdono solo questa etichetta.

ParametroTipoObbligatorioDescrizione
label_idstringsìID dell'etichetta (inizia con lbl_) o il nome esatto dell'etichetta. (max 128 caratteri)
Restituisce{ok: true}.
AnnotazionidestructiveHint idempotentHint
Esempio di params per tools/call
{
  "name": "delete_label",
  "arguments": {
    "label_id": "lbl_123"
  }
}
Modifica lo statocreate_label_rule
POST /labels/:label_id/rules

Aggiungi una regola di archiviazione automatica

Aggiungi una regola a un'etichetta, così la nuova posta corrispondente viene archiviata automaticamente. Ogni condizione impostata deve corrispondere. Usa inbox_id per dare a un indirizzo di ricezione la propria cartella; aggiungi skip_inbox per tenerla fuori dalla Inbox.

ParametroTipoObbligatorioDescrizione
label_idstringsìID dell'etichetta (inizia con lbl_) o il nome esatto dell'etichetta. (max 128 caratteri)
directionstringnoSolo posta in (ricevuta) o out (inviata). Omettilo per entrambe. (uno tra in, out)
inbox_idstringnoSolo la posta ricevuta da questa inbox (inb_…). Archivia ogni indirizzo di ricezione nella propria cartella.
fromstringnoIl mittente contiene questo testo (senza distinzione tra maiuscole e minuscole), ad es. @stripe.com. (max 200 caratteri)
tostringnoTo/Cc contiene questo testo (senza distinzione tra maiuscole e minuscole). (max 200 caratteri)
subjectstringnoL'oggetto contiene questo testo (senza distinzione tra maiuscole e minuscole). (max 200 caratteri)
skip_inboxbooleannoArchivia la posta ricevuta corrispondente, così compare solo nella cartella dell'etichetta e non nella Inbox.
apply_to_existingbooleannoArchivia anche la posta già conservata che corrisponde.
Restituisce{id: lrule_…, labelId, direction, inboxId, from, to, subject, skipInbox}.
Esempio di params per tools/call
{
  "name": "create_label_rule",
  "arguments": {
    "label_id": "Billing",
    "inbox_id": "inb_123",
    "skip_inbox": true
  }
}
Distruttivodelete_label_rule
DELETE /labels/:label_id/rules/:rule_id

Elimina una regola di archiviazione automatica

DESTRUCTIVE: rimuove una regola di archiviazione automatica. La posta già archiviata mantiene l'etichetta.

ParametroTipoObbligatorioDescrizione
label_idstringsìID dell'etichetta (inizia con lbl_) o il nome esatto dell'etichetta. (max 128 caratteri)
rule_idstringsìID della regola (inizia con lrule_), da get_label. (max 128 caratteri)
Restituisce{ok: true}.
AnnotazionidestructiveHint idempotentHint
Esempio di params per tools/call
{
  "name": "delete_label_rule",
  "arguments": {
    "label_id": "lbl_123",
    "rule_id": "lrule_123"
  }
}
Modifica lo statolabel_email
POST /emails/:email_id/labels

Aggiungi o rimuovi etichette da un'email

Sposta un messaggio tra cartelle: aggiungi e/o rimuovi etichette per nome o per ID lbl_…. I nomi sconosciuti in add vengono creati, a meno che create sia false.

ParametroTipoObbligatorioDescrizione
email_idstringsìID dell'email (inizia con em_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
addstring[]noEtichette da aggiungere. (0–10 elementi)
removestring[]noEtichette da rimuovere. (0–10 elementi)
createbooleannoCrea le etichette sconosciute in add (predefinito true).
RestituisceL'email aggiornata con labels.
AnnotazioniidempotentHint
Esempio di params per tools/call
{
  "name": "label_email",
  "arguments": {
    "email_id": "em_123",
    "add": [
      "Billing"
    ],
    "remove": [
      "Support"
    ]
  }
}

Bozze, allegati e identità mittente

Sola letturalist_sending_identities
GET /sending-identities

Elenca le identità mittente verificate

Indirizzi e domini da cui questo workspace può inviare in questo momento (domini verificati, il loro From predefinito e gli indirizzi delle inbox attive). Chiamalo prima di send_email per scegliere un from valido.

Nessun parametro.

Restituisce{domains: [nomi dei domini verificati], addresses: [indirizzi mittente], localParts: [...]}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "list_sending_identities",
  "arguments": {}
}
Modifica lo statocreate_draft
POST /drafts

Crea una bozza

Crea una bozza del composer. Le bozze contengono gli allegati: crea una bozza, chiama upload_attachment, poi send_email con draft_id. Non invia nulla.

ParametroTipoObbligatorioDescrizione
fromstringnoIndirizzo del mittente su un dominio verificato (può essere vuoto durante la stesura).
tostring[]noDestinatari. (0–100 elementi)
ccstring[]noDestinatari in copia. (0–100 elementi)
bccstring[]noDestinatari in copia nascosta. (0–100 elementi)
subjectstringnoOggetto. (max 998 caratteri)
htmlstringnoCorpo HTML.
textstringnoCorpo in testo semplice.
reply_to_email_idstringnoID dell'email a cui risponde questa bozza.
thread_idstringnoID del thread a cui appartiene questa bozza.
RestituisceOggetto bozza {id: dr_…, from, to, cc, bcc, subject, html, text, attachments: []}.
Esempio di params per tools/call
{
  "name": "create_draft",
  "arguments": {
    "from": "hello@example.com",
    "to": [
      "owner@example.com"
    ],
    "subject": "Invoice"
  }
}
Sola letturalist_drafts
GET /drafts

Elenca le bozze

Elenca le bozze del composer, dalle aggiornate più di recente. Paginato: il risultato include pagination {offset, limit, returned, total?, has_more, next_offset}.

ParametroTipoObbligatorioDescrizione
limitintegernoDimensione della pagina. Predefinita: 50. (predefinito 50; 1–200)
offsetintegernoNumero di record da saltare. Usa pagination.next_offset della pagina precedente. (predefinito 0; 0–…)
Restituisce{data: [bozze], count, pagination}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "list_drafts",
  "arguments": {}
}
Sola letturaget_draft
GET /drafts/:draft_id

Recupera una bozza

Recupera una bozza con i metadati dei suoi allegati.

ParametroTipoObbligatorioDescrizione
draft_idstringsìID della bozza (inizia con dr_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
RestituisceOggetto bozza con attachments.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "get_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
Modifica lo statoupdate_draft
PUT /drafts/:draft_id

Sostituisci il contenuto della bozza

Sostituisce contenuto e destinatari di una bozza. È una sostituzione completa: i campi omessi vengono svuotati, quindi leggi prima get_draft e invia tutti i campi che vuoi mantenere. Gli allegati non vengono toccati.

ParametroTipoObbligatorioDescrizione
draft_idstringsìID della bozza (inizia con dr_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
fromstringnoIndirizzo del mittente su un dominio verificato (può essere vuoto durante la stesura).
tostring[]noDestinatari. (0–100 elementi)
ccstring[]noDestinatari in copia. (0–100 elementi)
bccstring[]noDestinatari in copia nascosta. (0–100 elementi)
subjectstringnoOggetto. (max 998 caratteri)
htmlstringnoCorpo HTML.
textstringnoCorpo in testo semplice.
reply_to_email_idstringnoID dell'email a cui risponde questa bozza.
thread_idstringnoID del thread a cui appartiene questa bozza.
RestituisceOggetto bozza aggiornato.
AnnotazioniidempotentHint
Esempio di params per tools/call
{
  "name": "update_draft",
  "arguments": {
    "draft_id": "dr_123",
    "from": "hello@example.com",
    "to": [
      "owner@example.com"
    ],
    "subject": "Invoice (updated)",
    "text": "Attached."
  }
}
Distruttivodelete_draft
DELETE /drafts/:draft_id

Scarta una bozza

DESTRUCTIVE: scarta una bozza ed elimina definitivamente i suoi allegati archiviati.

ParametroTipoObbligatorioDescrizione
draft_idstringsìID della bozza (inizia con dr_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
Restituisce{ok: true}.
AnnotazionidestructiveHint idempotentHint
Esempio di params per tools/call
{
  "name": "delete_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
Modifica lo statoupload_attachment
POST /drafts/:draft_id/attachments

Carica un allegato in una bozza

Carica un file in una bozza (max 10 file e 10 MB in totale per messaggio). Fornisci content_base64 o un file_path locale. Al momento dell'invio gli allegati richiedono un piano a pagamento.

Fornisci almeno uno tra: content_base64, file_path.

ParametroTipoObbligatorioDescrizione
draft_idstringsìID della bozza (inizia con dr_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
filenamestringnoNome del file mostrato al destinatario. Per impostazione predefinita è il nome base di file_path. (max 255 caratteri)
content_typestringnoTipo MIME, ad es. application/pdf. Predefinito: application/octet-stream.
content_base64stringnoContenuto del file in base64 standard.
file_pathstringnoPercorso assoluto di un file locale leggibile dal processo del server MCP.
Restituisce{id: att_…, filename, contentType, sizeBytes, available}.
Esempio di params per tools/call
{
  "name": "upload_attachment",
  "arguments": {
    "draft_id": "dr_123",
    "filename": "invoice.pdf",
    "content_type": "application/pdf",
    "file_path": "/tmp/invoice.pdf"
  }
}
Sola letturadownload_attachment
GET /attachments/:attachment_id

Scarica un allegato

Scarica un allegato privato (inviato, ricevuto o di una bozza). Restituisce il contenuto in base64, oppure scrive il file quando è impostato save_to_path (rifiuta di sovrascrivere a meno che overwrite sia true).

ParametroTipoObbligatorioDescrizione
attachment_idstringsìID dell'allegato (inizia con att_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
save_to_pathstringnoPercorso locale assoluto facoltativo in cui scrivere il file invece di restituirlo in base64.
overwritebooleannoConsente di sostituire un file esistente in save_to_path. Predefinito: false.
Restituisce{attachment_id, filename, content_type, size_bytes, content_base64} oppure {attachment_id, filename, content_type, size_bytes, saved_to}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "download_attachment",
  "arguments": {
    "attachment_id": "att_123",
    "save_to_path": "/tmp/invoice.pdf"
  }
}
Distruttivodelete_attachment
DELETE /attachments/:attachment_id

Elimina un allegato

DESTRUCTIVE: elimina definitivamente un allegato archiviato (ad esempio per togliere un file da una bozza prima dell'invio).

ParametroTipoObbligatorioDescrizione
attachment_idstringsìID dell'allegato (inizia con att_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
Restituisce{ok: true}.
AnnotazionidestructiveHint idempotentHint
Esempio di params per tools/call
{
  "name": "delete_attachment",
  "arguments": {
    "attachment_id": "att_123"
  }
}

Template ospitati

Sola letturalist_templates
GET /templates

Elenca i template ospitati

Elenca i template email ospitati con stato di pubblicazione e utilizzo. Paginato: il risultato include pagination {offset, limit, returned, total?, has_more, next_offset}.

ParametroTipoObbligatorioDescrizione
lifecyclestringnoactive (predefinito), archived o all. (uno tra active, archived, all)
querystringnoCerca per nome o chiave. (max 120 caratteri)
limitintegernoDimensione della pagina. Predefinita: 50. (predefinito 50; 1–200)
offsetintegernoNumero di record da saltare. Usa pagination.next_offset della pagina precedente. (predefinito 0; 0–…)
Restituisce{data: [template], count, pagination}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "list_templates",
  "arguments": {
    "lifecycle": "active"
  }
}
Modifica lo statocreate_template
POST /templates

Crea un template ospitato

Crea un template con una bozza modificabile, facoltativamente a partire da un modello iniziale (welcome, reset, receipt o blank). Pubblicalo prima di inviare tramite chiave.

ParametroTipoObbligatorioDescrizione
namestringsìNome leggibile. (max 120 caratteri)
keystringnoChiave di invio stabile: lettere minuscole, numeri e trattini; inizia con una lettera (2–64 caratteri). Se omessa, viene ricavata dal nome.
starterstringnoContenuto iniziale. (uno tra blank, welcome, reset, receipt)
Restituisce{template, draft, activeVersion, versions, usage}.
Esempio di params per tools/call
{
  "name": "create_template",
  "arguments": {
    "name": "Account welcome",
    "key": "account-welcome",
    "starter": "welcome"
  }
}
Sola letturaget_template
GET /templates/:template_id

Recupera un template

Recupera la bozza corrente di un template (con revision), la release pubblicata attiva, lo storico delle release e l'utilizzo. Accetta ID o chiave.

ParametroTipoObbligatorioDescrizione
template_idstringsìID del template (tmpl_…) o chiave. (max 128 caratteri)
Restituisce{template, draft: {id, revision, subjectTemplate, htmlTemplate, textTemplate, variables, sampleData, …} | null, activeVersion, versions, usage}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "get_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Modifica lo statoupdate_template_draft
PUT /templates/:template_id/draft

Salva la bozza di un template

Salva la bozza modificabile del template con concorrenza ottimistica: passa la revision corrente ottenuta da get_template (409 significa che qualcun altro ha salvato prima; rileggi e ritenta). È una sostituzione completa del contenuto della bozza: i campi omessi vengono svuotati, quindi invia tutti i campi che vuoi mantenere. Usa i segnaposto {{variable}}.

ParametroTipoObbligatorioDescrizione
template_idstringsìID o chiave del template. (max 128 caratteri)
revisionintegersìRevisione corrente della bozza, da get_template. (1–…)
namestringnoNome del template. (max 120 caratteri)
subject_templatestringnoOggetto con segnaposto. (max 998 caratteri)
preheader_templatestringnoTesto di anteprima. (max 240 caratteri)
html_templatestringnoCorpo HTML con segnaposto.
text_templatestringnoCorpo in testo semplice con segnaposto.
fromstringnoMittente predefinito per gli invii di questo template.
reply_tostringnoReply-To predefinito.
variablesobject[]noContratto delle variabili tipizzate. Ogni elemento: {key (minuscole/underscore), label, type: text|number|url|boolean, required (predefinito true), fallback, description}.
variables[].keystringsì
variables[].labelstringno
variables[].typestringno(uno tra text, number, url, boolean)
variables[].requiredbooleanno
variables[].fallbackanyno
variables[].descriptionstringno
sample_dataobjectnoValori di esempio usati per anteprime e test.
Restituisce{template, draft: {revision: next}, validation: {valid, findings}}.
Esempio di params per 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"
    }
  }
}
Modifica lo statocreate_template_draft
POST /templates/:template_id/draft

Avvia una nuova bozza dalla release pubblicata

Crea una nuova bozza modificabile copiata dalla release pubblicata corrente (409 se esiste già una bozza o se non è pubblicato nulla).

ParametroTipoObbligatorioDescrizione
template_idstringsìID o chiave del template. (max 128 caratteri)
Restituisce{draft}.
Esempio di params per tools/call
{
  "name": "create_template_draft",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Sola letturarender_template
POST /templates/:template_id/render

Renderizza l'anteprima di un template

Renderizza l'output esatto del server (oggetto, html, testo) per la bozza, la release pubblicata o una versione specifica con i dati forniti. Non invia nulla. Restituisce 422 con findings quando i dati violano il contratto delle variabili.

ParametroTipoObbligatorioDescrizione
template_idstringsìID o chiave del template. (max 128 caratteri)
version_idstringnoID di versione facoltativo; per impostazione predefinita la bozza, poi la release pubblicata.
dataobjectnoValori delle variabili; per impostazione predefinita i dati di esempio della versione.
Restituisce{subject, html, text, preheader, versionId, versionNumber, isDraft, findings}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "render_template",
  "arguments": {
    "template_id": "account-welcome",
    "data": {
      "first_name": "Asha"
    }
  }
}
Invia email realisend_template_test
POST /templates/:template_id/test

Invia un'email di test del template

SENDS REAL EMAIL. Invia ai destinatari indicati uno snapshot della bozza (o di una versione specifica) con il prefisso [Test]. Conta ai fini dell'utilizzo; i workspace in prova possono inviare solo all'email dell'account o a un indirizzo del simulatore SES.

ParametroTipoObbligatorioDescrizione
template_idstringsìID o chiave del template. (max 128 caratteri)
tostring[]sìDestinatari del test. (1–100 elementi)
fromstringnoMittente su un dominio verificato; per impostazione predefinita il From del template.
version_idstringnoID di versione facoltativo.
dataobjectnoValori delle variabili; per impostazione predefinita i dati di esempio.
Restituisce{id: em_…, providerMessageId, threadId, isTest: true}.
Esempio di params per tools/call
{
  "name": "send_template_test",
  "arguments": {
    "template_id": "account-welcome",
    "to": [
      "owner@example.com"
    ]
  }
}
Modifica lo statopublish_template
POST /templates/:template_id/publish

Pubblica una release del template

Pubblica la bozza corrente come release immutabile che verrà usata da send_email con template.key. Fallisce con 422 e i findings in caso di errori di validazione, oppure con 409 se romperebbe il contratto delle variabili attivo di un template già usato in produzione.

ParametroTipoObbligatorioDescrizione
template_idstringsìID o chiave del template. (max 128 caratteri)
Restituisce{template, published}.
Esempio di params per tools/call
{
  "name": "publish_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Modifica lo statoarchive_template
POST /templates/:template_id/archive

Archivia un template

Blocca i nuovi invii che usano questo template (lo storico viene conservato; reversibile con restore_template). Qualsiasi integrazione che invia con questa chiave inizierà a fallire con 404.

ParametroTipoObbligatorioDescrizione
template_idstringsìID o chiave del template. (max 128 caratteri)
Restituisce{template}.
AnnotazioniidempotentHint
Esempio di params per tools/call
{
  "name": "archive_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Modifica lo statorestore_template
POST /templates/:template_id/restore

Ripristina un template archiviato

Rende di nuovo attivo un template archiviato.

ParametroTipoObbligatorioDescrizione
template_idstringsìID o chiave del template. (max 128 caratteri)
Restituisce{template}.
AnnotazioniidempotentHint
Esempio di params per tools/call
{
  "name": "restore_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}

Domini e DNS

Sola letturalist_domains
GET /domains

Elenca i domini

Elenca i domini di invio con lo setup_status aggregato (verified | checking | pending), lo stato DNS di ogni record e lo stato della ricezione in entrata. Può essere lento: i domini non verificati vengono ricontrollati in tempo reale. Paginato: il risultato include pagination {offset, limit, returned, total?, has_more, next_offset}.

ParametroTipoObbligatorioDescrizione
limitintegernoDimensione della pagina. Predefinita: 50. (predefinito 50; 1–200)
offsetintegernoNumero di record da saltare. Usa pagination.next_offset della pagina precedente. (predefinito 0; 0–…)
Restituisce{data: [domini con record], count, pagination}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "list_domains",
  "arguments": {}
}
Sola letturaget_domain
GET /domains/:domain_id

Recupera i dettagli di configurazione del dominio

Recupera un dominio con i record DNS esatti da pubblicare (tipo, nome, valore), lo stato attuale di ogni record visto da due resolver pubblici, i dns_issues con le correzioni e lo stato della ricezione in entrata.

ParametroTipoObbligatorioDescrizione
domain_idstringsìID del dominio (inizia con dom_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
Restituisce{id, name, status, setup_status, dns_propagating, records: [{type, name, value, verified, dns_state}], dns_issues: [{code, message, …}], inbound_domain, inbound_status}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "get_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Modifica lo statoadd_domain
POST /domains

Aggiungi un dominio di invio

Registra per l'invio un dominio che controlli. Restituisce i record DNS (CNAME SES Easy DKIM) che il titolare deve pubblicare. Non modifica direttamente il DNS. Conta ai fini del limite di domini del piano.

ParametroTipoObbligatorioDescrizione
namestringsìNome di dominio semplice, ad es. example.com o mail.example.com. (max 253 caratteri)
default_fromstringnoIndirizzo mittente predefinito facoltativo su questo dominio.
Restituisce{id: dom_…, name, status: pending, records: [...], ses: {configured}}.
Esempio di params per tools/call
{
  "name": "add_domain",
  "arguments": {
    "name": "example.com"
  }
}
Modifica lo statoverify_domain
POST /domains/:domain_id/verify

Verifica un dominio

Esegue subito un controllo di verifica SES/DNS in tempo reale. Si può ripetere senza rischi; interroga ogni 30–60 s dopo le modifiche DNS (la propagazione può richiedere da qualche minuto a qualche ora). L'invio è consentito quando lo stato è verified.

ParametroTipoObbligatorioDescrizione
domain_idstringsìID del dominio (inizia con dom_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
Restituisce{domain, checks: {ses, dkim, dkim_status}, status: verified|pending}.
AnnotazioniidempotentHint
Esempio di params per tools/call
{
  "name": "verify_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Distruttivodelete_domain
DELETE /domains/:domain_id

Elimina un dominio

DESTRUCTIVE: rimuove il dominio dal workspace, compresa la sua route di ricezione in entrata. Gli invii da quel dominio falliscono subito dopo. Non elimina i record DNS presso il tuo provider DNS.

ParametroTipoObbligatorioDescrizione
domain_idstringsìID del dominio (inizia con dom_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
Restituisce{ok: true}.
AnnotazionidestructiveHint idempotentHint
Esempio di params per tools/call
{
  "name": "delete_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Sola letturaget_dns_provider
GET /dns/provider

Rileva il provider DNS e gli host dei record

Rileva il provider DNS autoritativo del dominio e restituisce l'host relativo da inserire presso quel provider per ogni record, il record DMARC consigliato, le indicazioni per l'MX in entrata e se è disponibile la configurazione con un clic (Domain Connect).

ParametroTipoObbligatorioDescrizione
domain_idstringsìID del dominio (inizia con dom_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
Restituisce{detectionStatus, detected, zone, nameservers, recordHosts: {recordId: host}, inbound, recommendations, authentication, providers: {domainConnect: {available, providerName}}}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "get_dns_provider",
  "arguments": {
    "domain_id": "dom_123"
  }
}

Email in entrata

Modifica lo statosetup_inbound
POST /domains/:domain_id/inbound/setup

Abilita la ricezione in entrata per un dominio

Predispone la ricezione in entrata SES per un dominio verificato. Usa il dominio radice quando non ha un MX in conflitto, altrimenti inbound.<domain>. Restituisce il record MX che il titolare deve pubblicare; non modifica il DNS.

ParametroTipoObbligatorioDescrizione
domain_idstringsìID del dominio (inizia con dom_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
Restituisce{domain: dominio di ricezione, status: dns_pending|ready, record: {type: MX, name, value}}.
AnnotazioniidempotentHint
Esempio di params per tools/call
{
  "name": "setup_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Modifica lo statoverify_inbound
POST /domains/:domain_id/inbound/verify

Verifica l'MX in entrata

Ricontrolla il record MX in entrata. Lo stato diventa ready quando entrambi i resolver pubblici lo vedono.

ParametroTipoObbligatorioDescrizione
domain_idstringsìID del dominio (inizia con dom_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
Restituisce{domain, status: ready|dns_pending|propagating|checking, record}.
AnnotazioniidempotentHint
Esempio di params per tools/call
{
  "name": "verify_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Sola letturalist_inboxes
GET /inboxes

Elenca gli indirizzi in entrata

Elenca gli indirizzi di ricezione, facoltativamente per un solo dominio. Paginato: il risultato include pagination {offset, limit, returned, total?, has_more, next_offset}.

ParametroTipoObbligatorioDescrizione
domain_idstringnoFiltro facoltativo per ID del dominio.
limitintegernoDimensione della pagina. Predefinita: 50. (predefinito 50; 1–200)
offsetintegernoNumero di record da saltare. Usa pagination.next_offset della pagina precedente. (predefinito 0; 0–…)
Restituisce{data: [{id, address, name, status, domainId}], count, pagination}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "list_inboxes",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Sola letturaget_inbox
GET /inboxes/:inbox_id

Recupera una inbox

Recupera un indirizzo in entrata.

ParametroTipoObbligatorioDescrizione
inbox_idstringsìID della inbox (inizia con inb_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
RestituisceOggetto inbox.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "get_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}
Modifica lo statocreate_inbox
POST /inboxes

Crea un indirizzo in entrata

Crea un indirizzo come support@<receiving domain> su un dominio con stato di ricezione ready (esegui prima setup_inbound e verify_inbound). La posta ricevuta compare in list_emails con direction in.

ParametroTipoObbligatorioDescrizione
domain_idstringsìID del dominio (inizia con dom_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
local_partstringsìParte prima della @, ad es. support. (max 64 caratteri)
namestringnoNome visualizzato facoltativo.
Restituisce{id: inb_…, address, name, status: active}.
Esempio di params per tools/call
{
  "name": "create_inbox",
  "arguments": {
    "domain_id": "dom_123",
    "local_part": "support",
    "name": "Support"
  }
}
Modifica lo statoupdate_inbox
PATCH /inboxes/:inbox_id

Rinomina, attiva o disattiva una inbox

Rinomina una inbox o imposta il suo stato su active / disabled.

ParametroTipoObbligatorioDescrizione
inbox_idstringsìID della inbox (inizia con inb_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
namestringnoNuovo nome visualizzato.
statusstringnoNuovo stato. (uno tra active, disabled)
RestituisceLa inbox aggiornata.
AnnotazioniidempotentHint
Esempio di params per tools/call
{
  "name": "update_inbox",
  "arguments": {
    "inbox_id": "inb_123",
    "status": "disabled"
  }
}
Invia email realiset_inbox_forwarding
PUT /inboxes/:inbox_id/forwarding

Inoltra una inbox a un altro indirizzo

SENDS REAL EMAIL quando inoltri a una persona diversa dal titolare dell'account: imposta dove viene inoltrata la posta ricevuta da una inbox. L'indirizzo del titolare si attiva subito; qualsiasi altro indirizzo riceve un'email di conferma e l'inoltro resta pending finché qualcuno non conferma da quell'indirizzo. Passa forward_to: null per disattivare l'inoltro. Le copie inoltrate partono dall'indirizzo della inbox con il mittente originale come Reply-To.

ParametroTipoObbligatorioDescrizione
inbox_idstringsìID della inbox (inizia con inb_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
forward_tostring,nullsìIndirizzo email di destinazione dell'inoltro, oppure null per disattivarlo. (max 254 caratteri)
RestituisceLa inbox con forwardTo e forwardStatus (off, pending o active).
AnnotazioniidempotentHint
Esempio di params per tools/call
{
  "name": "set_inbox_forwarding",
  "arguments": {
    "inbox_id": "inb_123",
    "forward_to": "team@example.net"
  }
}
Distruttivodelete_inbox
DELETE /inboxes/:inbox_id

Elimina una inbox

DESTRUCTIVE: elimina un indirizzo in entrata. La posta già ricevuta viene conservata; la nuova posta diretta all'indirizzo non viene più archiviata lì.

ParametroTipoObbligatorioDescrizione
inbox_idstringsìID della inbox (inizia con inb_), come restituito da uno strumento di elenco o di creazione. (max 128 caratteri)
Restituisce{ok: true}.
AnnotazionidestructiveHint idempotentHint
Esempio di params per tools/call
{
  "name": "delete_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}

Deliverability, bounce e soppressioni

Sola letturadeliverability_stats
GET /deliverability/stats

Recupera le statistiche di consegna degli ultimi 30 giorni

Totali degli ultimi 30 giorni per l'intero workspace: sent, delivery, bounce, complaint, reject, open, click e deliveryRate (%).

Nessun parametro.

Restituisce{window: 30d, sent, delivery, bounce, complaint, reject, open, click, deliveryRate}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "deliverability_stats",
  "arguments": {}
}
Sola letturalist_sender_reputation
GET /deliverability/reputation

Elenca la reputazione dei mittenti

Stato della reputazione per indirizzo From esatto: active, throttled (limite giornaliero ridotto) o paused (gli invii restituiscono 423), con il motivo e il limite giornaliero. Controllalo quando gli invii falliscono con 423 o 429. Paginato: il risultato include pagination {offset, limit, returned, total?, has_more, next_offset}.

ParametroTipoObbligatorioDescrizione
limitintegernoDimensione della pagina. Predefinita: 50. (predefinito 50; 1–200)
offsetintegernoNumero di record da saltare. Usa pagination.next_offset della pagina precedente. (predefinito 0; 0–…)
Restituisce{data: [{sender, status, dailyLimit, reason, cleanSince, warnedAt, pausedAt, evaluatedAt}], count, pagination}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "list_sender_reputation",
  "arguments": {}
}
Sola letturalist_suppressions
GET /suppressions

Elenca le soppressioni

Lista di soppressione del workspace: destinatari bloccati dopo un bounce permanente o una segnalazione di spam. Gli invii verso di loro falliscono con 422. Paginato: il risultato include pagination {offset, limit, returned, total?, has_more, next_offset}.

ParametroTipoObbligatorioDescrizione
limitintegernoDimensione della pagina. Predefinita: 50. (predefinito 50; 1–200)
offsetintegernoNumero di record da saltare. Usa pagination.next_offset della pagina precedente. (predefinito 0; 0–…)
Restituisce{data: [{email, reason, detail, created_at}], count, pagination}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "list_suppressions",
  "arguments": {}
}
Distruttivoremove_suppression
DELETE /suppressions/:email

Rimuovi una soppressione per bounce

DESTRUCTIVE (indebolisce un blocco di sicurezza): rimuove una soppressione per bounce, così l'indirizzo può ricevere di nuovo posta. Fallo solo quando la persona conferma che l'indirizzo ora è valido. Le soppressioni per segnalazione di spam non possono essere rimosse (409).

ParametroTipoObbligatorioDescrizione
emailstringsìIndirizzo del destinatario soppresso. (max 320 caratteri)
Restituisce{ok: true}.
AnnotazionidestructiveHint idempotentHint
Esempio di params per tools/call
{
  "name": "remove_suppression",
  "arguments": {
    "email": "fixed-mailbox@example.net"
  }
}
Sola letturalist_blocked_recipients
GET /blocked-recipients

Elenca i destinatari bloccati

Tutti i destinatari che SendHQ rifiuterà: bounce, segnalazioni di spam e disiscrizioni dal marketing a livello di dominio, con un riepilogo per tipo. Legge fino ai 500 più recenti. Paginato: il risultato include pagination {offset, limit, returned, total?, has_more, next_offset}.

ParametroTipoObbligatorioDescrizione
limitintegernoDimensione della pagina. Predefinita: 50. (predefinito 50; 1–200)
offsetintegernoNumero di record da saltare. Usa pagination.next_offset della pagina precedente. (predefinito 0; 0–…)
Restituisce{data: [{email, domain, kind: bounce|complaint|unsubscribe, reason, detail, source, status, created_at}], count, summary: {total, bounce, complaint, unsubscribe}, pagination}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "list_blocked_recipients",
  "arguments": {}
}

Account, utilizzo, analytics e chiavi

Sola letturaget_account
GET /account

Recupera account, utilizzo e fatturazione

Email del titolare dell'account, piano/livello di accesso, consegne per destinatario usate nel periodo corrente rispetto alla quota, domini usati rispetto al limite, trasferimento di allegati, riepilogo della reputazione, stato dell'abbonamento, piani pubblicati e conteggi del workspace. Usalo per controllare la quota residua o a chi può consegnare la prova (l'email dell'account).

Nessun parametro.

Restituisce{user: {email, …}, usage: {domainsUsed, domainLimit, recipientDeliveries, emailQuotaMonth, attachmentBytes, attachmentByteLimit, periodKey}, access: {tier, planCode}, reputation, infrastructure, billing: {status, subscriptions, …}, plans, workspace: {mailer, stats}}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "get_account",
  "arguments": {}
}
Sola letturaget_analytics
GET /analytics

Recupera le analytics di invio

Analytics della dashboard per gli ultimi 7, 30 o 90 giorni: totali di inviate/ricevute/consegnate/bounce/bloccate/aperte/cliccate/segnalazioni di spam, una timeline giornaliera, i principali domini di invio e gli oggetti più frequenti.

ParametroTipoObbligatorioDescrizione
daysintegernoFinestra in giorni: 7, 30 (predefinito) o 90. (uno tra 7, 30, 90)
Restituisce{window, days, metrics, timeline: [{day, sent, received}], domains, topContent}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "get_analytics",
  "arguments": {
    "days": 30
  }
}
Sola letturalist_api_keys
GET /keys

Elenca i metadati delle chiavi API

Elenca nomi, prefissi non segreti e data dell'ultimo utilizzo delle chiavi API. Sola lettura: questo server MCP non può creare, ruotare o revocare chiavi; lo fa una persona nella dashboard. Paginato: il risultato include pagination {offset, limit, returned, total?, has_more, next_offset}.

ParametroTipoObbligatorioDescrizione
limitintegernoDimensione della pagina. Predefinita: 50. (predefinito 50; 1–200)
offsetintegernoNumero di record da saltare. Usa pagination.next_offset della pagina precedente. (predefinito 0; 0–…)
Restituisce{data: [{id, name, prefix, lastUsedAt, createdAt}], count, pagination}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "list_api_keys",
  "arguments": {}
}
Sola letturaget_service_health
GET /health

Controlla lo stato del servizio SendHQ

Controlla che l'API di SendHQ sia attiva e quale provider di posta è in uso. Non richiede una chiave API valida.

Nessun parametro.

Restituisce{ok, service, mailer}.
AnnotazionireadOnlyHint idempotentHint
Esempio di params per tools/call
{
  "name": "get_service_health",
  "arguments": {}
}

Inventario della copertura dell'API

Ogni operazione dell'API pubblica e lo strumento che la copre. Tutto ciò che un utente può fare nella dashboard e che ha un'API è coperto; le esclusioni riportate sotto sono intenzionali.

EndpointStrumentoNote
POST /emailssend_emailInvia un'email
POST /emails/batchsend_batchInvia fino a 100 messaggi personalizzati
GET /emailslist_emailsElenca le email inviate e ricevute
GET /emails/:idget_emailRecupera un'email e i suoi allegati
PATCH /emails/:idmark_emailAggiorna lettura, archiviazione, spam, categoria o importanza
POST /emails/:id/labelslabel_emailAggiungi o rimuovi etichette da un'email
DELETE /emails/:iddelete_emailElimina un'email conservata
GET /emails/:id/eventslist_email_eventsElenca gli eventi di consegna di un'email
GET /threads/:idget_threadRecupera una conversazione in ordine cronologico
GET /labelslist_labelsElenca le etichette con il numero di messaggi e le regole di archiviazione
POST /labelscreate_labelCrea un'etichetta, facoltativamente con regole di archiviazione automatica
GET /labels/:idget_labelRecupera un'etichetta per ID o per nome
PATCH /labels/:idupdate_labelRinomina un'etichetta, cambiane il colore o trasformala in un bucket
DELETE /labels/:iddelete_labelElimina un'etichetta senza eliminarne le email
POST /labels/:id/rulescreate_label_ruleAggiungi una regola di archiviazione automatica a un'etichetta
DELETE /labels/:id/rules/:rule_iddelete_label_ruleElimina una regola di archiviazione automatica
POST /draftscreate_draftCrea una bozza del composer
GET /draftslist_draftsElenca le bozze del composer
GET /drafts/:idget_draftRecupera una bozza e i suoi allegati
PUT /drafts/:idupdate_draftSostituisci il contenuto della bozza
DELETE /drafts/:iddelete_draftScarta una bozza
POST /drafts/:id/attachmentsupload_attachmentCarica un allegato in una bozza
GET /attachments/:iddownload_attachmentScarica un allegato privato
DELETE /attachments/:iddelete_attachmentElimina un allegato privato
GET /sending-identitieslist_sending_identitiesElenca le identità mittente verificate
GET /templateslist_templatesElenca i template ospitati
POST /templatescreate_templateCrea un template ospitato
GET /templates/:idget_templateRecupera bozze, release e utilizzo
PUT /templates/:id/draftupdate_template_draftSalva automaticamente la bozza di un template
POST /templates/:id/draftcreate_template_draftCrea una nuova bozza dalla release pubblicata
POST /templates/:id/renderrender_templateRenderizza l'output esatto del server
POST /templates/:id/testsend_template_testInvia uno snapshot di test
POST /templates/:id/publishpublish_templatePubblica una release immutabile del template
POST /templates/:id/archivearchive_templateArchivia un template
POST /templates/:id/restorerestore_templateRipristina un template archiviato
POST /domainsadd_domainAggiungi un dominio di invio
GET /domainslist_domainsElenca i domini e lo stato DNS in cache
GET /domains/:idget_domainRecupera i dettagli di configurazione del dominio
POST /domains/:id/verifyverify_domainAggiorna la verifica SES e DNS
POST /domains/:id/inbound/setupsetup_inboundPredisponi la ricezione in entrata SES
POST /domains/:id/inbound/verifyverify_inboundVerifica l'instradamento MX in entrata
DELETE /domains/:iddelete_domainElimina un dominio
GET /dns/providerget_dns_providerRileva il provider DNS autoritativo e gli host relativi dei record
GET /dns/domain-connect/connectget_domain_connect_linkCrea un link di consenso Domain Connect per configurare il DNS con un clic
POST /inboxescreate_inboxCrea un indirizzo in entrata
GET /inboxeslist_inboxesElenca gli indirizzi in entrata
GET /inboxes/:idget_inboxRecupera un indirizzo in entrata
PATCH /inboxes/:idupdate_inboxRinomina, attiva o disattiva una inbox
PUT /inboxes/:id/forwardingset_inbox_forwardingInoltra a un altro indirizzo la posta ricevuta da una inbox
DELETE /inboxes/:iddelete_inboxElimina una inbox conservandone i messaggi
GET /deliverability/statsdeliverability_statsRecupera le statistiche di consegna degli ultimi 30 giorni
GET /deliverability/reputationlist_sender_reputationElenca lo stato della reputazione per identità mittente esatta
GET /suppressionslist_suppressionsElenca le soppressioni del workspace
DELETE /suppressions/:emailremove_suppressionRimuovi una soppressione per bounce idonea
GET /blocked-recipientslist_blocked_recipientsElenca bounce, segnalazioni di spam e disiscrizioni
GET /accountget_accountRecupera account, utilizzo, stato della fatturazione e conteggi del workspace con una chiave API
GET /analyticsget_analyticsRecupera le analytics di invio della dashboard per 7, 30 o 90 giorni
GET /profileget_accountGemello di GET /account riservato alle sessioni; il server MCP legge la route con chiave API.
POST /billing/checkoutnon espostoPer scelta progettuale, le modifiche alla fatturazione sono disponibili solo tramite sessione e richiedono il titolare dell'account nella dashboard. Lo stato della fatturazione si può leggere con get_account.
POST /billing/cancelnon espostoPer scelta progettuale, le modifiche alla fatturazione sono disponibili solo tramite sessione e richiedono il titolare dell'account nella dashboard. Lo stato della fatturazione si può leggere con get_account.
POST /keysnon espostoEscluso intenzionalmente: un agente non deve generare né distruggere credenziali. Le chiavi le gestisce una persona nella dashboard.
GET /keyslist_api_keysElenca i metadati delle chiavi API
DELETE /keys/:idnon espostoEscluso intenzionalmente: un agente non deve generare né distruggere credenziali. Le chiavi le gestisce una persona nella dashboard.

Non disponibile per scelta

FunzionalitàEndpointMotivo
Creare, ruotare, revocare o eliminare chiavi APIPOST /keys, DELETE /keys/:idEscluso intenzionalmente: un agente non deve generare né distruggere credenziali. Le chiavi le gestisce una persona nella dashboard.
Avviare un checkout o annullare un abbonamentoPOST /billing/checkout, POST /billing/cancelPer scelta progettuale, le modifiche alla fatturazione sono disponibili solo tramite sessione e richiedono il titolare dell'account nella dashboard. Lo stato della fatturazione si può leggere con get_account.
DNS con un clic di Cloudflare (OAuth)GET /api/dns/cloudflare/connectRichiede una sessione interattiva nel browser e il consenso OAuth di Cloudflare. Usa invece i record di get_domain, gli host di get_dns_provider o get_domain_connect_link.
Registrazione, accesso, disconnessione, collegamento dell'account Google/api/auth/*Autenticazione di una persona nel browser; il server MCP si autentica con una chiave API.
Modulo di contatto del supportoPOST /api/contactModulo pubblico del sito di marketing destinato alle persone, non un'operazione del workspace.

Catalogo leggibile dalle macchine: /docs/mcp/tools.json (schemi, annotazioni, mappatura degli endpoint, esclusioni). Versione Markdown di questa pagina: /docs/mcp.md. Con la CLI installata, sendhq commands --format json stampa lo stesso catalogo.