Voor AI-agents

MCP-server van SendHQ

Geef een AI-agent volledige, veilige controle over één SendHQ-workspace: e-mail verzenden en ontvangen, domeinen verifiëren, templates publiceren en deliverability onderzoeken via 59 strikt getypeerde tools. Geschreven voor agents, maar mensen zijn ook welkom.

59 toolsstdio-transport, één commando0 tools voor sleutelbeheer
Installeren en verbinden (Claude Code)
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
claude mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp

Wat deze server is

Met de MCP-server van SendHQ kan een AI-agent één SendHQ-workspace bedienen via het Model Context Protocol: e-mail versturen (los, in batches, met templates, als antwoord, met bijlagen, met idempotente retries), verzonden en ontvangen e-mail lezen en doorzoeken (onderwerpen, berichtteksten en namen van bijlagen) inclusief de bezorgevents, e-mail ordenen in labels met automatische sorteerregels, concepten en privébijlagen beheren, gehoste templates opstellen en publiceren, domeinen en hun DNS toevoegen en verifiëren, inkomende e-mail en inkomende adressen inrichten, deliverability, bounces, klachten en suppressies bekijken, en accountgebruik, factureringsstatus, analytics en metadata van API-sleutels lezen.

Het is een lokale stdio-server die is ingebouwd in de sendhq CLI-binary. Je MCP-client start sendhq mcp als childproces en communiceert via JSON-RPC over stdin/stdout. Elke toolcall wordt één gedocumenteerd request naar de SendHQ REST API op https://sendhq.cc/api/v1, geauthenticeerd met de API-sleutel van je workspace. De MCP-server heeft dus precies de rechten van die sleutel en niet meer.

  • 59 tools in 8 groepen, gegenereerd uit één catalogus die ook wordt gepubliceerd als tools.json.
  • Strikte JSON Schemas: onbekende argumenten, verkeerde types en ontbrekende verplichte velden worden lokaal geweigerd voordat er iets bij SendHQ aankomt.
  • Gestructureerde fouten met een stabiele code, de HTTP-status, een explanation, een concrete remedy en of opnieuw proberen zin heeft.
  • Elke tool die echte e-mail verstuurt of data vernietigt, zegt dat in de eerste woorden van de beschrijving en heeft MCP-veiligheidsannotaties.
  • De modus --read-only verbergt alle tools die verzenden of iets wijzigen.
  • Er wordt niets gelogd. stdout bevat alleen protocolberichten; de API-sleutel en berichtinhoud komen nooit in een log terecht.
Niet het MCP-endpoint voor de documentatie.SendHQ host ook een klein, alleen-lezen MCP-endpoint voor documentatie op https://sendhq.cc/api/mcp (prijzen en docs opzoeken, geen toegang tot je account). De server op deze pagina is de volledige server met toegang tot je account; die draait lokaal of als de gehoste connector hieronder.

SendHQ gebruiken in Claude en ChatGPT

Geen installatie nodig: SendHQ draait deze server ook als gehoste connector op https://mcp.sendhq.cc/mcp, met dezelfde tools. Je logt in met je SendHQ-account in plaats van een sleutel te plakken.

Claude

  1. Open Settings → Connectors en zoek SendHQ in de directory, of kies Add custom connector en plak https://mcp.sendhq.cc/mcp.
  2. Klik op Connect, log in bij SendHQ, controleer de toegang en klik op Allow.
  3. Vraag Claude om je inbox te controleren, een e-mail vanaf je geverifieerde domein te versturen of een bounce uit te leggen.

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.

Goedkeuring en verbinding verbreken

  • The request_feature tool sends a feature request to the SendHQ team with your account details, so we can follow up by email.
  • Tools die echte e-mail versturen of data verwijderen, zijn als zodanig gelabeld. Of de assistent je eerst om toestemming vraagt, stel je per tool in de assistent in: kies in Claude voor die tools Needs approval onder Settings → Connectors → SendHQ.
  • De connector krijgt een eigen API-sleutel, genoemd naar de assistent (bijvoorbeeld “Claude (AI connector)”). Verwijder die onder API Keys om de verbinding direct te verbreken.
  • De connector kan geen API-sleutels aanmaken of intrekken en de facturering niet wijzigen. Bijlagen worden als base64 verstuurd en teruggegeven; er is geen toegang tot lokale bestanden.
  • Onbetaalde workspaces (integratieproefperiode) kunnen alleen afleveren bij het e-mailadres van het account of bij een AWS SES-simulatoradres.

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

Installeren

Installeer de sendhq-binary (Linux, macOS en Windows op x86-64 en arm64). Het installatieprogramma controleert de checksum van de release en zet de binary standaard in ~/.local/bin.

macOS en Linux
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
Windows PowerShell
irm https://downloads.sendhq.cc/install.ps1 | iex
De installatie controleren
sendhq version
SENDHQ_API_KEY=re_your_key sendhq doctor

Maak een API-sleutel aan in het dashboard op https://sendhq.cc/app#/keys. De MCP-server kan geen sleutels aanmaken. Het enige commando dat de server start is:

De stdio-server starten
SENDHQ_API_KEY=re_your_key sendhq mcp

Normaal start je dit nooit handmatig: de MCP-client doet dat. Als je het in een terminal uitvoert, wacht het op JSON-RPC via stdin.

Je client configureren

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

Voeg --scope user toe om de server in elk project beschikbaar te maken, of --scope project om hem naar de .mcp.json van het project te schrijven. Verwijs in een gedeelde .mcp.json naar de sleutel uit de omgeving in plaats van hem te committen; Claude Code expandeert ${VAR} in .mcp.json.

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

OpenAI Codex

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

Of via de commandline: codex mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp.

Claude Desktop

Bewerk claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\) en herstart de app. Desktopapps nemen het PATH van je shell niet over, dus gebruik het absolute pad van de binary (which sendhq).

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

Elke andere MCP-client

Configureer een stdio-server met het commando sendhq, de argumenten ["mcp"] (optioneel "--read-only") en de omgevingsvariabelen hieronder. De server ondersteunt de MCP-protocolversies 2024-11-05, 2025-03-26, 2025-06-18 en 2025-11-25, en implementeert initialize, ping, tools/list en tools/call. Toolresultaten bevatten zowel een JSON-tekstblok als structuredContent.

