npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

mailchannels-sdk

v1.4.0

Published

Node.js SDK to integrate MailChannels Email API into your JavaScript or TypeScript server-side applications.

Readme

MailChannels Node.js SDK

MailChannels Node.js SDK

npm version npm downloads Build Status License TypeScript Node.js

Built and tested against Email API 1.6.0

Node.js SDK to integrate MailChannels Email API into your JavaScript or TypeScript server-side applications.

This library provides a simple way to interact with the MailChannels Email API. It is written in TypeScript and can be used in both JavaScript and TypeScript projects and in different runtimes.

Contents

🚀 Features

This SDK fully supports all features and operations available in the MailChannels Email API. It is actively maintained to ensure compatibility and to quickly add support for new API features as they are released.

Some of the things you can do with the SDK:

  • Send transactional emails
  • Check DKIM, SPF & Domain Lockdown
  • Configure DKIM keys
  • Webhook notifications
  • Manage sub-accounts
  • Retrieve metrics
  • Inspect webhook delivery batches
  • Handle suppressions
  • Run a local simulator for development testing

[!TIP] For a detailed reference mapping each SDK method to its corresponding MailChannels API endpoint reference, see the SDK-API Mapping

📏 Prerequisites

📦 Installation

Add mailchannels-sdk dependency to your project

# npm
npm i mailchannels-sdk

# yarn
yarn add mailchannels-sdk

# pnpm
pnpm add mailchannels-sdk

📚 Usage

To authenticate, you'll need an API key. You can create and manage API keys in Dashboard > Account Settings > API Keys.

Pass your API key while initializing a new MailChannels client.

import { MailChannels } from 'mailchannels-sdk'

const mailchannels = new MailChannels('your-api-key')

Send an email:

const { data, error } = await mailchannels.emails.send({
  from: 'Name <[email protected]>',
  to: '[email protected]',
  subject: 'Test email',
  html: '<p>Hello World</p>'
})

📐 Naming Conventions

Most properties in the MailChannels API use snake_case. To follow JavaScript conventions, the SDK adopts camelCase for all properties. This means:

  • Most options and responses match the API docs, but field names are camelCase rather than snake_case.
  • Some fields are grouped into nested objects or renamed for simplicity and better developer experience.
  • While most fields match the API docs (just with camelCase), a few may be simplified or reorganized to feel more natural for JavaScript developers.

🧪 Local simulator

This package includes a local MailChannels simulator you can run via the CLI. It holds state in memory and emulates the SDK-supported endpoints, letting you develop and test your application locally without hitting the real MailChannels service.

| API | Source | | ----------- | -------------------------------------------------------------------------------------------------------------- | | Email API | src/simulator/email-api.mjs |

[!IMPORTANT] The simulator approximates the MailChannels service for local development and testing. It is not a production implementation and may differ from the live service.

Start the simulator

CLI:

# default: http://127.0.0.1:8787
npx mailchannels-sdk simulate

Programmatically:

import { createSimulator } from 'mailchannels-sdk/simulator'

const simulator = createSimulator()
const simulatorUrl = await simulator.listen()

Options

| Option | Description | Default | | ----------------- | ----------------------- | ----------- | | --port <number> | Port to listen on | 8787 | | --host <host> | Host address | 127.0.0.1 | | --silent | Suppress simulator logs | false |

You can override the bind address with the --host and --port options:

npx mailchannels-sdk simulate --host 127.0.0.1 --port 8787

Disable logs with the --silent option:

npx mailchannels-sdk simulate --silent

Point the SDK at the simulator

Use the optional baseUrl constructor option when creating the client:

import { MailChannels } from 'mailchannels-sdk'

const mailchannels = new MailChannels('local-test-key', {
  baseUrl: 'http://127.0.0.1:8787'
})

const { data, error } = await mailchannels.emails.send({
  from: '[email protected]',
  to: '[email protected]',
  subject: 'Hello from the simulator',
  html: '<p>Local test</p>'
})

What the simulator supports today

  • Email sends and async sends
  • Domain checks
  • DKIM key create, list, rotate, and update
  • Custom tracking domain create, list, update, and delete
  • Webhook enrollment, listing, validation, signing key lookup, and batch inspection
  • Sub-account lifecycle, API keys, SMTP passwords, limits, and usage
  • Engagement, performance, recipient behaviour, sender, volume, and usage metrics
  • Suppression create, list, and delete

Current limitations

  • State is in-memory only and is reset when the process stops
  • Any non-empty X-API-Key is accepted, with separate in-memory state per API key
  • Webhook responses are simulated locally, but the simulator does not yet emit real webhook callbacks to your application
  • Custom tracking domain verification is simulated, but the simulator does not yet check DNS records

