Vaemail

io.github.vaemail由 GitHub 帳號 vaemail 發布v1.2.0更新於 Nov 2, 2026

Email infrastructure for AI agents: send, authenticate domains, track delivery, diagnose issues.

概覽

AI 產生的概覽

VaEmail 讓助理寄送電子報與交易型郵件、管理聯絡人、驗證寄件網域並診斷送達問題。

可以做什麼
  • 準備、確認並追蹤電子報:依名稱找到名單、建立草稿與一次性權杖、經人工確認後執行寄送、以自然語句回報活動狀態
  • 管理聯絡人與受眾:依資料夾列出名單與訂閱人數、查詢單一地址的狀態、匯入或更新聯絡人且不會重新訂閱已退訂者
  • 寄送與檢視交易型郵件:帶冪等鍵排入寄送、試跑檢查、讀取投遞狀態與事件、依條件列出近期郵件
  • 設定並驗證寄件網域:宣告網域、回傳需發布的 DNS 紀錄、重新讀取 SPF、DKIM 與 DMARC
  • 診斷送達率與帳戶狀態:信譽問題與修正建議、被排除的地址、配額與金鑰上限、API 操作稽核紀錄
  • 無需 API 金鑰即可查詢服務支援的能力
適用情境
適合讓助理在無人盯看後台的情況下端到端處理郵件:寄送電子報或應用程式觸發的交易型郵件、接入新的寄件網域,或說明郵件為何落入垃圾郵件匣。批次寄送前查看配額與退訂名單時也有用。
執行需求
透過 npx 以 stdio 在本機執行(需 Node 18+),沒有其他相依套件。需要 VaEmail 帳戶,並在 VAEMAIL_API_KEY 提供由儀表板建立的金鑰,最好為該助理限定權限與上限;除 vaemail_capabilities 外所有工具都需要它。可用 VAEMAIL_BASE_URL 覆寫預設 API 位址。需要連線至 VaEmail API 的網路。
安裝前請注意
寄送無法復原:vaemail_confirmer_envoi 與 vaemail_send_email 標示為破壞性操作,確認權杖僅能使用一次。API 金鑰可寄信並消耗配額,應限定範圍並設定每日上限。發布 DNS 紀錄、建立金鑰、購買方案屬於人工步驟,助理不得聲稱已完成。沙箱金鑰會回滾寫入,不能當作投遞成功的證據。稽核紀錄不含郵件內容,但會記錄參數。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Vaemail,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

VaEmail — email infrastructure for AI agents

[Listed on mcpservers.org]

MCP server and CLI for VaEmail. Give an agent the ability to send email, authenticate a sending domain, track delivery and diagnose deliverability — without a human reading a dashboard in between.

European infrastructure: servers in Germany, sending through Amazon SES Europe.

Install

bash
# Claude Codeclaude mcp add vaemail --env VAEMAIL_API_KEY=swm_your_key -- npx -y vaemail mcp
# Any MCP clientnpx -y vaemail mcp

Or as a config block:

json
{  "mcpServers": {    "vaemail": {      "command": "npx",      "args": ["-y", "vaemail", "mcp"],      "env": { "VAEMAIL_API_KEY": "swm_your_key" }    }  }}

GET /api/v1/me identifies the tenant, key prefix, scopes and mode without returning the secret. Contact operations accept a tenant-unique external_reference for CRM identifiers and upserts.

Use a sandbox API key for integration tests: reads work normally, while every write is validated in a transaction that is always rolled back. No row, job, email, SMS, webhook or outbound HTTP call is emitted, and idempotency keys are not stored. Sandbox write responses carry X-VaEmail-Sandbox: 1 and sandbox: true in JSON objects. A sandbox response is never evidence that an email was delivered.

Check everything is wired up:

bash
npx vaemail init

Tools