Ruwe stdio-smoketest (pipe naar 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":{}}}

Er is geen gehost HTTP-transport voor de server met toegang tot je account. Een remote MCP-endpoint met schrijfrechten zou OAuth per gebruiker vereisen, en dat biedt SendHQ niet; de lokale binary houdt de sleutel op de machine waar hij al staat.

Omgeving en flags

Variabele of flagVerplichtBetekenis
SENDHQ_API_KEYjaAPI-sleutel van de workspace (re_…). Elke tool behalve get_service_health heeft hem nodig. Zonder sleutel start de server wel, maar elke call geeft een gestructureerde auth_error terug die uitlegt hoe je het oplost.
SENDHQ_API_BASE_URLneeBase-URL van de API. Standaard https://sendhq.cc/api/v1. Gebruik dit alleen voor een lokale of staging-omgeving. SENDHQ_BASE_URL wordt geaccepteerd als oudere alias.
SENDHQ_MCP_READ_ONLYnee1, true of yes werkt hetzelfde als --read-only.
--read-onlyneeStelt alleen tools beschikbaar die geen e-mail versturen en niets wijzigen. Verborgen tools worden ook geweigerd als ze bij naam worden aangeroepen.
SENDHQ_PROFILE / --profileneeGebruik een sleutel die sendhq auth login in de keyring van het besturingssysteem heeft opgeslagen, in plaats van SENDHQ_API_KEY. Zijn beide aanwezig, dan heeft de omgevingsvariabele voorrang.

De sleutel wordt alleen als Authorization: Bearer-header naar de geconfigureerde base-URL gestuurd. Hij wordt nooit afgedrukt, gelogd, herhaald in foutmeldingen of opgenomen in toolresultaten.

Veiligheidsmodel voor agents

  • Verstuurt echte e-mail. send_email, send_batch en send_template_test leveren e-mail af bij echte mensen en verbruiken bezorgcredits. Hun beschrijvingen beginnen met SENDS REAL EMAIL. Roep ze alleen aan als de gebruiker expliciet heeft gevraagd om dat specifieke bericht te versturen, met bevestigde ontvangers, afzender en inhoud.
  • Destructief. delete_email, delete_draft, delete_attachment, delete_domain, delete_inbox en remove_suppression zijn gemarkeerd met destructiveHint: true en hun beschrijvingen beginnen met DESTRUCTIVE. Vraag eerst bevestiging aan de gebruiker. remove_suppression verzwakt een veiligheidsblokkade en is alleen gepast als een mens bevestigt dat het adres weer werkt.
  • Wijzigt de status. Concepten, templates, domeinen en inboxen aanmaken of bijwerken, templates publiceren en verificatie starten wijzigt de workspace, maar verstuurt geen e-mail.
  • Alleen-lezen. Al het andere is readOnlyHint: true en kun je vrij aanroepen.
  • Deze server wijzigt nooit DNS. add_domain geeft records terug die een mens moet publiceren; get_domain_connect_link geeft een toestemmings-URL terug die iemand moet openen en bij de DNS-provider moet goedkeuren.
  • Deze server wijzigt nooit de facturering. get_account leest alleen het abonnement, het gebruik en de status van het abonnement.
  • Onbetaalde workspaces (integratieproefperiode) kunnen alleen afleveren bij het e-mailadres van de accounteigenaar (get_account → user.email) of bij een AWS SES-simulatoradres zoals success@simulator.amazonses.com, en kunnen geen bijlagen versturen.
  • Geaccepteerd is niet afgeleverd. Een geslaagde verzending geeft een ID terug; bewijs van bezorging, bounces en klachten komt later binnen in list_email_events. Beweer nooit dat een bericht in de inbox is beland of dat iemand het heeft gelezen.
  • Stap niet over op een ander From-adres om een 423-pauze te omzeilen, en voeg afgemelde ontvangers of ontvangers met een klacht nooit opnieuw toe.

API-sleutels vallen buiten de scope

Er zijn bewust geen tools die API-sleutels aanmaken, wijzigen, roteren, intrekken of verwijderen. Een agent mag geen credentials aanmaken of vernietigen. list_api_keys geeft alleen namen, niet-geheime prefixen en het tijdstip van laatste gebruik terug. Sleutelbeheer blijft in het dashboard, bij een ingelogde mens.

Workflows

1. Eerste verzending

  1. get_service_health bevestigt dat de API bereikbaar is (werkt zonder sleutel).
  2. get_account toont het abonnement (access.tier), het resterende quotum en user.email. Tijdens de proefperiode is dat e-mailadres de enige echte ontvanger die is toegestaan.
  3. list_sending_identities toont de From-adressen die je kunt gebruiken. Is de lijst leeg, doorloop dan eerst de domeinworkflow.
  4. Bevestig afzender, ontvanger, onderwerp en berichttekst met de gebruiker en roep daarna send_email aan met een idempotency_key.
  5. list_email_events met het teruggegeven id toont delivery, bounce, complaint of reject zodra de provider dat meldt (meestal binnen seconden tot minuten).
Eerste verzending
{
  "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. Domeinverificatie van begin tot eind

  1. add_domain met name: "example.com". Het resultaat bevat de DNS-records (DKIM-CNAME's, SES-verificatie, SPF, aanbevolen DMARC).
  2. get_dns_provider met de domain_id detecteert de gezaghebbende DNS-provider en geeft per record de exacte relatieve host terug die je bij die provider moet invullen.
  3. Is providers.domainConnect.available true, dan geeft get_domain_connect_link een toestemmings-URL terug. Geef die aan de mens; er verandert niets totdat die bij de provider goedkeurt. Geef de mens anders de records om te publiceren. Publiceer nooit een tweede SPF-record: voeg include:amazonses.com samen met de bestaande v=spf1-waarde.
  4. verify_domain controleert DNS en SES opnieuw. De status loopt via pending, checking en propagating naar verified. Poll verify_domain of get_domain elke 30–60 seconden; DNS kan minuten tot uren duren.
  5. Als status verified is, verschijnen de adressen van het domein in list_sending_identities.

3. Bounces, klachten en suppressies

  1. list_blocked_recipients geeft elk geblokkeerd adres terug met de reden (bounce, complaint, unsubscribe) en een totaaloverzicht.
  2. list_suppressions geeft suppressies door hard bounces en klachten terug; deliverability_stats geeft bezorg-, bounce- en klachtpercentages over 30 dagen; list_sender_reputation laat zien welke From-adressen worden afgeremd of gepauzeerd.
  3. Een verzending met een ontvanger op de suppressielijst mislukt met 422 recipient_suppressed. Verwijder die ontvanger en verstuur opnieuw.
  4. Roep remove_suppression alleen aan als een mens bevestigt dat een mailbox met een bounce nu weer werkt. Suppressies door klachten zijn permanent (409 complaint_suppression_locked).

4. Inkomende e-mail ontvangen

  1. Het domein (vaak een subdomein zoals inbound.example.com) moet geverifieerd zijn.
  2. setup_inbound richt ontvangst in en geeft één MX-record terug. Een mens publiceert het.
  3. verify_inbound totdat status ready is.
  4. create_inbox met domain_id en local_part (bijvoorbeeld support) maakt support@inbound.example.com aan.
  5. Poll list_emails met direction: "in" en unread: true (optioneel inbox_id). Lees een bericht met get_email, de conversatie met get_thread, bijlagen met download_attachment, en markeer het als afgehandeld met mark_email (read: true).
  6. Antwoord in de thread met send_email en reply_to_email_id; SendHQ stelt In-Reply-To, References en de thread in.

5. Webhooks en eventnotificaties

SendHQ biedt op dit moment geen webhooks die klanten zelf kunnen configureren, dus er is geen webhooktool. Notificaties van de provider worden binnen SendHQ verwerkt en zijn via leesoperaties beschikbaar. Poll in plaats daarvan: list_email_events voor de uitkomst van één bericht, list_emails met status (bijvoorbeeld bounced) of after voor recente wijzigingen, list_emails met direction: "in" en unread: true voor nieuwe inkomende e-mail, en list_blocked_recipients voor nieuwe suppressies. Poll niet vaker dan ongeveer één keer per minuut per vraag.

6. Een mislukte bezorging diagnosticeren

  1. Zoek het bericht: list_emails met direction: "out" en to of query, of get_email als je het ID hebt. status: failed betekent dat SendHQ of de provider het bij het aanbieden heeft geweigerd; de fout bij de e-mail legt uit waarom.
  2. list_email_events: bounce (permanent of tijdelijk, met de diagnose van de provider), complaint, reject of delivery. Nog geen events betekent dat de provider nog niets heeft gemeld; wacht en kijk later opnieuw.
  3. Is de verzendcall zelf mislukt, lees dan de fout-code: sender_domain_unverified → rond de domeinverificatie af; recipient_suppressed → het adres gaf eerder een hard bounce of een klacht; sender_paused → bekijk list_sender_reputation en herstel de bron van de lijst; trial_recipient_restricted → limieten van de proefperiode; quota_exhausted → gebruik in get_account.
  4. get_domain controleert of DKIM, SPF en DMARC nog gepubliceerd zijn; deliverability_stats laat zien of het probleem één bericht betreft of een trend is.
  5. Rapporteer wat het bewijs laat zien. Een delivery-event betekent dat de server van de ontvanger het bericht heeft geaccepteerd, niet dat het in de inbox is beland of is gelezen.

7. Een eigen taakbucket (labels)

  1. create_label met name (bijvoorbeeld Agent/Orders) en skip_inbox: true. Daarmee wordt het label een bucket: ontvangen e-mail die het label krijgt, wordt gearchiveerd, zodat hij alleen in het label verschijnt en nooit in de Inbox van de mens.
  2. Verstuur taakmail met send_email (of send_batch) en labels: ["Agent/Orders"]. Antwoorden in die conversatie krijgen automatisch het label en slaan de Inbox over.
  3. Voeg voor e-mail die buiten je conversaties begint een sorteerregel toe: create_label_rule met inbox_id (een apart adres zoals orders@…), from, to of subject. Geef apply_to_existing: true mee om al ontvangen e-mail ook te sorteren.
  4. Werk de bucket af: list_emails met label: "Agent/Orders", direction: "in" en unread: true; lees met get_email of get_thread, antwoord met send_email en reply_to_email_id, en roep mark_email read: true aan als het is afgehandeld.
  5. Verplaats een verdwaald bericht naar de bucket of eruit met label_email (add / remove). Een bucketlabel toevoegen aan een ontvangen bericht archiveert het ook.
  6. Optioneel stuurt set_inbox_forwarding een kopie van alles wat een ontvangend adres binnenkrijgt naar een andere mailbox (het doeladres bevestigt eerst per e-mail).
Verzenden naar een bucket
{
  "name": "send_email",
  "arguments": {
    "from": "Orders <orders@example.com>",
    "to": [
      "customer@example.net"
    ],
    "subject": "Order 1042: confirm delivery window",
    "text": "Reply with a time that works.",
    "labels": [
      "Agent/Orders"
    ],
    "idempotency_key": "order-1042-window"
  }
}

8. Bijlagen en templates

Voeg op een betaald abonnement maximaal 10 bestanden toe met send_email attachments (elk bestand heeft content_base64 of een lokaal file_path nodig; filename is standaard de basisnaam van het bestand). Voor gehoste templates: create_template → update_template_draft → render_template voor een voorbeeld met voorbeelddata → send_template_test (verstuurt één echte test) → publish_template, en verstuur daarna met send_email of send_batch via template: {key, data} en precies één to-ontvanger.

Resultaten, paginering en fouten

Een geslaagde call geeft het JSON-object van de API terug als structuredContent en als JSON-tekstblok. Elke list_*-tool accepteert limit (1–200, standaard 50) en offset, en voegt een pagination-object toe. Blijf aanroepen met offset: pagination.next_offset zolang has_more true is.

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

Een mislukte call geeft isError: true terug met een gestructureerde fout. Volg remedy in plaats van blind opnieuw te proberen; probeer alleen opnieuw als retryable true is.

Gestructureerde toolfout
{
  "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."
  }
}

Optionele foutvelden: request_id (vermeld die bij support), retry_after_seconds, problems (lijst met schemaschendingen bij invalid_arguments) en idempotent_replayed (zie Idempotentie).

Idempotentie

send_email en send_batch accepteren idempotency_key (maximaal 200 tekens), die wordt meegestuurd als Idempotency-Key-header. Genereer één stabiele sleutel per logisch bericht, bijvoorbeeld invoice-4812-receipt.

  • Een retry moet dezelfde sleutel EN een identieke requestbody gebruiken. Dezelfde sleutel met welke wijziging dan ook (ontvanger, onderwerp, berichttekst, header, templatedata, zelfs argumentwaarden) geeft 409 idempotency_conflict.
  • Dezelfde sleutel, dezelfde body, origineel afgerond: SendHQ geeft het opgeslagen resultaat terug zonder opnieuw te versturen. Zo probeer je het veilig opnieuw na een time-out of network_error.
  • Dezelfde sleutel terwijl het origineel nog loopt: 409 idempotency_in_progress, na korte tijd opnieuw te proberen.
  • Een nieuw logisch bericht heeft een nieuwe sleutel nodig.
  • Opgeslagen fouten worden ook opnieuw afgespeeld. Is de eerste poging mislukt, dan geeft een retry met dezelfde sleutel diezelfde fout terug met idempotent_replayed: true en retryable: false. Controleer met list_emails (direction: out) dat er niets is verstuurd, los de oorzaak op en verstuur daarna met een nieuwe sleutel.
  • De server probeert een POST nooit uit zichzelf opnieuw. Alleen alleen-lezen GET-calls worden automatisch opnieuw geprobeerd (maximaal 3 pogingen bij netwerkfouten, 429 en 5xx).
  • send_email met inline attachments kan geen idempotency_key meekrijgen, omdat het meerdere requests uitvoert. Voor verzendingen met bijlagen die veilig opnieuw kunnen: create_draft → upload_attachment → send_email met draft_id en idempotency_key.
Verzending die veilig opnieuw kan (herhaal exact bij een time-out)
{
  "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"
  }
}

Rate limits en quota

SendHQ publiceert geen vaste limiet voor het aantal requests per seconde op de API. De limieten waar een agent echt tegenaan loopt, zijn gebruikslimieten, die als 429 worden teruggegeven:

  • Maandelijkse afleveringen aan ontvangers per abonnement. Elk To-, Cc- en Bcc-adres telt als één aflevering. Zie get_account → usage.recipientDeliveries vs. usage.emailQuotaMonth.
  • Dagelijkse ontvangers per exact From-adres, bepaald door de reputatiestatus van die afzender (list_sender_reputation → dailyLimit, standaard 2.000 op betaalde abonnementen).
  • Integratieproefperiode: in totaal 100 ontvangers, alleen naar het e-mailadres van het account of naar SES-simulatoradressen.
  • Bijlagen: maximaal 10 bestanden en 10 MB per bericht; 10 GB aan bijlagenverkeer per maand, gewogen naar ontvangers, op betaalde abonnementen.
  • Per request: To + Cc + Bcc tot 100 adressen; send_batch tot 100 berichten.
  • Reputatie-circuitbreaker: in een rollend venster van 7 dagen zorgen bounces of klachten boven de drempel ervoor dat één From-adres wordt afgeremd of gepauzeerd (423 sender_paused). Het herstelt automatisch zodra de percentages dalen.

quota_exhausted kun je pas opnieuw proberen als de periode opnieuw begint of het abonnement verandert. rate_limited kun je opnieuw proberen na retry_after_seconds; probeer verzendingen opnieuw met dezelfde idempotency_key en een identieke body.

Foutencatalogus

code is stabiel; baseer je logica daarop en niet op message.

codeHTTPOpnieuw?Wat het betekent en wat je moet doen
invalid_arguments—neeDe argumenten voldeden lokaal niet aan het JSON Schema van de tool; er is niets bij SendHQ aangekomen. Corrigeer de velden die in problems staan.
auth_error401neeOntbrekende, ingetrokken of verkeerde API-sleutel. Stel SENDHQ_API_KEY in voor het serverproces; een mens maakt sleutels aan in het dashboard.
trial_recipient_restricted402neeDe integratieproefperiode kan alleen afleveren bij het e-mailadres van het account of een SES-simulatoradres. Verstuur daarheen, of laat de eigenaar een betaald abonnement activeren.
payment_required402neeDe functie vereist een betaald abonnement (bijvoorbeeld bijlagen). Verstuur zonder, of upgrade.
sender_domain_not_owned403neeHet From-domein hoort niet bij deze workspace. Gebruik list_sending_identities of add_domain.
sender_domain_unverified403neeHet From-domein is nog niet geverifieerd. get_domain, ontbrekende records publiceren, verify_domain.
domain_limit_reached403neeDe domeinlimiet van het abonnement is bereikt. Verwijder een ongebruikt domein (na goedkeuring) of upgrade.
marketing_not_enabled403neeDe marketingklasse is niet ingeschakeld voor dit domein of abonnement. Gebruik transactional alleen als het bericht echt transactioneel is.
forbidden403neeHet beleid staat de bewerking niet toe. Pas het request aan.
not_found404neeHet ID hoort niet bij deze workspace. Vraag de resource op om het juiste ID te vinden; herstel gearchiveerde templates eerst.
idempotency_conflict409neeSleutel hergebruikt met een andere body. Verstuur exact het origineel opnieuw, of gebruik een nieuwe sleutel voor een nieuw bericht.
idempotency_in_progress409jaHet oorspronkelijke request loopt nog. Wacht en probeer het dan opnieuw met dezelfde sleutel en body.
revision_conflict409neeHet templateconcept is gewijzigd sinds je het las. get_template, samenvoegen, opnieuw opslaan.
complaint_suppression_locked409neeDe ontvanger heeft een klacht ingediend. Stuur hem nooit meer e-mail.
inbound_not_ready409neeOntvangst van inkomende e-mail is nog niet klaar. setup_inbound, MX publiceren, verify_inbound.
conflict409neeDe resource bestaat al of heeft de verkeerde status. Lees hem en pas aan.
attachments_too_large413neeMeer dan 10 bestanden of 10 MB. Verwijder bijlagen of maak ze kleiner.
recipient_suppressed422neeEen ontvanger gaf eerder een hard bounce of een klacht. Verwijder die; zie list_blocked_recipients.
recipient_unsubscribed422neeEen ontvanger heeft zich afgemeld voor marketingmail. Verwijder die permanent.
validation_failed422neeInhoud geweigerd, bijvoorbeeld templatedata die het variabelencontract schendt. Corrigeer de invoer.
sender_paused423neeDit From-adres is gepauzeerd door de circuitbreaker voor bounces/klachten over 7 dagen. Stop, herstel de lijst en wacht op automatisch herstel.
quota_exhausted429neeMaandelijkse limiet, daglimiet per afzender, bijlagenlimiet of limiet van de proefperiode bereikt. Controleer get_account; wacht op de reset of upgrade.
rate_limited429jaRustiger aan; wacht retry_after_seconds. Verzendingen: dezelfde sleutel, dezelfde body.
server_error5xxjaTijdelijke fout bij SendHQ of de provider. Wacht met backoff en probeer opnieuw; verzendingen met dezelfde sleutel en body. Is idempotent_replayed true, gebruik dan een nieuwe sleutel nadat je hebt bevestigd dat er niets is verstuurd.
network_error—jaRequest of respons verloren gegaan. Probeer opnieuw; bij verzendingen maakt dezelfde idempotency_key dat veilig.
invalid_request400neeOngeldig request. Lees message en corrigeer het.
tool_error—neeLokale fout binnen de MCP-server (bijvoorbeeld een onleesbaar file_path). Lees message.

Toolreferentie

Elke tool met zijn veiligheidsklasse, het REST-endpoint dat hij aanroept, zijn parameters, de responsstructuur en een voorbeeld van een params-object voor tools/call. De parameters zijn exact: de server weigert alles wat niet vermeld staat.

E-mails en threads: send_email, send_batch, list_emails, get_email, mark_email, delete_email, list_email_events, get_thread
Labels en automatische sorteerregels: list_labels, get_label, create_label, update_label, delete_label, create_label_rule, delete_label_rule, label_email
Concepten, bijlagen en afzenderidentiteiten: list_sending_identities, create_draft, list_drafts, get_draft, update_draft, delete_draft, upload_attachment, download_attachment, delete_attachment
Gehoste templates: list_templates, create_template, get_template, update_template_draft, create_template_draft, render_template, send_template_test, publish_template, archive_template, restore_template
Domeinen en DNS: list_domains, get_domain, add_domain, verify_domain, delete_domain, get_dns_provider, get_domain_connect_link
Inkomende e-mail: setup_inbound, verify_inbound, list_inboxes, get_inbox, create_inbox, update_inbox, set_inbox_forwarding, delete_inbox
Deliverability, bounces en suppressies: deliverability_stats, list_sender_reputation, list_suppressions, remove_suppression, list_blocked_recipients
Account, gebruik, analytics en sleutels: get_account, get_analytics, list_api_keys, get_service_health

E-mails en threads

Verstuurt echte e-mailsend_email
POST /emails

Eén e-mail verzenden

SENDS REAL EMAIL. Verstuurt één bericht vanaf een geverifieerd domein: ruwe html/tekst, een gepubliceerde gehoste template, een antwoord in een bestaande thread of een bericht met bijlagen. Geef idempotency_key mee zodat een retry niet twee keer kan versturen; een retry moet dezelfde sleutel EN een identiek request gebruiken, anders geeft SendHQ 409 terug. attachments is een gemaksoptie die een concept aanmaakt, elk bestand uploadt en met dat concept verstuurt; het kan niet worden gecombineerd met idempotency_key of draft_id (gebruik create_draft + upload_attachment + send_email met draft_id voor verzendingen met bijlagen die veilig opnieuw kunnen). Onbetaalde workspaces (integratieproefperiode) kunnen alleen afleveren bij het e-mailadres van het account of een AWS SES-simulatoradres, en kunnen geen bijlagen versturen.

Geef minstens één van deze op: html, text, template.

ParameterTypeVerplichtBeschrijving
fromstringjaAfzender, bijv. Acme <hello@example.com>. Het domein moet in deze workspace geverifieerd zijn (zie list_sending_identities). (max. 998 tekens)
tostring[]jaOntvangers. Elk item is een adres, optioneel met een weergavenaam. To+cc+bcc mogen samen maximaal 100 zijn; elke bestemming verbruikt één bezorgcredit. (1–100 items)
ccstring[]neeOntvangers in cc. (0–100 items)
bccstring[]neeOntvangers in bcc. (0–100 items)
subjectstringneeOnderwerpregel. Laat weg bij het versturen van een template. (max. 998 tekens)
textstringneeBerichttekst in plaintext. Geef text, html of template op.
htmlstringneeHTML-berichttekst. SendHQ saneert die en leidt de tekst af als text ontbreekt.
reply_tostringneeReply-To-adres.
headersobjectneeExtra veilige custom headers (stringwaarden), bijv. {"X-Entity-Ref-ID": "123"}. Routeringsheaders zoals From/To/Message-ID worden door SendHQ beheerd.
message_classstringneetransactional (standaard) of marketing. Marketing vereist een abonnement of domein waarop marketing is ingeschakeld en voegt afmeldafhandeling toe. (een van transactional, marketing)
reply_to_email_idstringneeAntwoord binnen een bestaande conversatie: het em_…-ID van het bericht waarop je antwoordt. SendHQ stelt In-Reply-To/References en de thread in.
thread_idstringneeExpliciet thread-ID waaronder het bericht wordt opgeslagen.
draft_idstringneeVerstuur de bijlagen van een opgeslagen concept met dit bericht (dr_…). Het concept wordt na een geslaagde verzending verwijderd.
templateobjectneeVerstuur een gepubliceerde gehoste template in plaats van ruwe html/tekst. Vereist precies één to-ontvanger en geen cc/bcc; de template levert het onderwerp. Geef minstens één van deze op: id, key.
template.idstringneeTemplate-ID (tmpl_…). Geef id of key op.
template.keystringneeTemplatekey, zoals account-welcome. Geef id of key op.
template.version_idstringneeOptioneel ID van een gepubliceerde release (tmplv_…). Standaard de huidige gepubliceerde release.
template.dataobjectneeWaarden voor de getypeerde variabelen van de template.
labelsstring[]neeLabelnamen of lbl_…-ID's waaronder dit bericht wordt opgeslagen. Onbekende namen worden aangemaakt. Antwoorden in de conversatie krijgen dezelfde labels, en een bucketlabel (skip_inbox) houdt die antwoorden uit de Inbox. Max. 10. (0–10 items)
idempotency_keystringneeIdempotency-Key-header (max. 200 tekens). Hergebruik die alleen om exact dit request opnieuw te proberen. (max. 200 tekens)
attachmentsobject[]neeBij te voegen bestanden (max. 10 bestanden, 10 MB in totaal). Elk bestand heeft content_base64 (plus filename) of een lokaal file_path nodig. (0–10 items) Geef minstens één van deze op: content_base64, file_path.
attachments[].filenamestringneeBestandsnaam die de ontvanger ziet. Verplicht bij content_base64; standaard de basisnaam van file_path. (max. 255 tekens)
attachments[].content_typestringneeMIME-type, bijv. application/pdf. Standaard application/octet-stream.
attachments[].content_base64stringneeStandaard base64-inhoud van het bestand.
attachments[].file_pathstringneeAbsoluut pad van een lokaal bestand dat het MCP-serverproces kan lezen.
Retourneert{id: em_…, providerMessageId, threadId, templateId, templateVersionId, isTest}. Acceptatie is geen aflevering: controleer daarna list_email_events.
Voorbeeld van tools/call-params
{
  "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"
  }
}
Verstuurt echte e-mailsend_batch
POST /emails/batch

