Für KI-Agenten
SendHQ MCP-Server
Geben Sie einem KI-Agenten vollständige, sichere Kontrolle über einen SendHQ-Workspace: E-Mails senden und empfangen, Domains verifizieren, Templates veröffentlichen und die Zustellbarkeit untersuchen – über 59 streng typisierte Tools. Zuerst für Agenten geschrieben; Menschen sind willkommen.
curl -fsSL https://downloads.sendhq.cc/install.sh | sh
claude mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcpWas dieser Server ist
Der SendHQ MCP-Server lässt einen KI-Agenten über das Model Context Protocol einen SendHQ-Workspace bedienen: E-Mails senden (einzeln, als Batch, per Template, Antworten, Anhänge, idempotente Wiederholungsversuche), gesendete und empfangene E-Mails (Betreff, Text und Anhangsnamen) samt Zustell-Events lesen und durchsuchen, E-Mails mit Labels und automatischen Ablageregeln organisieren, Entwürfe und private Anhänge verwalten, gehostete Templates erstellen und veröffentlichen, Domains samt DNS hinzufügen und verifizieren, Inbound-Empfang und Inbound-Adressen einrichten, Zustellbarkeit, Bounces, Beschwerden und Sperrliste prüfen sowie Kontonutzung, Abrechnungsstatus, Analytics und Metadaten zu API-Schlüsseln lesen.
Es ist ein lokaler stdio-Server, der in die sendhq-CLI-Binärdatei eingebaut ist. Ihr MCP-Client startet sendhq mcp als Kindprozess und spricht JSON-RPC über stdin/stdout. Jeder Tool-Aufruf wird zu genau einer dokumentierten Anfrage an die SendHQ REST API unter https://sendhq.cc/api/v1, authentifiziert mit dem API-Schlüssel Ihres Workspace. Der MCP-Server hat also genau die Berechtigungen dieses Schlüssels und keine weiteren.
- 59 Tools in 8 Gruppen, erzeugt aus einem einzigen Katalog, der auch als tools.json veröffentlicht wird.
- Strikte JSON Schemas: Unbekannte Argumente, falsche Typen und fehlende Pflichtfelder werden lokal abgelehnt, bevor etwas SendHQ erreicht.
- Strukturierte Fehler mit stabilem
code, dem HTTP-status, einerexplanation, einem konkretenremedyund der Angabe, ob ein erneuter Versuch helfen kann. - Jedes Tool, das echte E-Mails sendet oder Daten löscht, sagt das gleich in den ersten Worten seiner Beschreibung und trägt MCP-Sicherheitsannotationen.
- Der
--read-only-Modus blendet alle sendenden und ändernden Tools aus. - Es wird nichts protokolliert. stdout enthält nur Protokollnachrichten; der API-Schlüssel und der Nachrichteninhalt gelangen nie in ein Log.
https://sendhq.cc/api/mcp (Preis- und Doku-Abfragen, kein Kontozugriff). Der Server auf dieser Seite ist der vollständige, kontobezogene; er läuft lokal oder als gehosteter Connector weiter unten.SendHQ in Claude und ChatGPT nutzen
Keine Installation nötig: SendHQ betreibt diesen Server auch als gehosteten Connector unter https://mcp.sendhq.cc/mcp mit denselben Tools. Sie melden sich mit Ihrem SendHQ-Konto an, statt einen Schlüssel einzufügen.
Claude
- Öffnen Sie Settings → Connectors und suchen Sie SendHQ im Verzeichnis, oder wählen Sie Add custom connector und fügen Sie
https://mcp.sendhq.cc/mcpein. - Klicken Sie auf Connect, melden Sie sich bei SendHQ an, prüfen Sie den Zugriff und klicken Sie auf Allow.
- Bitten Sie Claude, Ihren Posteingang zu prüfen, eine E-Mail von Ihrer verifizierten Domain zu senden oder einen Bounce zu erklären.
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.
Freigabe und Trennen
- The
request_featuretool sends a feature request to the SendHQ team with your account details, so we can follow up by email. - Tools, die echte E-Mails senden oder Daten löschen, sind entsprechend gekennzeichnet. Ob der Assistent vorher nachfragt, legen Sie pro Tool im Assistenten fest: In Claude wählen Sie für diese Tools unter Settings → Connectors → SendHQ die Option Needs approval.
- Der Connector erhält einen eigenen API-Schlüssel, der nach dem Assistenten benannt ist (zum Beispiel „Claude (AI connector)“). Löschen Sie ihn unter API Keys, um die Verbindung sofort zu trennen.
- Er kann weder API-Schlüssel erstellen oder widerrufen noch die Abrechnung ändern. Anhänge werden als Base64 gesendet und zurückgegeben; es gibt keinen lokalen Dateizugriff.
- Nicht bezahlte Workspaces (Integrationstestphase) können nur an die Konto-E-Mail-Adresse oder eine AWS-SES-Simulatoradresse zustellen.
Fragen: postmaster@sendhq.cc. Datenschutz: sendhq.cc/privacy.
Installation
Installieren Sie die sendhq-Binärdatei (Linux, macOS und Windows auf x86-64 und arm64). Das Installationsprogramm prüft die Prüfsumme des Releases und legt die Binärdatei standardmäßig in ~/.local/bin ab.
curl -fsSL https://downloads.sendhq.cc/install.sh | shirm https://downloads.sendhq.cc/install.ps1 | iexsendhq version
SENDHQ_API_KEY=re_your_key sendhq doctorErstellen Sie im Dashboard unter https://sendhq.cc/app#/keys einen API-Schlüssel. Der MCP-Server kann keine Schlüssel erstellen. Der eine Befehl, der den Server startet, lautet:
SENDHQ_API_KEY=re_your_key sendhq mcpSie führen das normalerweise nie selbst aus: Der MCP-Client startet den Server. Im Terminal ausgeführt, wartet er auf stdin auf JSON-RPC.
Client konfigurieren
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-onlyFügen Sie --scope user hinzu, damit der Server in jedem Projekt verfügbar ist, oder --scope project, um ihn in die .mcp.json des Projekts zu schreiben. Verweisen Sie in einer gemeinsam genutzten .mcp.json auf den Schlüssel in der Umgebung, statt ihn einzuchecken; Claude Code expandiert ${VAR} in .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" }Oder über die Kommandozeile: codex mcp add sendhq --env SENDHQ_API_KEY=re_your_key -- sendhq mcp.
Claude Desktop
Bearbeiten Sie claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\) und starten Sie die App neu. Desktop-Apps erben nicht den PATH Ihrer Shell, verwenden Sie daher den absoluten Pfad der Binärdatei (which sendhq).
{
"mcpServers": {
"sendhq": {
"command": "/Users/you/.local/bin/sendhq",
"args": [
"mcp"
],
"env": {
"SENDHQ_API_KEY": "re_your_key"
}
}
}
}Jeder andere MCP-Client
Konfigurieren Sie einen stdio-Server mit dem Befehl sendhq, den Argumenten ["mcp"] (optional "--read-only") und den unten genannten Umgebungsvariablen. Der Server unterstützt die MCP-Protokollversionen 2024-11-05, 2025-03-26, 2025-06-18 und 2025-11-25 und implementiert initialize, ping, tools/list und tools/call. Tool-Ergebnisse enthalten sowohl einen JSON-Textblock als auch 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":{}}}Für den kontobezogenen Server gibt es keinen gehosteten HTTP-Transport. Ein entfernter, schreibfähiger MCP-Endpunkt würde OAuth pro Nutzer erfordern, das SendHQ nicht anbietet; die lokale Binärdatei hält den Schlüssel auf dem Rechner, der ihn ohnehin besitzt.
Umgebung und Flags
| Variable oder Flag | Erforderlich | Bedeutung |
|---|---|---|
SENDHQ_API_KEY | ja | API-Schlüssel des Workspace (re_…). Jedes Tool außer get_service_health benötigt ihn. Ohne ihn startet der Server trotzdem, und jeder Aufruf liefert einen strukturierten auth_error mit der Anleitung zur Behebung. |
SENDHQ_API_BASE_URL | nein | Basis-URL der API. Standard: https://sendhq.cc/api/v1. Nutzen Sie sie nur für ein lokales oder Staging-Deployment. SENDHQ_BASE_URL wird als älterer Alias akzeptiert. |
SENDHQ_MCP_READ_ONLY | nein | 1, true oder yes verhält sich wie --read-only. |
--read-only | nein | Stellt nur Tools bereit, die weder E-Mails senden noch Zustand ändern. Ausgeblendete Tools werden auch dann abgelehnt, wenn sie per Namen aufgerufen werden. |
SENDHQ_PROFILE / --profile | nein | Verwendet einen mit sendhq auth login im Schlüsselbund des Betriebssystems gespeicherten Schlüssel statt SENDHQ_API_KEY. Die Umgebungsvariable hat Vorrang, wenn beide vorhanden sind. |
Der Schlüssel wird nur als Authorization: Bearer-Header an die konfigurierte Basis-URL gesendet. Er wird nie ausgegeben, protokolliert, in Fehlern wiederholt oder in Tool-Ergebnisse aufgenommen.
Sicherheitsmodell für Agenten
- Sendet echte E-Mails.
send_email,send_batchundsend_template_teststellen E-Mails an echte Personen zu und verbrauchen Zustellkontingent. Ihre Beschreibungen beginnen mitSENDS REAL EMAIL. Rufen Sie sie nur auf, wenn der Nutzer ausdrücklich darum gebeten hat, genau diese Nachricht zu senden, und Empfänger, Absender und Inhalt bestätigt sind. - Destruktiv.
delete_email,delete_draft,delete_attachment,delete_domain,delete_inboxundremove_suppressionsind mitdestructiveHint: truemarkiert, und ihre Beschreibungen beginnen mitDESTRUCTIVE. Holen Sie vorher die Bestätigung des Nutzers ein.remove_suppressionschwächt eine Schutzsperre ab und ist nur angebracht, wenn ein Mensch bestätigt, dass die Adresse wieder funktioniert. - Ändert den Zustand. Das Erstellen oder Aktualisieren von Entwürfen, Templates, Domains und Postfächern, das Veröffentlichen von Templates und das Starten der Verifizierung verändern den Workspace, senden aber keine E-Mails.
- Nur lesend. Alles andere ist
readOnlyHint: trueund kann bedenkenlos aufgerufen werden. - Dieser Server ändert nie das DNS.
add_domaingibt Einträge zurück, die ein Mensch veröffentlichen muss;get_domain_connect_linkgibt eine Zustimmungs-URL zurück, die eine Person öffnen und bei ihrem DNS-Provider bestätigen muss. - Dieser Server ändert nie die Abrechnung.
get_accountliest nur Tarif, Nutzung und Abostatus. - Nicht bezahlte Workspaces (Integrationstestphase) können nur an die E-Mail-Adresse des Kontoinhabers (
get_account→user.email) oder an eine AWS-SES-Simulatoradresse wiesuccess@simulator.amazonses.comzustellen und keine Anhänge senden. - Angenommen heißt nicht zugestellt. Ein erfolgreicher Versand liefert eine ID; Belege für Zustellung, Bounce und Beschwerde erscheinen später in
list_email_events. Behaupten Sie nie eine Platzierung im Posteingang oder dass eine Person die Nachricht gelesen hat. - Wechseln Sie nicht auf eine andere Absenderadresse, um eine
423-Pause zu umgehen, und fügen Sie abgemeldete oder beschwerdeführende Empfänger nie wieder hinzu.
API-Schlüssel sind ausgeschlossen
Es gibt bewusst keine Tools, die API-Schlüssel erstellen, ändern, rotieren, widerrufen oder löschen. Ein Agent darf keine Zugangsdaten erzeugen oder vernichten. list_api_keys gibt nur Namen, nicht geheime Präfixe und Zeitpunkte der letzten Nutzung zurück. Die Schlüsselverwaltung bleibt im Dashboard bei einem angemeldeten Menschen.
Workflows
1. Erster Versand
get_service_healthbestätigt, dass die API erreichbar ist (funktioniert ohne Schlüssel).get_accountzeigt den Tarif (access.tier), das verbleibende Kontingent unduser.email. In der Testphase ist diese E-Mail-Adresse der einzige erlaubte echte Empfänger.list_sending_identitieslistet die nutzbaren Absenderadressen auf. Ist die Liste leer, führen Sie zuerst den Domain-Workflow aus.- Bestätigen Sie Absender, Empfänger, Betreff und Text mit dem Nutzer und rufen Sie dann
send_emailmit einemidempotency_keyauf. list_email_eventsmit der zurückgegebenenidzeigtdelivery,bounce,complaintoderreject, sobald der Provider es meldet (meist nach Sekunden bis Minuten).
{
"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. Domain-Verifizierung von Anfang bis Ende
add_domainmitname: "example.com". Das Ergebnis enthält die DNS-Einträge (DKIM-CNAMEs, SES-Verifizierung, SPF, empfohlenes DMARC).get_dns_providermit derdomain_iderkennt den maßgeblichen DNS-Provider und liefert für jeden Eintrag den exakten relativen Host, der bei diesem Provider einzutragen ist.- Wenn
providers.domainConnect.availabletrue ist, liefertget_domain_connect_linkeine Zustimmungs-URL. Geben Sie sie dem Menschen; es ändert sich nichts, bevor er sie beim Provider bestätigt. Andernfalls geben Sie dem Menschen die zu veröffentlichenden Einträge. Veröffentlichen Sie nie einen zweiten SPF-Eintrag: Führen Sieinclude:amazonses.commit dem vorhandenenv=spf1-Wert zusammen. verify_domainprüft DNS und SES erneut. Der Status wechselt vonpendingübercheckingundpropagatingzuverified. Rufen Sieverify_domainoderget_domainalle 30–60 Sekunden ab; DNS kann Minuten bis Stunden brauchen.- Sobald
statusden Wertverifiedhat, erscheinen die Adressen der Domain inlist_sending_identities.
3. Bounces, Beschwerden und Sperrliste
list_blocked_recipientsgibt jede blockierte Adresse mit Grund (bounce,complaint,unsubscribe) und einer zusammenfassenden Anzahl zurück.list_suppressionsgibt Sperrlisteneinträge für Hard Bounces und Beschwerden zurück;deliverability_statsliefert die Zustell-, Bounce- und Beschwerderaten der letzten 30 Tage;list_sender_reputationzeigt, welche Absenderadressen gedrosselt oder pausiert sind.- Ein Versand mit einem gesperrten Empfänger schlägt mit
422 recipient_suppressedfehl. Entfernen Sie diesen Empfänger und senden Sie erneut. - Rufen Sie
remove_suppressionnur auf, wenn ein Mensch bestätigt, dass ein zuvor gebouncetes Postfach jetzt funktioniert. Sperren wegen Beschwerden sind dauerhaft (409 complaint_suppression_locked).
4. Eingehende E-Mails empfangen
- Die Domain (oft eine Subdomain wie
inbound.example.com) muss verifiziert sein. setup_inboundrichtet den Empfang ein und gibt einen MX-Eintrag zurück. Ein Mensch veröffentlicht ihn.- Rufen Sie
verify_inboundauf, bisstatusden Wertreadyhat. create_inboxmitdomain_idundlocal_part(zum Beispielsupport) erstelltsupport@inbound.example.com.- Fragen Sie
list_emailsmitdirection: "in"undunread: true(optionalinbox_id) regelmäßig ab. Lesen Sie eine Nachricht mitget_email, die Unterhaltung mitget_thread, Anhänge mitdownload_attachmentund markieren Sie sie mitmark_email(read: true) als erledigt. - Antworten Sie im Thread mit
send_emailundreply_to_email_id; SendHQ setzt In-Reply-To, References und den Thread.
5. Webhooks und Event-Benachrichtigungen
SendHQ bietet derzeit keine vom Kunden konfigurierbaren Webhooks an, daher gibt es kein Webhook-Tool. Provider-Benachrichtigungen werden intern in SendHQ verarbeitet und über lesende Abfragen bereitgestellt. Fragen Sie stattdessen per Polling ab: list_email_events für das Ergebnis einer Nachricht, list_emails mit status (zum Beispiel bounced) oder after für aktuelle Änderungen, list_emails mit direction: "in" und unread: true für neue eingehende E-Mails und list_blocked_recipients für neue Sperren. Fragen Sie pro Fragestellung höchstens etwa einmal pro Minute ab.
6. Einen Zustellfehler diagnostizieren
- Finden Sie die Nachricht:
list_emailsmitdirection: "out"undtooderquery, oderget_email, wenn Sie die ID haben.status: failedbedeutet, dass SendHQ oder der Provider die Nachricht bei der Einlieferung abgelehnt hat; der Fehler der E-Mail nennt den Grund. list_email_events:bounce(permanent oder vorübergehend, mit der Diagnose des Providers),complaint,rejectoderdelivery. Noch keine Events bedeutet, dass der Provider noch nichts gemeldet hat; warten Sie und prüfen Sie erneut.- Wenn der Sendeaufruf selbst fehlgeschlagen ist, lesen Sie den Fehler-
code:sender_domain_unverified→ Domain-Verifizierung abschließen;recipient_suppressed→ die Adresse hat zuvor gebounct oder sich beschwert;sender_paused→list_sender_reputationprüfen und die Listenquelle korrigieren;trial_recipient_restricted→ Grenzen der Testphase;quota_exhausted→ Nutzung inget_accountprüfen. get_domainprüft, ob DKIM, SPF und DMARC weiterhin veröffentlicht sind;deliverability_statszeigt, ob das Problem eine einzelne Nachricht oder ein Trend ist.- Berichten Sie, was die Belege zeigen. Ein
delivery-Event bedeutet, dass der Server des Empfängers die Nachricht angenommen hat, nicht dass sie im Posteingang gelandet ist oder gelesen wurde.
7. Einen Aufgaben-Bucket führen (Labels)
create_labelmitname(zum BeispielAgent/Orders) undskip_inbox: true. Das macht das Label zu einem Bucket: Empfangene E-Mails, die es erhalten, werden archiviert und erscheinen nur im Label, nie im Posteingang des Menschen.- Senden Sie Aufgaben-E-Mails mit
send_email(odersend_batch) undlabels: ["Agent/Orders"]. Antworten auf diese Unterhaltung erben das Label automatisch und umgehen den Posteingang. - Für E-Mails, die außerhalb Ihrer Unterhaltungen beginnen, fügen Sie eine Ablageregel hinzu:
create_label_rulemitinbox_id(eine dedizierte Adresse wieorders@…),from,toodersubject. Übergeben Sieapply_to_existing: true, um bereits empfangene E-Mails abzulegen. - Den Bucket abarbeiten:
list_emailsmitlabel: "Agent/Orders",direction: "in"undunread: true; lesen Sie mitget_emailoderget_thread, antworten Sie mitsend_emailundreply_to_email_idund setzen Sie nach der Bearbeitungmark_emailread: true. - Verschieben Sie eine verirrte Nachricht mit
label_email(add/remove) in den Bucket oder heraus. Wenn Sie einer empfangenen Nachricht ein Bucket-Label hinzufügen, wird sie ebenfalls archiviert. - Optional sendet
set_inbox_forwardingeine Kopie von allem, was eine Empfangsadresse erhält, an ein anderes Postfach (das Ziel bestätigt zuvor per 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. Anhänge und Templates
Hängen Sie mit send_email attachments bis zu 10 Dateien an (jede braucht content_base64 oder einen lokalen file_path; filename entspricht standardmäßig dem Basisnamen der Datei), in einem kostenpflichtigen Tarif. Für gehostete Templates: create_template → update_template_draft → render_template für die Vorschau mit Beispieldaten → send_template_test (sendet eine echte Test-E-Mail) → publish_template. Senden Sie danach mit send_email oder send_batch unter Verwendung von template: {key, data} und genau einem to-Empfänger.
Ergebnisse, Paginierung und Fehler
Ein erfolgreicher Aufruf gibt das JSON-Objekt der API als structuredContent und als JSON-Textblock zurück. Jedes list_*-Tool akzeptiert limit (1–200, Standard 50) und offset und fügt ein pagination-Objekt hinzu. Rufen Sie weiter mit offset: pagination.next_offset auf, solange has_more true ist.
{
"data": [
"…"
],
"count": 50,
"pagination": {
"offset": 0,
"limit": 50,
"returned": 50,
"total": 180,
"has_more": true,
"next_offset": 50
}
}Ein fehlgeschlagener Aufruf gibt isError: true mit einem strukturierten Fehler zurück. Befolgen Sie remedy, statt blind zu wiederholen; versuchen Sie es nur erneut, wenn retryable true ist.
{
"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."
}
}Optionale Fehlerfelder: request_id (nennen Sie sie dem Support), retry_after_seconds, problems (Liste der Schema-Verstöße bei invalid_arguments) und idempotent_replayed (siehe Idempotenz).
Idempotenz
send_email und send_batch akzeptieren idempotency_key (max. 200 Zeichen), der als Idempotency-Key-Header gesendet wird. Erzeugen Sie pro logischer Nachricht einen stabilen Schlüssel, zum Beispiel invoice-4812-receipt.
- Ein Wiederholungsversuch muss denselben Schlüssel UND einen identischen Anfrage-Body verwenden. Derselbe Schlüssel mit irgendeiner Änderung (Empfänger, Betreff, Text, Header, Template-Daten, sogar Argumentwerte) liefert
409 idempotency_conflict. - Gleicher Schlüssel, gleicher Body, Original abgeschlossen: SendHQ gibt das gespeicherte Ergebnis zurück, ohne erneut zu senden. So wiederholen Sie nach einem Timeout oder
network_errorsicher. - Gleicher Schlüssel, solange das Original noch läuft:
409 idempotency_in_progress, nach kurzer Wartezeit wiederholbar. - Eine neue logische Nachricht braucht einen neuen Schlüssel.
- Auch gespeicherte Fehler werden wiedergegeben. Ist der erste Versuch fehlgeschlagen, liefert ein Wiederholungsversuch mit demselben Schlüssel genau diesen Fehler mit
idempotent_replayed: trueundretryable: false. Prüfen Sie mitlist_emails(direction: out), dass nichts versendet wurde, beheben Sie die Ursache und senden Sie dann mit einem neuen Schlüssel. - Der Server wiederholt nie von sich aus einen POST. Nur lesende GET-Aufrufe werden automatisch wiederholt (bis zu 3 Versuche bei Netzwerkfehlern, 429 und 5xx).
send_emailmit Inline-attachmentskann keinenidempotency_keyannehmen, da es mehrere Anfragen ausführt. Für wiederholungssichere Versände mit Anhang:create_draft→upload_attachment→send_emailmitdraft_idundidempotency_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"
}
}Rate-Limits und Kontingente
SendHQ veröffentlicht kein festes Limit für Anfragen pro Sekunde an die API. Die Grenzen, auf die ein Agent tatsächlich stößt, sind Nutzungslimits, die als 429 zurückgegeben werden:
- Monatliche Empfängerzustellungen pro Tarif. Jede To-, Cc- und Bcc-Adresse zählt als eine Zustellung. Siehe
get_account→usage.recipientDeliveriesim Vergleich zuusage.emailQuotaMonth. - Tägliche Empfänger pro exakter Absenderadresse, bestimmt durch den Reputationsstatus dieses Absenders (
list_sender_reputation→dailyLimit, in bezahlten Tarifen standardmäßig 2.000). - Integrationstestphase: insgesamt 100 Empfänger, nur an die Konto-E-Mail-Adresse oder SES-Simulatoradressen.
- Anhänge: höchstens 10 Dateien und 10 MB pro Nachricht; 10 GB empfängergewichteter Anhangstransfer pro Monat in bezahlten Tarifen.
- Pro Anfrage: To + Cc + Bcc bis zu 100 Adressen;
send_batchbis zu 100 Nachrichten. - Reputations-Schutzschalter: Überschreiten Bounces oder Beschwerden in einem gleitenden 7-Tage-Fenster den Schwellenwert, wird eine Absenderadresse gedrosselt oder pausiert (
423 sender_paused). Sie erholt sich automatisch, sobald die Raten sinken.
quota_exhausted ist nicht wiederholbar, bis die Periode zurückgesetzt wird oder sich der Tarif ändert. rate_limited ist nach retry_after_seconds wiederholbar; wiederholen Sie Versände mit demselben idempotency_key und identischem Body.
Fehlerkatalog
code ist stabil; verzweigen Sie danach und nicht anhand von message.
| code | HTTP | Wiederholen? | Bedeutung und empfohlenes Vorgehen |
|---|---|---|---|
invalid_arguments | — | nein | Die Argumente haben das JSON Schema des Tools lokal nicht bestanden; nichts hat SendHQ erreicht. Korrigieren Sie die in problems aufgeführten Felder. |
auth_error | 401 | nein | API-Schlüssel fehlt, wurde widerrufen oder ist falsch. Setzen Sie SENDHQ_API_KEY für den Serverprozess; Schlüssel erstellt ein Mensch im Dashboard. |
trial_recipient_restricted | 402 | nein | Die Integrationstestphase kann nur an die Konto-E-Mail-Adresse oder eine SES-Simulatoradresse zustellen. Senden Sie dorthin, oder der Inhaber aktiviert einen bezahlten Tarif. |
payment_required | 402 | nein | Die Funktion erfordert einen bezahlten Tarif (zum Beispiel Anhänge). Senden Sie ohne sie oder wechseln Sie den Tarif. |
sender_domain_not_owned | 403 | nein | Die Absenderdomain gehört nicht zu diesem Workspace. Nutzen Sie list_sending_identities oder add_domain. |
sender_domain_unverified | 403 | nein | Die Absenderdomain ist noch nicht verifiziert. get_domain, fehlende Einträge veröffentlichen, verify_domain. |
domain_limit_reached | 403 | nein | Das Domain-Limit des Tarifs ist erreicht. Entfernen Sie (mit Freigabe) eine ungenutzte Domain oder wechseln Sie den Tarif. |
marketing_not_enabled | 403 | nein | Die Klasse Marketing ist für diese Domain oder diesen Tarif nicht aktiviert. Verwenden Sie transactional nur, wenn die Nachricht tatsächlich transaktional ist. |
forbidden | 403 | nein | Die Richtlinie erlaubt den Vorgang nicht. Passen Sie die Anfrage an. |
not_found | 404 | nein | Die ID gehört nicht zu diesem Workspace. Listen Sie die Ressource auf, um die richtige ID zu finden; stellen Sie archivierte Templates zuerst wieder her. |
idempotency_conflict | 409 | nein | Schlüssel wurde mit einem anderen Body wiederverwendet. Senden Sie das exakte Original erneut oder verwenden Sie für eine neue Nachricht einen neuen Schlüssel. |
idempotency_in_progress | 409 | ja | Die ursprüngliche Anfrage läuft noch. Warten Sie und wiederholen Sie dann mit demselben Schlüssel und Body. |
revision_conflict | 409 | nein | Der Template-Entwurf hat sich geändert, seit Sie ihn gelesen haben. get_template, zusammenführen, erneut speichern. |
complaint_suppression_locked | 409 | nein | Der Empfänger hat sich beschwert. Schreiben Sie ihm nie wieder. |
inbound_not_ready | 409 | nein | Inbound-Empfang ist nicht bereit. setup_inbound, MX veröffentlichen, verify_inbound. |
conflict | 409 | nein | Die Ressource existiert bereits oder befindet sich im falschen Zustand. Lesen Sie sie aus und passen Sie an. |
attachments_too_large | 413 | nein | Mehr als 10 Dateien oder 10 MB. Entfernen Sie Anhänge oder verkleinern Sie sie. |
recipient_suppressed | 422 | nein | Ein Empfänger hat zuvor gebounct oder sich beschwert. Entfernen Sie ihn; siehe list_blocked_recipients. |
recipient_unsubscribed | 422 | nein | Ein Empfänger hat sich von Marketing-E-Mails abgemeldet. Entfernen Sie ihn dauerhaft. |
validation_failed | 422 | nein | Inhalt abgelehnt, zum Beispiel Template-Daten, die den Variablenvertrag verletzen. Korrigieren Sie die Eingabe. |
sender_paused | 423 | nein | Diese Absenderadresse wurde vom 7-Tage-Schutzschalter für Bounces/Beschwerden pausiert. Stoppen Sie, bereinigen Sie die Liste und warten Sie auf die automatische Erholung. |
quota_exhausted | 429 | nein | Monatliches Limit, Tageslimit pro Absender, Anhangslimit oder Limit der Testphase erreicht. Prüfen Sie get_account; warten Sie auf das Zurücksetzen oder wechseln Sie den Tarif. |
rate_limited | 429 | ja | Verlangsamen Sie; warten Sie retry_after_seconds. Bei Versänden: gleicher Schlüssel, gleicher Body. |
server_error | 5xx | ja | Vorübergehender Fehler bei SendHQ oder beim Provider. Warten Sie mit Backoff und wiederholen Sie; bei Versänden mit demselben Schlüssel und Body. Ist idempotent_replayed true, verwenden Sie einen neuen Schlüssel, nachdem Sie bestätigt haben, dass nichts gesendet wurde. |
network_error | — | ja | Anfrage oder Antwort ging verloren. Wiederholen Sie; bei Versänden macht derselbe idempotency_key das sicher. |
invalid_request | 400 | nein | Fehlerhafte Anfrage. Lesen Sie message und korrigieren Sie sie. |
tool_error | — | nein | Lokaler Fehler im MCP-Server (zum Beispiel ein nicht lesbarer file_path). Lesen Sie message. |
Tool-Referenz
Jedes Tool mit Sicherheitsklasse, dem aufgerufenen REST-Endpunkt, seinen Parametern, dem Rückgabeformat und einem Beispiel für das tools/call-params-Objekt. Die Parameter sind exakt: Der Server lehnt alles ab, was nicht aufgeführt ist.
E-Mails und Threads: send_email, send_batch, list_emails, get_email, mark_email, delete_email, list_email_events, get_thread
Labels und automatische Ablageregeln: list_labels, get_label, create_label, update_label, delete_label, create_label_rule, delete_label_rule, label_email
Entwürfe, Anhänge und Absenderidentitäten: list_sending_identities, create_draft, list_drafts, get_draft, update_draft, delete_draft, upload_attachment, download_attachment, delete_attachment
Gehostete Templates: list_templates, create_template, get_template, update_template_draft, create_template_draft, render_template, send_template_test, publish_template, archive_template, restore_template
Domains und DNS: list_domains, get_domain, add_domain, verify_domain, delete_domain, get_dns_provider, get_domain_connect_link
Eingehende E-Mails: setup_inbound, verify_inbound, list_inboxes, get_inbox, create_inbox, update_inbox, set_inbox_forwarding, delete_inbox
Zustellbarkeit, Bounces und Sperrliste: deliverability_stats, list_sender_reputation, list_suppressions, remove_suppression, list_blocked_recipients
Konto, Nutzung, Analytics und Schlüssel: get_account, get_analytics, list_api_keys, get_service_health
Keine Tools entsprechen diesem Filter.
E-Mails und Threads
send_emailEine E-Mail senden
SENDS REAL EMAIL. Sendet eine Nachricht von einer verifizierten Domain: rohes HTML/Text, ein veröffentlichtes gehostetes Template, eine Antwort in einem bestehenden Thread oder eine Nachricht mit Anhängen. Übergeben Sie idempotency_key, damit ein Wiederholungsversuch nicht doppelt sendet; ein Wiederholungsversuch muss denselben Schlüssel UND eine identische Anfrage verwenden, sonst gibt SendHQ 409 zurück. attachments ist eine Komfortfunktion, die einen Entwurf erstellt, jede Datei hochlädt und mit diesem Entwurf sendet; sie lässt sich nicht mit idempotency_key oder draft_id kombinieren (für wiederholungssichere Versände mit Anhang nutzen Sie create_draft + upload_attachment + send_email mit draft_id). Nicht bezahlte Workspaces (Integrationstestphase) können nur an die Konto-E-Mail-Adresse oder eine AWS-SES-Simulatoradresse zustellen und keine Anhänge senden.
Geben Sie mindestens eines an: html, text, template.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
from | string | ja | Absender, z. B. Acme <hello@example.com>. Die Domain muss in diesem Workspace verifiziert sein (siehe list_sending_identities). (max. 998 Zeichen) |
to | string[] | ja | Empfänger. Jeder Eintrag ist eine Adresse, optional mit Anzeigenamen. To+cc+bcc dürfen zusammen höchstens 100 ergeben; jedes Ziel verbraucht ein Zustellkontingent. (1–100 Einträge) |
cc | string[] | nein | Empfänger in Kopie (Cc). (0–100 Einträge) |
bcc | string[] | nein | Empfänger in Blindkopie (Bcc). (0–100 Einträge) |
subject | string | nein | Betreffzeile. Beim Senden eines Templates weglassen. (max. 998 Zeichen) |
text | string | nein | Plain-Text-Body. Geben Sie text, html oder template an. |
html | string | nein | HTML-Body. SendHQ bereinigt ihn und leitet text ab, wenn text fehlt. |
reply_to | string | nein | Reply-To-Adresse. |
headers | object | nein | Zusätzliche sichere benutzerdefinierte Header (String-Werte), z. B. {"X-Entity-Ref-ID": "123"}. Routing-Header wie From/To/Message-ID werden von SendHQ gesteuert. |
message_class | string | nein | transactional (Standard) oder marketing. Marketing erfordert einen Marketing-fähigen Tarif oder eine solche Domain und ergänzt die Abmeldeverarbeitung. (eines von transactional, marketing) |
reply_to_email_id | string | nein | Antwort innerhalb einer bestehenden Unterhaltung: die em_…-ID der beantworteten Nachricht. SendHQ setzt In-Reply-To/References und den Thread. |
thread_id | string | nein | Explizite Thread-ID, unter der die Nachricht abgelegt wird. |
draft_id | string | nein | Sendet die Anhänge eines gespeicherten Entwurfs mit dieser Nachricht (dr_…). Der Entwurf wird nach erfolgreichem Versand gelöscht. |
template | object | nein | Sendet ein veröffentlichtes gehostetes Template statt rohem html/text. Erfordert genau einen to-Empfänger und kein cc/bcc; der Betreff stammt aus dem Template. Geben Sie mindestens eines an: id, key. |
template.id | string | nein | Template-ID (tmpl_…). Geben Sie id oder key an. |
template.key | string | nein | Template-Key wie account-welcome. Geben Sie id oder key an. |
template.version_id | string | nein | Optionale ID des veröffentlichten Releases (tmplv_…). Standard ist das aktuell veröffentlichte Release. |
template.data | object | nein | Werte für die typisierten Variablen des Templates. |
labels | string[] | nein | Label-Namen oder lbl_…-IDs, unter denen die Nachricht abgelegt wird. Unbekannte Namen werden angelegt. Antworten in der Unterhaltung erben die Labels, und ein Bucket-Label (skip_inbox) hält diese Antworten aus dem Posteingang heraus. Max. 10. (0–10 Einträge) |
idempotency_key | string | nein | Idempotency-Key-Header (max. 200 Zeichen). Verwenden Sie ihn nur, um genau diese Anfrage zu wiederholen. (max. 200 Zeichen) |
attachments | object[] | nein | Anzuhängende Dateien (max. 10 Dateien, insgesamt 10 MB). Jede braucht content_base64 (plus filename) oder einen lokalen file_path. (0–10 Einträge) Geben Sie mindestens eines an: content_base64, file_path. |
attachments[].filename | string | nein | Dateiname, den der Empfänger sieht. Bei content_base64 erforderlich; standardmäßig der Basisname von file_path. (max. 255 Zeichen) |
attachments[].content_type | string | nein | MIME-Typ, z. B. application/pdf. Standard ist application/octet-stream. |
attachments[].content_base64 | string | nein | Standard-Base64-Dateiinhalt. |
attachments[].file_path | string | nein | Absoluter Pfad einer lokalen Datei, die der MCP-Serverprozess lesen kann. |
{
"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_batchEinen Batch individualisierter E-Mails senden
SENDS REAL EMAIL. Sendet 1–100 unabhängige Nachrichten in einer Anfrage (nutzen Sie das für Template-Personalisierung pro Empfänger). Jeder Eintrag hat dieselbe Form wie bei send_email (ohne attachments/idempotency_key). Die Einträge gelingen oder scheitern einzeln: HTTP 207 bedeutet Teilerfolg; prüfen Sie jeweils data[i].ok und data[i].error. Ein idempotency_key deckt den gesamten Batch-Body ab.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
emails | object[] | ja | Zu sendende Nachrichten. (1–100 Einträge) Geben Sie mindestens eines an: html, text, template. |
idempotency_key | string | nein | Idempotency-Key für den gesamten Batch (max. 200 Zeichen). (max. 200 Zeichen) |
{
"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_emailsE-Mails auflisten und durchsuchen
Listet gesendete (direction: out) und empfangene (direction: in) E-Mails mit Filtern, neueste zuerst. Empfangene E-Mails werden klassifiziert: Den Posteingang eines Menschen lesen Sie mit direction: in, archived: false, category: primary; zum Sichten nutzen Sie important: true; Spam ist ausgeblendet, außer bei category: spam oder include_spam: true. Paginiert: Das Ergebnis enthält pagination {offset, limit, returned, total?, has_more, next_offset}.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
direction | string | nein | in für empfangene, out für gesendete E-Mails. (eines von in, out) |
status | string | nein | Statusfilter, z. B. queued, sent, delivered, bounced, complained, failed. |
domain | string | nein | Nur Nachrichten für diese Domain oder eine durch Kommas getrennte Liste von Domains (trifft auf jede zu). |
inbox_id | string | nein | Nur Nachrichten, die dieses Postfach empfangen hat (inb_…). |
label | string | nein | Nur Nachrichten mit diesem Label: eine Label-ID lbl_… oder der exakte Name, oder eine durch Kommas getrennte Liste (trifft auf jedes zu). Mit list_labels sehen Sie die Ordner. |
archived | boolean | nein | false = Posteingangsansicht (empfangene, nicht archivierte E-Mails), true = nur archivierte. Weglassen für alle E-Mails. |
category | string | nein | primary (Personen), updates (Newsletter, Massenmails, automatisierte E-Mails) oder spam; oder eine durch Kommas getrennte Liste. Spam ist ausgeblendet, sofern nicht angefordert. |
important | boolean | nein | true = nur als wichtig markierte Nachrichten (Antworten auf von Ihnen begonnene Unterhaltungen und als wichtig markierte Absender). |
include_spam | boolean | nein | Spam in die Ergebnisse einbeziehen (für Suchen über alle Ordner). |
from | string | nein | Die Absenderadresse enthält diesen Wert. |
to | string | nein | Die Empfängeradresse enthält diesen Wert. |
unread | boolean | nein | true = nur ungelesene, false = nur gelesene. |
after | string | nein | ISO-8601-Zeitstempel; nur Nachrichten, die danach erstellt wurden. (date-time) |
before | string | nein | ISO-8601-Zeitstempel; nur Nachrichten, die davor erstellt wurden. (date-time) |
query | string | nein | Freitextsuche über Betreffs, Texte, Absender-/Empfängeradressen und Anhangsdateinamen. (max. 200 Zeichen) |
limit | integer | nein | Seitengröße. Standard 50. (Standard 50; 1–200) |
offset | integer | nein | Anzahl der zu überspringenden Datensätze. Verwenden Sie pagination.next_offset der vorherigen Seite. (Standard 0; 0–…) |
{
"name": "list_emails",
"arguments": {
"direction": "in",
"unread": true,
"limit": 25
}
}get_emailEine E-Mail abrufen
Ruft eine Nachricht mit Headern, HTML-/Text-Body, Status, Thread-Metadaten und Anhangsmetadaten ab (die Bytes laden Sie mit download_attachment).
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
email_id | string | ja | E-Mail-ID (beginnt mit em_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "get_email",
"arguments": {
"email_id": "em_123"
}
}mark_emailAls gelesen, archiviert, Spam oder wichtig markieren
Aktualisiert eine Nachricht: read, archived, category (primary, updates, spam; nur empfangene E-Mails) und important. Wer Spam meldet oder als wichtig markiert, bringt SendHQ etwas über diesen Absender für künftige E-Mails bei; übergeben Sie learn: false, um nur diese Nachricht zu ändern. Übergeben Sie mindestens ein Feld.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
email_id | string | ja | E-Mail-ID (beginnt mit em_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
read | boolean | nein | true = gelesen, false = ungelesen. |
archived | boolean | nein | true = archivieren (Posteingang überspringen), false = zurück in den Posteingang verschieben. |
category | string | nein | Verschiebt eine empfangene Nachricht nach primary, updates oder spam. (eines von primary, updates, spam) |
important | boolean | nein | Markiert die Nachricht als wichtig oder hebt die Markierung auf. |
learn | boolean | nein | false = dieses Urteil nicht für den Absender merken (Standard true). |
{
"name": "mark_email",
"arguments": {
"email_id": "em_123",
"read": true
}
}delete_emailEine E-Mail löschen
DESTRUCTIVE: Löscht eine gespeicherte Nachricht und ihre gespeicherten Anhänge dauerhaft aus SendHQ. Eine bereits zugestellte Nachricht wird dadurch nicht zurückgerufen.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
email_id | string | ja | E-Mail-ID (beginnt mit em_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "delete_email",
"arguments": {
"email_id": "em_123"
}
}list_email_eventsZustell-Events einer E-Mail auflisten
Provider-Events zu einer gesendeten Nachricht: delivery, bounce, complaint, reject, open, click. Das ist der Beleg dafür, ob eine Nachricht zugestellt wurde oder warum sie fehlschlug. Paginiert: Das Ergebnis enthält pagination {offset, limit, returned, total?, has_more, next_offset}.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
email_id | string | ja | E-Mail-ID (beginnt mit em_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
limit | integer | nein | Seitengröße. Standard 50. (Standard 50; 1–200) |
offset | integer | nein | Anzahl der zu überspringenden Datensätze. Verwenden Sie pagination.next_offset der vorherigen Seite. (Standard 0; 0–…) |
{
"name": "list_email_events",
"arguments": {
"email_id": "em_123"
}
}get_threadEine Unterhaltung abrufen
Ruft alle Nachrichten einer Unterhaltung in chronologischer Reihenfolge ab (gesendet und empfangen), jeweils mit Anhangsmetadaten.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
thread_id | string | ja | Thread-ID (meist die em_…-ID der ersten Nachricht; siehe threadId bei jeder E-Mail). (max. 128 Zeichen) |
{
"name": "get_thread",
"arguments": {
"thread_id": "em_123"
}
}Labels und automatische Ablageregeln
list_labelsLabels auflisten
Listet die Labels (Ordner) des Workspace mit Gesamtzahl, Zahl ungelesener Nachrichten und ihren automatischen Ablageregeln auf. Paginiert: Das Ergebnis enthält pagination {offset, limit, returned, total?, has_more, next_offset}.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
limit | integer | nein | Seitengröße. Standard 50. (Standard 50; 1–200) |
offset | integer | nein | Anzahl der zu überspringenden Datensätze. Verwenden Sie pagination.next_offset der vorherigen Seite. (Standard 0; 0–…) |
{
"name": "list_labels",
"arguments": {}
}get_labelEin Label abrufen
Ruft ein Label mit Zählern und automatischen Ablageregeln ab.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
label_id | string | ja | Label-ID (beginnt mit lbl_) oder der exakte Label-Name. (max. 128 Zeichen) |
{
"name": "get_label",
"arguments": {
"label_id": "Billing"
}
}create_labelEin Label erstellen
Erstellt ein ordnerartiges Label. Setzen Sie skip_inbox: true, um daraus einen Bucket zu machen, den ein Agent besitzt: Senden Sie mit labels: [name], und die Antworten werden im Label abgelegt und aus dem Posteingang herausgehalten. Optionale automatische Ablageregeln legen neue gesendete/empfangene E-Mails ab (jede Bedingung einer Regel muss zutreffen). Setzen Sie apply_to_existing, um auch gespeicherte E-Mails abzulegen.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name | string | ja | Label-Name, z. B. Billing oder Clients/Acme. Pro Workspace eindeutig (Groß-/Kleinschreibung wird nicht unterschieden). (max. 64 Zeichen) |
color | string | nein | Hex-Farbe wie #1a73e8. Optional. |
skip_inbox | boolean | nein | Bucket-Modus: Empfangene E-Mails, die dieses Label erhalten (per Regel, per Antwort auf eine mit diesem Label gesendete Unterhaltung oder von Hand), werden archiviert und erscheinen nur im Label, nicht im Posteingang. |
rules | object[] | nein | Optionale automatische Ablageregeln (max. 20). Jede braucht mindestens eines von inbox_id, from, to, subject. (0–20 Einträge) |
rules[].direction | string | nein | Nur in (empfangene) oder out (gesendete) E-Mails. Weglassen für beide. (eines von in, out) |
rules[].inbox_id | string | nein | Nur E-Mails, die dieses Postfach empfangen hat (inb_…). Legt jede Empfangsadresse in einem eigenen Ordner ab. |
rules[].from | string | nein | Absender enthält diesen Text (Groß-/Kleinschreibung egal), z. B. @stripe.com. (max. 200 Zeichen) |
rules[].to | string | nein | To/Cc enthält diesen Text (Groß-/Kleinschreibung egal). (max. 200 Zeichen) |
rules[].subject | string | nein | Betreff enthält diesen Text (Groß-/Kleinschreibung egal). (max. 200 Zeichen) |
rules[].skip_inbox | boolean | nein | Archiviert passende empfangene E-Mails, sodass sie nur im Label-Ordner erscheinen, nicht im Posteingang. |
apply_to_existing | boolean | nein | Legt auch bereits gespeicherte E-Mails ab, die zu den Regeln passen. |
{
"name": "create_label",
"arguments": {
"name": "Agent/Orders",
"skip_inbox": true,
"rules": [
{
"from": "@stripe.com"
}
]
}
}update_labelEin Label umbenennen, umfärben oder zum Bucket machen
Benennt ein Label um, ändert seine Farbe oder schaltet den Bucket-Modus (skip_inbox) um. Beim Einschalten des Bucket-Modus werden empfangene E-Mails archiviert, die bereits im Label liegen.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
label_id | string | ja | Label-ID (beginnt mit lbl_) oder der exakte Label-Name. (max. 128 Zeichen) |
name | string | nein | Neuer Name. (max. 64 Zeichen) |
color | string | nein | Neue Hex-Farbe. |
skip_inbox | boolean | nein | Bucket-Modus: Empfangene E-Mails, die dieses Label erhalten (per Regel, per Antwort auf eine mit diesem Label gesendete Unterhaltung oder von Hand), werden archiviert und erscheinen nur im Label, nicht im Posteingang. |
{
"name": "update_label",
"arguments": {
"label_id": "lbl_123",
"name": "Finance/Billing"
}
}delete_labelEin Label löschen
DESTRUCTIVE: Löscht ein Label und seine Regeln. Die E-Mail selbst bleibt erhalten; sie verliert nur dieses Label.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
label_id | string | ja | Label-ID (beginnt mit lbl_) oder der exakte Label-Name. (max. 128 Zeichen) |
{
"name": "delete_label",
"arguments": {
"label_id": "lbl_123"
}
}create_label_ruleEine automatische Ablageregel hinzufügen
Fügt einem Label eine Regel hinzu, damit passende neue E-Mails automatisch abgelegt werden. Jede von Ihnen gesetzte Bedingung muss zutreffen. Mit inbox_id erhält eine Empfangsadresse einen eigenen Ordner; mit skip_inbox bleibt sie aus dem Posteingang heraus.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
label_id | string | ja | Label-ID (beginnt mit lbl_) oder der exakte Label-Name. (max. 128 Zeichen) |
direction | string | nein | Nur in (empfangene) oder out (gesendete) E-Mails. Weglassen für beide. (eines von in, out) |
inbox_id | string | nein | Nur E-Mails, die dieses Postfach empfangen hat (inb_…). Legt jede Empfangsadresse in einem eigenen Ordner ab. |
from | string | nein | Absender enthält diesen Text (Groß-/Kleinschreibung egal), z. B. @stripe.com. (max. 200 Zeichen) |
to | string | nein | To/Cc enthält diesen Text (Groß-/Kleinschreibung egal). (max. 200 Zeichen) |
subject | string | nein | Betreff enthält diesen Text (Groß-/Kleinschreibung egal). (max. 200 Zeichen) |
skip_inbox | boolean | nein | Archiviert passende empfangene E-Mails, sodass sie nur im Label-Ordner erscheinen, nicht im Posteingang. |
apply_to_existing | boolean | nein | Legt auch bereits gespeicherte E-Mails ab, die passen. |
{
"name": "create_label_rule",
"arguments": {
"label_id": "Billing",
"inbox_id": "inb_123",
"skip_inbox": true
}
}delete_label_ruleEine automatische Ablageregel löschen
DESTRUCTIVE: Entfernt eine automatische Ablageregel. Bereits abgelegte E-Mails behalten ihr Label.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
label_id | string | ja | Label-ID (beginnt mit lbl_) oder der exakte Label-Name. (max. 128 Zeichen) |
rule_id | string | ja | Regel-ID (beginnt mit lrule_), aus get_label. (max. 128 Zeichen) |
{
"name": "delete_label_rule",
"arguments": {
"label_id": "lbl_123",
"rule_id": "lrule_123"
}
}label_emailLabels einer E-Mail hinzufügen oder entfernen
Verschiebt eine Nachricht zwischen Ordnern: Labels per Name oder lbl_…-ID hinzufügen und/oder entfernen. Unbekannte Namen in add werden angelegt, es sei denn create ist false.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
email_id | string | ja | E-Mail-ID (beginnt mit em_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
add | string[] | nein | Hinzuzufügende Labels. (0–10 Einträge) |
remove | string[] | nein | Zu entfernende Labels. (0–10 Einträge) |
create | boolean | nein | Legt unbekannte Labels in add an (Standard true). |
{
"name": "label_email",
"arguments": {
"email_id": "em_123",
"add": [
"Billing"
],
"remove": [
"Support"
]
}
}Entwürfe, Anhänge und Absenderidentitäten
list_sending_identitiesVerifizierte Absenderidentitäten auflisten
Adressen und Domains, von denen dieser Workspace jetzt senden kann (verifizierte Domains, ihr Standard-From und aktive Postfachadressen). Rufen Sie das vor send_email auf, um ein gültiges from zu wählen.
Keine Parameter.
{
"name": "list_sending_identities",
"arguments": {}
}create_draftEinen Entwurf erstellen
Erstellt einen Composer-Entwurf. Entwürfe enthalten Anhänge: Erstellen Sie einen Entwurf, rufen Sie upload_attachment auf und senden Sie dann send_email mit draft_id. Sendet nichts.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
from | string | nein | Absenderadresse einer verifizierten Domain (kann beim Entwerfen leer sein). |
to | string[] | nein | Empfänger. (0–100 Einträge) |
cc | string[] | nein | Empfänger in Kopie (Cc). (0–100 Einträge) |
bcc | string[] | nein | Empfänger in Blindkopie (Bcc). (0–100 Einträge) |
subject | string | nein | Betreffzeile. (max. 998 Zeichen) |
html | string | nein | HTML-Body. |
text | string | nein | Plain-Text-Body. |
reply_to_email_id | string | nein | E-Mail-ID, auf die dieser Entwurf antwortet. |
thread_id | string | nein | Thread-ID, zu der dieser Entwurf gehört. |
{
"name": "create_draft",
"arguments": {
"from": "hello@example.com",
"to": [
"owner@example.com"
],
"subject": "Invoice"
}
}list_draftsEntwürfe auflisten
Listet Composer-Entwürfe auf, zuletzt aktualisierte zuerst. Paginiert: Das Ergebnis enthält pagination {offset, limit, returned, total?, has_more, next_offset}.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
limit | integer | nein | Seitengröße. Standard 50. (Standard 50; 1–200) |
offset | integer | nein | Anzahl der zu überspringenden Datensätze. Verwenden Sie pagination.next_offset der vorherigen Seite. (Standard 0; 0–…) |
{
"name": "list_drafts",
"arguments": {}
}get_draftEinen Entwurf abrufen
Ruft einen Entwurf mit seinen Anhangsmetadaten ab.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
draft_id | string | ja | Entwurfs-ID (beginnt mit dr_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "get_draft",
"arguments": {
"draft_id": "dr_123"
}
}update_draftEntwurfsinhalt ersetzen
Ersetzt Inhalt und Empfänger eines Entwurfs. Das ist ein vollständiger Ersatz: Weggelassene Felder werden geleert, lesen Sie daher zuerst get_draft und senden Sie jedes Feld mit, das erhalten bleiben soll. Anhänge bleiben unberührt.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
draft_id | string | ja | Entwurfs-ID (beginnt mit dr_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
from | string | nein | Absenderadresse einer verifizierten Domain (kann beim Entwerfen leer sein). |
to | string[] | nein | Empfänger. (0–100 Einträge) |
cc | string[] | nein | Empfänger in Kopie (Cc). (0–100 Einträge) |
bcc | string[] | nein | Empfänger in Blindkopie (Bcc). (0–100 Einträge) |
subject | string | nein | Betreffzeile. (max. 998 Zeichen) |
html | string | nein | HTML-Body. |
text | string | nein | Plain-Text-Body. |
reply_to_email_id | string | nein | E-Mail-ID, auf die dieser Entwurf antwortet. |
thread_id | string | nein | Thread-ID, zu der dieser Entwurf gehört. |
{
"name": "update_draft",
"arguments": {
"draft_id": "dr_123",
"from": "hello@example.com",
"to": [
"owner@example.com"
],
"subject": "Invoice (updated)",
"text": "Attached."
}
}delete_draftEinen Entwurf verwerfen
DESTRUCTIVE: Verwirft einen Entwurf und löscht seine gespeicherten Anhänge dauerhaft.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
draft_id | string | ja | Entwurfs-ID (beginnt mit dr_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "delete_draft",
"arguments": {
"draft_id": "dr_123"
}
}upload_attachmentEinen Anhang zu einem Entwurf hochladen
Lädt eine Datei zu einem Entwurf hoch (max. 10 Dateien und insgesamt 10 MB pro Nachricht). Geben Sie content_base64 oder einen lokalen file_path an. Anhänge erfordern beim Senden einen bezahlten Tarif.
Geben Sie mindestens eines an: content_base64, file_path.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
draft_id | string | ja | Entwurfs-ID (beginnt mit dr_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
filename | string | nein | Dateiname, den der Empfänger sieht. Standard ist der Basisname von file_path. (max. 255 Zeichen) |
content_type | string | nein | MIME-Typ, z. B. application/pdf. Standard ist application/octet-stream. |
content_base64 | string | nein | Standard-Base64-Dateiinhalt. |
file_path | string | nein | Absoluter Pfad einer lokalen Datei, die der MCP-Serverprozess lesen kann. |
{
"name": "upload_attachment",
"arguments": {
"draft_id": "dr_123",
"filename": "invoice.pdf",
"content_type": "application/pdf",
"file_path": "/tmp/invoice.pdf"
}
}download_attachmentEinen Anhang herunterladen
Lädt einen privaten Anhang herunter (gesendet, empfangen oder aus einem Entwurf). Gibt Base64-Inhalt zurück oder schreibt die Datei, wenn save_to_path gesetzt ist (überschreibt nicht, außer overwrite ist true).
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
attachment_id | string | ja | Anhangs-ID (beginnt mit att_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
save_to_path | string | nein | Optionaler absoluter lokaler Pfad, in den die Datei geschrieben wird, statt Base64 zurückzugeben. |
overwrite | boolean | nein | Erlaubt das Ersetzen einer vorhandenen Datei unter save_to_path. Standard false. |
{
"name": "download_attachment",
"arguments": {
"attachment_id": "att_123",
"save_to_path": "/tmp/invoice.pdf"
}
}delete_attachmentEinen Anhang löschen
DESTRUCTIVE: Löscht einen gespeicherten Anhang dauerhaft (zum Beispiel, um vor dem Senden eine Datei aus einem Entwurf zu entfernen).
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
attachment_id | string | ja | Anhangs-ID (beginnt mit att_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "delete_attachment",
"arguments": {
"attachment_id": "att_123"
}
}Gehostete Templates
list_templatesGehostete Templates auflisten
Listet gehostete E-Mail-Templates mit Veröffentlichungsstatus und Nutzung auf. Paginiert: Das Ergebnis enthält pagination {offset, limit, returned, total?, has_more, next_offset}.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
lifecycle | string | nein | active (Standard), archived oder all. (eines von active, archived, all) |
query | string | nein | Suche nach Name oder Key. (max. 120 Zeichen) |
limit | integer | nein | Seitengröße. Standard 50. (Standard 50; 1–200) |
offset | integer | nein | Anzahl der zu überspringenden Datensätze. Verwenden Sie pagination.next_offset der vorherigen Seite. (Standard 0; 0–…) |
{
"name": "list_templates",
"arguments": {
"lifecycle": "active"
}
}create_templateEin gehostetes Template erstellen
Erstellt ein Template mit bearbeitbarem Entwurf, optional aus einer Vorlage (welcome, reset, receipt oder blank). Veröffentlichen Sie es, bevor Sie per Key senden.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name | string | ja | Name für Menschen. (max. 120 Zeichen) |
key | string | nein | Stabiler Sende-Key: Kleinbuchstaben, Ziffern, Bindestriche; beginnt mit einem Buchstaben (2–64 Zeichen). Wird aus dem Namen abgeleitet, wenn er fehlt. |
starter | string | nein | Startinhalt. (eines von blank, welcome, reset, receipt) |
{
"name": "create_template",
"arguments": {
"name": "Account welcome",
"key": "account-welcome",
"starter": "welcome"
}
}get_templateEin Template abrufen
Ruft den aktuellen Entwurf eines Templates (mit revision), das aktive veröffentlichte Release, den Release-Verlauf und die Nutzung ab. Akzeptiert ID oder Key.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
template_id | string | ja | Template-ID (tmpl_…) oder Key. (max. 128 Zeichen) |
{
"name": "get_template",
"arguments": {
"template_id": "account-welcome"
}
}update_template_draftEinen Template-Entwurf speichern
Speichert den bearbeitbaren Entwurf des Templates mit optimistischer Nebenläufigkeitskontrolle: Übergeben Sie die aktuelle revision aus get_template (409 bedeutet, dass jemand anderes zuerst gespeichert hat; erneut lesen und wiederholen). Das ist ein vollständiger Ersatz des Entwurfsinhalts: Weggelassene Felder werden geleert, senden Sie daher jedes Feld mit, das erhalten bleiben soll. Verwenden Sie {{variable}}-Platzhalter.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
template_id | string | ja | Template-ID oder Key. (max. 128 Zeichen) |
revision | integer | ja | Aktuelle Entwurfsrevision aus get_template. (1–…) |
name | string | nein | Template-Name. (max. 120 Zeichen) |
subject_template | string | nein | Betreff mit Platzhaltern. (max. 998 Zeichen) |
preheader_template | string | nein | Vorschautext. (max. 240 Zeichen) |
html_template | string | nein | HTML-Body mit Platzhaltern. |
text_template | string | nein | Plain-Text-Body mit Platzhaltern. |
from | string | nein | Standardabsender für Versände dieses Templates. |
reply_to | string | nein | Standard-Reply-To. |
variables | object[] | nein | Typisierter Variablenvertrag. Jeder Eintrag: {key (Kleinbuchstaben/Unterstriche), label, type: text|number|url|boolean, required (Standard true), fallback, description}. |
variables[].key | string | ja | |
variables[].label | string | nein | |
variables[].type | string | nein | (eines von text, number, url, boolean) |
variables[].required | boolean | nein | |
variables[].fallback | any | nein | |
variables[].description | string | nein | |
sample_data | object | nein | Beispielwerte für Vorschauen und 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_draftEinen neuen Entwurf aus dem veröffentlichten Release beginnen
Erstellt einen neuen bearbeitbaren Entwurf als Kopie des aktuellen veröffentlichten Releases (409, wenn bereits ein Entwurf existiert oder nichts veröffentlicht ist).
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
template_id | string | ja | Template-ID oder Key. (max. 128 Zeichen) |
{
"name": "create_template_draft",
"arguments": {
"template_id": "account-welcome"
}
}render_templateEine Template-Vorschau rendern
Rendert die exakte Server-Ausgabe (subject, html, text) für den Entwurf, das veröffentlichte Release oder eine bestimmte Version mit den angegebenen Daten. Sendet nichts. Gibt 422 mit findings zurück, wenn Daten den Variablenvertrag verletzen.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
template_id | string | ja | Template-ID oder Key. (max. 128 Zeichen) |
version_id | string | nein | Optionale Versions-ID; Standard ist der Entwurf, dann das veröffentlichte Release. |
data | object | nein | Variablenwerte; Standard sind die Beispieldaten der Version. |
{
"name": "render_template",
"arguments": {
"template_id": "account-welcome",
"data": {
"first_name": "Asha"
}
}
}send_template_testEine Test-E-Mail für ein Template senden
SENDS REAL EMAIL. Sendet einen mit [Test] präfixierten Snapshot des Entwurfs (oder einer angegebenen Version) an die angegebenen Empfänger. Zählt auf die Nutzung an; Workspaces in der Testphase können nur an die Konto-E-Mail-Adresse oder eine SES-Simulatoradresse senden.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
template_id | string | ja | Template-ID oder Key. (max. 128 Zeichen) |
to | string[] | ja | Testempfänger. (1–100 Einträge) |
from | string | nein | Absender auf einer verifizierten Domain; Standard ist das From des Templates. |
version_id | string | nein | Optionale Versions-ID. |
data | object | nein | Variablenwerte; Standard sind die Beispieldaten. |
{
"name": "send_template_test",
"arguments": {
"template_id": "account-welcome",
"to": [
"owner@example.com"
]
}
}publish_templateEin Template-Release veröffentlichen
Veröffentlicht den aktuellen Entwurf als unveränderliches Release, das send_email mit template.key verwendet. Schlägt mit 422 findings bei Validierungsfehlern fehl oder mit 409, wenn es den aktiven Variablenvertrag eines bereits produktiv genutzten Templates brechen würde.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
template_id | string | ja | Template-ID oder Key. (max. 128 Zeichen) |
{
"name": "publish_template",
"arguments": {
"template_id": "account-welcome"
}
}archive_templateEin Template archivieren
Stoppt neue Versände mit diesem Template (der Verlauf bleibt erhalten; mit restore_template umkehrbar). Jede Integration, die diesen Key sendet, schlägt dann mit 404 fehl.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
template_id | string | ja | Template-ID oder Key. (max. 128 Zeichen) |
{
"name": "archive_template",
"arguments": {
"template_id": "account-welcome"
}
}restore_templateEin archiviertes Template wiederherstellen
Macht ein archiviertes Template wieder aktiv.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
template_id | string | ja | Template-ID oder Key. (max. 128 Zeichen) |
{
"name": "restore_template",
"arguments": {
"template_id": "account-welcome"
}
}Domains und DNS
list_domainsDomains auflisten
Listet Absenderdomains mit aggregiertem setup_status (verified | checking | pending), DNS-Status pro Eintrag und Inbound-Status auf. Kann langsam sein: Nicht verifizierte Domains werden live neu geprüft. Paginiert: Das Ergebnis enthält pagination {offset, limit, returned, total?, has_more, next_offset}.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
limit | integer | nein | Seitengröße. Standard 50. (Standard 50; 1–200) |
offset | integer | nein | Anzahl der zu überspringenden Datensätze. Verwenden Sie pagination.next_offset der vorherigen Seite. (Standard 0; 0–…) |
{
"name": "list_domains",
"arguments": {}
}get_domainDomain-Setup-Details abrufen
Ruft eine Domain mit den exakt zu veröffentlichenden DNS-Einträgen (type, name, value), dem Live-Status jedes Eintrags von zwei öffentlichen Resolvern, dns_issues samt Lösungen und dem Inbound-Status ab.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
domain_id | string | ja | Domain-ID (beginnt mit dom_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "get_domain",
"arguments": {
"domain_id": "dom_123"
}
}add_domainEine Absenderdomain hinzufügen
Registriert eine Domain, die Sie kontrollieren, für den Versand. Gibt die DNS-Einträge (SES-Easy-DKIM-CNAMEs) zurück, die der Inhaber veröffentlichen muss. Ändert das DNS nicht selbst. Zählt auf das Domain-Limit des Tarifs an.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
name | string | ja | Reiner Domainname, z. B. example.com oder mail.example.com. (max. 253 Zeichen) |
default_from | string | nein | Optionale Standard-Absenderadresse dieser Domain. |
{
"name": "add_domain",
"arguments": {
"name": "example.com"
}
}verify_domainEine Domain verifizieren
Führt jetzt eine Live-Prüfung von SES/DNS durch. Kann bedenkenlos wiederholt werden; fragen Sie nach DNS-Änderungen alle 30–60 s ab (die Propagierung kann Minuten bis Stunden dauern). Senden ist erlaubt, sobald der Status verified ist.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
domain_id | string | ja | Domain-ID (beginnt mit dom_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "verify_domain",
"arguments": {
"domain_id": "dom_123"
}
}delete_domainEine Domain löschen
DESTRUCTIVE: Entfernt die Domain aus dem Workspace, einschließlich ihrer Inbound-Empfangsroute. Versände von ihr schlagen danach sofort fehl. DNS-Einträge bei Ihrem DNS-Provider werden dabei nicht gelöscht.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
domain_id | string | ja | Domain-ID (beginnt mit dom_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "delete_domain",
"arguments": {
"domain_id": "dom_123"
}
}get_dns_providerDNS-Provider und Eintrags-Hosts erkennen
Erkennt den maßgeblichen DNS-Provider der Domain und gibt für jeden Eintrag den relativen Host zurück, der bei diesem Provider einzutragen ist, dazu den empfohlenen DMARC-Eintrag, MX-Hinweise für Inbound und die Angabe, ob die Einrichtung per Klick (Domain Connect) verfügbar ist.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
domain_id | string | ja | Domain-ID (beginnt mit dom_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "get_dns_provider",
"arguments": {
"domain_id": "dom_123"
}
}get_domain_connect_linkEinen DNS-Einrichtungslink für die Einrichtung per Klick abrufen
Wenn get_dns_provider providers.domainConnect.available meldet, erstellen Sie eine signierte Zustimmungs-URL. Geben Sie sie dem Menschen: Er öffnet sie und bestätigt die DNS-Änderung bei seinem Provider. Bis dahin ändert sich nichts. 409, falls nicht unterstützt.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
domain_id | string | ja | Domain-ID (beginnt mit dom_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "get_domain_connect_link",
"arguments": {
"domain_id": "dom_123"
}
}Eingehende E-Mails
setup_inboundInbound-Empfang für eine Domain aktivieren
Richtet SES-Inbound-Empfang für eine verifizierte Domain ein. Verwendet die Root-Domain, wenn sie keinen kollidierenden MX hat, andernfalls inbound.<domain>. Gibt den MX-Eintrag zurück, den der Inhaber veröffentlichen muss; das DNS wird nicht bearbeitet.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
domain_id | string | ja | Domain-ID (beginnt mit dom_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "setup_inbound",
"arguments": {
"domain_id": "dom_123"
}
}verify_inboundInbound-MX verifizieren
Prüft den Inbound-MX-Eintrag erneut. Der Status wird ready, wenn beide öffentlichen Resolver ihn sehen.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
domain_id | string | ja | Domain-ID (beginnt mit dom_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "verify_inbound",
"arguments": {
"domain_id": "dom_123"
}
}list_inboxesInbound-Adressen auflisten
Listet Empfangsadressen auf, optional für eine Domain. Paginiert: Das Ergebnis enthält pagination {offset, limit, returned, total?, has_more, next_offset}.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
domain_id | string | nein | Optionaler Filter nach Domain-ID. |
limit | integer | nein | Seitengröße. Standard 50. (Standard 50; 1–200) |
offset | integer | nein | Anzahl der zu überspringenden Datensätze. Verwenden Sie pagination.next_offset der vorherigen Seite. (Standard 0; 0–…) |
{
"name": "list_inboxes",
"arguments": {
"domain_id": "dom_123"
}
}get_inboxEin Postfach abrufen
Ruft eine Inbound-Adresse ab.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
inbox_id | string | ja | Postfach-ID (beginnt mit inb_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "get_inbox",
"arguments": {
"inbox_id": "inb_123"
}
}create_inboxEine Inbound-Adresse erstellen
Erstellt eine Adresse wie support@<receiving domain> auf einer Domain, deren Inbound-Status ready ist (führen Sie zuvor setup_inbound und verify_inbound aus). Empfangene E-Mails erscheinen in list_emails mit direction in.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
domain_id | string | ja | Domain-ID (beginnt mit dom_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
local_part | string | ja | Teil vor dem @, z. B. support. (max. 64 Zeichen) |
name | string | nein | Optionaler Anzeigename. |
{
"name": "create_inbox",
"arguments": {
"domain_id": "dom_123",
"local_part": "support",
"name": "Support"
}
}update_inboxEin Postfach umbenennen, aktivieren oder deaktivieren
Benennt ein Postfach um oder setzt seinen Status auf active / disabled.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
inbox_id | string | ja | Postfach-ID (beginnt mit inb_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
name | string | nein | Neuer Anzeigename. |
status | string | nein | Neuer Status. (einer von active, disabled) |
{
"name": "update_inbox",
"arguments": {
"inbox_id": "inb_123",
"status": "disabled"
}
}set_inbox_forwardingEin Postfach an eine andere Adresse weiterleiten
SENDS REAL EMAIL, wenn an jemand anderen als den Kontoinhaber weitergeleitet wird: Legt fest, wohin die empfangenen E-Mails eines Postfachs weitergeleitet werden. Die eigene Adresse des Inhabers wird sofort aktiv; jede andere Adresse erhält eine Bestätigungs-E-Mail, und die Weiterleitung bleibt pending, bis dort jemand bestätigt. Übergeben Sie forward_to: null, um die Weiterleitung auszuschalten. Weitergeleitete Kopien kommen von der Postfachadresse, mit dem ursprünglichen Absender als Reply-To.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
inbox_id | string | ja | Postfach-ID (beginnt mit inb_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
forward_to | string,null | ja | Zieladresse für die Weiterleitung oder null, um die Weiterleitung auszuschalten. (max. 254 Zeichen) |
{
"name": "set_inbox_forwarding",
"arguments": {
"inbox_id": "inb_123",
"forward_to": "team@example.net"
}
}delete_inboxEin Postfach löschen
DESTRUCTIVE: Löscht eine Inbound-Adresse. Bereits empfangene E-Mails bleiben erhalten; neue E-Mails an die Adresse werden ihr nicht mehr zugeordnet.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
inbox_id | string | ja | Postfach-ID (beginnt mit inb_), wie sie ein List- oder Create-Tool zurückgibt. (max. 128 Zeichen) |
{
"name": "delete_inbox",
"arguments": {
"inbox_id": "inb_123"
}
}Zustellbarkeit, Bounces und Sperrliste
deliverability_statsZustellstatistiken der letzten 30 Tage abrufen
Workspace-weite Summen der letzten 30 Tage: sent, delivery, bounce, complaint, reject, open, click und deliveryRate (%).
Keine Parameter.
{
"name": "deliverability_stats",
"arguments": {}
}list_sender_reputationAbsenderreputation auflisten
Reputationsstatus pro exakter Absenderadresse: active, throttled (niedrigeres Tageslimit) oder paused (Versände liefern 423), mit Grund und Tageslimit. Prüfen Sie das, wenn Versände mit 423 oder 429 fehlschlagen. Paginiert: Das Ergebnis enthält pagination {offset, limit, returned, total?, has_more, next_offset}.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
limit | integer | nein | Seitengröße. Standard 50. (Standard 50; 1–200) |
offset | integer | nein | Anzahl der zu überspringenden Datensätze. Verwenden Sie pagination.next_offset der vorherigen Seite. (Standard 0; 0–…) |
{
"name": "list_sender_reputation",
"arguments": {}
}list_suppressionsSperrliste auflisten
Sperrliste des Workspace: Empfänger, die nach einem permanenten Bounce oder einer Spam-Beschwerde blockiert wurden. Versände an sie schlagen mit 422 fehl. Paginiert: Das Ergebnis enthält pagination {offset, limit, returned, total?, has_more, next_offset}.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
limit | integer | nein | Seitengröße. Standard 50. (Standard 50; 1–200) |
offset | integer | nein | Anzahl der zu überspringenden Datensätze. Verwenden Sie pagination.next_offset der vorherigen Seite. (Standard 0; 0–…) |
{
"name": "list_suppressions",
"arguments": {}
}remove_suppressionEine Bounce-Sperre entfernen
DESTRUCTIVE (schwächt eine Schutzsperre ab): Entfernt eine Bounce-Sperre, damit die Adresse wieder angeschrieben werden kann. Tun Sie das nur, wenn der Mensch bestätigt, dass die Adresse jetzt gültig ist. Sperren wegen Beschwerden können nicht entfernt werden (409).
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
email | string | ja | Gesperrte Empfängeradresse. (max. 320 Zeichen) |
{
"name": "remove_suppression",
"arguments": {
"email": "fixed-mailbox@example.net"
}
}list_blocked_recipientsBlockierte Empfänger auflisten
Jeder Empfänger, den SendHQ ablehnt: Bounces, Beschwerden und domainbezogene Marketing-Abmeldungen, mit einer Zusammenfassung nach Art. Liest bis zu die neuesten 500. Paginiert: Das Ergebnis enthält pagination {offset, limit, returned, total?, has_more, next_offset}.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
limit | integer | nein | Seitengröße. Standard 50. (Standard 50; 1–200) |
offset | integer | nein | Anzahl der zu überspringenden Datensätze. Verwenden Sie pagination.next_offset der vorherigen Seite. (Standard 0; 0–…) |
{
"name": "list_blocked_recipients",
"arguments": {}
}Konto, Nutzung, Analytics und Schlüssel
get_accountKonto, Nutzung und Abrechnung abrufen
E-Mail-Adresse des Kontoinhabers, Tarif/Zugriffsstufe, in der aktuellen Periode genutzte Empfängerzustellungen im Vergleich zum Kontingent, genutzte Domains im Vergleich zum Limit, Anhangstransfer, Reputationszusammenfassung, Abostatus, veröffentlichte Tarife und Workspace-Zähler. Nutzen Sie es, um das verbleibende Kontingent zu prüfen oder zu sehen, an wen die Testphase zustellen kann (die Konto-E-Mail-Adresse).
Keine Parameter.
{
"name": "get_account",
"arguments": {}
}get_analyticsVersand-Analytics abrufen
Dashboard-Analytics für die letzten 7, 30 oder 90 Tage: Summen für gesendet/empfangen/zugestellt/gebounct/blockiert/geöffnet/geklickt/Beschwerden, ein tageweiser Verlauf, die wichtigsten Absenderdomains und die häufigsten Betreffs.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
days | integer | nein | Zeitfenster in Tagen: 7, 30 (Standard) oder 90. (eines von 7, 30, 90) |
{
"name": "get_analytics",
"arguments": {
"days": 30
}
}list_api_keysMetadaten zu API-Schlüsseln auflisten
Listet Namen, nicht geheime Präfixe und Zeitpunkte der letzten Nutzung von API-Schlüsseln auf. Nur lesend: Dieser MCP-Server kann keine Schlüssel erstellen, rotieren oder widerrufen; das erledigt ein Mensch im Dashboard. Paginiert: Das Ergebnis enthält pagination {offset, limit, returned, total?, has_more, next_offset}.
| Parameter | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
limit | integer | nein | Seitengröße. Standard 50. (Standard 50; 1–200) |
offset | integer | nein | Anzahl der zu überspringenden Datensätze. Verwenden Sie pagination.next_offset der vorherigen Seite. (Standard 0; 0–…) |
{
"name": "list_api_keys",
"arguments": {}
}get_service_healthDen Dienststatus von SendHQ prüfen
Prüft, ob die SendHQ API erreichbar ist und welcher Mail-Provider aktiv ist. Benötigt keinen gültigen API-Schlüssel.
Keine Parameter.
{
"name": "get_service_health",
"arguments": {}
}Abdeckung der API
Jede Operation der öffentlichen API und das Tool, das sie abdeckt. Alles, was ein Nutzer im Dashboard tun kann und wofür es eine API gibt, ist abgedeckt; die folgenden Ausnahmen sind beabsichtigt.
| Endpunkt | Tool | Hinweise |
|---|---|---|
| POST /emails | send_email | Eine E-Mail senden |
| POST /emails/batch | send_batch | Bis zu 100 individualisierte Nachrichten senden |
| GET /emails | list_emails | Gesendete und empfangene E-Mails auflisten |
| GET /emails/:id | get_email | Eine E-Mail mit ihren Anhängen abrufen |
| PATCH /emails/:id | mark_email | Gelesen-Status, Archivierung, Spam, Kategorie oder Wichtigkeit aktualisieren |
| POST /emails/:id/labels | label_email | Labels einer E-Mail hinzufügen oder entfernen |
| DELETE /emails/:id | delete_email | Eine gespeicherte E-Mail löschen |
| GET /emails/:id/events | list_email_events | Zustell-Events einer E-Mail auflisten |
| GET /threads/:id | get_thread | Eine Unterhaltung chronologisch abrufen |
| GET /labels | list_labels | Labels mit Nachrichtenzahlen und Ablageregeln auflisten |
| POST /labels | create_label | Ein Label erstellen, optional mit automatischen Ablageregeln |
| GET /labels/:id | get_label | Ein Label per ID oder Name abrufen |
| PATCH /labels/:id | update_label | Ein Label umbenennen, umfärben oder zum Bucket machen |
| DELETE /labels/:id | delete_label | Ein Label löschen, ohne seine E-Mails zu löschen |
| POST /labels/:id/rules | create_label_rule | Einem Label eine automatische Ablageregel hinzufügen |
| DELETE /labels/:id/rules/:rule_id | delete_label_rule | Eine automatische Ablageregel löschen |
| POST /drafts | create_draft | Einen Composer-Entwurf erstellen |
| GET /drafts | list_drafts | Composer-Entwürfe auflisten |
| GET /drafts/:id | get_draft | Einen Entwurf und Anhänge abrufen |
| PUT /drafts/:id | update_draft | Entwurfsinhalt ersetzen |
| DELETE /drafts/:id | delete_draft | Einen Entwurf verwerfen |
| POST /drafts/:id/attachments | upload_attachment | Einen Anhang zu einem Entwurf hochladen |
| GET /attachments/:id | download_attachment | Einen privaten Anhang herunterladen |
| DELETE /attachments/:id | delete_attachment | Einen privaten Anhang löschen |
| GET /sending-identities | list_sending_identities | Verifizierte Absenderidentitäten auflisten |
| GET /templates | list_templates | Gehostete Templates auflisten |
| POST /templates | create_template | Ein gehostetes Template erstellen |
| GET /templates/:id | get_template | Entwürfe, Releases und Nutzung abrufen |
| PUT /templates/:id/draft | update_template_draft | Einen Template-Entwurf automatisch speichern |
| POST /templates/:id/draft | create_template_draft | Einen neuen Entwurf aus dem veröffentlichten Release erstellen |
| POST /templates/:id/render | render_template | Die exakte Server-Ausgabe rendern |
| POST /templates/:id/test | send_template_test | Einen Test-Snapshot senden |
| POST /templates/:id/publish | publish_template | Ein unveränderliches Template-Release veröffentlichen |
| POST /templates/:id/archive | archive_template | Ein Template archivieren |
| POST /templates/:id/restore | restore_template | Ein archiviertes Template wiederherstellen |
| POST /domains | add_domain | Eine Absenderdomain hinzufügen |
| GET /domains | list_domains | Domains und zwischengespeicherten DNS-Status auflisten |
| GET /domains/:id | get_domain | Domain-Setup-Details abrufen |
| POST /domains/:id/verify | verify_domain | SES- und DNS-Verifizierung aktualisieren |
| POST /domains/:id/inbound/setup | setup_inbound | SES-Inbound-Empfang einrichten |
| POST /domains/:id/inbound/verify | verify_inbound | Inbound-MX-Routing verifizieren |
| DELETE /domains/:id | delete_domain | Eine Domain löschen |
| GET /dns/provider | get_dns_provider | Den maßgeblichen DNS-Provider und die relativen Eintrags-Hosts erkennen |
| GET /dns/domain-connect/connect | get_domain_connect_link | Einen Domain-Connect-Zustimmungslink für die DNS-Einrichtung per Klick erstellen |
| POST /inboxes | create_inbox | Eine Inbound-Adresse erstellen |
| GET /inboxes | list_inboxes | Inbound-Adressen auflisten |
| GET /inboxes/:id | get_inbox | Eine Inbound-Adresse abrufen |
| PATCH /inboxes/:id | update_inbox | Ein Postfach umbenennen, aktivieren oder deaktivieren |
| PUT /inboxes/:id/forwarding | set_inbox_forwarding | Die empfangenen E-Mails eines Postfachs an eine andere Adresse weiterleiten |
| DELETE /inboxes/:id | delete_inbox | Ein Postfach löschen und die Nachrichten behalten |
| GET /deliverability/stats | deliverability_stats | Zustellstatistiken der letzten 30 Tage abrufen |
| GET /deliverability/reputation | list_sender_reputation | Reputationsstatus pro exakter Absenderidentität auflisten |
| GET /suppressions | list_suppressions | Sperrlisteneinträge des Workspace auflisten |
| DELETE /suppressions/:email | remove_suppression | Eine zulässige Bounce-Sperre entfernen |
| GET /blocked-recipients | list_blocked_recipients | Bounces, Beschwerden und Abmeldungen auflisten |
| GET /account | get_account | Konto, Nutzung, Abrechnungsstatus und Workspace-Zähler mit einem API-Schlüssel abrufen |
| GET /analytics | get_analytics | Dashboard-Versand-Analytics für 7, 30 oder 90 Tage abrufen |
| GET /profile | get_account | Reines Sitzungs-Gegenstück zu GET /account; der MCP-Server liest die Route für API-Schlüssel. |
| POST /billing/checkout | nicht verfügbar | Änderungen an der Abrechnung sind bewusst nur in einer Sitzung möglich und erfordern den Kontoinhaber im Dashboard. Der Abrechnungsstatus ist mit get_account lesbar. |
| POST /billing/cancel | nicht verfügbar | Änderungen an der Abrechnung sind bewusst nur in einer Sitzung möglich und erfordern den Kontoinhaber im Dashboard. Der Abrechnungsstatus ist mit get_account lesbar. |
| POST /keys | nicht verfügbar | Bewusst ausgeschlossen: Ein Agent darf keine Zugangsdaten erzeugen oder vernichten. Schlüssel verwaltet ein Mensch im Dashboard. |
| GET /keys | list_api_keys | API-Schlüssel-Metadaten auflisten |
| DELETE /keys/:id | nicht verfügbar | Bewusst ausgeschlossen: Ein Agent darf keine Zugangsdaten erzeugen oder vernichten. Schlüssel verwaltet ein Mensch im Dashboard. |
Bewusst nicht verfügbar
| Fähigkeit | Endpunkte | Grund |
|---|---|---|
| API-Schlüssel erstellen, rotieren, widerrufen oder löschen | POST /keys, DELETE /keys/:id | Bewusst ausgeschlossen: Ein Agent darf keine Zugangsdaten erzeugen oder vernichten. Schlüssel verwaltet ein Mensch im Dashboard. |
| Einen Checkout starten oder ein Abonnement kündigen | POST /billing/checkout, POST /billing/cancel | Änderungen an der Abrechnung sind bewusst nur in einer Sitzung möglich und erfordern den Kontoinhaber im Dashboard. Der Abrechnungsstatus ist mit get_account lesbar. |
| Cloudflare-DNS per Klick (OAuth) | GET /api/dns/cloudflare/connect | Erfordert eine interaktive Browsersitzung und die OAuth-Zustimmung bei Cloudflare. Nutzen Sie stattdessen die Einträge aus get_domain, die Hosts aus get_dns_provider oder get_domain_connect_link. |
| Registrieren, Anmelden, Abmelden, Verknüpfung mit Google-Konto | /api/auth/* | Authentifizierung im Browser durch Menschen; der MCP-Server authentifiziert sich mit einem API-Schlüssel. |
| Kontaktformular für den Support | POST /api/contact | Öffentliches Formular der Marketing-Website für Menschen, keine Workspace-Operation. |
Maschinenlesbarer Katalog: /docs/mcp/tools.json (Schemas, Annotationen, Endpunktzuordnung, Ausnahmen). Markdown-Version dieser Seite: /docs/mcp.md. Mit installierter CLI gibt sendhq commands --format json denselben Katalog aus.