Notify
Officialnotifycx
Official Node/TypeScript client for Notify — a deliberately minimal transactional email API.
Notify sends email with one HTTPS request. You (or your AI) already render the HTML; Notify delivers it. Domain auth (SPF/DKIM/DMARC), logs, and webhooks included.
Pro is $10 for 10,000 emails · Pricing
What this repo is
This repository is the official client (notifycx) and official MCP (notifycx-mcp). It talks to https://notify.cx over HTTPS.
It does not include Notify’s server, AWS SES credentials, or any way to use Notify’s infrastructure without your own API key from the dashboard. Forks cannot send on Notify’s AWS account.
Related MCP server: SuprSend MCP Server - deprecated
Three ways to send
Context | Prefer |
App / CI / production (Node/TS) |
|
App / any language | Native |
IDE coding agents |
|
First email in minutes
Create an account at notify.cx and copy an API key.
Install and send (sandbox first if you have not verified a domain yet):
npm install notifycximport Notify from 'notifycx'
const notify = new Notify({ apiKey: process.env.NOTIFY_API_KEY! })
// Non-delivering API rehearsal (no SES):
await notify.sendTest({
to: 'you@example.com',
from: 'hello@yourdomain.com',
subject: 'API rehearsal',
html: '<p>Does not deliver</p>',
})
// Production (requires verified domain for custom from):
await notify.send({
to: 'user@example.com',
from: 'Acme <hello@yourdomain.com>',
subject: 'Reset your password',
html: '<p>Click to reset…</p>',
})Prefer html in new code. message and text are also accepted.
Auth
Header:
x-api-key(the SDK sets this for you)Env:
NOTIFY_API_KEY— never commit real keys; never put keys in client bundlesOptional:
NOTIFY_BASE_URL/baseUrlfor local mocks only (defaulthttps://notify.cx)
Responses
Success: { success: true, data: { messageId: "…" } }
Failure: { success: false, error: "…", code: "…" } — the SDK throws NotifyError with status and body.
Security
Call Notify only from server-side code (Route Handlers, Workers, Actions, backends).
Prefer domain-locked
sending_accesskeys in apps; usefull_accessfor MCP / dashboard management.No AWS keys belong in this client. SES runs on Notify’s servers after your authenticated API request.
Native fetch (no SDK)
See examples/fetch-send or:
const res = await fetch('https://notify.cx/api/email/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': process.env.NOTIFY_API_KEY,
},
body: JSON.stringify({
to: 'user@example.com',
from: 'noreply@your-verified-domain.com',
subject: 'Hello',
html: '<p>Sent with fetch.</p>',
}),
})OpenAPI
Vendored copy:
openapi/openapi.yaml(synced from Notify)Interactive: https://notify.cx/api-docs
MCP for coding agents
npx -y notifycx-mcpSet NOTIFY_API_KEY in your MCP server env. Details: mcp/README.md · notify.cx/mcp
Links
Develop
npm test
npm run buildSee CONTRIBUTING.md and MAINTAINING.md.
Available Tools
21 toolsadd_domainA
Add a sending domain and start SPF/DKIM verification. Returns dnsRecords (type/name/value) the user must add at their DNS host — Notify does not publish DNS. After DNS is configured, call check_domain. Then use send_email with a from address on that domain.
Inputs: domain (required), dnsProvider.
bootstrap_confirmA
Confirm the email OTP from bootstrap_start. Returns api_key once — instruct the user to put it in MCP env NOTIFY_API_KEY (do not leave the secret in chat). Then use add_domain / send_email. No NOTIFY_API_KEY required for this call.
Inputs: code (required), email (required), intent, clientHint.
bootstrap_startA
Start Notify agent signup or key recovery without the dashboard. Sends a 6-digit email OTP. No NOTIFY_API_KEY required. Ask the user to paste the code, then call bootstrap_confirm. Requires acceptTerms: true (https://notify.cx/terms).
Inputs: email (required), acceptTerms (required), intent.
check_domainA
Poll SES for domain SPF/DKIM verification status after DNS records were added. Call after add_domain. When both succeed, production send_email with that from domain is unlocked and the plan email limit lifts.
Inputs: domain (required).
create_api_keyA
Create an API key (full_access required). Free plan allows one key. Prefer sending_access + domainId for app keys on Pro+.
Inputs: name (required), domainId, permission.
create_billing_checkoutA
Get a Stripe Checkout URL for Pro or Scale (full_access key). User opens the URL in a browser to pay — not the Notify dashboard.
Inputs: plan.
create_webhookA
Create a Notify webhook for delivery events on a verified domain. Requires Pro or Scale (free plan has 0 webhooks). Use list_domains to get domainId.
Inputs: domainId (required), webhookUrl (required), subscribedEvents (required), matchMode, +2 more.
delete_api_keyB
Deactivate an API key by keyId. Cannot delete the last full_access key.
Inputs: keyId (required).
delete_webhookC
Delete a Notify webhook subscription by id.
Inputs: id (required).
get_domainA
Get one Notify sending domain by hostname, including dnsRecords (type/name/value) and raw DNS tokens for pending verification. Show dnsRecords to the user so they can add them at their hosting provider.
Inputs: domain (required).
get_usageA
Get Notify plan usage and quota (hourly/monthly sends, account_verified). Use when debugging limits or confirming production unlock.
Inputs: no named parameters.
get_webhookC
Get one Notify webhook by id.
Inputs: id (required).
list_api_keysA
List API key metadata for the account (id, name, prefix only — never the full secret).
Inputs: no named parameters.
list_domainsA
List Notify sending domains and verification status (SPF/DKIM). Includes structured dnsRecords (type/name/value) for the user to publish at their DNS host.
Inputs: no named parameters.
list_email_logsA
List recent Notify email delivery logs. Use after a send to check delivery, bounce, open, or click status.
Inputs: page, limit, eventType.
list_webhooksB
List Notify webhook subscriptions (URL, events, domain scope).
Inputs: no named parameters.
regenerate_api_keyA
Rotate an API key secret by keyId. Returns the new api_key once — update NOTIFY_API_KEY / app secrets.
Inputs: keyId (required).
send_emailA
Send transactional email via Notify (password reset, receipt, magic link, invoice, etc.) with a verified from domain. Use when the user wants production delivery. Prefer html for the body. For non-delivering API rehearsal before domain verification, use send_test_email instead.
Inputs: to (required), from (required), subject (required), html, +2 more.
send_test_emailA
API rehearsal for Notify: same request shape as production send but does not deliver and does not count toward quota. Use before domain verification or when testing the HTTP contract. For real inbox delivery, use send_email after verifying SPF/DKIM.
Inputs: to (required), from (required), subject (required), html, +2 more.
test_webhookA
Send a test Notify webhook payload to a URL (does not require an existing subscription id).
Inputs: eventType (required), webhookUrl (required), domainId.
update_webhookC
Update an existing Notify webhook (URL, events, domain scope).
Inputs: id (required), domainId, matchMode, matchFroms, +3 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 21 tools
Each tool targets a distinct resource+action (email send vs test send, webhook CRUD, API key lifecycle, domain verification), and descriptions explicitly steer between near-neighbors like send_email/send_test_email. The only mild overlap is between list_domains, get_domain, and check_domain, which all surface SPF/DKIM verification state, though their verbs still differentiate intent.
Nearly all tools follow a predictable verb_noun pattern (send_email, list_webhooks, create_api_key, delete_webhook). Minor deviations: bootstrap_start/bootstrap_confirm read as noun_verb, and the create/add split (add_domain vs create_webhook/create_api_key) introduces slight inconsistency.
21 tools is on the heavy side, but the surface spans several real sub-domains (sending, domains, API keys, webhooks, billing, onboarding) and each tool maps to a concrete operation. Nothing looks redundant or filler, so the count is defensible rather than bloated.
Webhooks have full CRUD plus test, API keys have create/list/delete/regenerate, and domains cover add/list/get/verify. Gaps exist but are minor: no delete_domain or domain removal path, no single-log retrieval or log filtering, and billing is checkout-only with no subscription management.
Maintenance
Related MCP Connectors
Send transactional email and manage domains, audiences, and broadcasts from any MCP client.
Send email, manage domains, templates, webhooks and broadcasts from your AI agent.
Send, track, and manage transactional and bulk email delivery
Send, track, and manage transactional emails at scale
Related MCP Servers
- AlicenseAqualityBmaintenanceA multi-service email platform for MCP-compatible clients that supports standard email providers, transactional APIs, and local testing environments. It enables users to send and receive emails, monitor service health, and integrate with messaging webhooks like Slack and Discord through natural language commands.104MIT
- AlicenseAqualityBmaintenanceManage your entire notification infrastructure using natural language. Trigger workflows, create users, manage preferences, update tenant branding, and access docs — all from Cursor, Claude Desktop, or Windsurf. 24 tools covering email, SMS, push, WhatsApp, Slack, MS Teams, and in-app notifications.2212MIT

nahook-mcpofficial
AlicenseAqualityDmaintenanceThe official MCP server for Nahook. Manage webhook endpoints, inspect deliveries and delivery attempts, retry failed deliveries, and list environments — directly from Claude, Cursor, Cline, or any MCP-compatible client.121MIT- AlicenseBqualityBmaintenanceOfficial MCP server for Shipmail, enabling agents to manage domains, mailboxes, messages, threads, webhooks, and suppressions via natural language.100837 npm1MIT