Een batch individuele e-mails verzenden

SENDS REAL EMAIL. Verstuurt 1–100 onafhankelijke berichten in één request (gebruik dit voor templatepersonalisatie per ontvanger). Elk item heeft dezelfde structuur als send_email (zonder attachments/idempotency_key). Items slagen of mislukken afzonderlijk: HTTP 207 betekent gedeeltelijk succes; controleer elke data[i].ok en data[i].error. Eén idempotency_key geldt voor de hele batchbody.

ParameterTypeVerplichtBeschrijving
emailsobject[]jaTe verzenden berichten. (1–100 items) Geef minstens één van deze op: html, text, template.
idempotency_keystringneeIdempotency-Key voor de hele batch (max. 200 tekens). (max. 200 tekens)
Retourneert{data: [{index, ok, id?, error?: {message, status}}], count, successful, failed}.
Voorbeeld van tools/call-params
{
  "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"
  }
}
Alleen-lezenlist_emails
GET /emails

E-mail opvragen en doorzoeken

Vraagt verzonden (direction: out) en ontvangen (direction: in) e-mail op, nieuwste eerst, met filters. Ontvangen e-mail wordt geclassificeerd: lees de inbox van de mens met direction: in, archived: false, category: primary; triage met important: true; spam is verborgen, tenzij category: spam of include_spam: true. Gepagineerd: het resultaat bevat pagination {offset, limit, returned, total?, has_more, next_offset}.

