Pour les agents IA

Serveur MCP SendHQ

Donnez à un agent IA un contrôle complet et sûr d’un espace de travail SendHQ : envoyer et recevoir des e-mails, vérifier des domaines, publier des modèles et analyser la délivrabilité grâce à 59 outils strictement typés. Rédigé d’abord pour les agents ; les humains sont les bienvenus.

59 outilstransport stdio, une seule commande0 outil de gestion des clés
Installer et connecter (Claude Code)
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
claude mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp

Présentation du serveur

Le serveur MCP SendHQ permet à un agent IA d’exploiter un espace de travail SendHQ via le Model Context Protocol : envoyer des e-mails (unitaires, par lot, à partir de modèles, réponses, pièces jointes, nouvelles tentatives idempotentes), lire et rechercher le courrier envoyé et reçu (objets, corps et noms de pièces jointes) ainsi que ses événements de livraison, classer le courrier sous des libellés avec des règles de classement automatique, gérer les brouillons et les pièces jointes privées, rédiger et publier des modèles hébergés, ajouter et vérifier des domaines et leur DNS, configurer la réception et les adresses entrantes, examiner la délivrabilité, les bounces, les plaintes et les suppressions, et consulter l’utilisation du compte, l’état de la facturation, les statistiques et les métadonnées des clés API.

C’est un serveur stdio local intégré au binaire CLI sendhq. Votre client MCP lance sendhq mcp comme processus enfant et communique en JSON-RPC via stdin/stdout. Chaque appel d’outil devient une requête documentée vers l’API REST de SendHQ à l’adresse https://sendhq.cc/api/v1, authentifiée avec la clé API de votre espace de travail : le serveur MCP a donc exactement les permissions de cette clé, et rien de plus.

  • 59 outils répartis en 8 groupes, générés à partir d’un catalogue unique également publié sous le nom tools.json.
  • Des JSON Schemas stricts : les arguments inconnus, les types incorrects et les champs obligatoires manquants sont rejetés localement avant que quoi que ce soit n’atteigne SendHQ.
  • Des erreurs structurées avec un code stable, le status HTTP, une explanation, un remedy concret et l’indication qu’une nouvelle tentative peut ou non aider.
  • Chaque outil qui envoie de vrais e-mails ou détruit des données l’indique dès les premiers mots de sa description et porte des annotations de sécurité MCP.
  • Le mode --read-only masque tous les outils d’envoi et de modification.
  • Rien n’est journalisé. stdout ne transporte que des messages de protocole ; la clé API et le contenu des messages n’apparaissent jamais dans un log.
Ce n’est pas l’endpoint MCP de documentation.SendHQ héberge aussi un petit endpoint MCP de documentation en lecture seule à l’adresse https://sendhq.cc/api/mcp (consultation des tarifs et de la documentation, sans accès au compte). Le serveur décrit sur cette page est le serveur complet, rattaché au compte ; il s’exécute en local ou via le connecteur hébergé décrit ci-dessous.

Utiliser SendHQ dans Claude et ChatGPT

Aucune installation requise : SendHQ exécute aussi ce serveur sous forme de connecteur hébergé à l’adresse https://mcp.sendhq.cc/mcp, avec les mêmes outils. Vous vous connectez avec votre compte SendHQ au lieu de coller une clé.

Claude

  1. Ouvrez Settings → Connectors et trouvez SendHQ dans l’annuaire, ou choisissez Add custom connector et collez https://mcp.sendhq.cc/mcp.
  2. Cliquez sur Connect, connectez-vous à SendHQ, vérifiez les accès demandés et cliquez sur Allow.
  3. Demandez à Claude de consulter votre boîte de réception, d’envoyer un e-mail depuis votre domaine vérifié ou d’expliquer 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.

Approbation et déconnexion

  • The request_feature tool sends a feature request to the SendHQ team with your account details, so we can follow up by email.
  • Les outils qui envoient de vrais e-mails ou suppriment des données sont signalés comme tels. C’est dans l’assistant que vous choisissez, outil par outil, s’il doit d’abord vous demander votre accord : dans Claude, choisissez Needs approval pour ces outils sous Settings → Connectors → SendHQ.
  • Le connecteur reçoit sa propre clé API, nommée d’après l’assistant (par exemple « Claude (AI connector) »). Supprimez-la sous API Keys pour le déconnecter immédiatement.
  • Il ne peut ni créer ni révoquer de clés API, ni modifier la facturation. Les pièces jointes sont envoyées et renvoyées en base64 ; il n’y a aucun accès aux fichiers locaux.
  • Les espaces de travail non payants (essai d’intégration) ne peuvent délivrer qu’à l’adresse e-mail du compte ou à une adresse du simulateur AWS SES.

Questions : postmaster@sendhq.cc. Confidentialité : sendhq.cc/privacy.

Installation

Installez le binaire sendhq (Linux, macOS et Windows, sur x86-64 et arm64). L’installateur vérifie la somme de contrôle de la version et place le binaire dans ~/.local/bin par défaut.

macOS et Linux
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
Windows PowerShell
irm https://downloads.sendhq.cc/install.ps1 | iex
Vérifier l’installation
sendhq version
SENDHQ_API_KEY=re_your_key sendhq doctor

Créez une clé API dans le tableau de bord, à l’adresse https://sendhq.cc/app#/keys. Le serveur MCP ne peut pas créer de clés. La seule commande qui lance le serveur est :

Lancer le serveur stdio
SENDHQ_API_KEY=re_your_key sendhq mcp

En temps normal, vous ne la lancez jamais à la main : c’est le client MCP qui s’en charge. Lancée dans un terminal, elle attend du JSON-RPC sur stdin.

Configurer votre 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

Ajoutez --scope user pour le rendre disponible dans tous les projets, ou --scope project pour l’écrire dans le fichier .mcp.json du projet. Pour un .mcp.json partagé, référencez la clé depuis l’environnement au lieu de la committer ; Claude Code développe ${VAR} dans .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 en ligne de commande : codex mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp.

Claude Desktop

Modifiez claude_desktop_config.json (macOS : ~/Library/Application Support/Claude/, Windows : %APPDATA%\Claude\) et redémarrez l’application. Les applications de bureau n’héritent pas du PATH de votre shell : utilisez donc le chemin absolu du binaire (which sendhq).

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

Tout autre client MCP

Configurez un serveur stdio avec la commande sendhq, les arguments ["mcp"] (et éventuellement "--read-only") et les variables d’environnement ci-dessous. Le serveur prend en charge les versions 2024-11-05, 2025-03-26, 2025-06-18 et 2025-11-25 du protocole MCP, et implémente initialize, ping, tools/list et tools/call. Les résultats d’outils contiennent à la fois un bloc de texte JSON et un structuredContent.