ToolWhat it does
vaemail_preparer_envoiPrepares a newsletter draft, resolves the list, optionally sends a test, and returns a recap plus a one-use confirmation token. It never sends or schedules.
vaemail_confirmer_envoiExecutes the scheduled or immediate newsletter prepared with the token, after explicit human confirmation. This is destructive.
vaemail_ou_en_est_ma_campagneWhere a campaign stands, in plain sentences: scheduled, sending, sent, opens, clicks.
vaemail_qui_est_abonneLists by folder with subscriber counts, or the lists and status of one address.
vaemail_importer_contactsAdds contacts to a list (created if missing). Never re-subscribes an unsubscribed address.
vaemail_capabilitiesWhat the service supports. No API key needed.
vaemail_send_emailQueue a transactional email, return its id.
vaemail_validate_emailDry run: would this send go out, and what would block it.
vaemail_get_messageDelivery status and every event for one message.
vaemail_list_messagesRecent messages, filtered by status, tag or recipient.
vaemail_list_domainsSending domains with live SPF, DKIM and DMARC state.
vaemail_create_domainDeclare a domain, return the DNS records to publish.
vaemail_verify_domainRe-read the DNS and report what is authenticated.
vaemail_dns_requirementsThe records a declared domain still needs.
vaemail_diagnose_deliverabilityWhy mail is landing badly, with the actions that fix it.
vaemail_list_bouncesAddresses excluded from sending, and why.
vaemail_get_usageQuota, daily cap on the key, what is left.
vaemail_get_audit_logWhat this key has done, to report it accurately.

Both vaemail_confirmer_envoi and vaemail_send_email advertise destructiveHint: true: sending externally is irreversible. The newsletter confirmation guard applies to immediate sending; drafts and scheduled campaigns keep their existing behavior.

What this is built to prevent

An agent fails differently from a person. It retries, it does not read a dashboard, and it reports success from a 200. The API is shaped around that:

  • A send is accepted, not delivered. vaemail_send_email returns 202 and an id. Only vaemail_get_message says what became of it. The tool descriptions say so, so an agent does not announce a delivery it cannot know about.
  • Retries do not duplicate. Pass idempotency_key and a repeat call replays the first response for 24 hours instead of sending twice.
  • Errors say what to do. Every failure carries a stable code, whether it is retryable, and the corrective action with the endpoint that performs it.
  • Keys are bounded. Scopes, a daily send cap, a cap on recipients per email and an allow-list of sender domains. An agent cannot spend more than the key allows.
  • Every call is logged. Which key, which operation, which parameters, which result — message bodies excluded. Autonomous, but accountable.
  • Human steps are named as such. Publishing DNS records is one. A record whose value still contains a placeholder is flagged publishable: false, because publishing it would break the domain's authentication.

CLI

bash
vaemail init                          # check config, print the MCP snippetvaemail capabilities                  # what the service can do (no key needed)vaemail send --to [email protected] --subject Hi --html '<p>Hello</p>'vaemail status 42                     # delivery status of a messagevaemail domains:add exemple.fr        # declare a domain, print DNS recordsvaemail doctor                        # why is my email not arriving?vaemail usage                         # quota and remaining allowancevaemail mcp                           # run the MCP server on stdio

Add --json to any command for machine-readable output.

Use it as a library

The same client the MCP server and the CLI run on is exported, so an application can call VaEmail directly. No dependencies.