ParameterTypeVerplichtBeschrijving
directionstringneein voor ontvangen, out voor verzonden. (een van in, out)
statusstringneeStatusfilter, bijv. queued, sent, delivered, bounced, complained, failed.
domainstringneeAlleen berichten voor dit domein, of een kommagescheiden lijst met domeinen (matcht op elk ervan).
inbox_idstringneeAlleen berichten die door deze inbox zijn ontvangen (inb_…).
labelstringneeAlleen berichten met dit label: een label-ID lbl_… of de exacte naam, of een kommagescheiden lijst (matcht op elk ervan). Gebruik list_labels om de mappen te zien.
archivedbooleanneefalse = de Inbox-weergave (ontvangen e-mail die niet is gearchiveerd), true = alleen gearchiveerd. Laat weg voor alle e-mail.
categorystringneeprimary (mensen), updates (nieuwsbrieven, bulk, geautomatiseerd) of spam; of een kommagescheiden lijst. Spam is verborgen, tenzij je erom vraagt.
importantbooleanneetrue = alleen berichten die als belangrijk zijn gemarkeerd (antwoorden op conversaties die jij bent begonnen en afzenders die als belangrijk zijn gemarkeerd).
include_spambooleanneeNeem spam op in de resultaten (voor zoekopdrachten in alle mappen).
fromstringneeAfzenderadres bevat deze waarde.
tostringneeOntvangersadres bevat deze waarde.
unreadbooleanneetrue = alleen ongelezen, false = alleen gelezen.
afterstringneeISO-8601-tijdstempel; alleen berichten die daarna zijn aangemaakt. (date-time)
beforestringneeISO-8601-tijdstempel; alleen berichten die daarvoor zijn aangemaakt. (date-time)
querystringneeVrije-tekstzoekopdracht in onderwerpen, berichtteksten, adressen van afzenders/ontvangers en bestandsnamen van bijlagen. (max. 200 tekens)
limitintegerneePaginagrootte. Standaard 50. (standaard 50; 1–200)
offsetintegerneeAantal records dat wordt overgeslagen. Gebruik pagination.next_offset van de vorige pagina. (standaard 0; 0–…)
Retourneert{data: [samenvattingen van e-mails], count, pagination}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "list_emails",
  "arguments": {
    "direction": "in",
    "unread": true,
    "limit": 25
  }
}
Alleen-lezenget_email
GET /emails/:email_id

Eén e-mail ophalen

Haalt één bericht op met headers, html-/tekstbody, status, threadmetadata en metadata van bijlagen (download de bytes met download_attachment).

ParameterTypeVerplichtBeschrijving
email_idstringjaE-mail-ID (begint met em_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
RetourneertE-mailobject: {id, direction, status, from, to, cc, bcc, subject, html, text, threadId, messageId, providerMessageId, readAt, createdAt, attachments: [{id, filename, contentType, sizeBytes, available}]}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "get_email",
  "arguments": {
    "email_id": "em_123"
  }
}
Wijzigt statusmark_email
PATCH /emails/:email_id

Markeren als gelezen, gearchiveerd, spam of belangrijk

Werkt één bericht bij: read, archived, category (primary, updates, spam; alleen ontvangen e-mail) en important. Als je spam meldt of iets als belangrijk markeert, leert SendHQ dat over die afzender voor toekomstige e-mail; geef learn: false mee om alleen dit bericht te wijzigen. Geef minstens één veld op.

ParameterTypeVerplichtBeschrijving
email_idstringjaE-mail-ID (begint met em_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
readbooleanneetrue = gelezen, false = ongelezen.
archivedbooleanneetrue = archiveren (de Inbox overslaan), false = terugzetten naar de Inbox.
categorystringneeVerplaats een ontvangen bericht naar primary, updates of spam. (een van primary, updates, spam)
importantbooleanneeMarkeer het bericht als belangrijk of haal die markering weg.
learnbooleanneefalse = dit oordeel niet onthouden voor de afzender (standaard true).
RetourneertHet bijgewerkte e-mailobject.
AnnotatiesidempotentHint
Voorbeeld van tools/call-params
{
  "name": "mark_email",
  "arguments": {
    "email_id": "em_123",
    "read": true
  }
}
Destructiefdelete_email
DELETE /emails/:email_id

Een e-mail verwijderen

DESTRUCTIVE: verwijdert een bewaard bericht en de opgeslagen bijlagen permanent uit SendHQ. Een bericht dat al is afgeleverd, wordt niet teruggehaald.

ParameterTypeVerplichtBeschrijving
email_idstringjaE-mail-ID (begint met em_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
Retourneert{ok: true}.
AnnotatiesdestructiveHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "delete_email",
  "arguments": {
    "email_id": "em_123"
  }
}
Alleen-lezenlist_email_events
GET /emails/:email_id/events

Bezorgevents van een e-mail opvragen

Provider-events voor één verzonden bericht: delivery, bounce, complaint, reject, open, click. Dit is het bewijs of een bericht is afgeleverd of waarom het is mislukt. Gepagineerd: het resultaat bevat pagination {offset, limit, returned, total?, has_more, next_offset}.

ParameterTypeVerplichtBeschrijving
email_idstringjaE-mail-ID (begint met em_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
limitintegerneePaginagrootte. Standaard 50. (standaard 50; 1–200)
offsetintegerneeAantal records dat wordt overgeslagen. Gebruik pagination.next_offset van de vorige pagina. (standaard 0; 0–…)
Retourneert{data: [{event_type, recipient, reason, created_at, …}], count, pagination}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "list_email_events",
  "arguments": {
    "email_id": "em_123"
  }
}
Alleen-lezenget_thread
GET /threads/:thread_id

Een conversatie ophalen

Haalt alle berichten in een conversatie op in chronologische volgorde (verzonden en ontvangen), elk met metadata van de bijlagen.

ParameterTypeVerplichtBeschrijving
thread_idstringjaThread-ID (meestal het em_…-ID van het eerste bericht; zie threadId bij elke e-mail). (max. 128 tekens)
Retourneert{id, subject, data: [e-mails]}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "get_thread",
  "arguments": {
    "thread_id": "em_123"
  }
}

Labels en automatische sorteerregels

Alleen-lezenlist_labels
GET /labels

Labels opvragen

Vraagt de labels (mappen) van de workspace op met het totale aantal en het aantal ongelezen berichten, plus hun automatische sorteerregels. Gepagineerd: het resultaat bevat pagination {offset, limit, returned, total?, has_more, next_offset}.

ParameterTypeVerplichtBeschrijving
limitintegerneePaginagrootte. Standaard 50. (standaard 50; 1–200)
offsetintegerneeAantal records dat wordt overgeslagen. Gebruik pagination.next_offset van de vorige pagina. (standaard 0; 0–…)
Retourneert{data: [{id, name, color, totalCount, unreadCount, rules: [...]}], count, pagination}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "list_labels",
  "arguments": {}
}
Alleen-lezenget_label
GET /labels/:label_id

Een label ophalen

Haalt één label op met aantallen en automatische sorteerregels.

ParameterTypeVerplichtBeschrijving
label_idstringjaLabel-ID (begint met lbl_) of de exacte labelnaam. (max. 128 tekens)
RetourneertLabelobject.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "get_label",
  "arguments": {
    "label_id": "Billing"
  }
}
Wijzigt statuscreate_label
POST /labels

Een label aanmaken

Maakt een label in mapstijl aan. Zet skip_inbox: true om er een bucket van een agent van te maken: verstuur met labels: [name] en de antwoorden worden in het label opgeslagen en uit de Inbox gehouden. Optionele automatische sorteerregels sorteren nieuwe verzonden/ontvangen e-mail (elke voorwaarde van een regel moet overeenkomen). Zet apply_to_existing om ook bewaarde e-mail te sorteren.

ParameterTypeVerplichtBeschrijving
namestringjaLabelnaam, bijv. Billing of Clients/Acme. Uniek per workspace (hoofdletterongevoelig). (max. 64 tekens)
colorstringneeHexkleur zoals #1a73e8. Optioneel.
skip_inboxbooleanneeBucketmodus: ontvangen e-mail die dit label krijgt (via een regel, via een antwoord op een conversatie die met dit label is verzonden, of handmatig) wordt gearchiveerd, zodat hij alleen in het label verschijnt en niet in de Inbox.
rulesobject[]neeOptionele automatische sorteerregels (max. 20). Elke regel heeft minstens een van inbox_id, from, to, subject nodig. (0–20 items)
rules[].directionstringneeAlleen in (ontvangen) of out (verzonden) e-mail. Laat weg voor beide. (een van in, out)
rules[].inbox_idstringneeAlleen e-mail die door deze inbox is ontvangen (inb_…). Sorteert elk ontvangend adres in een eigen map.
rules[].fromstringneeAfzender bevat deze tekst (hoofdletterongevoelig), bijv. @stripe.com. (max. 200 tekens)
rules[].tostringneeTo/Cc bevat deze tekst (hoofdletterongevoelig). (max. 200 tekens)
rules[].subjectstringneeOnderwerp bevat deze tekst (hoofdletterongevoelig). (max. 200 tekens)
rules[].skip_inboxbooleanneeArchiveer overeenkomende ontvangen e-mail, zodat die alleen in de labelmap verschijnt en niet in de Inbox.
apply_to_existingbooleanneeSorteer ook al bewaarde e-mail die aan de regels voldoet.
RetourneertHet aangemaakte label met regels.
Voorbeeld van tools/call-params
{
  "name": "create_label",
  "arguments": {
    "name": "Agent/Orders",
    "skip_inbox": true,
    "rules": [
      {
        "from": "@stripe.com"
      }
    ]
  }
}
Wijzigt statusupdate_label
PATCH /labels/:label_id

Een label hernoemen, van kleur veranderen of er een bucket van maken

Hernoemt een label, wijzigt de kleur of schakelt de bucketmodus (skip_inbox) in of uit. Als je de bucketmodus inschakelt, wordt ontvangen e-mail die al in het label staat gearchiveerd.