Test rapide stdio brut (à envoyer dans 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":{}}}

Il n’existe pas de transport HTTP hébergé pour le serveur rattaché au compte. Un endpoint MCP distant capable d’écrire nécessiterait un OAuth par utilisateur, que SendHQ ne propose pas ; le binaire local garde la clé sur la machine qui la détient déjà.

Environnement et options

Variable ou optionObligatoireSignification
SENDHQ_API_KEYouiClé API de l’espace de travail (re_…). Tous les outils sauf get_service_health en ont besoin. Sans elle, le serveur démarre quand même et chaque appel renvoie une auth_error structurée expliquant comment corriger le problème.
SENDHQ_API_BASE_URLnonURL de base de l’API. Valeur par défaut : https://sendhq.cc/api/v1. À n’utiliser que pour un déploiement local ou de staging. SENDHQ_BASE_URL est accepté comme ancien alias.
SENDHQ_MCP_READ_ONLYnon1, true ou yes équivaut à --read-only.
--read-onlynonN’expose que les outils qui n’envoient pas d’e-mails et ne modifient pas l’état. Les outils masqués sont également refusés s’ils sont appelés par leur nom.
SENDHQ_PROFILE / --profilenonUtilise une clé enregistrée par sendhq auth login dans le trousseau du système d’exploitation au lieu de SENDHQ_API_KEY. La variable d’environnement l’emporte si les deux existent.

La clé n’est envoyée que dans l’en-tête Authorization: Bearer, vers l’URL de base configurée. Elle n’est jamais affichée, journalisée, reprise dans les erreurs ni incluse dans les résultats d’outils.

Modèle de sécurité pour les agents

  • Envoie de vrais e-mails. send_email, send_batch et send_template_test délivrent du courrier à de vraies personnes et consomment des crédits de livraison. Leur description commence par SENDS REAL EMAIL. Ne les appelez que lorsque l’utilisateur a explicitement demandé l’envoi de ce message précis, avec destinataires, expéditeur et contenu confirmés.
  • Destructif. delete_email, delete_draft, delete_attachment, delete_domain, delete_inbox et remove_suppression sont marqués destructiveHint: true et leur description commence par DESTRUCTIVE. Demandez d’abord confirmation à l’utilisateur. remove_suppression affaiblit un blocage de sécurité et ne convient que lorsqu’un humain confirme que l’adresse fonctionne de nouveau.
  • Modifie l’état. Créer ou mettre à jour des brouillons, des modèles, des domaines et des boîtes de réception, publier des modèles et lancer une vérification modifient l’espace de travail, mais n’envoient pas d’e-mail.
  • Lecture seule. Tout le reste est readOnlyHint: true et peut être appelé librement.
  • Ce serveur ne modifie jamais le DNS. add_domain renvoie des enregistrements qu’un humain doit publier ; get_domain_connect_link renvoie une URL de consentement qu’une personne doit ouvrir et approuver chez son fournisseur DNS.
  • Ce serveur ne modifie jamais la facturation. get_account se contente de lire la formule, l’utilisation et l’état de l’abonnement.
  • Les espaces de travail non payants (essai d’intégration) ne peuvent délivrer qu’à l’adresse e-mail du propriétaire du compte (get_account → user.email) ou à une adresse du simulateur AWS SES comme success@simulator.amazonses.com, et ne peuvent pas envoyer de pièces jointes.
  • Accepté ne veut pas dire délivré. Un envoi réussi renvoie un identifiant ; les preuves de livraison, de bounce et de plainte arrivent ensuite dans list_email_events. N’affirmez jamais qu’un message est arrivé en boîte de réception ni qu’une personne l’a lu.
  • Ne changez pas d’adresse From pour contourner une pause 423, et ne réintégrez jamais des destinataires désinscrits ou ayant porté plainte.

Les clés API sont hors périmètre

Par conception, il n’existe aucun outil pour créer, modifier, faire tourner, révoquer ou supprimer des clés API. Un agent ne doit ni émettre ni détruire d’identifiants. list_api_keys renvoie uniquement les noms, les préfixes non secrets et les dates de dernière utilisation. La gestion des clés reste dans le tableau de bord, entre les mains d’un humain connecté.

Workflows

1. Premier envoi

  1. get_service_health confirme que l’API est joignable (fonctionne sans clé).
  2. get_account indique la formule (access.tier), le quota restant et user.email. Pendant l’essai, cette adresse est le seul vrai destinataire autorisé.
  3. list_sending_identities liste les adresses From que vous pouvez utiliser. Si la liste est vide, suivez d’abord le workflow de domaine.
  4. Confirmez l’expéditeur, le destinataire, l’objet et le corps avec l’utilisateur, puis appelez send_email avec une idempotency_key.
  5. list_email_events avec l’id renvoyé affiche delivery, bounce, complaint ou reject dès que le fournisseur le signale (généralement en quelques secondes à quelques minutes).
Premier envoi
{
  "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. Vérification de domaine de bout en bout

  1. add_domain avec name: "example.com". Le résultat contient les enregistrements DNS (CNAME DKIM, vérification SES, SPF, DMARC recommandé).
  2. get_dns_provider avec le domain_id détecte le fournisseur DNS faisant autorité et renvoie l’hôte relatif exact à saisir pour chaque enregistrement chez ce fournisseur.
  3. Si providers.domainConnect.available vaut true, get_domain_connect_link renvoie une URL de consentement. Transmettez-la à l’humain ; rien ne change tant qu’il n’a pas approuvé chez le fournisseur. Sinon, donnez à l’humain les enregistrements à publier. Ne publiez jamais un second enregistrement SPF : fusionnez include:amazonses.com dans la valeur v=spf1 existante.
  4. verify_domain revérifie le DNS et SES. Le statut passe par pending, checking et propagating jusqu’à verified. Interrogez verify_domain ou get_domain toutes les 30 à 60 secondes ; le DNS peut mettre de quelques minutes à quelques heures.
  5. Lorsque status vaut verified, les adresses du domaine apparaissent dans list_sending_identities.

3. Bounces, plaintes et suppressions

  1. list_blocked_recipients renvoie chaque adresse bloquée avec son motif (bounce, complaint, unsubscribe) ainsi qu’un décompte récapitulatif.
  2. list_suppressions renvoie les suppressions pour hard bounce et pour plainte ; deliverability_stats fournit les taux de livraison, de bounces et de plaintes sur 30 jours ; list_sender_reputation indique quelles adresses From sont bridées ou en pause.
  3. Un envoi contenant un destinataire en liste de suppression échoue avec 422 recipient_suppressed. Retirez ce destinataire et renvoyez.
  4. N’appelez remove_suppression que lorsqu’un humain confirme qu’une boîte aux lettres en bounce fonctionne désormais. Les suppressions pour plainte sont permanentes (409 complaint_suppression_locked).

4. Recevoir des e-mails entrants

  1. Le domaine (souvent un sous-domaine comme inbound.example.com) doit être vérifié.
  2. setup_inbound configure la réception et renvoie un enregistrement MX. Un humain le publie.
  3. verify_inbound jusqu’à ce que status vaille ready.
  4. create_inbox avec domain_id et local_part (par exemple support) crée support@inbound.example.com.
  5. Interrogez list_emails avec direction: "in" et unread: true (et éventuellement inbox_id). Lisez un message avec get_email, sa conversation avec get_thread, ses pièces jointes avec download_attachment, et marquez-le comme traité avec mark_email (read: true).
  6. Répondez dans le fil avec send_email et reply_to_email_id ; SendHQ définit In-Reply-To, References et le fil de discussion.

5. Webhooks et notifications d’événements

SendHQ ne propose pas actuellement de webhooks configurables par les clients ; il n’existe donc pas d’outil webhook. Les notifications des fournisseurs sont traitées dans SendHQ et exposées via des lectures. Interrogez plutôt : list_email_events pour le résultat d’un message, list_emails avec status (par exemple bounced) ou after pour les changements récents, list_emails avec direction: "in" et unread: true pour le nouveau courrier entrant, et list_blocked_recipients pour les nouvelles suppressions. N’interrogez pas plus d’une fois par minute environ pour une même question.

6. Diagnostiquer un échec de livraison

  1. Trouvez le message : list_emails avec direction: "out" et to ou query, ou get_email si vous avez l’identifiant. status: failed signifie que SendHQ ou le fournisseur l’a rejeté lors de la soumission ; l’erreur de l’e-mail en explique la raison.
  2. list_email_events : bounce (permanent ou transitoire, avec le diagnostic du fournisseur), complaint, reject ou delivery. L’absence d’événements signifie que le fournisseur n’a encore rien signalé ; attendez et vérifiez à nouveau.
  3. Si l’appel d’envoi lui-même a échoué, lisez le code d’erreur : sender_domain_unverified → terminez la vérification du domaine ; recipient_suppressed → l’adresse a déjà généré un hard bounce ou une plainte ; sender_paused → examinez list_sender_reputation et corrigez la source de la liste ; trial_recipient_restricted → limites de l’essai ; quota_exhausted → utilisation dans get_account.
  4. get_domain vérifie que DKIM, SPF et DMARC sont toujours publiés ; deliverability_stats montre si le problème concerne un seul message ou une tendance.
  5. Rapportez ce que montrent les preuves. Un événement delivery signifie que le serveur du destinataire a accepté le message, pas qu’il est arrivé en boîte de réception ni qu’il a été lu.

7. Gérer sa propre catégorie de tâches (libellés)

  1. create_label avec name (par exemple Agent/Orders) et skip_inbox: true. Le libellé devient alors une catégorie : le courrier reçu qui l’obtient est archivé, de sorte qu’il n’apparaît que dans le libellé, jamais dans la Boîte de réception de l’humain.
  2. Envoyez le courrier lié à la tâche avec send_email (ou send_batch) et labels: ["Agent/Orders"]. Les réponses à cette conversation héritent automatiquement du libellé et évitent la Boîte de réception.
  3. Pour le courrier qui commence en dehors de vos conversations, ajoutez une règle de classement : create_label_rule avec inbox_id (une adresse dédiée comme orders@…), from, to ou subject. Passez apply_to_existing: true pour classer le courrier déjà reçu.
  4. Traitez la catégorie : list_emails avec label: "Agent/Orders", direction: "in" et unread: true ; lisez avec get_email ou get_thread, répondez avec send_email et reply_to_email_id, puis appelez mark_email read: true une fois le message traité.
  5. Déplacez un message égaré vers la catégorie ou hors de celle-ci avec label_email (add / remove). Ajouter un libellé de catégorie à un message reçu l’archive également.
  6. En option, set_inbox_forwarding envoie une copie de tout ce que reçoit une adresse de réception vers une autre boîte aux lettres (la cible confirme d’abord par e-mail).
Envoyer dans une catégorie
{
  "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. Pièces jointes et modèles

Joignez jusqu’à 10 fichiers avec le paramètre attachments de send_email (chacun nécessite content_base64 ou un file_path local ; filename vaut par défaut le nom de base du fichier) sur une formule payante. Pour les modèles hébergés : create_template → update_template_draft → render_template pour prévisualiser avec des données d’exemple → send_template_test (envoie un vrai test) → publish_template, puis envoyez avec send_email ou send_batch en utilisant template: {key, data} et exactement un destinataire to.

Résultats, pagination et erreurs

Un appel réussi renvoie l’objet JSON de l’API sous forme de structuredContent et de bloc de texte JSON. Chaque outil list_* accepte limit (1–200, 50 par défaut) et offset, et ajoute un objet pagination. Continuez à appeler avec offset: pagination.next_offset tant que has_more vaut true.

Résultat paginé
{
  "data": [
    "…"
  ],
  "count": 50,
  "pagination": {
    "offset": 0,
    "limit": 50,
    "returned": 50,
    "total": 180,
    "has_more": true,
    "next_offset": 50
  }
}

Un appel en échec renvoie isError: true avec une erreur structurée. Suivez le remedy au lieu de réessayer à l’aveugle ; ne réessayez que si retryable vaut true.

Erreur d’outil structurée
{
  "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."
  }
}

Champs d’erreur facultatifs : request_id (à citer au support), retry_after_seconds, problems (liste des violations de schéma pour invalid_arguments) et idempotent_replayed (voir Idempotence).

Idempotence

send_email et send_batch acceptent idempotency_key (200 caractères max.), envoyée dans l’en-tête Idempotency-Key. Générez une clé stable par message logique, par exemple invoice-4812-receipt.

  • Une nouvelle tentative doit réutiliser la même clé ET un corps de requête identique. La même clé avec la moindre modification (destinataire, objet, corps, en-tête, données de modèle, voire valeurs d’arguments) renvoie 409 idempotency_conflict.
  • Même clé, même corps, requête d’origine terminée : SendHQ renvoie le résultat enregistré sans renvoyer l’e-mail. C’est ainsi que l’on réessaie sans risque après un timeout ou une network_error.
  • Même clé alors que la requête d’origine est encore en cours : 409 idempotency_in_progress, à réessayer après une courte attente.
  • Un nouveau message logique nécessite une nouvelle clé.
  • Les échecs enregistrés sont eux aussi rejoués. Si la première tentative a échoué, réessayer avec la même clé renvoie ce même échec avec idempotent_replayed: true et retryable: false. Vérifiez avec list_emails (direction: out) que rien n’est parti, corrigez la cause, puis envoyez avec une nouvelle clé.
  • Le serveur ne réessaie jamais un POST de lui-même. Seuls les appels GET en lecture seule sont réessayés automatiquement (jusqu’à 3 tentatives en cas d’erreur réseau, de 429 et de 5xx).
  • send_email avec des attachments en ligne ne peut pas prendre d’idempotency_key, car il exécute plusieurs requêtes. Pour des envois de pièces jointes sûrs en cas de nouvelle tentative : create_draft → upload_attachment → send_email avec draft_id et idempotency_key.
Envoi sûr en cas de nouvelle tentative (à répéter à l’identique après un 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 débit et quotas

SendHQ ne publie pas de limite fixe de requêtes par seconde pour l’API. Les limites qu’un agent rencontre réellement sont des limites d’utilisation, renvoyées sous forme de 429 :

  • Livraisons mensuelles par destinataire selon la formule. Chaque adresse To, Cc et Bcc compte pour une livraison. Voir get_account → usage.recipientDeliveries par rapport à usage.emailQuotaMonth.
  • Destinataires quotidiens par adresse From exacte, selon l’état de réputation de cet expéditeur (list_sender_reputation → dailyLimit, 2 000 par défaut sur les formules payantes).
  • Essai d’intégration : 100 destinataires au total, uniquement vers l’adresse e-mail du compte ou des adresses du simulateur SES.
  • Pièces jointes : au maximum 10 fichiers et 10 MB par message ; 10 GB de transfert de pièces jointes pondéré par destinataire par mois sur les formules payantes.
  • Par requête : To + Cc + Bcc jusqu’à 100 adresses ; send_batch jusqu’à 100 messages.
  • Disjoncteur de réputation : sur une fenêtre glissante de 7 jours, des bounces ou des plaintes au-delà du seuil brident ou mettent en pause une adresse From (423 sender_paused). Elle se rétablit automatiquement une fois les taux redescendus.

quota_exhausted ne peut pas être réessayé avant la réinitialisation de la période ou un changement de formule. rate_limited peut être réessayé après retry_after_seconds ; pour les envois, réessayez avec la même idempotency_key et un corps identique.

Catalogue des erreurs

Le code est stable ; basez vos branchements sur lui plutôt que sur message.

codeHTTPRéessayer ?Signification et marche à suivre
invalid_arguments—nonLes arguments n’ont pas passé localement le JSON Schema de l’outil ; rien n’a atteint SendHQ. Corrigez les champs listés dans problems.
auth_error401nonClé API manquante, révoquée ou incorrecte. Définissez SENDHQ_API_KEY pour le processus du serveur ; c’est un humain qui crée les clés dans le tableau de bord.
trial_recipient_restricted402nonL’essai d’intégration ne peut délivrer qu’à l’adresse e-mail du compte ou à une adresse du simulateur SES. Envoyez-y, ou le propriétaire active une formule payante.
payment_required402nonLa fonctionnalité nécessite une formule payante (par exemple les pièces jointes). Envoyez sans elle ou passez à une formule supérieure.
sender_domain_not_owned403nonLe domaine From n’appartient pas à cet espace de travail. Utilisez list_sending_identities ou add_domain.
sender_domain_unverified403nonLe domaine From n’est pas encore vérifié. get_domain, publiez les enregistrements manquants, verify_domain.
domain_limit_reached403nonLimite de domaines de la formule atteinte. Supprimez un domaine inutilisé (avec approbation) ou passez à une formule supérieure.
marketing_not_enabled403nonLa classe marketing n’est pas activée pour ce domaine ou cette formule. N’utilisez transactional que si le message est réellement transactionnel.
forbidden403nonLa politique n’autorise pas l’opération. Ajustez la requête.
not_found404nonL’identifiant n’appartient pas à cet espace de travail. Listez la ressource pour trouver le bon identifiant ; restaurez d’abord les modèles archivés.
idempotency_conflict409nonClé réutilisée avec un corps différent. Renvoyez exactement la requête d’origine, ou utilisez une nouvelle clé pour un nouveau message.
idempotency_in_progress409ouiLa requête d’origine est toujours en cours. Attendez, puis réessayez avec la même clé et le même corps.
revision_conflict409nonLe brouillon du modèle a changé depuis votre lecture. get_template, fusionnez, enregistrez à nouveau.
complaint_suppression_locked409nonLe destinataire a porté plainte. Ne lui envoyez plus jamais d’e-mail.
inbound_not_ready409nonLa réception n’est pas prête. setup_inbound, publiez le MX, verify_inbound.
conflict409nonLa ressource existe déjà ou n’est pas dans le bon état. Lisez-la et ajustez.
attachments_too_large413nonPlus de 10 fichiers ou de 10 MB. Retirez ou réduisez les pièces jointes.
recipient_suppressed422nonUn destinataire a déjà généré un hard bounce ou une plainte. Retirez-le ; voir list_blocked_recipients.
recipient_unsubscribed422nonUn destinataire s’est désinscrit des e-mails marketing. Retirez-le définitivement.
validation_failed422nonContenu rejeté, par exemple des données de modèle qui ne respectent pas le contrat de variables. Corrigez l’entrée.
sender_paused423nonCette adresse From est mise en pause par le disjoncteur bounces/plaintes sur 7 jours. Arrêtez, corrigez la liste et attendez le rétablissement automatique.
quota_exhausted429nonLimite mensuelle, quotidienne par expéditeur, de pièces jointes ou d’essai atteinte. Consultez get_account ; attendez la réinitialisation ou passez à une formule supérieure.
rate_limited429ouiRalentissez ; attendez retry_after_seconds. Envois : même clé, même corps.
server_error5xxouiDéfaillance temporaire de SendHQ ou du fournisseur. Appliquez un backoff et réessayez ; pour les envois, avec la même clé et le même corps. Si idempotent_replayed vaut true, utilisez une nouvelle clé après avoir confirmé que rien n’a été envoyé.
network_error—ouiRequête ou réponse perdue. Réessayez ; pour les envois, la même idempotency_key rend l’opération sûre.
invalid_request400nonRequête mal formée. Lisez message et corrigez-la.
tool_error—nonDéfaillance locale dans le serveur MCP (par exemple un file_path illisible). Lisez message.

Référence des outils

Chaque outil avec sa classe de sécurité, l’endpoint REST qu’il appelle, ses paramètres, son format de retour et un exemple d’objet params pour tools/call. Les paramètres sont exacts : le serveur rejette tout ce qui n’est pas listé.

E-mails et fils de discussion : send_email, send_batch, list_emails, get_email, mark_email, delete_email, list_email_events, get_thread
Libellés et règles de classement automatique : list_labels, get_label, create_label, update_label, delete_label, create_label_rule, delete_label_rule, label_email
Brouillons, pièces jointes et identités d’expéditeur : list_sending_identities, create_draft, list_drafts, get_draft, update_draft, delete_draft, upload_attachment, download_attachment, delete_attachment
Modèles hébergés : list_templates, create_template, get_template, update_template_draft, create_template_draft, render_template, send_template_test, publish_template, archive_template, restore_template
Domaines et DNS : list_domains, get_domain, add_domain, verify_domain, delete_domain, get_dns_provider, get_domain_connect_link
E-mails entrants : setup_inbound, verify_inbound, list_inboxes, get_inbox, create_inbox, update_inbox, set_inbox_forwarding, delete_inbox
Délivrabilité, bounces et suppressions : deliverability_stats, list_sender_reputation, list_suppressions, remove_suppression, list_blocked_recipients
Compte, utilisation, statistiques et clés : get_account, get_analytics, list_api_keys, get_service_health

E-mails et fils de discussion

Envoie de vrais e-mailssend_email
POST /emails

Envoyer un e-mail

SENDS REAL EMAIL. Envoie un message depuis un domaine vérifié : html/texte brut, modèle hébergé publié, réponse dans un fil existant ou message avec pièces jointes. Passez idempotency_key pour qu’une nouvelle tentative ne puisse pas envoyer deux fois ; une nouvelle tentative doit réutiliser la même clé ET une requête identique, sinon SendHQ renvoie 409. attachments est un raccourci qui crée un brouillon, téléverse chaque fichier et envoie avec ce brouillon ; il ne peut pas être combiné avec idempotency_key ni draft_id (utilisez create_draft + upload_attachment + send_email avec draft_id pour des envois de pièces jointes sûrs en cas de nouvelle tentative). Les espaces de travail non payants (essai d’intégration) ne peuvent délivrer qu’à l’adresse e-mail du compte ou à une adresse du simulateur AWS SES, et ne peuvent pas envoyer de pièces jointes.

Fournissez au moins l’un des éléments suivants : html, text, template.

ParamètreTypeObligatoireDescription
fromstringouiExpéditeur, par ex. Acme <hello@example.com>. Le domaine doit être vérifié dans cet espace de travail (voir list_sending_identities). (998 caractères max.)
tostring[]ouiDestinataires. Chaque entrée est une adresse, éventuellement accompagnée d’un nom d’affichage. To+cc+bcc ne peuvent dépasser 100 au total ; chaque destination consomme un crédit de livraison. (1–100 éléments)
ccstring[]nonDestinataires en copie. (0–100 éléments)
bccstring[]nonDestinataires en copie cachée. (0–100 éléments)
subjectstringnonObjet. À omettre lors de l’envoi d’un modèle. (998 caractères max.)
textstringnonCorps en texte brut. Fournissez text, html ou template.
htmlstringnonCorps HTML. SendHQ le nettoie et en dérive le texte lorsque text est omis.
reply_tostringnonAdresse Reply-To.
headersobjectnonEn-têtes personnalisés sûrs supplémentaires (valeurs de type chaîne), par ex. {"X-Entity-Ref-ID": "123"}. Les en-têtes de routage comme From/To/Message-ID sont contrôlés par SendHQ.
message_classstringnontransactional (par défaut) ou marketing. Le mode marketing nécessite une formule ou un domaine où le marketing est activé, et ajoute la gestion des désinscriptions. (valeurs possibles : transactional, marketing)
reply_to_email_idstringnonRépondre dans une conversation existante : l’identifiant em_… du message auquel vous répondez. SendHQ définit In-Reply-To/References et le fil de discussion.
thread_idstringnonIdentifiant explicite du fil sous lequel classer le message.
draft_idstringnonEnvoie avec ce message les pièces jointes d’un brouillon enregistré (dr_…). Le brouillon est supprimé après un envoi réussi.
templateobjectnonEnvoie un modèle hébergé publié au lieu de html/texte brut. Exige exactement un destinataire to et aucun cc/bcc ; le modèle fournit l’objet. Fournissez au moins l’un des éléments suivants : id, key.
template.idstringnonIdentifiant du modèle (tmpl_…). Fournissez id ou key.
template.keystringnonClé du modèle, par exemple account-welcome. Fournissez id ou key.
template.version_idstringnonIdentifiant facultatif d’une version publiée (tmplv_…). Par défaut, la version publiée actuelle.
template.dataobjectnonValeurs des variables typées du modèle.
labelsstring[]nonNoms de libellés ou identifiants lbl_… sous lesquels classer ce message. Les noms inconnus sont créés. Les réponses de la conversation héritent des libellés, et un libellé de catégorie (skip_inbox) tient ces réponses hors de la Boîte de réception. 10 max. (0–10 éléments)
idempotency_keystringnonEn-tête Idempotency-Key (200 caractères max.). Ne la réutilisez que pour réessayer exactement cette requête. (200 caractères max.)
attachmentsobject[]nonFichiers à joindre (10 fichiers max., 10 MB au total). Chacun nécessite content_base64 (plus filename) ou un file_path local. (0–10 éléments) Fournissez au moins l’un des éléments suivants : content_base64, file_path.
attachments[].filenamestringnonNom de fichier affiché au destinataire. Obligatoire avec content_base64 ; par défaut, le nom de base de file_path. (255 caractères max.)
attachments[].content_typestringnonType MIME, par ex. application/pdf. Par défaut application/octet-stream.
attachments[].content_base64stringnonContenu du fichier en base64 standard.
attachments[].file_pathstringnonChemin absolu d’un fichier local lisible par le processus du serveur MCP.
Renvoie{id: em_…, providerMessageId, threadId, templateId, templateVersionId, isTest}. Accepté ne veut pas dire délivré : vérifiez ensuite avec list_email_events.
Exemple de params 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"
  }
}
Envoie de vrais e-mailssend_batch
POST /emails/batch

Envoyer un lot d’e-mails personnalisés

SENDS REAL EMAIL. Envoie de 1 à 100 messages indépendants en une seule requête (à utiliser pour la personnalisation de modèle par destinataire). Chaque élément a la même forme que send_email (sans attachments/idempotency_key). Les éléments réussissent ou échouent individuellement : HTTP 207 signifie un succès partiel ; examinez chaque data[i].ok et data[i].error. Une seule idempotency_key couvre l’ensemble du corps du lot.

ParamètreTypeObligatoireDescription
emailsobject[]ouiMessages à envoyer. (1–100 éléments) Fournissez au moins l’un des éléments suivants : html, text, template.
idempotency_keystringnonIdempotency-Key pour l’ensemble du lot (200 caractères max.). (200 caractères max.)
Renvoie{data: [{index, ok, id?, error?: {message, status}}], count, successful, failed}.
Exemple de params 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"
  }
}
Lecture seulelist_emails
GET /emails

