| name | lumail |
| version | 0.1.0 |
| tags | ["email","marketing","newsletter","mcp","api","cli"] |
| description | Manage Lumail email marketing platform via CLI and TypeScript SDK.
Use this skill whenever working with email marketing, subscriber management, campaign creation, or any Lumail API interaction. This includes managing subscribers, sending campaigns, tagging contacts, sending transactional emails, verifying emails, tracking events, and running V2 tools.
Common scenarios: - adding or managing email subscribers - creating, updating, or sending campaigns - managing tags and segments - sending transactional emails - verifying email addresses - tracking subscriber events - running V2 AI tools (generate subject lines, writing style, etc.)
Prefer this skill whenever the user mentions "lumail", "email campaign", "subscribers", "newsletter", "email marketing", "lumail cli", "send email", "email list", "tags", or any email marketing task. |
Lumail - Email Marketing CLI & SDK
Interact with the Lumail API using either the CLI (pnpm lumail) or the TypeScript SDK (import { Lumail } from "@/lib/lumail-sdk").
Quick Start
pnpm lumail auth set <your-api-key>
pnpm lumail auth test
CLI Reference
All CLI commands run via pnpm lumail <command>. Every command supports global flags.
Global Flags
| Flag | Description |
|---|
--json | Output as JSON |
--format <text|json|csv> | Output format (default: text) |
--verbose | Enable debug logging |
--no-color | Disable colored output |
--no-header | Omit table headers (for piping) |
Authentication
pnpm lumail auth set <token>
pnpm lumail auth show
pnpm lumail auth show --raw
pnpm lumail auth remove
pnpm lumail auth test
Subscribers
pnpm lumail subscribers create --email user@example.com --name "John" --tags vip beta
pnpm lumail subscribers get user@example.com
pnpm lumail subscribers update user@example.com --name "John Doe"
pnpm lumail subscribers update user@example.com --tags premium --replace-tags
pnpm lumail subscribers delete user@example.com
pnpm lumail subscribers unsubscribe user@example.com
pnpm lumail subscribers add-tags user@example.com --tags vip premium
pnpm lumail subscribers remove-tags user@example.com --tags old-tag
pnpm lumail subscribers events user@example.com --take 50 --order desc
Campaigns
pnpm lumail campaigns list
pnpm lumail campaigns list --status DRAFT --page 1 --limit 50
pnpm lumail campaigns list --query "welcome" --json
pnpm lumail campaigns create --subject "Welcome!" --name "Welcome Campaign"
pnpm lumail campaigns get <campaignId>
pnpm lumail campaigns update <campaignId> --subject "Updated Subject" --preview "Preview text"
pnpm lumail campaigns delete <campaignId>
pnpm lumail campaigns send <campaignId>
pnpm lumail campaigns send <campaignId> --scheduled-at 2025-12-25T10:00:00Z --timezone UTC
Tags
pnpm lumail tags list
pnpm lumail tags create --name "premium"
pnpm lumail tags get premium
pnpm lumail tags update <id> --name "gold"
Emails (Transactional)
pnpm lumail emails send \
--to user@example.com \
--from noreply@yourdomain.com \
--subject "Order Confirmation" \
--content "Your order #123 is confirmed." \
--content-type MARKDOWN
pnpm lumail emails send --to x --from y --subject z --content "Hello" --transactional
pnpm lumail emails verify user@example.com
Events
pnpm lumail events create \
--type SUBSCRIBER_PAYMENT \
--subscriber user@example.com \
--data '{"amount": 99, "plan": "pro"}'
Event types: SUBSCRIBED, UNSUBSCRIBED, TAG_ADDED, TAG_REMOVED, EMAIL_OPENED, EMAIL_CLICKED, EMAIL_SENT, EMAIL_RECEIVED, WORKFLOW_STARTED, WORKFLOW_COMPLETED, WORKFLOW_CANCELED, FIELD_UPDATED, EMAIL_BOUNCED, EMAIL_COMPLAINED, WEBHOOK_EXECUTED, SUBSCRIBER_PAYMENT, SUBSCRIBER_REFUND
Tools (V2 API)
The V2 tools API provides 59+ tools for AI agents and advanced operations.
pnpm lumail tools list
pnpm lumail tools get list_subscribers
pnpm lumail tools run list_subscribers --params '{"limit": 10, "status": "SUBSCRIBED"}'
pnpm lumail tools run create_campaign --params '{"name": "Test", "subject": "Hello"}'
pnpm lumail tools run send_campaign --params '{"campaignId": "abc123"}'
SDK Reference
The SDK lives at src/lib/lumail-sdk/ and is importable via @/lib/lumail-sdk.
Setup
import { Lumail } from "@/lib/lumail-sdk";
const lumail = new Lumail({
apiKey: "lm_...",
baseUrl: "https://lumail.io/api",
});
Subscribers
const { subscriber } = await lumail.subscribers.create({
email: "user@example.com",
name: "John",
tags: ["vip", "beta"],
fields: { company: "Acme" },
triggerWorkflows: true,
});
const { subscriber } = await lumail.subscribers.get("user@example.com");
await lumail.subscribers.update("user@example.com", { name: "John Doe" });
await lumail.subscribers.delete("user@example.com");
await lumail.subscribers.unsubscribe("user@example.com");
await lumail.subscribers.addTags("user@example.com", ["premium"]);
await lumail.subscribers.removeTags("user@example.com", ["old-tag"]);
const { events, nextCursor } = await lumail.subscribers.listEvents("user@example.com", {
take: 20,
order: "desc",
eventTypes: ["EMAIL_OPENED", "EMAIL_CLICKED"],
});
Campaigns
const { campaigns, total, pageCount } = await lumail.campaigns.list({
status: "DRAFT",
page: 1,
limit: 20,
query: "welcome",
});
const { campaign, campaignId } = await lumail.campaigns.create({
subject: "Welcome!",
name: "Welcome Campaign",
contentType: "MARKDOWN",
});
const { campaign } = await lumail.campaigns.get(campaignId);
await lumail.campaigns.update(campaignId, { subject: "Updated Subject" });
await lumail.campaigns.delete(campaignId);
await lumail.campaigns.send(campaignId);
await lumail.campaigns.send(campaignId, {
scheduledAt: "2025-12-25T10:00:00Z",
timezone: "UTC",
});
Emails (Transactional)
const { qstashMessageId } = await lumail.emails.send({
to: "user@example.com",
from: "noreply@yourdomain.com",
subject: "Order Confirmation",
content: "Your order is confirmed.",
contentType: "MARKDOWN",
tracking: { links: true, open: true },
});
const { isValid } = await lumail.emails.verify({ email: "test@example.com" });
Tags
const { tags } = await lumail.tags.list();
const { tag } = await lumail.tags.create({ name: "premium" });
const { tag } = await lumail.tags.get("premium");
await lumail.tags.update("premium", { name: "gold" });
Events
await lumail.events.create({
eventType: "SUBSCRIBER_PAYMENT",
subscriber: "user@example.com",
data: { amount: 99, plan: "pro" },
});
Tools (V2 API)
const { tools, grouped } = await lumail.tools.list();
const { tool } = await lumail.tools.get("list_subscribers");
const result = await lumail.tools.run<{ subscribers: unknown[] }>(
"list_subscribers",
{ limit: 10 },
);
Error Handling
The SDK throws typed errors - catch specific error types:
import {
Lumail,
LumailAuthenticationError,
LumailNotFoundError,
LumailRateLimitError,
LumailValidationError,
LumailPaymentRequiredError,
} from "@/lib/lumail-sdk";
try {
await lumail.subscribers.get("unknown@example.com");
} catch (error) {
if (error instanceof LumailNotFoundError) {
} else if (error instanceof LumailAuthenticationError) {
} else if (error instanceof LumailRateLimitError) {
} else if (error instanceof LumailPaymentRequiredError) {
} else if (error instanceof LumailValidationError) {
}
}
Retry Behavior
- GET/PUT/DELETE requests retry up to 3 times on network errors and 429s
- POST/PATCH requests do NOT retry (prevents duplicate subscribers/emails)
- Retry delays: 1s, 2s, 4s (exponential backoff)
- Respects
Retry-After header from rate limit responses
- Default timeout: 30s per request
npm Package
Published as lumail on npm. Dual CLI + library:
npx lumail auth set <token>
npx lumail subscribers create --email user@example.com
import { Lumail } from "lumail";
const lumail = new Lumail({ apiKey: "lm_..." });
Package source: packages/lumail/
Build: bun run build (in packages/lumail/)
Auto-release: pushes to main trigger GitHub Actions release
File Locations
| Component | Path |
|---|
| SDK source | src/lib/lumail-sdk/ |
| CLI source | src/cli/ |
| npm package | packages/lumail/ |
| Build script | packages/lumail/build.ts |
| Tests | __tests__/lumail-sdk.test.ts, __tests__/lumail-cli.test.ts |
| API docs | content/docs/api-reference/ |
| GH Action | .github/workflows/release-lumail.yml |