ParameterTypeVerplichtBeschrijving
label_idstringjaLabel-ID (begint met lbl_) of de exacte labelnaam. (max. 128 tekens)
namestringneeNieuwe naam. (max. 64 tekens)
colorstringneeNieuwe hexkleur.
skip_inboxbooleanneeBucketmodus: ontvangen e-mail die dit label krijgt (via een regel, via een antwoord op een conversatie die met dit label is verzonden, of handmatig) wordt gearchiveerd, zodat hij alleen in het label verschijnt en niet in de Inbox.
RetourneertBijgewerkt label.
AnnotatiesidempotentHint
Voorbeeld van tools/call-params
{
  "name": "update_label",
  "arguments": {
    "label_id": "lbl_123",
    "name": "Finance/Billing"
  }
}
Destructiefdelete_label
DELETE /labels/:label_id

Een label verwijderen

DESTRUCTIVE: verwijdert een label en de regels ervan. De e-mail zelf blijft bewaard; die verliest alleen dit label.

ParameterTypeVerplichtBeschrijving
label_idstringjaLabel-ID (begint met lbl_) of de exacte labelnaam. (max. 128 tekens)
Retourneert{ok: true}.
AnnotatiesdestructiveHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "delete_label",
  "arguments": {
    "label_id": "lbl_123"
  }
}
Wijzigt statuscreate_label_rule
POST /labels/:label_id/rules

Een automatische sorteerregel toevoegen

Voegt een regel aan een label toe, zodat overeenkomende nieuwe e-mail automatisch wordt gesorteerd. Elke voorwaarde die je instelt, moet overeenkomen. Gebruik inbox_id om een ontvangend adres een eigen map te geven; voeg skip_inbox toe om die e-mail uit de Inbox te houden.

ParameterTypeVerplichtBeschrijving
label_idstringjaLabel-ID (begint met lbl_) of de exacte labelnaam. (max. 128 tekens)
directionstringneeAlleen in (ontvangen) of out (verzonden) e-mail. Laat weg voor beide. (een van in, out)
inbox_idstringneeAlleen e-mail die door deze inbox is ontvangen (inb_…). Sorteert elk ontvangend adres in een eigen map.
fromstringneeAfzender bevat deze tekst (hoofdletterongevoelig), bijv. @stripe.com. (max. 200 tekens)
tostringneeTo/Cc bevat deze tekst (hoofdletterongevoelig). (max. 200 tekens)
subjectstringneeOnderwerp bevat deze tekst (hoofdletterongevoelig). (max. 200 tekens)
skip_inboxbooleanneeArchiveer overeenkomende ontvangen e-mail, zodat die alleen in de labelmap verschijnt en niet in de Inbox.
apply_to_existingbooleanneeSorteer ook al bewaarde e-mail die overeenkomt.
Retourneert{id: lrule_…, labelId, direction, inboxId, from, to, subject, skipInbox}.
Voorbeeld van tools/call-params
{
  "name": "create_label_rule",
  "arguments": {
    "label_id": "Billing",
    "inbox_id": "inb_123",
    "skip_inbox": true
  }
}
Destructiefdelete_label_rule
DELETE /labels/:label_id/rules/:rule_id

Een automatische sorteerregel verwijderen

DESTRUCTIVE: verwijdert één automatische sorteerregel. E-mail die al is gesorteerd, houdt zijn label.

ParameterTypeVerplichtBeschrijving
label_idstringjaLabel-ID (begint met lbl_) of de exacte labelnaam. (max. 128 tekens)
rule_idstringjaRegel-ID (begint met lrule_), uit get_label. (max. 128 tekens)
Retourneert{ok: true}.
AnnotatiesdestructiveHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "delete_label_rule",
  "arguments": {
    "label_id": "lbl_123",
    "rule_id": "lrule_123"
  }
}
Wijzigt statuslabel_email
POST /emails/:email_id/labels

Labels aan een e-mail toevoegen of ervan verwijderen

Verplaatst een bericht tussen mappen: voeg labels toe en/of verwijder ze op naam of lbl_…-ID. Onbekende namen in add worden aangemaakt, tenzij create false is.

ParameterTypeVerplichtBeschrijving
email_idstringjaE-mail-ID (begint met em_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
addstring[]neeToe te voegen labels. (0–10 items)
removestring[]neeTe verwijderen labels. (0–10 items)
createbooleanneeMaak onbekende labels in add aan (standaard true).
RetourneertDe bijgewerkte e-mail met labels.
AnnotatiesidempotentHint
Voorbeeld van tools/call-params
{
  "name": "label_email",
  "arguments": {
    "email_id": "em_123",
    "add": [
      "Billing"
    ],
    "remove": [
      "Support"
    ]
  }
}

Concepten, bijlagen en afzenderidentiteiten

Alleen-lezenlist_sending_identities
GET /sending-identities

Geverifieerde afzenderidentiteiten opvragen

Adressen en domeinen waarvandaan deze workspace op dit moment kan versturen (geverifieerde domeinen, hun standaard-From en actieve inboxadressen). Roep dit aan vóór send_email om een geldige from te kiezen.

Geen parameters.

Retourneert{domains: [geverifieerde domeinnamen], addresses: [afzenderadressen], localParts: [...]}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "list_sending_identities",
  "arguments": {}
}
Wijzigt statuscreate_draft
POST /drafts

Een concept aanmaken

Maakt een concept in de editor aan. Concepten bevatten bijlagen: maak een concept aan, roep upload_attachment aan en daarna send_email met draft_id. Verstuurt niets.

ParameterTypeVerplichtBeschrijving
fromstringneeAfzenderadres op een geverifieerd domein (mag leeg zijn tijdens het opstellen).
tostring[]neeOntvangers. (0–100 items)
ccstring[]neeOntvangers in cc. (0–100 items)
bccstring[]neeOntvangers in bcc. (0–100 items)
subjectstringneeOnderwerpregel. (max. 998 tekens)
htmlstringneeHTML-berichttekst.
textstringneeBerichttekst in plaintext.
reply_to_email_idstringneeE-mail-ID waarop dit concept antwoordt.
thread_idstringneeThread-ID waar dit concept bij hoort.
RetourneertConceptobject {id: dr_…, from, to, cc, bcc, subject, html, text, attachments: []}.
Voorbeeld van tools/call-params
{
  "name": "create_draft",
  "arguments": {
    "from": "hello@example.com",
    "to": [
      "owner@example.com"
    ],
    "subject": "Invoice"
  }
}
Alleen-lezenlist_drafts
GET /drafts

Concepten opvragen

Vraagt concepten uit de editor op, meest recent bijgewerkt eerst. Gepagineerd: het resultaat bevat pagination {offset, limit, returned, total?, has_more, next_offset}.

ParameterTypeVerplichtBeschrijving
limitintegerneePaginagrootte. Standaard 50. (standaard 50; 1–200)
offsetintegerneeAantal records dat wordt overgeslagen. Gebruik pagination.next_offset van de vorige pagina. (standaard 0; 0–…)
Retourneert{data: [concepten], count, pagination}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "list_drafts",
  "arguments": {}
}
Alleen-lezenget_draft
GET /drafts/:draft_id

Een concept ophalen

Haalt één concept op met de metadata van de bijlagen.