Lister et rechercher des e-mails

Liste les e-mails envoyés (direction: out) et reçus (direction: in), du plus récent au plus ancien, avec filtres. Le courrier reçu est classé : lisez la boîte de réception humaine avec direction: in, archived: false, category: primary ; faites le tri avec important: true ; le spam est masqué sauf avec category: spam ou include_spam: true. Paginé : le résultat inclut pagination {offset, limit, returned, total?, has_more, next_offset}.

ParamètreTypeObligatoireDescription
directionstringnonin pour le courrier reçu, out pour le courrier envoyé. (valeurs possibles : in, out)
statusstringnonFiltre de statut, par ex. queued, sent, delivered, bounced, complained, failed.
domainstringnonUniquement les messages de ce domaine, ou d’une liste de domaines séparés par des virgules (correspondance avec n’importe lequel).
inbox_idstringnonUniquement les messages reçus par cette boîte de réception (inb_…).
labelstringnonUniquement les messages portant ce libellé : un identifiant de libellé lbl_… ou son nom exact, ou une liste séparée par des virgules (correspondance avec n’importe lequel). Utilisez list_labels pour voir les dossiers.
archivedbooleannonfalse = vue Boîte de réception (courrier reçu non archivé), true = courrier archivé uniquement. À omettre pour tout le courrier.
categorystringnonprimary (personnes), updates (newsletters, envois en masse, e-mails automatisés) ou spam ; ou une liste séparée par des virgules. Le spam est masqué sauf demande explicite.
importantbooleannontrue = uniquement les messages marqués importants (réponses aux conversations que vous avez lancées et expéditeurs marqués importants).
include_spambooleannonInclure le spam dans les résultats (pour les recherches dans tous les dossiers).
fromstringnonL’adresse de l’expéditeur contient cette valeur.
tostringnonL’adresse du destinataire contient cette valeur.
unreadbooleannontrue = non lus uniquement, false = lus uniquement.
afterstringnonHorodatage ISO-8601 ; uniquement les messages créés après celui-ci. (date-time)
beforestringnonHorodatage ISO-8601 ; uniquement les messages créés avant celui-ci. (date-time)
querystringnonRecherche plein texte dans les objets, les corps, les adresses d’expéditeur/destinataire et les noms des pièces jointes. (200 caractères max.)
limitintegernonTaille de page. 50 par défaut. (par défaut 50 ; 1–200)
offsetintegernonNombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…)
Renvoie{data: [résumés d’e-mails], count, pagination}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "list_emails",
  "arguments": {
    "direction": "in",
    "unread": true,
    "limit": 25
  }
}
Lecture seuleget_email
GET /emails/:email_id

