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.
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
claude mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcpPré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
codestable, lestatusHTTP, uneexplanation, unremedyconcret 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-onlymasque 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.
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
- Ouvrez Settings → Connectors et trouvez SendHQ dans l’annuaire, ou choisissez Add custom connector et collez
https://mcp.sendhq.cc/mcp. - Cliquez sur Connect, connectez-vous à SendHQ, vérifiez les accès demandés et cliquez sur Allow.
- 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
- Open Settings → Security and login and turn on Developer mode.
- Go to chatgpt.com/plugins, click Create MCP app, name it SendHQ and enter
https://mcp.sendhq.cc/mcp. - 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_featuretool 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.
curl -fsSL https://downloads.sendhq.cc/install.sh | shirm https://downloads.sendhq.cc/install.ps1 | iexsendhq version
SENDHQ_API_KEY=re_your_key sendhq doctorCré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 :
SENDHQ_API_KEY=re_your_key sendhq mcpEn 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 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-onlyAjoutez --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.
{
"mcpServers": {
"sendhq": {
"command": "sendhq",
"args": [
"mcp"
],
"env": {
"SENDHQ_API_KEY": "${SENDHQ_API_KEY}"
}
}
}
}OpenAI Codex
[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).
{
"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.
{"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 option | Obligatoire | Signification |
|---|---|---|
SENDHQ_API_KEY | oui | Clé 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_URL | non | URL 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_ONLY | non | 1, true ou yes équivaut à --read-only. |
--read-only | non | N’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 / --profile | non | Utilise 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_batchetsend_template_testdélivrent du courrier à de vraies personnes et consomment des crédits de livraison. Leur description commence parSENDS 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_inboxetremove_suppressionsont marquésdestructiveHint: trueet leur description commence parDESTRUCTIVE. Demandez d’abord confirmation à l’utilisateur.remove_suppressionaffaiblit 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: trueet peut être appelé librement. - Ce serveur ne modifie jamais le DNS.
add_domainrenvoie des enregistrements qu’un humain doit publier ;get_domain_connect_linkrenvoie une URL de consentement qu’une personne doit ouvrir et approuver chez son fournisseur DNS. - Ce serveur ne modifie jamais la facturation.
get_accountse 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 commesuccess@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
get_service_healthconfirme que l’API est joignable (fonctionne sans clé).get_accountindique la formule (access.tier), le quota restant etuser.email. Pendant l’essai, cette adresse est le seul vrai destinataire autorisé.list_sending_identitiesliste les adresses From que vous pouvez utiliser. Si la liste est vide, suivez d’abord le workflow de domaine.- Confirmez l’expéditeur, le destinataire, l’objet et le corps avec l’utilisateur, puis appelez
send_emailavec uneidempotency_key. list_email_eventsavec l’idrenvoyé affichedelivery,bounce,complaintourejectdès que le fournisseur le signale (généralement en quelques secondes à quelques minutes).
{
"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
add_domainavecname: "example.com". Le résultat contient les enregistrements DNS (CNAME DKIM, vérification SES, SPF, DMARC recommandé).get_dns_provideravec ledomain_iddétecte le fournisseur DNS faisant autorité et renvoie l’hôte relatif exact à saisir pour chaque enregistrement chez ce fournisseur.- Si
providers.domainConnect.availablevaut true,get_domain_connect_linkrenvoie 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 : fusionnezinclude:amazonses.comdans la valeurv=spf1existante. verify_domainrevérifie le DNS et SES. Le statut passe parpending,checkingetpropagatingjusqu’àverified. Interrogezverify_domainouget_domaintoutes les 30 à 60 secondes ; le DNS peut mettre de quelques minutes à quelques heures.- Lorsque
statusvautverified, les adresses du domaine apparaissent danslist_sending_identities.
3. Bounces, plaintes et suppressions
list_blocked_recipientsrenvoie chaque adresse bloquée avec son motif (bounce,complaint,unsubscribe) ainsi qu’un décompte récapitulatif.list_suppressionsrenvoie les suppressions pour hard bounce et pour plainte ;deliverability_statsfournit les taux de livraison, de bounces et de plaintes sur 30 jours ;list_sender_reputationindique quelles adresses From sont bridées ou en pause.- Un envoi contenant un destinataire en liste de suppression échoue avec
422 recipient_suppressed. Retirez ce destinataire et renvoyez. - N’appelez
remove_suppressionque 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
- Le domaine (souvent un sous-domaine comme
inbound.example.com) doit être vérifié. setup_inboundconfigure la réception et renvoie un enregistrement MX. Un humain le publie.verify_inboundjusqu’à ce questatusvailleready.create_inboxavecdomain_idetlocal_part(par exemplesupport) créesupport@inbound.example.com.- Interrogez
list_emailsavecdirection: "in"etunread: true(et éventuellementinbox_id). Lisez un message avecget_email, sa conversation avecget_thread, ses pièces jointes avecdownload_attachment, et marquez-le comme traité avecmark_email(read: true). - Répondez dans le fil avec
send_emailetreply_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
- Trouvez le message :
list_emailsavecdirection: "out"ettoouquery, ouget_emailsi vous avez l’identifiant.status: failedsignifie que SendHQ ou le fournisseur l’a rejeté lors de la soumission ; l’erreur de l’e-mail en explique la raison. list_email_events:bounce(permanent ou transitoire, avec le diagnostic du fournisseur),complaint,rejectoudelivery. L’absence d’événements signifie que le fournisseur n’a encore rien signalé ; attendez et vérifiez à nouveau.- Si l’appel d’envoi lui-même a échoué, lisez le
coded’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→ examinezlist_sender_reputationet corrigez la source de la liste ;trial_recipient_restricted→ limites de l’essai ;quota_exhausted→ utilisation dansget_account. get_domainvérifie que DKIM, SPF et DMARC sont toujours publiés ;deliverability_statsmontre si le problème concerne un seul message ou une tendance.- Rapportez ce que montrent les preuves. Un événement
deliverysignifie 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)
create_labelavecname(par exempleAgent/Orders) etskip_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.- Envoyez le courrier lié à la tâche avec
send_email(ousend_batch) etlabels: ["Agent/Orders"]. Les réponses à cette conversation héritent automatiquement du libellé et évitent la Boîte de réception. - Pour le courrier qui commence en dehors de vos conversations, ajoutez une règle de classement :
create_label_ruleavecinbox_id(une adresse dédiée commeorders@…),from,toousubject. Passezapply_to_existing: truepour classer le courrier déjà reçu. - Traitez la catégorie :
list_emailsaveclabel: "Agent/Orders",direction: "in"etunread: true; lisez avecget_emailouget_thread, répondez avecsend_emailetreply_to_email_id, puis appelezmark_emailread: trueune fois le message traité. - 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. - En option,
set_inbox_forwardingenvoie 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).
{
"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.
{
"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.
{
"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: trueetretryable: false. Vérifiez aveclist_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_emailavec desattachmentsen 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_emailavecdraft_idetidempotency_key.
{
"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.recipientDeliveriespar 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_batchjusqu’à 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.
| code | HTTP | Réessayer ? | Signification et marche à suivre |
|---|---|---|---|
invalid_arguments | — | non | Les 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_error | 401 | non | Clé 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_restricted | 402 | non | L’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_required | 402 | non | La fonctionnalité nécessite une formule payante (par exemple les pièces jointes). Envoyez sans elle ou passez à une formule supérieure. |
sender_domain_not_owned | 403 | non | Le domaine From n’appartient pas à cet espace de travail. Utilisez list_sending_identities ou add_domain. |
sender_domain_unverified | 403 | non | Le domaine From n’est pas encore vérifié. get_domain, publiez les enregistrements manquants, verify_domain. |
domain_limit_reached | 403 | non | Limite de domaines de la formule atteinte. Supprimez un domaine inutilisé (avec approbation) ou passez à une formule supérieure. |
marketing_not_enabled | 403 | non | La classe marketing n’est pas activée pour ce domaine ou cette formule. N’utilisez transactional que si le message est réellement transactionnel. |
forbidden | 403 | non | La politique n’autorise pas l’opération. Ajustez la requête. |
not_found | 404 | non | L’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_conflict | 409 | non | Clé 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_progress | 409 | oui | La requête d’origine est toujours en cours. Attendez, puis réessayez avec la même clé et le même corps. |
revision_conflict | 409 | non | Le brouillon du modèle a changé depuis votre lecture. get_template, fusionnez, enregistrez à nouveau. |
complaint_suppression_locked | 409 | non | Le destinataire a porté plainte. Ne lui envoyez plus jamais d’e-mail. |
inbound_not_ready | 409 | non | La réception n’est pas prête. setup_inbound, publiez le MX, verify_inbound. |
conflict | 409 | non | La ressource existe déjà ou n’est pas dans le bon état. Lisez-la et ajustez. |
attachments_too_large | 413 | non | Plus de 10 fichiers ou de 10 MB. Retirez ou réduisez les pièces jointes. |
recipient_suppressed | 422 | non | Un destinataire a déjà généré un hard bounce ou une plainte. Retirez-le ; voir list_blocked_recipients. |
recipient_unsubscribed | 422 | non | Un destinataire s’est désinscrit des e-mails marketing. Retirez-le définitivement. |
validation_failed | 422 | non | Contenu rejeté, par exemple des données de modèle qui ne respectent pas le contrat de variables. Corrigez l’entrée. |
sender_paused | 423 | non | Cette 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_exhausted | 429 | non | Limite 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_limited | 429 | oui | Ralentissez ; attendez retry_after_seconds. Envois : même clé, même corps. |
server_error | 5xx | oui | Dé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 | — | oui | Requête ou réponse perdue. Réessayez ; pour les envois, la même idempotency_key rend l’opération sûre. |
invalid_request | 400 | non | Requête mal formée. Lisez message et corrigez-la. |
tool_error | — | non | Dé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
Aucun outil ne correspond à ce filtre.
E-mails et fils de discussion
send_emailEnvoyer 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
from | string | oui | Expé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.) |
to | string[] | oui | Destinataires. 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) |
cc | string[] | non | Destinataires en copie. (0–100 éléments) |
bcc | string[] | non | Destinataires en copie cachée. (0–100 éléments) |
subject | string | non | Objet. À omettre lors de l’envoi d’un modèle. (998 caractères max.) |
text | string | non | Corps en texte brut. Fournissez text, html ou template. |
html | string | non | Corps HTML. SendHQ le nettoie et en dérive le texte lorsque text est omis. |
reply_to | string | non | Adresse Reply-To. |
headers | object | non | En-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_class | string | non | transactional (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_id | string | non | Ré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_id | string | non | Identifiant explicite du fil sous lequel classer le message. |
draft_id | string | non | Envoie avec ce message les pièces jointes d’un brouillon enregistré (dr_…). Le brouillon est supprimé après un envoi réussi. |
template | object | non | Envoie 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.id | string | non | Identifiant du modèle (tmpl_…). Fournissez id ou key. |
template.key | string | non | Clé du modèle, par exemple account-welcome. Fournissez id ou key. |
template.version_id | string | non | Identifiant facultatif d’une version publiée (tmplv_…). Par défaut, la version publiée actuelle. |
template.data | object | non | Valeurs des variables typées du modèle. |
labels | string[] | non | Noms 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_key | string | non | En-tête Idempotency-Key (200 caractères max.). Ne la réutilisez que pour réessayer exactement cette requête. (200 caractères max.) |
attachments | object[] | non | Fichiers à 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[].filename | string | non | Nom 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_type | string | non | Type MIME, par ex. application/pdf. Par défaut application/octet-stream. |
attachments[].content_base64 | string | non | Contenu du fichier en base64 standard. |
attachments[].file_path | string | non | Chemin absolu d’un fichier local lisible par le processus du serveur MCP. |
{
"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"
}
}send_batchEnvoyer 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
emails | object[] | oui | Messages à envoyer. (1–100 éléments) Fournissez au moins l’un des éléments suivants : html, text, template. |
idempotency_key | string | non | Idempotency-Key pour l’ensemble du lot (200 caractères max.). (200 caractères max.) |
{
"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"
}
}list_emailsLister 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
direction | string | non | in pour le courrier reçu, out pour le courrier envoyé. (valeurs possibles : in, out) |
status | string | non | Filtre de statut, par ex. queued, sent, delivered, bounced, complained, failed. |
domain | string | non | Uniquement les messages de ce domaine, ou d’une liste de domaines séparés par des virgules (correspondance avec n’importe lequel). |
inbox_id | string | non | Uniquement les messages reçus par cette boîte de réception (inb_…). |
label | string | non | Uniquement 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. |
archived | boolean | non | false = vue Boîte de réception (courrier reçu non archivé), true = courrier archivé uniquement. À omettre pour tout le courrier. |
category | string | non | primary (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. |
important | boolean | non | true = uniquement les messages marqués importants (réponses aux conversations que vous avez lancées et expéditeurs marqués importants). |
include_spam | boolean | non | Inclure le spam dans les résultats (pour les recherches dans tous les dossiers). |
from | string | non | L’adresse de l’expéditeur contient cette valeur. |
to | string | non | L’adresse du destinataire contient cette valeur. |
unread | boolean | non | true = non lus uniquement, false = lus uniquement. |
after | string | non | Horodatage ISO-8601 ; uniquement les messages créés après celui-ci. (date-time) |
before | string | non | Horodatage ISO-8601 ; uniquement les messages créés avant celui-ci. (date-time) |
query | string | non | Recherche plein texte dans les objets, les corps, les adresses d’expéditeur/destinataire et les noms des pièces jointes. (200 caractères max.) |
limit | integer | non | Taille de page. 50 par défaut. (par défaut 50 ; 1–200) |
offset | integer | non | Nombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…) |
{
"name": "list_emails",
"arguments": {
"direction": "in",
"unread": true,
"limit": 25
}
}get_emailObtenir 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
email_id | string | oui | Identifiant de l’e-mail (commence par em_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
{
"name": "get_email",
"arguments": {
"email_id": "em_123"
}
}mark_emailMarquer 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
email_id | string | oui | Identifiant de l’e-mail (commence par em_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
read | boolean | non | true = lu, false = non lu. |
archived | boolean | non | true = archiver (hors de la Boîte de réception), false = remettre dans la Boîte de réception. |
category | string | non | Déplace un message reçu vers primary, updates ou spam. (valeurs possibles : primary, updates, spam) |
important | boolean | non | Marquer ou démarquer le message comme important. |
learn | boolean | non | false = ne pas mémoriser ce verdict pour l’expéditeur (true par défaut). |
{
"name": "mark_email",
"arguments": {
"email_id": "em_123",
"read": true
}
}delete_emailSupprimer 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
email_id | string | oui | Identifiant de l’e-mail (commence par em_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
{
"name": "delete_email",
"arguments": {
"email_id": "em_123"
}
}list_email_eventsLister 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
email_id | string | oui | Identifiant de l’e-mail (commence par em_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
limit | integer | non | Taille de page. 50 par défaut. (par défaut 50 ; 1–200) |
offset | integer | non | Nombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…) |
{
"name": "list_email_events",
"arguments": {
"email_id": "em_123"
}
}get_threadObtenir 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
thread_id | string | oui | Identifiant du fil (généralement l’identifiant em_… du premier message ; voir threadId sur n’importe quel e-mail). (128 caractères max.) |
{
"name": "get_thread",
"arguments": {
"thread_id": "em_123"
}
}Libellés et règles de classement automatique
list_labelsLister 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
limit | integer | non | Taille de page. 50 par défaut. (par défaut 50 ; 1–200) |
offset | integer | non | Nombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…) |
{
"name": "list_labels",
"arguments": {}
}get_labelObtenir un libellé
Récupère un libellé avec ses compteurs et ses règles de classement automatique.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
label_id | string | oui | Identifiant du libellé (commence par lbl_) ou nom exact du libellé. (128 caractères max.) |
{
"name": "get_label",
"arguments": {
"label_id": "Billing"
}
}create_labelCré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ètre | Type | Obligatoire | Description |
|---|---|---|---|
name | string | oui | Nom du libellé, par ex. Billing ou Clients/Acme. Unique par espace de travail (insensible à la casse). (64 caractères max.) |
color | string | non | Couleur hexadécimale, par exemple #1a73e8. Facultatif. |
skip_inbox | boolean | non | Mode 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. |
rules | object[] | non | Rè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[].direction | string | non | Uniquement le courrier in (reçu) ou out (envoyé). À omettre pour les deux. (valeurs possibles : in, out) |
rules[].inbox_id | string | non | Uniquement le courrier reçu par cette boîte de réception (inb_…). Classe chaque adresse de réception dans son propre dossier. |
rules[].from | string | non | L’expéditeur contient ce texte (insensible à la casse), par ex. @stripe.com. (200 caractères max.) |
rules[].to | string | non | To/Cc contient ce texte (insensible à la casse). (200 caractères max.) |
rules[].subject | string | non | L’objet contient ce texte (insensible à la casse). (200 caractères max.) |
rules[].skip_inbox | boolean | non | Archive 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_existing | boolean | non | Classe aussi le courrier déjà conservé qui correspond aux règles. |
{
"name": "create_label",
"arguments": {
"name": "Agent/Orders",
"skip_inbox": true,
"rules": [
{
"from": "@stripe.com"
}
]
}
}update_labelRenommer 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
label_id | string | oui | Identifiant du libellé (commence par lbl_) ou nom exact du libellé. (128 caractères max.) |
name | string | non | Nouveau nom. (64 caractères max.) |
color | string | non | Nouvelle couleur hexadécimale. |
skip_inbox | boolean | non | Mode 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. |
{
"name": "update_label",
"arguments": {
"label_id": "lbl_123",
"name": "Finance/Billing"
}
}delete_labelSupprimer 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
label_id | string | oui | Identifiant du libellé (commence par lbl_) ou nom exact du libellé. (128 caractères max.) |
{
"name": "delete_label",
"arguments": {
"label_id": "lbl_123"
}
}create_label_ruleAjouter 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
label_id | string | oui | Identifiant du libellé (commence par lbl_) ou nom exact du libellé. (128 caractères max.) |
direction | string | non | Uniquement le courrier in (reçu) ou out (envoyé). À omettre pour les deux. (valeurs possibles : in, out) |
inbox_id | string | non | Uniquement le courrier reçu par cette boîte de réception (inb_…). Classe chaque adresse de réception dans son propre dossier. |
from | string | non | L’expéditeur contient ce texte (insensible à la casse), par ex. @stripe.com. (200 caractères max.) |
to | string | non | To/Cc contient ce texte (insensible à la casse). (200 caractères max.) |
subject | string | non | L’objet contient ce texte (insensible à la casse). (200 caractères max.) |
skip_inbox | boolean | non | Archive 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_existing | boolean | non | Classe aussi le courrier déjà conservé qui correspond. |
{
"name": "create_label_rule",
"arguments": {
"label_id": "Billing",
"inbox_id": "inb_123",
"skip_inbox": true
}
}delete_label_ruleSupprimer une règle de classement automatique
DESTRUCTIVE : retire une règle de classement automatique. Le courrier déjà classé conserve son libellé.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
label_id | string | oui | Identifiant du libellé (commence par lbl_) ou nom exact du libellé. (128 caractères max.) |
rule_id | string | oui | Identifiant de la règle (commence par lrule_), obtenu via get_label. (128 caractères max.) |
{
"name": "delete_label_rule",
"arguments": {
"label_id": "lbl_123",
"rule_id": "lrule_123"
}
}label_emailAjouter 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
email_id | string | oui | Identifiant de l’e-mail (commence par em_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
add | string[] | non | Libellés à ajouter. (0–10 éléments) |
remove | string[] | non | Libellés à retirer. (0–10 éléments) |
create | boolean | non | Crée les libellés inconnus dans add (true par défaut). |
{
"name": "label_email",
"arguments": {
"email_id": "em_123",
"add": [
"Billing"
],
"remove": [
"Support"
]
}
}Brouillons, pièces jointes et identités d’expéditeur
list_sending_identitiesLister 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.
{
"name": "list_sending_identities",
"arguments": {}
}create_draftCré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ètre | Type | Obligatoire | Description |
|---|---|---|---|
from | string | non | Adresse d’expéditeur sur un domaine vérifié (peut rester vide pendant la rédaction). |
to | string[] | non | Destinataires. (0–100 éléments) |
cc | string[] | non | Destinataires en copie. (0–100 éléments) |
bcc | string[] | non | Destinataires en copie cachée. (0–100 éléments) |
subject | string | non | Objet. (998 caractères max.) |
html | string | non | Corps HTML. |
text | string | non | Corps en texte brut. |
reply_to_email_id | string | non | Identifiant de l’e-mail auquel ce brouillon répond. |
thread_id | string | non | Identifiant du fil auquel appartient ce brouillon. |
{
"name": "create_draft",
"arguments": {
"from": "hello@example.com",
"to": [
"owner@example.com"
],
"subject": "Invoice"
}
}list_draftsLister 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
limit | integer | non | Taille de page. 50 par défaut. (par défaut 50 ; 1–200) |
offset | integer | non | Nombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…) |
{
"name": "list_drafts",
"arguments": {}
}get_draftObtenir un brouillon
Récupère un brouillon avec les métadonnées de ses pièces jointes.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
draft_id | string | oui | Identifiant du brouillon (commence par dr_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
{
"name": "get_draft",
"arguments": {
"draft_id": "dr_123"
}
}update_draftRemplacer 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
draft_id | string | oui | Identifiant du brouillon (commence par dr_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
from | string | non | Adresse d’expéditeur sur un domaine vérifié (peut rester vide pendant la rédaction). |
to | string[] | non | Destinataires. (0–100 éléments) |
cc | string[] | non | Destinataires en copie. (0–100 éléments) |
bcc | string[] | non | Destinataires en copie cachée. (0–100 éléments) |
subject | string | non | Objet. (998 caractères max.) |
html | string | non | Corps HTML. |
text | string | non | Corps en texte brut. |
reply_to_email_id | string | non | Identifiant de l’e-mail auquel ce brouillon répond. |
thread_id | string | non | Identifiant du fil auquel appartient ce brouillon. |
{
"name": "update_draft",
"arguments": {
"draft_id": "dr_123",
"from": "hello@example.com",
"to": [
"owner@example.com"
],
"subject": "Invoice (updated)",
"text": "Attached."
}
}delete_draftAbandonner un brouillon
DESTRUCTIVE : abandonne un brouillon et supprime définitivement ses pièces jointes stockées.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
draft_id | string | oui | Identifiant du brouillon (commence par dr_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
{
"name": "delete_draft",
"arguments": {
"draft_id": "dr_123"
}
}upload_attachmentTé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ètre | Type | Obligatoire | Description |
|---|---|---|---|
draft_id | string | oui | Identifiant du brouillon (commence par dr_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
filename | string | non | Nom de fichier affiché au destinataire. Par défaut, le nom de base de file_path. (255 caractères max.) |
content_type | string | non | Type MIME, par ex. application/pdf. Par défaut application/octet-stream. |
content_base64 | string | non | Contenu du fichier en base64 standard. |
file_path | string | non | Chemin absolu d’un fichier local lisible par le processus du serveur MCP. |
{
"name": "upload_attachment",
"arguments": {
"draft_id": "dr_123",
"filename": "invoice.pdf",
"content_type": "application/pdf",
"file_path": "/tmp/invoice.pdf"
}
}download_attachmentTé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ètre | Type | Obligatoire | Description |
|---|---|---|---|
attachment_id | string | oui | Identifiant 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_path | string | non | Chemin local absolu facultatif où écrire le fichier au lieu de renvoyer du base64. |
overwrite | boolean | non | Autorise le remplacement d’un fichier existant à save_to_path. false par défaut. |
{
"name": "download_attachment",
"arguments": {
"attachment_id": "att_123",
"save_to_path": "/tmp/invoice.pdf"
}
}delete_attachmentSupprimer 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
attachment_id | string | oui | Identifiant de la pièce jointe (commence par att_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
{
"name": "delete_attachment",
"arguments": {
"attachment_id": "att_123"
}
}Modèles hébergés
list_templatesLister 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
lifecycle | string | non | active (par défaut), archived ou all. (valeurs possibles : active, archived, all) |
query | string | non | Recherche par nom ou par clé. (120 caractères max.) |
limit | integer | non | Taille de page. 50 par défaut. (par défaut 50 ; 1–200) |
offset | integer | non | Nombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…) |
{
"name": "list_templates",
"arguments": {
"lifecycle": "active"
}
}create_templateCré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ètre | Type | Obligatoire | Description |
|---|---|---|---|
name | string | oui | Nom lisible. (120 caractères max.) |
key | string | non | Clé 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. |
starter | string | non | Contenu de départ. (valeurs possibles : blank, welcome, reset, receipt) |
{
"name": "create_template",
"arguments": {
"name": "Account welcome",
"key": "account-welcome",
"starter": "welcome"
}
}get_templateObtenir 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
template_id | string | oui | Identifiant (tmpl_…) ou clé du modèle. (128 caractères max.) |
{
"name": "get_template",
"arguments": {
"template_id": "account-welcome"
}
}update_template_draftEnregistrer 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
template_id | string | oui | Identifiant ou clé du modèle. (128 caractères max.) |
revision | integer | oui | Révision actuelle du brouillon, obtenue via get_template. (1–…) |
name | string | non | Nom du modèle. (120 caractères max.) |
subject_template | string | non | Objet avec espaces réservés. (998 caractères max.) |
preheader_template | string | non | Texte d’aperçu. (240 caractères max.) |
html_template | string | non | Corps HTML avec espaces réservés. |
text_template | string | non | Corps en texte brut avec espaces réservés. |
from | string | non | Expéditeur par défaut pour les envois de ce modèle. |
reply_to | string | non | Reply-To par défaut. |
variables | object[] | non | Contrat 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[].key | string | oui | |
variables[].label | string | non | |
variables[].type | string | non | (valeurs possibles : text, number, url, boolean) |
variables[].required | boolean | non | |
variables[].fallback | any | non | |
variables[].description | string | non | |
sample_data | object | non | Valeurs d’exemple utilisées pour les aperçus et les tests. |
{
"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"
}
}
}create_template_draftCré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ètre | Type | Obligatoire | Description |
|---|---|---|---|
template_id | string | oui | Identifiant ou clé du modèle. (128 caractères max.) |
{
"name": "create_template_draft",
"arguments": {
"template_id": "account-welcome"
}
}render_templateGé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ètre | Type | Obligatoire | Description |
|---|---|---|---|
template_id | string | oui | Identifiant ou clé du modèle. (128 caractères max.) |
version_id | string | non | Identifiant de version facultatif ; par défaut le brouillon, puis la version publiée. |
data | object | non | Valeurs des variables ; par défaut, les données d’exemple de la version. |
{
"name": "render_template",
"arguments": {
"template_id": "account-welcome",
"data": {
"first_name": "Asha"
}
}
}send_template_testEnvoyer 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
template_id | string | oui | Identifiant ou clé du modèle. (128 caractères max.) |
to | string[] | oui | Destinataires du test. (1–100 éléments) |
from | string | non | Expéditeur sur un domaine vérifié ; par défaut, le From du modèle. |
version_id | string | non | Identifiant de version facultatif. |
data | object | non | Valeurs des variables ; par défaut, les données d’exemple. |
{
"name": "send_template_test",
"arguments": {
"template_id": "account-welcome",
"to": [
"owner@example.com"
]
}
}publish_templatePublier 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
template_id | string | oui | Identifiant ou clé du modèle. (128 caractères max.) |
{
"name": "publish_template",
"arguments": {
"template_id": "account-welcome"
}
}archive_templateArchiver 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
template_id | string | oui | Identifiant ou clé du modèle. (128 caractères max.) |
{
"name": "archive_template",
"arguments": {
"template_id": "account-welcome"
}
}restore_templateRestaurer un modèle archivé
Réactive un modèle archivé.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
template_id | string | oui | Identifiant ou clé du modèle. (128 caractères max.) |
{
"name": "restore_template",
"arguments": {
"template_id": "account-welcome"
}
}Domaines et DNS
list_domainsLister 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
limit | integer | non | Taille de page. 50 par défaut. (par défaut 50 ; 1–200) |
offset | integer | non | Nombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…) |
{
"name": "list_domains",
"arguments": {}
}get_domainObtenir 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
domain_id | string | oui | Identifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
{
"name": "get_domain",
"arguments": {
"domain_id": "dom_123"
}
}add_domainAjouter 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
name | string | oui | Nom de domaine nu, par ex. example.com ou mail.example.com. (253 caractères max.) |
default_from | string | non | Adresse d’expéditeur par défaut facultative sur ce domaine. |
{
"name": "add_domain",
"arguments": {
"name": "example.com"
}
}verify_domainVé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ètre | Type | Obligatoire | Description |
|---|---|---|---|
domain_id | string | oui | Identifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
{
"name": "verify_domain",
"arguments": {
"domain_id": "dom_123"
}
}delete_domainSupprimer 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
domain_id | string | oui | Identifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
{
"name": "delete_domain",
"arguments": {
"domain_id": "dom_123"
}
}get_dns_providerDé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ètre | Type | Obligatoire | Description |
|---|---|---|---|
domain_id | string | oui | Identifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
{
"name": "get_dns_provider",
"arguments": {
"domain_id": "dom_123"
}
}get_domain_connect_linkObtenir un lien de configuration DNS en un clic
Lorsque get_dns_provider signale providers.domainConnect.available, crée une URL de consentement signée. Transmettez-la à l’humain : il l’ouvre et approuve la modification DNS chez son fournisseur. Rien ne change tant qu’il n’a pas approuvé. 409 si ce n’est pas pris en charge.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
domain_id | string | oui | Identifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
{
"name": "get_domain_connect_link",
"arguments": {
"domain_id": "dom_123"
}
}E-mails entrants
setup_inboundActiver 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
domain_id | string | oui | Identifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
{
"name": "setup_inbound",
"arguments": {
"domain_id": "dom_123"
}
}verify_inboundVérifier le MX entrant
Revérifie l’enregistrement MX entrant. Le statut passe à ready lorsque les deux résolveurs publics le voient.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
domain_id | string | oui | Identifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
{
"name": "verify_inbound",
"arguments": {
"domain_id": "dom_123"
}
}list_inboxesLister 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
domain_id | string | non | Filtre facultatif par identifiant de domaine. |
limit | integer | non | Taille de page. 50 par défaut. (par défaut 50 ; 1–200) |
offset | integer | non | Nombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…) |
{
"name": "list_inboxes",
"arguments": {
"domain_id": "dom_123"
}
}get_inboxObtenir une boîte de réception
Récupère une adresse de réception.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
inbox_id | string | oui | Identifiant 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.) |
{
"name": "get_inbox",
"arguments": {
"inbox_id": "inb_123"
}
}create_inboxCré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ètre | Type | Obligatoire | Description |
|---|---|---|---|
domain_id | string | oui | Identifiant du domaine (commence par dom_), tel que renvoyé par un outil de liste ou de création. (128 caractères max.) |
local_part | string | oui | Partie avant le @, par ex. support. (64 caractères max.) |
name | string | non | Nom d’affichage facultatif. |
{
"name": "create_inbox",
"arguments": {
"domain_id": "dom_123",
"local_part": "support",
"name": "Support"
}
}update_inboxRenommer, 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
inbox_id | string | oui | Identifiant 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.) |
name | string | non | Nouveau nom d’affichage. |
status | string | non | Nouveau statut. (valeurs possibles : active, disabled) |
{
"name": "update_inbox",
"arguments": {
"inbox_id": "inb_123",
"status": "disabled"
}
}set_inbox_forwardingTransfé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ètre | Type | Obligatoire | Description |
|---|---|---|---|
inbox_id | string | oui | Identifiant 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_to | string,null | oui | Adresse e-mail cible du transfert, ou null pour désactiver le transfert. (254 caractères max.) |
{
"name": "set_inbox_forwarding",
"arguments": {
"inbox_id": "inb_123",
"forward_to": "team@example.net"
}
}delete_inboxSupprimer 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
inbox_id | string | oui | Identifiant 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.) |
{
"name": "delete_inbox",
"arguments": {
"inbox_id": "inb_123"
}
}Délivrabilité, bounces et suppressions
deliverability_statsObtenir 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.
{
"name": "deliverability_stats",
"arguments": {}
}list_sender_reputationLister 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
limit | integer | non | Taille de page. 50 par défaut. (par défaut 50 ; 1–200) |
offset | integer | non | Nombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…) |
{
"name": "list_sender_reputation",
"arguments": {}
}list_suppressionsLister 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
limit | integer | non | Taille de page. 50 par défaut. (par défaut 50 ; 1–200) |
offset | integer | non | Nombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…) |
{
"name": "list_suppressions",
"arguments": {}
}remove_suppressionRetirer 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
email | string | oui | Adresse du destinataire en liste de suppression. (320 caractères max.) |
{
"name": "remove_suppression",
"arguments": {
"email": "fixed-mailbox@example.net"
}
}list_blocked_recipientsLister 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
limit | integer | non | Taille de page. 50 par défaut. (par défaut 50 ; 1–200) |
offset | integer | non | Nombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…) |
{
"name": "list_blocked_recipients",
"arguments": {}
}Compte, utilisation, statistiques et clés
get_accountObtenir 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.
{
"name": "get_account",
"arguments": {}
}get_analyticsObtenir 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
days | integer | non | Fenêtre en jours : 7, 30 (par défaut) ou 90. (valeurs possibles : 7, 30, 90) |
{
"name": "get_analytics",
"arguments": {
"days": 30
}
}list_api_keysLister 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ètre | Type | Obligatoire | Description |
|---|---|---|---|
limit | integer | non | Taille de page. 50 par défaut. (par défaut 50 ; 1–200) |
offset | integer | non | Nombre d’enregistrements à ignorer. Utilisez pagination.next_offset de la page précédente. (par défaut 0 ; 0–…) |
{
"name": "list_api_keys",
"arguments": {}
}get_service_healthVé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.
{
"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.
| Endpoint | Outil | Remarques |
|---|---|---|
| POST /emails | send_email | Envoyer un e-mail |
| POST /emails/batch | send_batch | Envoyer jusqu’à 100 messages personnalisés |
| GET /emails | list_emails | Lister les e-mails envoyés et reçus |
| GET /emails/:id | get_email | Récupérer un e-mail et ses pièces jointes |
| PATCH /emails/:id | mark_email | Modifier l’état lu, l’archivage, le spam, la catégorie ou l’importance |
| POST /emails/:id/labels | label_email | Ajouter ou retirer des libellés sur un e-mail |
| DELETE /emails/:id | delete_email | Supprimer un e-mail conservé |
| GET /emails/:id/events | list_email_events | Lister les événements de livraison d’un e-mail |
| GET /threads/:id | get_thread | Récupérer une conversation dans l’ordre chronologique |
| GET /labels | list_labels | Lister les libellés avec leur nombre de messages et leurs règles de classement |
| POST /labels | create_label | Créer un libellé, avec des règles de classement automatique en option |
| GET /labels/:id | get_label | Récupérer un libellé par identifiant ou par nom |
| PATCH /labels/:id | update_label | Renommer un libellé, changer sa couleur ou le transformer en catégorie |
| DELETE /labels/:id | delete_label | Supprimer un libellé sans supprimer ses e-mails |
| POST /labels/:id/rules | create_label_rule | Ajouter une règle de classement automatique à un libellé |
| DELETE /labels/:id/rules/:rule_id | delete_label_rule | Supprimer une règle de classement automatique |
| POST /drafts | create_draft | Créer un brouillon de rédaction |
| GET /drafts | list_drafts | Lister les brouillons de rédaction |
| GET /drafts/:id | get_draft | Récupérer un brouillon et ses pièces jointes |
| PUT /drafts/:id | update_draft | Remplacer le contenu d’un brouillon |
| DELETE /drafts/:id | delete_draft | Abandonner un brouillon |
| POST /drafts/:id/attachments | upload_attachment | Téléverser une pièce jointe dans un brouillon |
| GET /attachments/:id | download_attachment | Télécharger une pièce jointe privée |
| DELETE /attachments/:id | delete_attachment | Supprimer une pièce jointe privée |
| GET /sending-identities | list_sending_identities | Lister les identités d’expéditeur vérifiées |
| GET /templates | list_templates | Lister les modèles hébergés |
| POST /templates | create_template | Créer un modèle hébergé |
| GET /templates/:id | get_template | Récupérer les brouillons, les versions publiées et l’utilisation |
| PUT /templates/:id/draft | update_template_draft | Enregistrer automatiquement un brouillon de modèle |
| POST /templates/:id/draft | create_template_draft | Créer un nouveau brouillon à partir de la version publiée |
| POST /templates/:id/render | render_template | Obtenir le rendu exact produit par le serveur |
| POST /templates/:id/test | send_template_test | Envoyer un instantané de test |
| POST /templates/:id/publish | publish_template | Publier une version immuable du modèle |
| POST /templates/:id/archive | archive_template | Archiver un modèle |
| POST /templates/:id/restore | restore_template | Restaurer un modèle archivé |
| POST /domains | add_domain | Ajouter un domaine d’envoi |
| GET /domains | list_domains | Lister les domaines et l’état DNS en cache |
| GET /domains/:id | get_domain | Récupérer les détails de configuration d’un domaine |
| POST /domains/:id/verify | verify_domain | Actualiser la vérification SES et DNS |
| POST /domains/:id/inbound/setup | setup_inbound | Configurer la réception SES |
| POST /domains/:id/inbound/verify | verify_inbound | Vérifier le routage MX entrant |
| DELETE /domains/:id | delete_domain | Supprimer un domaine |
| GET /dns/provider | get_dns_provider | Détecter le fournisseur DNS faisant autorité et les hôtes relatifs des enregistrements |
| GET /dns/domain-connect/connect | get_domain_connect_link | Créer un lien de consentement Domain Connect pour configurer le DNS en un clic |
| POST /inboxes | create_inbox | Créer une adresse de réception |
| GET /inboxes | list_inboxes | Lister les adresses de réception |
| GET /inboxes/:id | get_inbox | Récupérer une adresse de réception |
| PATCH /inboxes/:id | update_inbox | Renommer, activer ou désactiver une boîte de réception |
| PUT /inboxes/:id/forwarding | set_inbox_forwarding | Transférer le courrier reçu par une boîte de réception vers une autre adresse |
| DELETE /inboxes/:id | delete_inbox | Supprimer une boîte de réception en conservant les messages |
| GET /deliverability/stats | deliverability_stats | Récupérer les statistiques de livraison sur 30 jours |
| GET /deliverability/reputation | list_sender_reputation | Lister l’état de réputation par identité d’expéditeur exacte |
| GET /suppressions | list_suppressions | Lister les suppressions de l’espace de travail |
| DELETE /suppressions/:email | remove_suppression | Retirer une suppression pour bounce éligible |
| GET /blocked-recipients | list_blocked_recipients | Lister les bounces, les plaintes et les désinscriptions |
| GET /account | get_account | Récupérer le compte, l’utilisation, l’état de facturation et les compteurs de l’espace de travail avec une clé API |
| GET /analytics | get_analytics | Récupérer les statistiques d’envoi du tableau de bord sur 7, 30 ou 90 jours |
| GET /profile | get_account | Équivalent réservé aux sessions de GET /account ; le serveur MCP lit la route par clé API. |
| POST /billing/checkout | non 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/cancel | non 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 /keys | non 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 /keys | list_api_keys | Lister les métadonnées des clés API |
| DELETE /keys/:id | non 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é | Endpoints | Raison |
|---|---|---|
| Créer, faire tourner, révoquer ou supprimer des clés API | POST /keys, DELETE /keys/:id | 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. |
| Lancer un paiement ou résilier un abonnement | POST /billing/checkout, POST /billing/cancel | 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. |
| DNS en un clic Cloudflare (OAuth) | GET /api/dns/cloudflare/connect | Né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 support | POST /api/contact | Formulaire 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.