ParameterTypeVerplichtBeschrijving
draft_idstringjaConcept-ID (begint met dr_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
RetourneertConceptobject met attachments.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "get_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
Wijzigt statusupdate_draft
PUT /drafts/:draft_id

Inhoud van een concept vervangen

Vervangt de inhoud en ontvangers van een concept. Dit is een volledige vervanging: velden die je weglaat, worden leeggemaakt, dus lees eerst get_draft en stuur elk veld mee dat je wilt behouden. Bijlagen blijven ongewijzigd.

ParameterTypeVerplichtBeschrijving
draft_idstringjaConcept-ID (begint met dr_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
fromstringneeAfzenderadres op een geverifieerd domein (mag leeg zijn tijdens het opstellen).
tostring[]neeOntvangers. (0–100 items)
ccstring[]neeOntvangers in cc. (0–100 items)
bccstring[]neeOntvangers in bcc. (0–100 items)
subjectstringneeOnderwerpregel. (max. 998 tekens)
htmlstringneeHTML-berichttekst.
textstringneeBerichttekst in plaintext.
reply_to_email_idstringneeE-mail-ID waarop dit concept antwoordt.
thread_idstringneeThread-ID waar dit concept bij hoort.
RetourneertBijgewerkt conceptobject.
AnnotatiesidempotentHint
Voorbeeld van tools/call-params
{
  "name": "update_draft",
  "arguments": {
    "draft_id": "dr_123",
    "from": "hello@example.com",
    "to": [
      "owner@example.com"
    ],
    "subject": "Invoice (updated)",
    "text": "Attached."
  }
}
Destructiefdelete_draft
DELETE /drafts/:draft_id

Een concept weggooien

DESTRUCTIVE: gooit een concept weg en verwijdert de opgeslagen bijlagen permanent.

ParameterTypeVerplichtBeschrijving
draft_idstringjaConcept-ID (begint met dr_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
Retourneert{ok: true}.
AnnotatiesdestructiveHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "delete_draft",
  "arguments": {
    "draft_id": "dr_123"
  }
}
Wijzigt statusupload_attachment
POST /drafts/:draft_id/attachments

Een bijlage uploaden naar een concept

Uploadt één bestand naar een concept (max. 10 bestanden en 10 MB in totaal per bericht). Geef content_base64 of een lokaal file_path op. Voor bijlagen is bij het verzenden een betaald abonnement nodig.

Geef minstens één van deze op: content_base64, file_path.

ParameterTypeVerplichtBeschrijving
draft_idstringjaConcept-ID (begint met dr_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
filenamestringneeBestandsnaam die de ontvanger ziet. Standaard de basisnaam van file_path. (max. 255 tekens)
content_typestringneeMIME-type, bijv. application/pdf. Standaard application/octet-stream.
content_base64stringneeStandaard base64-inhoud van het bestand.
file_pathstringneeAbsoluut pad van een lokaal bestand dat het MCP-serverproces kan lezen.
Retourneert{id: att_…, filename, contentType, sizeBytes, available}.
Voorbeeld van tools/call-params
{
  "name": "upload_attachment",
  "arguments": {
    "draft_id": "dr_123",
    "filename": "invoice.pdf",
    "content_type": "application/pdf",
    "file_path": "/tmp/invoice.pdf"
  }
}
Alleen-lezendownload_attachment
GET /attachments/:attachment_id

Een bijlage downloaden

Downloadt een privébijlage (verzonden, ontvangen of van een concept). Geeft base64-inhoud terug, of schrijft het bestand weg als save_to_path is ingesteld (weigert te overschrijven, tenzij overwrite true is).

ParameterTypeVerplichtBeschrijving
attachment_idstringjaBijlage-ID (begint met att_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
save_to_pathstringneeOptioneel absoluut lokaal pad om het bestand naartoe te schrijven in plaats van base64 terug te geven.
overwritebooleanneeSta toe dat een bestaand bestand op save_to_path wordt vervangen. Standaard false.
Retourneert{attachment_id, filename, content_type, size_bytes, content_base64} of {attachment_id, filename, content_type, size_bytes, saved_to}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "download_attachment",
  "arguments": {
    "attachment_id": "att_123",
    "save_to_path": "/tmp/invoice.pdf"
  }
}
Destructiefdelete_attachment
DELETE /attachments/:attachment_id

Een bijlage verwijderen

DESTRUCTIVE: verwijdert een opgeslagen bijlage permanent (bijvoorbeeld om een bestand uit een concept te halen voordat je verstuurt).

ParameterTypeVerplichtBeschrijving
attachment_idstringjaBijlage-ID (begint met att_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
Retourneert{ok: true}.
AnnotatiesdestructiveHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "delete_attachment",
  "arguments": {
    "attachment_id": "att_123"
  }
}

Gehoste templates

Alleen-lezenlist_templates
GET /templates

Gehoste templates opvragen

Vraagt gehoste e-mailtemplates op met publicatiestatus en gebruik. Gepagineerd: het resultaat bevat pagination {offset, limit, returned, total?, has_more, next_offset}.

ParameterTypeVerplichtBeschrijving
lifecyclestringneeactive (standaard), archived of all. (een van active, archived, all)
querystringneeZoeken op naam of key. (max. 120 tekens)
limitintegerneePaginagrootte. Standaard 50. (standaard 50; 1–200)
offsetintegerneeAantal records dat wordt overgeslagen. Gebruik pagination.next_offset van de vorige pagina. (standaard 0; 0–…)
Retourneert{data: [templates], count, pagination}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "list_templates",
  "arguments": {
    "lifecycle": "active"
  }
}
Wijzigt statuscreate_template
POST /templates

Een gehoste template aanmaken

Maakt een template met een bewerkbaar concept aan, optioneel op basis van een startsjabloon (welcome, reset, receipt of blank). Publiceer de template voordat je op key verstuurt.

ParameterTypeVerplichtBeschrijving
namestringjaLeesbare naam. (max. 120 tekens)
keystringneeStabiele verzendkey: kleine letters, cijfers en koppeltekens; begint met een letter (2–64 tekens). Wordt afgeleid van de naam als je hem weglaat.
starterstringneeStartinhoud. (een van blank, welcome, reset, receipt)
Retourneert{template, draft, activeVersion, versions, usage}.
Voorbeeld van tools/call-params
{
  "name": "create_template",
  "arguments": {
    "name": "Account welcome",
    "key": "account-welcome",
    "starter": "welcome"
  }
}
Alleen-lezenget_template
GET /templates/:template_id

Een template ophalen

Haalt het huidige concept van een template op (met revision), de actieve gepubliceerde release, de releasegeschiedenis en het gebruik. Accepteert een ID of key.

ParameterTypeVerplichtBeschrijving
template_idstringjaTemplate-ID (tmpl_…) of key. (max. 128 tekens)
Retourneert{template, draft: {id, revision, subjectTemplate, htmlTemplate, textTemplate, variables, sampleData, …} | null, activeVersion, versions, usage}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "get_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Wijzigt statusupdate_template_draft
PUT /templates/:template_id/draft

Een templateconcept opslaan

Slaat het bewerkbare concept van de template op met optimistic concurrency: geef de huidige revision uit get_template mee (409 betekent dat iemand anders eerder heeft opgeslagen; lees opnieuw en probeer het nog eens). Dit vervangt de conceptinhoud volledig: weggelaten velden worden leeggemaakt, dus stuur elk veld mee dat je wilt behouden. Gebruik placeholders als {{variable}}.

ParameterTypeVerplichtBeschrijving
template_idstringjaTemplate-ID of key. (max. 128 tekens)
revisionintegerjaHuidige conceptrevisie uit get_template. (1–…)
namestringneeTemplatenaam. (max. 120 tekens)
subject_templatestringneeOnderwerp met placeholders. (max. 998 tekens)
preheader_templatestringneeVoorbeeldtekst. (max. 240 tekens)
html_templatestringneeHTML-berichttekst met placeholders.
text_templatestringneeBerichttekst in plaintext met placeholders.
fromstringneeStandaardafzender voor verzendingen van deze template.
reply_tostringneeStandaard-Reply-To.
variablesobject[]neeGetypeerd variabelencontract. Elk item: {key (kleine letters/underscores), label, type: text|number|url|boolean, required (standaard true), fallback, description}.
variables[].keystringja
variables[].labelstringnee
variables[].typestringnee(een van text, number, url, boolean)
variables[].requiredbooleannee
variables[].fallbackanynee
variables[].descriptionstringnee
sample_dataobjectneeVoorbeeldwaarden voor voorbeelden en tests.
Retourneert{template, draft: {revision: next}, validation: {valid, findings}}.
Voorbeeld van tools/call-params
{
  "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"
    }
  }
}
Wijzigt statuscreate_template_draft
POST /templates/:template_id/draft

Een nieuw concept starten vanuit de gepubliceerde release

Maakt een nieuw bewerkbaar concept aan als kopie van de huidige gepubliceerde release (409 als er al een concept bestaat of niets is gepubliceerd).

ParameterTypeVerplichtBeschrijving
template_idstringjaTemplate-ID of key. (max. 128 tekens)
Retourneert{draft}.
Voorbeeld van tools/call-params
{
  "name": "create_template_draft",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Alleen-lezenrender_template
POST /templates/:template_id/render

Een voorbeeld van een template renderen

Rendert de exacte serveruitvoer (onderwerp, html, tekst) voor het concept, de gepubliceerde release of een specifieke versie met de opgegeven data. Verstuurt niets. Geeft 422 met findings terug als de data het variabelencontract schendt.

ParameterTypeVerplichtBeschrijving
template_idstringjaTemplate-ID of key. (max. 128 tekens)
version_idstringneeOptioneel versie-ID; standaard het concept, daarna de gepubliceerde release.
dataobjectneeVariabelewaarden; standaard de voorbeelddata van de versie.
Retourneert{subject, html, text, preheader, versionId, versionNumber, isDraft, findings}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "render_template",
  "arguments": {
    "template_id": "account-welcome",
    "data": {
      "first_name": "Asha"
    }
  }
}
Verstuurt echte e-mailsend_template_test
POST /templates/:template_id/test

Een testmail van een template versturen

SENDS REAL EMAIL. Verstuurt een snapshot van het concept (of een opgegeven versie) met het voorvoegsel [Test] naar de opgegeven ontvangers. Telt mee voor het gebruik; workspaces in de proefperiode kunnen alleen versturen naar het e-mailadres van het account of een SES-simulatoradres.

ParameterTypeVerplichtBeschrijving
template_idstringjaTemplate-ID of key. (max. 128 tekens)
tostring[]jaTestontvangers. (1–100 items)
fromstringneeAfzender op een geverifieerd domein; standaard de From van de template.
version_idstringneeOptioneel versie-ID.
dataobjectneeVariabelewaarden; standaard de voorbeelddata.
Retourneert{id: em_…, providerMessageId, threadId, isTest: true}.
Voorbeeld van tools/call-params
{
  "name": "send_template_test",
  "arguments": {
    "template_id": "account-welcome",
    "to": [
      "owner@example.com"
    ]
  }
}
Wijzigt statuspublish_template
POST /templates/:template_id/publish

Een templaterelease publiceren

Publiceert het huidige concept als onveranderlijke release die send_email met template.key zal gebruiken. Mislukt met 422 en findings bij validatiefouten, of met 409 als het het live variabelencontract zou breken van een template die al in productie wordt gebruikt.