Obtenir un e-mail

Récupère un message avec ses en-têtes, son corps html/texte, son statut, les métadonnées du fil et celles des pièces jointes (téléchargez les octets avec download_attachment).

ParamètreTypeObligatoireDescription
email_idstringouiIdentifiant de l’e-mail (commence par em_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
RenvoieObjet e-mail : {id, direction, status, from, to, cc, bcc, subject, html, text, threadId, messageId, providerMessageId, readAt, createdAt, attachments: [{id, filename, contentType, sizeBytes, available}]}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "get_email",
  "arguments": {
    "email_id": "em_123"
  }
}
Modifie l’étatmark_email
PATCH /emails/:email_id

Marquer comme lu, archivé, spam ou important

Met à jour un message : read, archived, category (primary, updates, spam ; courrier reçu uniquement) et important. Signaler un spam ou marquer un message important renseigne SendHQ sur cet expéditeur pour ses futurs e-mails ; passez learn: false pour ne modifier que ce message. Passez au moins un champ.

ParamètreTypeObligatoireDescription
email_idstringouiIdentifiant de l’e-mail (commence par em_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
readbooleannontrue = lu, false = non lu.
archivedbooleannontrue = archiver (hors de la Boîte de réception), false = remettre dans la Boîte de réception.
categorystringnonDéplace un message reçu vers primary, updates ou spam. (valeurs possibles : primary, updates, spam)
importantbooleannonMarquer ou démarquer le message comme important.
learnbooleannonfalse = ne pas mémoriser ce verdict pour l’expéditeur (true par défaut).
RenvoieL’objet e-mail mis à jour.
AnnotationsidempotentHint
Exemple de params tools/call
{
  "name": "mark_email",
  "arguments": {
    "email_id": "em_123",
    "read": true
  }
}
Destructifdelete_email
DELETE /emails/:email_id

Supprimer un e-mail

DESTRUCTIVE : supprime définitivement de SendHQ un message conservé et ses pièces jointes stockées. Cela ne rappelle pas un message déjà délivré.

ParamètreTypeObligatoireDescription
email_idstringouiIdentifiant de l’e-mail (commence par em_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
Renvoie{ok: true}.
AnnotationsdestructiveHint idempotentHint
Exemple de params tools/call
{
  "name": "delete_email",
  "arguments": {
    "email_id": "em_123"
  }
}
Lecture seulelist_email_events
GET /emails/:email_id/events

Lister les événements de livraison d’un e-mail

Événements du fournisseur pour un message envoyé : delivery, bounce, complaint, reject, open, click. C’est la preuve qu’un message a été délivré, ou la raison de son échec. Paginé : le résultat inclut pagination {offset, limit, returned, total?, has_more, next_offset}.

ParamètreTypeObligatoireDescription
email_idstringouiIdentifiant de l’e-mail (commence par em_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
limitintegernonTaille de page. 50 par défaut. (par défaut 50 ; 1–200)
offsetintegernonNombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…)
Renvoie{data: [{event_type, recipient, reason, created_at, …}], count, pagination}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "list_email_events",
  "arguments": {
    "email_id": "em_123"
  }
}
Lecture seuleget_thread
GET /threads/:thread_id

Obtenir une conversation

Récupère tous les messages d’une conversation dans l’ordre chronologique (envoyés et reçus), chacun avec les métadonnées de ses pièces jointes.

ParamètreTypeObligatoireDescription
thread_idstringouiIdentifiant du fil (généralement l’identifiant em_… du premier message ; voir threadId sur n’importe quel e-mail). (128 caractères max.)
Renvoie{id, subject, data: [e-mails]}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "get_thread",
  "arguments": {
    "thread_id": "em_123"
  }
}

Libellés et règles de classement automatique

Lecture seulelist_labels
GET /labels

Lister les libellés

Liste les libellés (dossiers) de l’espace de travail avec leur nombre total de messages et de non-lus, ainsi que leurs règles de classement automatique. Paginé : le résultat inclut pagination {offset, limit, returned, total?, has_more, next_offset}.

ParamètreTypeObligatoireDescription
limitintegernonTaille de page. 50 par défaut. (par défaut 50 ; 1–200)
offsetintegernonNombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…)
Renvoie{data: [{id, name, color, totalCount, unreadCount, rules: [...]}], count, pagination}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "list_labels",
  "arguments": {}
}
Lecture seuleget_label
GET /labels/:label_id

Obtenir un libellé

Récupère un libellé avec ses compteurs et ses règles de classement automatique.

ParamètreTypeObligatoireDescription
label_idstringouiIdentifiant du libellé (commence par lbl_) ou nom exact du libellé. (128 caractères max.)
RenvoieObjet libellé.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "get_label",
  "arguments": {
    "label_id": "Billing"
  }
}
Modifie l’étatcreate_label
POST /labels

Créer un libellé

Crée un libellé de type dossier. Définissez skip_inbox: true pour en faire une catégorie appartenant à un agent : envoyez avec labels: [name] et les réponses sont classées sous le libellé et tenues hors de la Boîte de réception. Des règles de classement automatique facultatives classent le nouveau courrier envoyé/reçu (chaque condition d’une règle doit correspondre). Définissez apply_to_existing pour classer aussi le courrier déjà conservé.

ParamètreTypeObligatoireDescription
namestringouiNom du libellé, par ex. Billing ou Clients/Acme. Unique par espace de travail (insensible à la casse). (64 caractères max.)
colorstringnonCouleur hexadécimale, par exemple #1a73e8. Facultatif.
skip_inboxbooleannonMode catégorie : le courrier reçu qui obtient ce libellé (par une règle, par une réponse à une conversation envoyée avec ce libellé, ou manuellement) est archivé, de sorte qu’il n’apparaît que dans le libellé, pas dans la Boîte de réception.
rulesobject[]nonRègles de classement automatique facultatives (20 max.). Chacune nécessite au moins l’un des champs inbox_id, from, to, subject. (0–20 éléments)
rules[].directionstringnonUniquement le courrier in (reçu) ou out (envoyé). À omettre pour les deux. (valeurs possibles : in, out)
rules[].inbox_idstringnonUniquement le courrier reçu par cette boîte de réception (inb_…). Classe chaque adresse de réception dans son propre dossier.
rules[].fromstringnonL’expéditeur contient ce texte (insensible à la casse), par ex. @stripe.com. (200 caractères max.)
rules[].tostringnonTo/Cc contient ce texte (insensible à la casse). (200 caractères max.)
rules[].subjectstringnonL’objet contient ce texte (insensible à la casse). (200 caractères max.)
rules[].skip_inboxbooleannonArchive le courrier reçu correspondant pour qu’il n’apparaisse que dans le dossier du libellé, pas dans la Boîte de réception.
apply_to_existingbooleannonClasse aussi le courrier déjà conservé qui correspond aux règles.
RenvoieLe libellé créé avec ses règles.
Exemple de params tools/call
{
  "name": "create_label",
  "arguments": {
    "name": "Agent/Orders",
    "skip_inbox": true,
    "rules": [
      {
        "from": "@stripe.com"
      }
    ]
  }
}
Modifie l’étatupdate_label
PATCH /labels/:label_id