js
import { VaEmail } from 'vaemail';
const client = new VaEmail({ apiKey: process.env.VAEMAIL_API_KEY });
await client.send(  {    to: '[email protected]',    subject: 'Your order is on its way',    html: '<p>Tracking number: 1Z999</p>',  },  'order-4711', // idempotency key: safe to replay for 24 hours);

Errors carry what to do next, not just a status code:

js
try {  await client.send({ to: '[email protected]' });} catch (error) {  error.code;        // DOMAIN_NOT_VERIFIED  error.retryable;   // false  error.pourAgent(); // reason, corrective action, whether to retry}

Also: capabilities(), health(), validate(), getMessage(), listMessages(), listDomains(), addDomain(), verifyDomain(), dnsRecords(), diagnoseDeliverability(), listSuppressions(), removeSuppression(), usage(), auditLogs().

Connecter Stripe

Utilise une clé Stripe restreinte rk_live_ ou rk_test_, avec Customers en lecture et Webhook Endpoints en écriture. Une clé secrète sk_ est refusée. VaEmail ne renvoie aucun secret Stripe : l'état de la connexion expose uniquement les quatre derniers caractères de la clé et du token du webhook.

Routes REST :

  • GET /api/v1/integrations/stripe : lire l'état de la connexion ;
  • POST /api/v1/integrations/stripe : créer ou réconcilier le webhook, avec {"api_key":"rk_live_..."} et la portée settings.write ;
  • DELETE /api/v1/integrations/stripe : supprimer le webhook Stripe puis la connexion locale. Action irréversible, à confirmer explicitement par un humain.

Stripe appelle POST /api/v1/webhooks/stripe/{token}. Cette route publique vérifie Stripe-Signature et ne reçoit pas la clé API VaEmail.

Événements pris en charge et déclencheurs d'automatisation :

Événement StripeDéclencheur VaEmail
invoice.payment_failedstripe_payment_failed (payment_failed)
customer.subscription.createdstripe_subscription_created (subscription_created)
customer.subscription.deletedstripe_subscription_deleted (subscription_deleted)
checkout.session.completedstripe_checkout_completed (checkout_completed)

A Python SDK with the same surface is available: pip install vaemail (https://github.com/vaemail/vaemail-python).

Environment

VariableMeaning
VAEMAIL_API_KEYAccount API key. Created from the dashboard, under « Clés API ».
VAEMAIL_BASE_URLAPI base URL. Defaults to https://app.vaemail.fr.

Also available

Skill and examples

Dependencies

None. Node 18+ for the built-in fetch, and nothing else — a package an agent installs on its own should not pull a dependency tree behind it.

License

MIT

來源:README.md,提交 b11fa33

工具

18

vaemail_preparer_envoi

Préparer l’envoi d’une newsletter

Prépare une newsletter à une liste de contacts sans l’envoyer ni la programmer. Fait tout seul : retrouve la liste par son nom, crée la campagne, envoie un test si demandé, et rend un récapitulatif, un jeton à confirmer et l'audience abonnée à ce jour. l'étalement prévu par la chauffe du domaine et le lien vers la campagne dans l'admin. L’outil vaemail_confirmer_envoi exécute ensuite l’envoi ou la programmation après accord humain explicite. Ne fait jamais : envoyer sans « quand » explicite (sans ce champ, la campagne reste en brouillon, rien ne part) ; inventer une liste (si le nom est ambigu, l'outil rend les candidates et vous choisissez avec l'humain). Utilisez-le dès que quelqu'un dit « envoie / programme la newsletter à … ». Exemple : { "sujet": "Votre budget formation 2026 se ferme le 31 décembre", "contenu": "<p>…</p>", "liste": "L'actu BienveNum", "quand": "2026-09-17 10:00", "test_vers": "[email protected]" }.

輸入參數liste必填quandsujet必填apercucontenu必填test_versnom_interneliste_exclue

vaemail_confirmer_envoi

Confirmer l’envoi d’une newsletter

Exécute l’envoi ou la programmation préparé(e) après confirmation humaine explicite. Le jeton est à usage unique.

輸入參數jeton必填

vaemail_ou_en_est_ma_campagne

Où en est ma campagne ?

Dit où en est une newsletter, en phrases : brouillon, programmée (et pour quand), en cours d'envoi (envoyés, restent), ou terminée (envoyés, ouverts, cliqués, rebonds, désinscriptions). Retrouve la campagne par son numéro ou par un bout de son sujet ; si plusieurs correspondent, rend la liste et vous choisissez. Lecture seule, ne change rien. Utilisez-le pour « ça en est où ? », « elle est partie ? », « combien ont ouvert ? ». Exemple : { "campagne": "budget formation" } ou { "campagne": 60 }.

輸入參數campagne必填

vaemail_qui_est_abonne

Qui est abonné à quoi ?

Sans paramètre : toutes les listes du compte, rangées par dossier, avec le nombre d'abonnés de chacune. Avec une adresse : ses listes, et si elle est désinscrite (auquel cas aucun envoi ne l'atteindra, et il ne faut pas la réabonner). Lecture seule. Utilisez-le avant d'envoyer (pour choisir la liste) et pour « est-ce que untel est inscrit ? ». Exemple : {} ou { "adresse": "[email protected]" }.

輸入參數adresse

vaemail_importer_contacts

Importer des contacts dans une liste

Ajoute des contacts (email, prénom, nom, attributs libres) à une liste, créée si elle n'existe pas. Met à jour les contacts déjà connus. Ne fait jamais : réabonner quelqu'un qui s'est désinscrit (il est ajouté à la liste mais reste désinscrit, aucun envoi ne l'atteindra) ; supprimer quoi que ce soit. Rend un compte-rendu : lignes reçues, lignes ignorées (adresse invalide), abonnés de la liste avant et après. Utilisez-le pour « ajoute ces contacts à … », « importe ce fichier dans … ». Exemple : { "liste": "Prospects salon", "contacts": [{ "email": "[email protected]", "prenom": "Anne", "nom": "Blin", "attributs": { "SOCIETE": "Blin SA" } }] }.

輸入參數liste必填contacts必填

vaemail_capabilities

What VaEmail can do

Return what VaEmail supports: interfaces, capabilities, limits, scopes and region. No API key needed. Call this first when deciding whether VaEmail fits a need.

無需輸入參數。

vaemail_send_email

Send an email

Queue a transactional email and return its id. The call returns as soon as the message is ACCEPTED, not when it is delivered: use vaemail_get_message to find out what happened to it. Pass idempotency_key when retrying so a network timeout cannot send the same message twice.

輸入參數to必填taghtmlsubjectreply_tofrom_namevariablestemplate_ididempotency_key

vaemail_validate_email

Check a send without sending

Dry run: report whether the email would go out, and name what would block it. Sends nothing. Use it right after setup, before the first real message.

輸入參數to必填htmlsubjecttemplate_id

vaemail_get_message

Delivery status of one message

Return the delivery status of a message and every event known about it (delivered, opened, clicked, bounced, complained), plus the transport error when it failed.

輸入參數id必填

vaemail_list_messages

List recent messages

List messages newest first, filtered by status, tag or recipient. Paginate with the returned next_cursor.

輸入參數totaglimitcursorstatus

vaemail_list_domains

List sending domains

List the sending domains of the account with the live state of their SPF, DKIM and DMARC records.

無需輸入參數。

vaemail_create_domain

Declare a sending domain

Declare a domain and return the DNS records to add at the registrar, each with what it is for. Declaring a domain does not authenticate it: the records must be published, then verified. Adding DNS records is a human step — report them, do not claim the domain is ready.

輸入參數domain必填dkim_selectoridempotency_key

vaemail_verify_domain

Verify domain authentication

Read SPF, DKIM and DMARC for a domain in the public DNS and report each record. Without SPF and DMARC, large mailbox providers file the mail as spam.

輸入參數domain必填dkim_selector

vaemail_dns_requirements

DNS records expected for a domain

Return the DNS records a declared domain needs, record by record, with the role of each.

輸入參數domain必填

vaemail_diagnose_deliverability

Why is my email not arriving?

Diagnose deliverability for the account: authentication of every domain, reputation findings (hard bounces, complaints, where the contacts came from) and recommended actions, each with the endpoint that performs it. Answers "why are my emails from example.com landing badly?" in one call.

輸入參數domain

vaemail_list_bounces

Addresses removed from sending

List addresses excluded from sending: hard bounces, complaints and unsubscribes, with the reason for each. Sending to one of them is refused, so read this before retrying a failed recipient.

輸入參數limitsincecursorreason

vaemail_get_usage

Usage, quota and key limits

Return the monthly quota and what is left of it, today's sends, and for the key in use: its scopes, its daily cap and the remaining allowance. Read it before a batch to know whether to stop.

無需輸入參數。

vaemail_get_audit_log

What this key has done

Return the log of API actions: which key, which operation, which parameters, which result. Message bodies are never stored in it. Use it to report exactly what was done.

輸入參數limitsincecursoroperation

版本歷史

2
  1. v1.2.0最新Oct 26, 2026
  2. v1.1.0Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分