The next planned expansion is outbound webhook delivery so client applications can test webhook ingestion flows against the simulator as well.

📬 Using with Nodemailer

The SDK provides a transport for Nodemailer that allows you to send emails using the MailChannels Email API.

Install

# npm
npm i mailchannels-sdk nodemailer && npm i -D @types/nodemailer

# yarn
yarn add mailchannels-sdk nodemailer && yarn add -D @types/nodemailer

# pnpm
pnpm add mailchannels-sdk nodemailer && pnpm add -D @types/nodemailer

Sending

import nodemailer from 'nodemailer'
import { mailchannelsTransport } from 'mailchannels-sdk/nodemailer'

const transport = nodemailer.createTransport(
  mailchannelsTransport({
    apiKey: 'your-api-key',
    sendMode: 'async', // 'async' or 'sync'. Default is 'async'
    // SDK client options: `baseUrl`, `timeout`, `signal`, `retry`
  })
)

transport.sendMail({
  from: '[email protected]',
  to: '[email protected]',
  subject: 'Hello from Nodemailer',
  html: '<p>Hello World</p>',
  mailchannels: {
    // SDK send options: `campaignId`, `tracking`, `transactional`, `unsubscribe`
  }
}, (error, info) => {
  if (error) {
    console.error('Error sending email:', error)
    return;
  }
  console.log('Sent message info:', info)
})

Limitations

The MailChannels Nodemailer transport maps a subset of Nodemailer features to the MailChannels SDK. Some features are not supported or have limitations:

  • Only a single replyTo address is supported
  • Multiple DKIM signatures are not supported
  • For async sends (sendMode: 'async'), the response will have a messageId of null, and both the accepted and rejected arrays will be empty
  • Attachment path, href and other URL fields are not supported
  • MailChannels-specific send options must be passed via the augmented mailchannels field in the sendMail options
  • Some advanced Nodemailer behaviors may be ignored or transformed when mapped to the SDK

🤖 Using with an AI agent

This repository ships a complete agent skill at .agents/skills/mailchannels-js/. It teaches an AI coding agent how to use the mailchannels-sdk package correctly by breaking the documentation down into focused per-topic files with a decision tree so the agent loads only the parts the task actually needs.

Layout:

.agents/skills/mailchannels-js/
├── SKILL.md              # entry point: scope, decision tree, conventions
└── resources/            # focused recipes (sending, attachments, webhooks, …)

Every file is plain Markdown. The skill works with any agent that can be pointed at a directory of context files — Claude Code, Cursor, Codex CLI, Aider, Continue, and similar tools all consume it without modification.

Install

The skill ships inside the mailchannels-sdk npm package. Use npm pack to download the tarball, extract it, and copy the skill directory wherever your agent looks for skills, rules, or context files:

# Make a temp directory to hold the tarball and extracted files:
mkdir /tmp/mc-js-sdk

# Pin the version to match the SDK you have installed — omit the pin to
# grab the latest release:
npm pack --pack-destination /tmp/mc-js-sdk mailchannels-sdk

# Extract the tarball:
tar -xzf /tmp/mc-js-sdk/mailchannels-sdk-*.tgz -C /tmp/mc-js-sdk

# Replace the destination with your agent's path:
mkdir -p <your-agent's-skills-dir>
cp -r /tmp/mc-js-sdk/package/.agents/skills/mailchannels-js <your-agent's-skills-dir>/

# Clean up:
rm -r /tmp/mc-js-sdk

Re-run the same commands when you upgrade the SDK so the skill stays in step with the installed version.

Common destinations:

| Agent | Where to put it | | --- | --- | | Claude Code | .claude/skills/ (project) or ~/.claude/skills/ (user) | | Cursor | .cursor/rules/ (or attach files inline with @) | | Codex CLI | referenced from the project's AGENTS.md | | Aider | referenced from the conventions file in .aider.conf.yml | | Continue | registered as a custom context provider |

If your tool isn't listed, look for the equivalent of "skill", "rule", "context bundle", or "conventions file" — any mechanism that lets the agent read a directory of Markdown will work.

⚖️ License

MIT License

💻 Development

Local development

# Install dependencies
pnpm install

# Build the package
pnpm build

# Run Oxlint
pnpm lint

# Run Vitest
pnpm test
pnpm test:watch

# Run typecheck
pnpm test:types

# Refresh API parity fixtures and README version note
pnpm parity:fixtures

# Run the local simulator
pnpm simulate

# Run a playground script
pnpx jiti playground/emails/send.ts

# Release new version
pnpm release