Renommer un libellé, changer sa couleur ou en faire une catégorie

Renomme un libellé, change sa couleur ou active/désactive le mode catégorie (skip_inbox). Activer le mode catégorie archive le courrier reçu déjà présent dans le libellé.

ParamètreTypeObligatoireDescription
label_idstringouiIdentifiant du libellé (commence par lbl_) ou nom exact du libellé. (128 caractères max.)
namestringnonNouveau nom. (64 caractères max.)
colorstringnonNouvelle couleur hexadécimale.
skip_inboxbooleannonMode catégorie : le courrier reçu qui obtient ce libellé (par une règle, par une réponse à une conversation envoyée avec ce libellé, ou manuellement) est archivé, de sorte qu’il n’apparaît que dans le libellé, pas dans la Boîte de réception.
RenvoieLe libellé mis à jour.
AnnotationsidempotentHint
Exemple de params tools/call
{
  "name": "update_label",
  "arguments": {
    "label_id": "lbl_123",
    "name": "Finance/Billing"
  }
}
Destructifdelete_label
DELETE /labels/:label_id

Supprimer un libellé

DESTRUCTIVE : supprime un libellé et ses règles. Les e-mails eux-mêmes sont conservés ; ils perdent seulement ce libellé.

ParamètreTypeObligatoireDescription
label_idstringouiIdentifiant du libellé (commence par lbl_) ou nom exact du libellé. (128 caractères max.)
Renvoie{ok: true}.
AnnotationsdestructiveHint idempotentHint
Exemple de params tools/call
{
  "name": "delete_label",
  "arguments": {
    "label_id": "lbl_123"
  }
}
Modifie l’étatcreate_label_rule
POST /labels/:label_id/rules

Ajouter une règle de classement automatique

Ajoute une règle à un libellé pour que le nouveau courrier correspondant soit classé automatiquement. Chaque condition définie doit correspondre. Utilisez inbox_id pour donner à une adresse de réception son propre dossier ; ajoutez skip_inbox pour tenir ce courrier hors de la Boîte de réception.

ParamètreTypeObligatoireDescription
label_idstringouiIdentifiant du libellé (commence par lbl_) ou nom exact du libellé. (128 caractères max.)
directionstringnonUniquement le courrier in (reçu) ou out (envoyé). À omettre pour les deux. (valeurs possibles : in, out)
inbox_idstringnonUniquement le courrier reçu par cette boîte de réception (inb_…). Classe chaque adresse de réception dans son propre dossier.
fromstringnonL’expéditeur contient ce texte (insensible à la casse), par ex. @stripe.com. (200 caractères max.)
tostringnonTo/Cc contient ce texte (insensible à la casse). (200 caractères max.)
subjectstringnonL’objet contient ce texte (insensible à la casse). (200 caractères max.)
skip_inboxbooleannonArchive le courrier reçu correspondant pour qu’il n’apparaisse que dans le dossier du libellé, pas dans la Boîte de réception.
apply_to_existingbooleannonClasse aussi le courrier déjà conservé qui correspond.
Renvoie{id: lrule_…, labelId, direction, inboxId, from, to, subject, skipInbox}.
Exemple de params tools/call
{
  "name": "create_label_rule",
  "arguments": {
    "label_id": "Billing",
    "inbox_id": "inb_123",
    "skip_inbox": true
  }
}
Destructifdelete_label_rule
DELETE /labels/:label_id/rules/:rule_id

Supprimer une règle de classement automatique

DESTRUCTIVE : retire une règle de classement automatique. Le courrier déjà classé conserve son libellé.

ParamètreTypeObligatoireDescription
label_idstringouiIdentifiant du libellé (commence par lbl_) ou nom exact du libellé. (128 caractères max.)
rule_idstringouiIdentifiant de la règle (commence par lrule_), obtenu via get_label. (128 caractères max.)
Renvoie{ok: true}.
AnnotationsdestructiveHint idempotentHint
Exemple de params tools/call
{
  "name": "delete_label_rule",
  "arguments": {
    "label_id": "lbl_123",
    "rule_id": "lrule_123"
  }
}
Modifie l’étatlabel_email
POST /emails/:email_id/labels

Ajouter ou retirer des libellés sur un e-mail

Déplace un message entre dossiers : ajoute et/ou retire des libellés par nom ou par identifiant lbl_…. Les noms inconnus dans add sont créés, sauf si create vaut false.

ParamètreTypeObligatoireDescription
email_idstringouiIdentifiant de l’e-mail (commence par em_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
addstring[]nonLibellés à ajouter. (0–10 éléments)
removestring[]nonLibellés à retirer. (0–10 éléments)
createbooleannonCrée les libellés inconnus dans add (true par défaut).
RenvoieL’e-mail mis à jour avec ses labels.
AnnotationsidempotentHint
Exemple de params tools/call
{
  "name": "label_email",
  "arguments": {
    "email_id": "em_123",
    "add": [
      "Billing"
    ],
    "remove": [
      "Support"
    ]
  }
}

Brouillons, pièces jointes et identités d’expéditeur

Lecture seulelist_sending_identities
GET /sending-identities

Lister les identités d’expéditeur vérifiées

Adresses et domaines depuis lesquels cet espace de travail peut envoyer dès maintenant (domaines vérifiés, leur From par défaut et adresses des boîtes de réception actives). À appeler avant send_email pour choisir un from valide.

Aucun paramètre.

Renvoie{domains: [noms des domaines vérifiés], addresses: [adresses d’expéditeur], localParts: [...]}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "list_sending_identities",
  "arguments": {}
}
Modifie l’étatcreate_draft
POST /drafts

Créer un brouillon

Crée un brouillon de rédaction. Les brouillons contiennent les pièces jointes : créez un brouillon, appelez upload_attachment, puis send_email avec draft_id. N’envoie rien.

ParamètreTypeObligatoireDescription
fromstringnonAdresse d’expéditeur sur un domaine vérifié (peut rester vide pendant la rédaction).
tostring[]nonDestinataires. (0–100 éléments)
ccstring[]nonDestinataires en copie. (0–100 éléments)
bccstring[]nonDestinataires en copie cachée. (0–100 éléments)
subjectstringnonObjet. (998 caractères max.)
htmlstringnonCorps HTML.
textstringnonCorps en texte brut.
reply_to_email_idstringnonIdentifiant de l’e-mail auquel ce brouillon répond.
thread_idstringnonIdentifiant du fil auquel appartient ce brouillon.
RenvoieObjet brouillon {id: dr_…, from, to, cc, bcc, subject, html, text, attachments: []}.
Exemple de params tools/call
{
  "name": "create_draft",
  "arguments": {
    "from": "hello@example.com",
    "to": [
      "owner@example.com"
    ],
    "subject": "Invoice"
  }
}
Lecture seulelist_drafts
GET /drafts

Lister les brouillons

Liste les brouillons de rédaction, du plus récemment modifié au plus ancien. Paginé : le résultat inclut pagination {offset, limit, returned, total?, has_more, next_offset}.

ParamètreTypeObligatoireDescription
limitintegernonTaille de page. 50 par défaut. (par défaut 50 ; 1–200)
offsetintegernonNombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…)
Renvoie{data: [brouillons], count, pagination}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "list_drafts",
  "arguments": {}
}
Lecture seuleget_draft
GET /drafts/:draft_id

Obtenir un brouillon

Récupère un brouillon avec les métadonnées de ses pièces jointes.