ParameterTypeVerplichtBeschrijving
template_idstringjaTemplate-ID of key. (max. 128 tekens)
Retourneert{template, published}.
Voorbeeld van tools/call-params
{
  "name": "publish_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Wijzigt statusarchive_template
POST /templates/:template_id/archive

Een template archiveren

Stopt nieuwe verzendingen met deze template (de geschiedenis blijft bewaard; terug te draaien met restore_template). Elke integratie die met deze key verstuurt, begint te falen met 404.

ParameterTypeVerplichtBeschrijving
template_idstringjaTemplate-ID of key. (max. 128 tekens)
Retourneert{template}.
AnnotatiesidempotentHint
Voorbeeld van tools/call-params
{
  "name": "archive_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}
Wijzigt statusrestore_template
POST /templates/:template_id/restore

Een gearchiveerde template herstellen

Maakt een gearchiveerde template weer actief.

ParameterTypeVerplichtBeschrijving
template_idstringjaTemplate-ID of key. (max. 128 tekens)
Retourneert{template}.
AnnotatiesidempotentHint
Voorbeeld van tools/call-params
{
  "name": "restore_template",
  "arguments": {
    "template_id": "account-welcome"
  }
}

Domeinen en DNS

Alleen-lezenlist_domains
GET /domains

Domeinen opvragen

Vraagt verzenddomeinen op met een samengevatte setup_status (verified | checking | pending), de DNS-status per record en de status van inkomende e-mail. Kan traag zijn: niet-geverifieerde domeinen worden live opnieuw gecontroleerd. Gepagineerd: het resultaat bevat pagination {offset, limit, returned, total?, has_more, next_offset}.

ParameterTypeVerplichtBeschrijving
limitintegerneePaginagrootte. Standaard 50. (standaard 50; 1–200)
offsetintegerneeAantal records dat wordt overgeslagen. Gebruik pagination.next_offset van de vorige pagina. (standaard 0; 0–…)
Retourneert{data: [domeinen met records], count, pagination}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "list_domains",
  "arguments": {}
}
Alleen-lezenget_domain
GET /domains/:domain_id

Configuratiegegevens van een domein ophalen

Haalt één domein op met de exacte DNS-records die je moet publiceren (type, naam, waarde), de live status van elk record volgens twee publieke resolvers, dns_issues met oplossingen en de status van inkomende e-mail.

ParameterTypeVerplichtBeschrijving
domain_idstringjaDomein-ID (begint met dom_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
Retourneert{id, name, status, setup_status, dns_propagating, records: [{type, name, value, verified, dns_state}], dns_issues: [{code, message, …}], inbound_domain, inbound_status}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "get_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Wijzigt statusadd_domain
POST /domains

Een verzenddomein toevoegen

Registreert een domein dat je beheert om vanaf te versturen. Geeft de DNS-records terug (SES Easy DKIM-CNAME's) die de eigenaar moet publiceren. Wijzigt zelf geen DNS. Telt mee voor de domeinlimiet van het abonnement.

ParameterTypeVerplichtBeschrijving
namestringjaKale domeinnaam, bijv. example.com of mail.example.com. (max. 253 tekens)
default_fromstringneeOptioneel standaard afzenderadres op dit domein.
Retourneert{id: dom_…, name, status: pending, records: [...], ses: {configured}}.
Voorbeeld van tools/call-params
{
  "name": "add_domain",
  "arguments": {
    "name": "example.com"
  }
}
Wijzigt statusverify_domain
POST /domains/:domain_id/verify

Een domein verifiëren

Voert nu een live SES/DNS-verificatie uit. Veilig om te herhalen; poll elke 30–60 s na DNS-wijzigingen (propagatie kan minuten tot uren duren). Verzenden is toegestaan zodra de status verified is.

ParameterTypeVerplichtBeschrijving
domain_idstringjaDomein-ID (begint met dom_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
Retourneert{domain, checks: {ses, dkim, dkim_status}, status: verified|pending}.
AnnotatiesidempotentHint
Voorbeeld van tools/call-params
{
  "name": "verify_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Destructiefdelete_domain
DELETE /domains/:domain_id

Een domein verwijderen

DESTRUCTIVE: verwijdert het domein uit de workspace, inclusief de route voor inkomende e-mail. Verzendingen vanaf het domein mislukken daarna direct. DNS-records bij je DNS-provider worden niet verwijderd.

ParameterTypeVerplichtBeschrijving
domain_idstringjaDomein-ID (begint met dom_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
Retourneert{ok: true}.
AnnotatiesdestructiveHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "delete_domain",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Alleen-lezenget_dns_provider
GET /dns/provider

DNS-provider en recordhosts detecteren

Detecteert de gezaghebbende DNS-provider van het domein en geeft per record de relatieve host terug die je bij die provider moet invullen, het aanbevolen DMARC-record, richtlijnen voor de inkomende MX en of configuratie met één klik (Domain Connect) beschikbaar is.

ParameterTypeVerplichtBeschrijving
domain_idstringjaDomein-ID (begint met dom_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
Retourneert{detectionStatus, detected, zone, nameservers, recordHosts: {recordId: host}, inbound, recommendations, authentication, providers: {domainConnect: {available, providerName}}}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "get_dns_provider",
  "arguments": {
    "domain_id": "dom_123"
  }
}

Inkomende e-mail

Wijzigt statussetup_inbound
POST /domains/:domain_id/inbound/setup

Inkomende e-mail inschakelen voor een domein

Richt ontvangst van inkomende e-mail via SES in voor een geverifieerd domein. Gebruikt het hoofddomein als dat geen conflicterend MX-record heeft, en anders inbound.<domain>. Geeft het MX-record terug dat de eigenaar moet publiceren; wijzigt zelf geen DNS.

ParameterTypeVerplichtBeschrijving
domain_idstringjaDomein-ID (begint met dom_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
Retourneert{domain: ontvangend domein, status: dns_pending|ready, record: {type: MX, name, value}}.
AnnotatiesidempotentHint
Voorbeeld van tools/call-params
{
  "name": "setup_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Wijzigt statusverify_inbound
POST /domains/:domain_id/inbound/verify

Inkomende MX verifiëren

Controleert het inkomende MX-record opnieuw. De status wordt ready als beide publieke resolvers het zien.

ParameterTypeVerplichtBeschrijving
domain_idstringjaDomein-ID (begint met dom_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
Retourneert{domain, status: ready|dns_pending|propagating|checking, record}.
AnnotatiesidempotentHint
Voorbeeld van tools/call-params
{
  "name": "verify_inbound",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Alleen-lezenlist_inboxes
GET /inboxes

Inkomende adressen opvragen

Vraagt ontvangende adressen op, optioneel voor één domein. Gepagineerd: het resultaat bevat pagination {offset, limit, returned, total?, has_more, next_offset}.

ParameterTypeVerplichtBeschrijving
domain_idstringneeOptioneel filter op domein-ID.
limitintegerneePaginagrootte. Standaard 50. (standaard 50; 1–200)
offsetintegerneeAantal records dat wordt overgeslagen. Gebruik pagination.next_offset van de vorige pagina. (standaard 0; 0–…)
Retourneert{data: [{id, address, name, status, domainId}], count, pagination}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "list_inboxes",
  "arguments": {
    "domain_id": "dom_123"
  }
}
Alleen-lezenget_inbox
GET /inboxes/:inbox_id

Een inbox ophalen

Haalt één inkomend adres op.

ParameterTypeVerplichtBeschrijving
inbox_idstringjaInbox-ID (begint met inb_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
RetourneertInboxobject.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "get_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}
Wijzigt statuscreate_inbox
POST /inboxes

Een inkomend adres aanmaken

Maakt een adres zoals support@<receiving domain> aan op een domein waarvan de inkomende status ready is (voer eerst setup_inbound en verify_inbound uit). Ontvangen e-mail verschijnt in list_emails met direction in.

ParameterTypeVerplichtBeschrijving
domain_idstringjaDomein-ID (begint met dom_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
local_partstringjaDeel vóór de @, bijv. support. (max. 64 tekens)
namestringneeOptionele weergavenaam.
Retourneert{id: inb_…, address, name, status: active}.
Voorbeeld van tools/call-params
{
  "name": "create_inbox",
  "arguments": {
    "domain_id": "dom_123",
    "local_part": "support",
    "name": "Support"
  }
}
Wijzigt statusupdate_inbox
PATCH /inboxes/:inbox_id

Een inbox hernoemen, inschakelen of uitschakelen

Hernoemt een inbox of zet de status op active / disabled.

ParameterTypeVerplichtBeschrijving
inbox_idstringjaInbox-ID (begint met inb_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
namestringneeNieuwe weergavenaam.
statusstringneeNieuwe status. (een van active, disabled)
RetourneertBijgewerkte inbox.
AnnotatiesidempotentHint
Voorbeeld van tools/call-params
{
  "name": "update_inbox",
  "arguments": {
    "inbox_id": "inb_123",
    "status": "disabled"
  }
}
Verstuurt echte e-mailset_inbox_forwarding
PUT /inboxes/:inbox_id/forwarding

Een inbox doorsturen naar een ander adres

SENDS REAL EMAIL bij doorsturen naar iemand anders dan de accounteigenaar: stelt in waarheen de ontvangen e-mail van een inbox wordt doorgestuurd. Het eigen adres van de eigenaar wordt direct actief; elk ander adres krijgt een bevestigingsmail en doorsturen blijft pending totdat iemand daar bevestigt. Geef forward_to: null mee om doorsturen uit te zetten. Doorgestuurde kopieën komen van het inboxadres met de oorspronkelijke afzender als Reply-To.

ParameterTypeVerplichtBeschrijving
inbox_idstringjaInbox-ID (begint met inb_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
forward_tostring,nulljaE-mailadres waarnaar wordt doorgestuurd, of null om doorsturen uit te zetten. (max. 254 tekens)
RetourneertInbox met forwardTo en forwardStatus (off, pending of active).
AnnotatiesidempotentHint
Voorbeeld van tools/call-params
{
  "name": "set_inbox_forwarding",
  "arguments": {
    "inbox_id": "inb_123",
    "forward_to": "team@example.net"
  }
}
Destructiefdelete_inbox
DELETE /inboxes/:inbox_id

Een inbox verwijderen

DESTRUCTIVE: verwijdert een inkomend adres. Al ontvangen e-mail blijft bewaard; nieuwe e-mail aan het adres wordt er niet meer in opgeslagen.

ParameterTypeVerplichtBeschrijving
inbox_idstringjaInbox-ID (begint met inb_), zoals teruggegeven door een list- of create-tool. (max. 128 tekens)
Retourneert{ok: true}.
AnnotatiesdestructiveHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "delete_inbox",
  "arguments": {
    "inbox_id": "inb_123"
  }
}

Deliverability, bounces en suppressies

Alleen-lezendeliverability_stats
GET /deliverability/stats

Bezorgstatistieken over 30 dagen ophalen

Totalen over 30 dagen voor de hele workspace: sent, delivery, bounce, complaint, reject, open, click en deliveryRate (%).

Geen parameters.

Retourneert{window: 30d, sent, delivery, bounce, complaint, reject, open, click, deliveryRate}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "deliverability_stats",
  "arguments": {}
}
Alleen-lezenlist_sender_reputation
GET /deliverability/reputation

Afzenderreputatie opvragen

Reputatiestatus per exact From-adres: active, throttled (lagere daglimiet) of paused (verzendingen geven 423), met de reden en de daglimiet. Controleer dit als verzendingen mislukken met 423 of 429. Gepagineerd: het resultaat bevat pagination {offset, limit, returned, total?, has_more, next_offset}.

ParameterTypeVerplichtBeschrijving
limitintegerneePaginagrootte. Standaard 50. (standaard 50; 1–200)
offsetintegerneeAantal records dat wordt overgeslagen. Gebruik pagination.next_offset van de vorige pagina. (standaard 0; 0–…)
Retourneert{data: [{sender, status, dailyLimit, reason, cleanSince, warnedAt, pausedAt, evaluatedAt}], count, pagination}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "list_sender_reputation",
  "arguments": {}
}
Alleen-lezenlist_suppressions
GET /suppressions

Suppressies opvragen

Suppressielijst van de workspace: ontvangers die zijn geblokkeerd na een permanente bounce of een spamklacht. Verzendingen naar hen mislukken met 422. Gepagineerd: het resultaat bevat pagination {offset, limit, returned, total?, has_more, next_offset}.

ParameterTypeVerplichtBeschrijving
limitintegerneePaginagrootte. Standaard 50. (standaard 50; 1–200)
offsetintegerneeAantal records dat wordt overgeslagen. Gebruik pagination.next_offset van de vorige pagina. (standaard 0; 0–…)
Retourneert{data: [{email, reason, detail, created_at}], count, pagination}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "list_suppressions",
  "arguments": {}
}
Destructiefremove_suppression
DELETE /suppressions/:email

Een bouncesuppressie verwijderen

DESTRUCTIVE (verzwakt een veiligheidsblokkade): verwijdert een bouncesuppressie zodat het adres weer e-mail kan ontvangen. Doe dit alleen als de mens bevestigt dat het adres nu geldig is. Suppressies door klachten kunnen niet worden verwijderd (409).

ParameterTypeVerplichtBeschrijving
emailstringjaAdres van de ontvanger op de suppressielijst. (max. 320 tekens)
Retourneert{ok: true}.
AnnotatiesdestructiveHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "remove_suppression",
  "arguments": {
    "email": "fixed-mailbox@example.net"
  }
}
Alleen-lezenlist_blocked_recipients
GET /blocked-recipients

Geblokkeerde ontvangers opvragen

Elke ontvanger die SendHQ weigert: bounces, klachten en afmeldingen voor marketing per domein, met een overzicht per soort. Leest maximaal de 500 nieuwste. Gepagineerd: het resultaat bevat pagination {offset, limit, returned, total?, has_more, next_offset}.

ParameterTypeVerplichtBeschrijving
limitintegerneePaginagrootte. Standaard 50. (standaard 50; 1–200)
offsetintegerneeAantal records dat wordt overgeslagen. Gebruik pagination.next_offset van de vorige pagina. (standaard 0; 0–…)
Retourneert{data: [{email, domain, kind: bounce|complaint|unsubscribe, reason, detail, source, status, created_at}], count, summary: {total, bounce, complaint, unsubscribe}, pagination}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "list_blocked_recipients",
  "arguments": {}
}

Account, gebruik, analytics en sleutels

Alleen-lezenget_account
GET /account

Account, gebruik en facturering ophalen

E-mailadres van de accounteigenaar, abonnement/toegangsniveau, gebruikte afleveringen aan ontvangers in de huidige periode vs. quotum, gebruikte domeinen vs. limiet, bijlagenverkeer, reputatieoverzicht, abonnementsstatus, gepubliceerde abonnementen en aantallen in de workspace. Gebruik dit om het resterende quotum te controleren of om te zien naar wie de proefperiode kan afleveren (het e-mailadres van het account).

Geen parameters.

Retourneert{user: {email, …}, usage: {domainsUsed, domainLimit, recipientDeliveries, emailQuotaMonth, attachmentBytes, attachmentByteLimit, periodKey}, access: {tier, planCode}, reputation, infrastructure, billing: {status, subscriptions, …}, plans, workspace: {mailer, stats}}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "get_account",
  "arguments": {}
}
Alleen-lezenget_analytics
GET /analytics

Verzendanalytics ophalen

Dashboardanalytics over de laatste 7, 30 of 90 dagen: totalen voor sent/received/delivered/bounced/blocked/opened/clicked/complaint, een dagelijkse tijdlijn, de belangrijkste verzenddomeinen en de meest gebruikte onderwerpen.

ParameterTypeVerplichtBeschrijving
daysintegerneeVenster in dagen: 7, 30 (standaard) of 90. (een van 7, 30, 90)
Retourneert{window, days, metrics, timeline: [{day, sent, received}], domains, topContent}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "get_analytics",
  "arguments": {
    "days": 30
  }
}
Alleen-lezenlist_api_keys
GET /keys

Metadata van API-sleutels opvragen

Vraagt namen, niet-geheime prefixen en het tijdstip van laatste gebruik van API-sleutels op. Alleen-lezen: deze MCP-server kan geen sleutels aanmaken, roteren of intrekken; dat doet een mens in het dashboard. Gepagineerd: het resultaat bevat pagination {offset, limit, returned, total?, has_more, next_offset}.

ParameterTypeVerplichtBeschrijving
limitintegerneePaginagrootte. Standaard 50. (standaard 50; 1–200)
offsetintegerneeAantal records dat wordt overgeslagen. Gebruik pagination.next_offset van de vorige pagina. (standaard 0; 0–…)
Retourneert{data: [{id, name, prefix, lastUsedAt, createdAt}], count, pagination}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "list_api_keys",
  "arguments": {}
}
Alleen-lezenget_service_health
GET /health

Status van de SendHQ-dienst controleren

Controleert of de SendHQ API bereikbaar is en welke mailprovider actief is. Heeft geen geldige API-sleutel nodig.

Geen parameters.

Retourneert{ok, service, mailer}.
AnnotatiesreadOnlyHint idempotentHint
Voorbeeld van tools/call-params
{
  "name": "get_service_health",
  "arguments": {}
}

Overzicht van de API-dekking

Elke bewerking in de publieke API en de tool die haar dekt. Alles wat een gebruiker in het dashboard kan doen en een API heeft, wordt gedekt; de uitzonderingen hieronder zijn bewust.

EndpointToolOpmerkingen
POST /emailssend_emailEén e-mail verzenden
POST /emails/batchsend_batchMaximaal 100 individuele berichten verzenden
GET /emailslist_emailsVerzonden en ontvangen e-mail opvragen
GET /emails/:idget_emailEen e-mail en de bijlagen ophalen
PATCH /emails/:idmark_emailLeesstatus, archivering, spam, categorie of belangrijkheid bijwerken
POST /emails/:id/labelslabel_emailLabels aan een e-mail toevoegen of ervan verwijderen
DELETE /emails/:iddelete_emailEen bewaarde e-mail verwijderen
GET /emails/:id/eventslist_email_eventsBezorgevents van een e-mail opvragen
GET /threads/:idget_threadEen conversatie in chronologische volgorde ophalen
GET /labelslist_labelsLabels opvragen met aantallen berichten en sorteerregels
POST /labelscreate_labelEen label aanmaken, optioneel met automatische sorteerregels
GET /labels/:idget_labelEen label ophalen op ID of naam
PATCH /labels/:idupdate_labelEen label hernoemen, een andere kleur geven of er een bucket van maken
DELETE /labels/:iddelete_labelEen label verwijderen zonder de e-mail erin te verwijderen
POST /labels/:id/rulescreate_label_ruleEen automatische sorteerregel aan een label toevoegen
DELETE /labels/:id/rules/:rule_iddelete_label_ruleEen automatische sorteerregel verwijderen
POST /draftscreate_draftEen concept in de editor aanmaken
GET /draftslist_draftsConcepten uit de editor opvragen
GET /drafts/:idget_draftEen concept en de bijlagen ophalen
PUT /drafts/:idupdate_draftInhoud van een concept vervangen
DELETE /drafts/:iddelete_draftEen concept weggooien
POST /drafts/:id/attachmentsupload_attachmentEen bijlage uploaden naar een concept
GET /attachments/:iddownload_attachmentEen privébijlage downloaden
DELETE /attachments/:iddelete_attachmentEen privébijlage verwijderen
GET /sending-identitieslist_sending_identitiesGeverifieerde afzenderidentiteiten opvragen
GET /templateslist_templatesGehoste templates opvragen
POST /templatescreate_templateEen gehoste template aanmaken
GET /templates/:idget_templateConcepten, releases en gebruik ophalen
PUT /templates/:id/draftupdate_template_draftEen templateconcept automatisch opslaan
POST /templates/:id/draftcreate_template_draftEen nieuw concept maken op basis van de gepubliceerde release
POST /templates/:id/renderrender_templateDe exacte serveruitvoer renderen
POST /templates/:id/testsend_template_testEen testsnapshot verzenden
POST /templates/:id/publishpublish_templateEen onveranderlijke templaterelease publiceren
POST /templates/:id/archivearchive_templateEen template archiveren
POST /templates/:id/restorerestore_templateEen gearchiveerde template herstellen
POST /domainsadd_domainEen verzenddomein toevoegen
GET /domainslist_domainsDomeinen en gecachte DNS-status opvragen
GET /domains/:idget_domainConfiguratiegegevens van een domein ophalen
POST /domains/:id/verifyverify_domainSES- en DNS-verificatie vernieuwen
POST /domains/:id/inbound/setupsetup_inboundOntvangst van inkomende e-mail via SES inrichten
POST /domains/:id/inbound/verifyverify_inboundInkomende MX-routering verifiëren
DELETE /domains/:iddelete_domainEen domein verwijderen
GET /dns/providerget_dns_providerDe gezaghebbende DNS-provider en relatieve recordhosts detecteren
GET /dns/domain-connect/connectget_domain_connect_linkEen Domain Connect-toestemmingslink maken voor DNS-configuratie met één klik
POST /inboxescreate_inboxEen inkomend adres aanmaken
GET /inboxeslist_inboxesInkomende adressen opvragen
GET /inboxes/:idget_inboxEen inkomend adres ophalen
PATCH /inboxes/:idupdate_inboxEen inbox hernoemen, inschakelen of uitschakelen
PUT /inboxes/:id/forwardingset_inbox_forwardingDe ontvangen e-mail van een inbox doorsturen naar een ander adres
DELETE /inboxes/:iddelete_inboxEen inbox verwijderen en de berichten bewaren
GET /deliverability/statsdeliverability_statsBezorgstatistieken over 30 dagen ophalen
GET /deliverability/reputationlist_sender_reputationReputatiestatus per exacte afzenderidentiteit opvragen
GET /suppressionslist_suppressionsSuppressies van de workspace opvragen
DELETE /suppressions/:emailremove_suppressionEen bouncesuppressie verwijderen die daarvoor in aanmerking komt
GET /blocked-recipientslist_blocked_recipientsBounces, klachten en afmeldingen opvragen
GET /accountget_accountAccount, gebruik, factureringsstatus en aantallen in de workspace ophalen met een API-sleutel
GET /analyticsget_analyticsVerzendanalytics uit het dashboard ophalen over 7, 30 of 90 dagen
GET /profileget_accountSessievariant van GET /account; de MCP-server leest de route voor API-sleutels.
POST /billing/checkoutniet beschikbaarFactureringswijzigingen kunnen bewust alleen via een sessie en vereisen de accounteigenaar in het dashboard. De factureringsstatus is leesbaar met get_account.
POST /billing/cancelniet beschikbaarFactureringswijzigingen kunnen bewust alleen via een sessie en vereisen de accounteigenaar in het dashboard. De factureringsstatus is leesbaar met get_account.
POST /keysniet beschikbaarBewust uitgesloten: een agent mag geen credentials aanmaken of vernietigen. Sleutels worden door een mens in het dashboard beheerd.
GET /keyslist_api_keysMetadata van API-sleutels opvragen
DELETE /keys/:idniet beschikbaarBewust uitgesloten: een agent mag geen credentials aanmaken of vernietigen. Sleutels worden door een mens in het dashboard beheerd.

Bewust niet beschikbaar

MogelijkheidEndpointsReden
API-sleutels aanmaken, roteren, intrekken of verwijderenPOST /keys, DELETE /keys/:idBewust uitgesloten: een agent mag geen credentials aanmaken of vernietigen. Sleutels worden door een mens in het dashboard beheerd.
Een checkout starten of een abonnement opzeggenPOST /billing/checkout, POST /billing/cancelFactureringswijzigingen kunnen bewust alleen via een sessie en vereisen de accounteigenaar in het dashboard. De factureringsstatus is leesbaar met get_account.
Cloudflare-DNS met één klik (OAuth)GET /api/dns/cloudflare/connectVereist een interactieve browsersessie en toestemming via Cloudflare OAuth. Gebruik in plaats daarvan de records uit get_domain, de hosts uit get_dns_provider of get_domain_connect_link.
Registreren, inloggen, uitloggen, Google-account koppelen/api/auth/*Authenticatie door een mens in de browser; de MCP-server authenticeert met een API-sleutel.
Contactformulier voor supportPOST /api/contactOpenbaar formulier op de marketingsite voor mensen, geen bewerking in een workspace.

Machineleesbare catalogus: /docs/mcp/tools.json (schema's, annotaties, koppeling met endpoints, uitzonderingen). Markdownversie van deze pagina: /docs/mcp.md. Met de CLI geïnstalleerd print sendhq commands --format json dezelfde catalogus.