ParamètreTypeObligatoireDescription
draft_idstringouiIdentifiant du brouillon (commence par dr_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
RenvoieObjet brouillon avec ses attachments.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "get_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
Modifie l’étatupdate_draft
PUT /drafts/:draft_id

Remplacer le contenu d’un brouillon

Remplace le contenu et les destinataires d’un brouillon. Il s’agit d’un remplacement complet : les champs omis sont effacés ; lisez donc d’abord get_draft et envoyez tous les champs à conserver. Les pièces jointes ne sont pas affectées.

ParamètreTypeObligatoireDescription
draft_idstringouiIdentifiant du brouillon (commence par dr_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
fromstringnonAdresse d’expéditeur sur un domaine vérifié (peut rester vide pendant la rédaction).
tostring[]nonDestinataires. (0–100 éléments)
ccstring[]nonDestinataires en copie. (0–100 éléments)
bccstring[]nonDestinataires en copie cachée. (0–100 éléments)
subjectstringnonObjet. (998 caractères max.)
htmlstringnonCorps HTML.
textstringnonCorps en texte brut.
reply_to_email_idstringnonIdentifiant de l’e-mail auquel ce brouillon répond.
thread_idstringnonIdentifiant du fil auquel appartient ce brouillon.
RenvoieL’objet brouillon mis à jour.
AnnotationsidempotentHint
Exemple de params tools/call
{
  "name": "update_draft",
  "arguments": {
    "draft_id": "dr_123",
    "from": "hello@example.com",
    "to": [
      "owner@example.com"
    ],
    "subject": "Invoice (updated)",
    "text": "Attached."
  }
}
Destructifdelete_draft
DELETE /drafts/:draft_id

Abandonner un brouillon

DESTRUCTIVE : abandonne un brouillon et supprime définitivement ses pièces jointes stockées.

ParamètreTypeObligatoireDescription
draft_idstringouiIdentifiant du brouillon (commence par dr_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
Renvoie{ok: true}.
AnnotationsdestructiveHint idempotentHint
Exemple de params tools/call
{
  "name": "delete_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
Modifie l’étatupload_attachment
POST /drafts/:draft_id/attachments

Téléverser une pièce jointe dans un brouillon

Téléverse un fichier dans un brouillon (10 fichiers et 10 MB au total par message au maximum). Fournissez content_base64 ou un file_path local. Les pièces jointes nécessitent une formule payante au moment de l’envoi.

Fournissez au moins l’un des éléments suivants : content_base64, file_path.

ParamètreTypeObligatoireDescription
draft_idstringouiIdentifiant du brouillon (commence par dr_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
filenamestringnonNom de fichier affiché au destinataire. Par défaut, le nom de base de file_path. (255 caractères max.)
content_typestringnonType MIME, par ex. application/pdf. Par défaut application/octet-stream.
content_base64stringnonContenu du fichier en base64 standard.
file_pathstringnonChemin absolu d’un fichier local lisible par le processus du serveur MCP.
Renvoie{id: att_…, filename, contentType, sizeBytes, available}.
Exemple de params tools/call
{
  "name": "upload_attachment",
  "arguments": {
    "draft_id": "dr_123",
    "filename": "invoice.pdf",
    "content_type": "application/pdf",
    "file_path": "/tmp/invoice.pdf"
  }
}
Lecture seuledownload_attachment
GET /attachments/:attachment_id

Télécharger une pièce jointe

Télécharge une pièce jointe privée (envoyée, reçue ou de brouillon). Renvoie le contenu en base64, ou écrit le fichier lorsque save_to_path est défini (refuse d’écraser un fichier sauf si overwrite vaut true).

ParamètreTypeObligatoireDescription
attachment_idstringouiIdentifiant de la pièce jointe (commence par att_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
save_to_pathstringnonChemin local absolu facultatif où écrire le fichier au lieu de renvoyer du base64.
overwritebooleannonAutorise le remplacement d’un fichier existant à save_to_path. false par défaut.
Renvoie{attachment_id, filename, content_type, size_bytes, content_base64} ou {attachment_id, filename, content_type, size_bytes, saved_to}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "download_attachment",
  "arguments": {
    "attachment_id": "att_123",
    "save_to_path": "/tmp/invoice.pdf"
  }
}
Destructifdelete_attachment
DELETE /attachments/:attachment_id

Supprimer une pièce jointe

DESTRUCTIVE : supprime définitivement une pièce jointe stockée (par exemple pour retirer un fichier d’un brouillon avant l’envoi).

ParamètreTypeObligatoireDescription
attachment_idstringouiIdentifiant de la pièce jointe (commence par att_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
Renvoie{ok: true}.
AnnotationsdestructiveHint idempotentHint
Exemple de params tools/call
{
  "name": "delete_attachment",
  "arguments": {
    "attachment_id": "att_123"
  }
}

Modèles hébergés

Lecture seulelist_templates
GET /templates

Lister les modèles hébergés

Liste les modèles d’e-mails hébergés avec leur état de publication et leur utilisation. Paginé : le résultat inclut pagination {offset, limit, returned, total?, has_more, next_offset}.

ParamètreTypeObligatoireDescription
lifecyclestringnonactive (par défaut), archived ou all. (valeurs possibles : active, archived, all)
querystringnonRecherche par nom ou par clé. (120 caractères max.)
limitintegernonTaille de page. 50 par défaut. (par défaut 50 ; 1–200)
offsetintegernonNombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…)
Renvoie{data: [modèles], count, pagination}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "list_templates",
  "arguments": {
    "lifecycle": "active"
  }
}
Modifie l’étatcreate_template
POST /templates

Créer un modèle hébergé

Crée un modèle avec un brouillon modifiable, éventuellement à partir d’un modèle de départ (welcome, reset, receipt ou blank). Publiez-le avant d’envoyer par clé.

ParamètreTypeObligatoireDescription
namestringouiNom lisible. (120 caractères max.)
keystringnonClé d’envoi stable : lettres minuscules, chiffres, traits d’union ; commence par une lettre (2 à 64 caractères). Dérivée du nom si elle est omise.
starterstringnonContenu de départ. (valeurs possibles : blank, welcome, reset, receipt)
Renvoie{template, draft, activeVersion, versions, usage}.
Exemple de params tools/call
{
  "name": "create_template",
  "arguments": {
    "name": "Account welcome",
    "key": "account-welcome",
    "starter": "welcome"
  }
}
Lecture seuleget_template
GET /templates/:template_id

Obtenir un modèle

Récupère le brouillon actuel d’un modèle (avec sa revision), la version publiée active, l’historique des versions et l’utilisation. Accepte un identifiant ou une clé.

ParamètreTypeObligatoireDescription
template_idstringouiIdentifiant (tmpl_…) ou clé du modèle. (128 caractères max.)
Renvoie{template, draft: {id, revision, subjectTemplate, htmlTemplate, textTemplate, variables, sampleData, …} | null, activeVersion, versions, usage}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "get_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Modifie l’étatupdate_template_draft
PUT /templates/:template_id/draft

Enregistrer un brouillon de modèle

Enregistre le brouillon modifiable du modèle avec une concurrence optimiste : passez la revision actuelle obtenue via get_template (409 signifie que quelqu’un d’autre a enregistré avant vous ; relisez et réessayez). Il s’agit d’un remplacement complet du contenu du brouillon : les champs omis sont effacés, envoyez donc tous les champs à conserver. Utilisez des espaces réservés {{variable}}.

ParamètreTypeObligatoireDescription
template_idstringouiIdentifiant ou clé du modèle. (128 caractères max.)
revisionintegerouiRévision actuelle du brouillon, obtenue via get_template. (1–…)
namestringnonNom du modèle. (120 caractères max.)
subject_templatestringnonObjet avec espaces réservés. (998 caractères max.)
preheader_templatestringnonTexte d’aperçu. (240 caractères max.)
html_templatestringnonCorps HTML avec espaces réservés.
text_templatestringnonCorps en texte brut avec espaces réservés.
fromstringnonExpéditeur par défaut pour les envois de ce modèle.
reply_tostringnonReply-To par défaut.
variablesobject[]nonContrat de variables typées. Chaque élément : {key (minuscules/tirets bas), label, type: text|number|url|boolean, required (true par défaut), fallback, description}.
variables[].keystringoui
variables[].labelstringnon
variables[].typestringnon(valeurs possibles : text, number, url, boolean)
variables[].requiredbooleannon
variables[].fallbackanynon
variables[].descriptionstringnon
sample_dataobjectnonValeurs d’exemple utilisées pour les aperçus et les tests.
Renvoie{template, draft: {revision: next}, validation: {valid, findings}}.
Exemple de params 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"
    }
  }
}
Modifie l’étatcreate_template_draft
POST /templates/:template_id/draft

Créer un nouveau brouillon à partir de la version publiée

Crée un nouveau brouillon modifiable copié à partir de la version publiée actuelle (409 si un brouillon existe déjà ou si rien n’est publié).

ParamètreTypeObligatoireDescription
template_idstringouiIdentifiant ou clé du modèle. (128 caractères max.)
Renvoie{draft}.
Exemple de params tools/call
{
  "name": "create_template_draft",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Lecture seulerender_template
POST /templates/:template_id/render

Générer un aperçu de modèle

Génère le rendu exact produit par le serveur (subject, html, text) pour le brouillon, la version publiée ou une version précise, avec les données fournies. N’envoie rien. Renvoie 422 avec des findings lorsque les données ne respectent pas le contrat de variables.

ParamètreTypeObligatoireDescription
template_idstringouiIdentifiant ou clé du modèle. (128 caractères max.)
version_idstringnonIdentifiant de version facultatif ; par défaut le brouillon, puis la version publiée.
dataobjectnonValeurs des variables ; par défaut, les données d’exemple de la version.
Renvoie{subject, html, text, preheader, versionId, versionNumber, isDraft, findings}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "render_template",
  "arguments": {
    "template_id": "account-welcome",
    "data": {
      "first_name": "Asha"
    }
  }
}
Envoie de vrais e-mailssend_template_test
POST /templates/:template_id/test

Envoyer un e-mail de test d’un modèle

SENDS REAL EMAIL. Envoie aux destinataires indiqués un instantané du brouillon (ou d’une version donnée) préfixé par [Test]. Compte dans l’utilisation ; les espaces de travail en essai ne peuvent envoyer qu’à l’adresse e-mail du compte ou à une adresse du simulateur SES.

ParamètreTypeObligatoireDescription
template_idstringouiIdentifiant ou clé du modèle. (128 caractères max.)
tostring[]ouiDestinataires du test. (1–100 éléments)
fromstringnonExpéditeur sur un domaine vérifié ; par défaut, le From du modèle.
version_idstringnonIdentifiant de version facultatif.
dataobjectnonValeurs des variables ; par défaut, les données d’exemple.
Renvoie{id: em_…, providerMessageId, threadId, isTest: true}.
Exemple de params tools/call
{
  "name": "send_template_test",
  "arguments": {
    "template_id": "account-welcome",
    "to": [
      "owner@example.com"
    ]
  }
}
Modifie l’étatpublish_template
POST /templates/:template_id/publish

Publier une version de modèle

Publie le brouillon actuel sous forme de version immuable, que send_email utilisera avec template.key. Échoue avec des findings 422 en cas d’erreurs de validation, ou avec 409 si la publication casserait le contrat de variables en vigueur d’un modèle déjà utilisé en production.

ParamètreTypeObligatoireDescription
template_idstringouiIdentifiant ou clé du modèle. (128 caractères max.)
Renvoie{template, published}.
Exemple de params tools/call
{
  "name": "publish_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Modifie l’étatarchive_template
POST /templates/:template_id/archive

Archiver un modèle

Bloque les nouveaux envois utilisant ce modèle (l’historique est conservé ; réversible avec restore_template). Toute intégration qui envoie avec cette clé commencera à échouer avec une 404.

ParamètreTypeObligatoireDescription
template_idstringouiIdentifiant ou clé du modèle. (128 caractères max.)
Renvoie{template}.
AnnotationsidempotentHint
Exemple de params tools/call
{
  "name": "archive_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Modifie l’étatrestore_template
POST /templates/:template_id/restore

Restaurer un modèle archivé

Réactive un modèle archivé.

ParamètreTypeObligatoireDescription
template_idstringouiIdentifiant ou clé du modèle. (128 caractères max.)
Renvoie{template}.
AnnotationsidempotentHint
Exemple de params tools/call
{
  "name": "restore_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}

Domaines et DNS

Lecture seulelist_domains
GET /domains

Lister les domaines

Liste les domaines d’envoi avec leur setup_status global (verified | checking | pending), l’état DNS de chaque enregistrement et l’état de la réception. Peut être lent : les domaines non vérifiés sont revérifiés en direct. Paginé : le résultat inclut pagination {offset, limit, returned, total?, has_more, next_offset}.

ParamètreTypeObligatoireDescription
limitintegernonTaille de page. 50 par défaut. (par défaut 50 ; 1–200)
offsetintegernonNombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…)
Renvoie{data: [domaines avec leurs enregistrements], count, pagination}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "list_domains",
  "arguments": {}
}
Lecture seuleget_domain
GET /domains/:domain_id

Obtenir les détails de configuration d’un domaine

Récupère un domaine avec les enregistrements DNS exacts à publier (type, nom, valeur), l’état en direct de chaque enregistrement vu par deux résolveurs publics, les dns_issues avec leurs correctifs et l’état de la réception.

ParamètreTypeObligatoireDescription
domain_idstringouiIdentifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
Renvoie{id, name, status, setup_status, dns_propagating, records: [{type, name, value, verified, dns_state}], dns_issues: [{code, message, …}], inbound_domain, inbound_status}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "get_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Modifie l’étatadd_domain
POST /domains

Ajouter un domaine d’envoi

Enregistre pour l’envoi un domaine que vous contrôlez. Renvoie les enregistrements DNS (CNAME SES Easy DKIM) que le propriétaire doit publier. Ne modifie pas le DNS lui-même. Compte dans la limite de domaines de la formule.

ParamètreTypeObligatoireDescription
namestringouiNom de domaine nu, par ex. example.com ou mail.example.com. (253 caractères max.)
default_fromstringnonAdresse d’expéditeur par défaut facultative sur ce domaine.
Renvoie{id: dom_…, name, status: pending, records: [...], ses: {configured}}.
Exemple de params tools/call
{
  "name": "add_domain",
  "arguments": {
    "name": "example.com"
  }
}
Modifie l’étatverify_domain
POST /domains/:domain_id/verify

Vérifier un domaine

Lance immédiatement une vérification SES/DNS en direct. Peut être répété sans risque ; interrogez toutes les 30 à 60 s après une modification DNS (la propagation peut prendre de quelques minutes à quelques heures). L’envoi est autorisé une fois le statut à verified.

ParamètreTypeObligatoireDescription
domain_idstringouiIdentifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
Renvoie{domain, checks: {ses, dkim, dkim_status}, status: verified|pending}.
AnnotationsidempotentHint
Exemple de params tools/call
{
  "name": "verify_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Destructifdelete_domain
DELETE /domains/:domain_id

Supprimer un domaine

DESTRUCTIVE : retire le domaine de l’espace de travail, y compris sa route de réception. Les envois depuis ce domaine échouent immédiatement après. Les enregistrements DNS chez votre fournisseur DNS ne sont pas supprimés.

ParamètreTypeObligatoireDescription
domain_idstringouiIdentifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
Renvoie{ok: true}.
AnnotationsdestructiveHint idempotentHint
Exemple de params tools/call
{
  "name": "delete_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Lecture seuleget_dns_provider
GET /dns/provider

Détecter le fournisseur DNS et les hôtes des enregistrements

Détecte le fournisseur DNS faisant autorité pour le domaine et renvoie l’hôte relatif à saisir chez ce fournisseur pour chaque enregistrement, l’enregistrement DMARC recommandé, des indications pour le MX entrant, et si la configuration en un clic (Domain Connect) est disponible.

ParamètreTypeObligatoireDescription
domain_idstringouiIdentifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
Renvoie{detectionStatus, detected, zone, nameservers, recordHosts: {recordId: host}, inbound, recommendations, authentication, providers: {domainConnect: {available, providerName}}}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "get_dns_provider",
  "arguments": {
    "domain_id": "dom_123"
  }
}

E-mails entrants

Modifie l’étatsetup_inbound
POST /domains/:domain_id/inbound/setup

Activer la réception d’e-mails pour un domaine

Configure la réception SES pour un domaine vérifié. Utilise le domaine racine s’il n’a pas de MX en conflit, sinon inbound.<domain>. Renvoie l’enregistrement MX que le propriétaire doit publier ; ne modifie pas le DNS.

ParamètreTypeObligatoireDescription
domain_idstringouiIdentifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
Renvoie{domain: domaine de réception, status: dns_pending|ready, record: {type: MX, name, value}}.
AnnotationsidempotentHint
Exemple de params tools/call
{
  "name": "setup_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Modifie l’étatverify_inbound
POST /domains/:domain_id/inbound/verify

Vérifier le MX entrant

Revérifie l’enregistrement MX entrant. Le statut passe à ready lorsque les deux résolveurs publics le voient.

ParamètreTypeObligatoireDescription
domain_idstringouiIdentifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
Renvoie{domain, status: ready|dns_pending|propagating|checking, record}.
AnnotationsidempotentHint
Exemple de params tools/call
{
  "name": "verify_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Lecture seulelist_inboxes
GET /inboxes

Lister les adresses de réception

Liste les adresses de réception, éventuellement pour un seul domaine. Paginé : le résultat inclut pagination {offset, limit, returned, total?, has_more, next_offset}.

ParamètreTypeObligatoireDescription
domain_idstringnonFiltre facultatif par identifiant de domaine.
limitintegernonTaille de page. 50 par défaut. (par défaut 50 ; 1–200)
offsetintegernonNombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…)
Renvoie{data: [{id, address, name, status, domainId}], count, pagination}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "list_inboxes",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Lecture seuleget_inbox
GET /inboxes/:inbox_id

Obtenir une boîte de réception

Récupère une adresse de réception.

ParamètreTypeObligatoireDescription
inbox_idstringouiIdentifiant de la boîte de réception (commence par inb_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
RenvoieObjet boîte de réception.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "get_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}
Modifie l’étatcreate_inbox
POST /inboxes

Créer une adresse de réception

Crée une adresse comme support@<receiving domain> sur un domaine dont l’état de réception est ready (lancez d’abord setup_inbound et verify_inbound). Le courrier reçu apparaît dans list_emails avec la direction in.

ParamètreTypeObligatoireDescription
domain_idstringouiIdentifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
local_partstringouiPartie avant le @, par ex. support. (64 caractères max.)
namestringnonNom d’affichage facultatif.
Renvoie{id: inb_…, address, name, status: active}.
Exemple de params tools/call
{
  "name": "create_inbox",
  "arguments": {
    "domain_id": "dom_123",
    "local_part": "support",
    "name": "Support"
  }
}
Modifie l’étatupdate_inbox
PATCH /inboxes/:inbox_id

Renommer, activer ou désactiver une boîte de réception

Renomme une boîte de réception ou définit son statut sur active / disabled.

ParamètreTypeObligatoireDescription
inbox_idstringouiIdentifiant de la boîte de réception (commence par inb_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
namestringnonNouveau nom d’affichage.
statusstringnonNouveau statut. (valeurs possibles : active, disabled)
RenvoieLa boîte de réception mise à jour.
AnnotationsidempotentHint
Exemple de params tools/call
{
  "name": "update_inbox",
  "arguments": {
    "inbox_id": "inb_123",
    "status": "disabled"
  }
}
Envoie de vrais e-mailsset_inbox_forwarding
PUT /inboxes/:inbox_id/forwarding

Transférer une boîte de réception vers une autre adresse

SENDS REAL EMAIL en cas de transfert vers une personne autre que le propriétaire du compte : définit où le courrier reçu par une boîte de réception est transféré. L’adresse du propriétaire est activée immédiatement ; toute autre adresse reçoit un e-mail de confirmation et le transfert reste pending jusqu’à ce que quelqu’un confirme à cette adresse. Passez forward_to: null pour désactiver le transfert. Les copies transférées partent de l’adresse de la boîte de réception, avec l’expéditeur d’origine en Reply-To.

ParamètreTypeObligatoireDescription
inbox_idstringouiIdentifiant de la boîte de réception (commence par inb_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
forward_tostring,nullouiAdresse e-mail cible du transfert, ou null pour désactiver le transfert. (254 caractères max.)
RenvoieLa boîte de réception avec forwardTo et forwardStatus (off, pending ou active).
AnnotationsidempotentHint
Exemple de params tools/call
{
  "name": "set_inbox_forwarding",
  "arguments": {
    "inbox_id": "inb_123",
    "forward_to": "team@example.net"
  }
}
Destructifdelete_inbox
DELETE /inboxes/:inbox_id

Supprimer une boîte de réception

DESTRUCTIVE : supprime une adresse de réception. Le courrier déjà reçu est conservé ; le nouveau courrier envoyé à cette adresse n’y est plus classé.

ParamètreTypeObligatoireDescription
inbox_idstringouiIdentifiant de la boîte de réception (commence par inb_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.)
Renvoie{ok: true}.
AnnotationsdestructiveHint idempotentHint
Exemple de params tools/call
{
  "name": "delete_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}

Délivrabilité, bounces et suppressions

Lecture seuledeliverability_stats
GET /deliverability/stats

Obtenir les statistiques de livraison sur 30 jours

Totaux sur 30 jours pour l’ensemble de l’espace de travail : sent, delivery, bounce, complaint, reject, open, click et deliveryRate (%).

Aucun paramètre.

Renvoie{window: 30d, sent, delivery, bounce, complaint, reject, open, click, deliveryRate}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "deliverability_stats",
  "arguments": {}
}
Lecture seulelist_sender_reputation
GET /deliverability/reputation

Lister la réputation des expéditeurs

État de réputation par adresse From exacte : active, throttled (limite quotidienne abaissée) ou paused (les envois renvoient 423), avec le motif et la limite quotidienne. À consulter lorsque les envois échouent avec 423 ou 429. Paginé : le résultat inclut pagination {offset, limit, returned, total?, has_more, next_offset}.

ParamètreTypeObligatoireDescription
limitintegernonTaille de page. 50 par défaut. (par défaut 50 ; 1–200)
offsetintegernonNombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…)
Renvoie{data: [{sender, status, dailyLimit, reason, cleanSince, warnedAt, pausedAt, evaluatedAt}], count, pagination}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "list_sender_reputation",
  "arguments": {}
}
Lecture seulelist_suppressions
GET /suppressions

Lister les suppressions

Liste de suppression de l’espace de travail : destinataires bloqués après un bounce permanent ou une plainte pour spam. Les envois vers eux échouent avec 422. Paginé : le résultat inclut pagination {offset, limit, returned, total?, has_more, next_offset}.

ParamètreTypeObligatoireDescription
limitintegernonTaille de page. 50 par défaut. (par défaut 50 ; 1–200)
offsetintegernonNombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…)
Renvoie{data: [{email, reason, detail, created_at}], count, pagination}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "list_suppressions",
  "arguments": {}
}
Destructifremove_suppression
DELETE /suppressions/:email

Retirer une suppression pour bounce

DESTRUCTIVE (affaiblit un blocage de sécurité) : retire une suppression pour bounce afin que l’adresse puisse de nouveau recevoir des e-mails. Ne le faites que lorsque l’humain confirme que l’adresse est désormais valide. Les suppressions pour plainte ne peuvent pas être retirées (409).

ParamètreTypeObligatoireDescription
emailstringouiAdresse du destinataire en liste de suppression. (320 caractères max.)
Renvoie{ok: true}.
AnnotationsdestructiveHint idempotentHint
Exemple de params tools/call
{
  "name": "remove_suppression",
  "arguments": {
    "email": "fixed-mailbox@example.net"
  }
}
Lecture seulelist_blocked_recipients
GET /blocked-recipients

Lister les destinataires bloqués

Tous les destinataires que SendHQ refusera : bounces, plaintes et désinscriptions marketing par domaine, avec un récapitulatif par type. Lit au maximum les 500 plus récents. Paginé : le résultat inclut pagination {offset, limit, returned, total?, has_more, next_offset}.

ParamètreTypeObligatoireDescription
limitintegernonTaille de page. 50 par défaut. (par défaut 50 ; 1–200)
offsetintegernonNombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…)
Renvoie{data: [{email, domain, kind: bounce|complaint|unsubscribe, reason, detail, source, status, created_at}], count, summary: {total, bounce, complaint, unsubscribe}, pagination}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "list_blocked_recipients",
  "arguments": {}
}

Compte, utilisation, statistiques et clés

Lecture seuleget_account
GET /account

Obtenir le compte, l’utilisation et la facturation

Adresse e-mail du propriétaire du compte, formule/palier d’accès, livraisons par destinataire utilisées sur la période en cours par rapport au quota, domaines utilisés par rapport à la limite, transfert de pièces jointes, résumé de réputation, état de l’abonnement, formules publiées et compteurs de l’espace de travail. À utiliser pour vérifier le quota restant ou le destinataire autorisé pendant l’essai (l’adresse e-mail du compte).

Aucun paramètre.

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

Obtenir les statistiques d’envoi

Statistiques du tableau de bord sur les 7, 30 ou 90 derniers jours : totaux envoyés/reçus/délivrés/bounces/bloqués/ouverts/cliqués/plaintes, chronologie quotidienne, principaux domaines d’envoi et principaux objets.

ParamètreTypeObligatoireDescription
daysintegernonFenêtre en jours : 7, 30 (par défaut) ou 90. (valeurs possibles : 7, 30, 90)
Renvoie{window, days, metrics, timeline: [{day, sent, received}], domains, topContent}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "get_analytics",
  "arguments": {
    "days": 30
  }
}
Lecture seulelist_api_keys
GET /keys

Lister les métadonnées des clés API

Liste les noms des clés API, leurs préfixes non secrets et leurs dates de dernière utilisation. Lecture seule : ce serveur MCP ne peut ni créer, ni faire tourner, ni révoquer de clés ; c’est un humain qui s’en charge dans le tableau de bord. Paginé : le résultat inclut pagination {offset, limit, returned, total?, has_more, next_offset}.

ParamètreTypeObligatoireDescription
limitintegernonTaille de page. 50 par défaut. (par défaut 50 ; 1–200)
offsetintegernonNombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…)
Renvoie{data: [{id, name, prefix, lastUsedAt, createdAt}], count, pagination}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "list_api_keys",
  "arguments": {}
}
Lecture seuleget_service_health
GET /health

Vérifier l’état du service SendHQ

Vérifie que l’API SendHQ est opérationnelle et indique quel fournisseur de messagerie est actif. Ne nécessite pas de clé API valide.

Aucun paramètre.

Renvoie{ok, service, mailer}.
AnnotationsreadOnlyHint idempotentHint
Exemple de params tools/call
{
  "name": "get_service_health",
  "arguments": {}
}

Inventaire de couverture de l’API

Chaque opération de l’API publique et l’outil qui la couvre. Tout ce qu’un utilisateur peut faire dans le tableau de bord et qui dispose d’une API est couvert ; les exclusions ci-dessous sont délibérées.

EndpointOutilRemarques
POST /emailssend_emailEnvoyer un e-mail
POST /emails/batchsend_batchEnvoyer jusqu’à 100 messages personnalisés
GET /emailslist_emailsLister les e-mails envoyés et reçus
GET /emails/:idget_emailRécupérer un e-mail et ses pièces jointes
PATCH /emails/:idmark_emailModifier l’état lu, l’archivage, le spam, la catégorie ou l’importance
POST /emails/:id/labelslabel_emailAjouter ou retirer des libellés sur un e-mail
DELETE /emails/:iddelete_emailSupprimer un e-mail conservé
GET /emails/:id/eventslist_email_eventsLister les événements de livraison d’un e-mail
GET /threads/:idget_threadRécupérer une conversation dans l’ordre chronologique
GET /labelslist_labelsLister les libellés avec leur nombre de messages et leurs règles de classement
POST /labelscreate_labelCréer un libellé, avec des règles de classement automatique en option
GET /labels/:idget_labelRécupérer un libellé par identifiant ou par nom
PATCH /labels/:idupdate_labelRenommer un libellé, changer sa couleur ou le transformer en catégorie
DELETE /labels/:iddelete_labelSupprimer un libellé sans supprimer ses e-mails
POST /labels/:id/rulescreate_label_ruleAjouter une règle de classement automatique à un libellé
DELETE /labels/:id/rules/:rule_iddelete_label_ruleSupprimer une règle de classement automatique
POST /draftscreate_draftCréer un brouillon de rédaction
GET /draftslist_draftsLister les brouillons de rédaction
GET /drafts/:idget_draftRécupérer un brouillon et ses pièces jointes
PUT /drafts/:idupdate_draftRemplacer le contenu d’un brouillon
DELETE /drafts/:iddelete_draftAbandonner un brouillon
POST /drafts/:id/attachmentsupload_attachmentTéléverser une pièce jointe dans un brouillon
GET /attachments/:iddownload_attachmentTélécharger une pièce jointe privée
DELETE /attachments/:iddelete_attachmentSupprimer une pièce jointe privée
GET /sending-identitieslist_sending_identitiesLister les identités d’expéditeur vérifiées
GET /templateslist_templatesLister les modèles hébergés
POST /templatescreate_templateCréer un modèle hébergé
GET /templates/:idget_templateRécupérer les brouillons, les versions publiées et l’utilisation
PUT /templates/:id/draftupdate_template_draftEnregistrer automatiquement un brouillon de modèle
POST /templates/:id/draftcreate_template_draftCréer un nouveau brouillon à partir de la version publiée
POST /templates/:id/renderrender_templateObtenir le rendu exact produit par le serveur
POST /templates/:id/testsend_template_testEnvoyer un instantané de test
POST /templates/:id/publishpublish_templatePublier une version immuable du modèle
POST /templates/:id/archivearchive_templateArchiver un modèle
POST /templates/:id/restorerestore_templateRestaurer un modèle archivé
POST /domainsadd_domainAjouter un domaine d’envoi
GET /domainslist_domainsLister les domaines et l’état DNS en cache
GET /domains/:idget_domainRécupérer les détails de configuration d’un domaine
POST /domains/:id/verifyverify_domainActualiser la vérification SES et DNS
POST /domains/:id/inbound/setupsetup_inboundConfigurer la réception SES
POST /domains/:id/inbound/verifyverify_inboundVérifier le routage MX entrant
DELETE /domains/:iddelete_domainSupprimer un domaine
GET /dns/providerget_dns_providerDétecter le fournisseur DNS faisant autorité et les hôtes relatifs des enregistrements
GET /dns/domain-connect/connectget_domain_connect_linkCréer un lien de consentement Domain Connect pour configurer le DNS en un clic
POST /inboxescreate_inboxCréer une adresse de réception
GET /inboxeslist_inboxesLister les adresses de réception
GET /inboxes/:idget_inboxRécupérer une adresse de réception
PATCH /inboxes/:idupdate_inboxRenommer, activer ou désactiver une boîte de réception
PUT /inboxes/:id/forwardingset_inbox_forwardingTransférer le courrier reçu par une boîte de réception vers une autre adresse
DELETE /inboxes/:iddelete_inboxSupprimer une boîte de réception en conservant les messages
GET /deliverability/statsdeliverability_statsRécupérer les statistiques de livraison sur 30 jours
GET /deliverability/reputationlist_sender_reputationLister l’état de réputation par identité d’expéditeur exacte
GET /suppressionslist_suppressionsLister les suppressions de l’espace de travail
DELETE /suppressions/:emailremove_suppressionRetirer une suppression pour bounce éligible
GET /blocked-recipientslist_blocked_recipientsLister les bounces, les plaintes et les désinscriptions
GET /accountget_accountRécupérer le compte, l’utilisation, l’état de facturation et les compteurs de l’espace de travail avec une clé API
GET /analyticsget_analyticsRécupérer les statistiques d’envoi du tableau de bord sur 7, 30 ou 90 jours
GET /profileget_accountÉquivalent réservé aux sessions de GET /account ; le serveur MCP lit la route par clé API.
POST /billing/checkoutnon exposéLes modifications de facturation sont par conception réservées aux sessions et exigent la présence du propriétaire du compte dans le tableau de bord. L’état de facturation peut être lu avec get_account.
POST /billing/cancelnon exposéLes modifications de facturation sont par conception réservées aux sessions et exigent la présence du propriétaire du compte dans le tableau de bord. L’état de facturation peut être lu avec get_account.
POST /keysnon exposéExclu délibérément : un agent ne doit ni émettre ni détruire d’identifiants. Les clés sont gérées par un humain dans le tableau de bord.
GET /keyslist_api_keysLister les métadonnées des clés API
DELETE /keys/:idnon exposéExclu délibérément : un agent ne doit ni émettre ni détruire d’identifiants. Les clés sont gérées par un humain dans le tableau de bord.

Délibérément non disponible

FonctionnalitéEndpointsRaison
Créer, faire tourner, révoquer ou supprimer des clés APIPOST /keys, DELETE /keys/:idExclu délibérément : un agent ne doit ni émettre ni détruire d’identifiants. Les clés sont gérées par un humain dans le tableau de bord.
Lancer un paiement ou résilier un abonnementPOST /billing/checkout, POST /billing/cancelLes modifications de facturation sont par conception réservées aux sessions et exigent la présence du propriétaire du compte dans le tableau de bord. L’état de facturation peut être lu avec get_account.
DNS en un clic Cloudflare (OAuth)GET /api/dns/cloudflare/connectNécessite une session de navigateur interactive et un consentement OAuth Cloudflare. Utilisez plutôt les enregistrements de get_domain, les hôtes de get_dns_provider ou get_domain_connect_link.
Inscription, connexion, déconnexion, association d’un compte Google/api/auth/*Authentification humaine dans le navigateur ; le serveur MCP s’authentifie avec une clé API.
Formulaire de contact du supportPOST /api/contactFormulaire public du site marketing destiné aux humains, pas une opération sur l’espace de travail.

Catalogue lisible par machine : /docs/mcp/tools.json (schémas, annotations, correspondance des endpoints, exclusions). Version Markdown de cette page : /docs/mcp.md. Si la CLI est installée, sendhq commands --format json affiche le même catalogue.