MCP @numail/mcp · the agent interface to NuMail

Give your agent
a cold-email stack.

NuMail speaks the Model Context Protocol. Point Claude Code, Cursor, OpenAI Codex, or any MCP-compatible client at @numail/mcp and it can create campaigns, import leads, connect mailboxes, read the unibox, approve drafts, and call a winner — by name, no glue code, no scraping the dashboard.

30-second install →See the tool catalog
~ ▸ claude code · numail session● numail · tools loaded
▸ "Spin up a campaign for the leads in mercer.csv. Two steps, 3 days apart."
   numail.lead.import({ file: "mercer.csv", map: "auto" })
   → 1,204 leads imported · 3 dupes skipped
   numail.campaign.create({
     name: "Mercer · Q3 outbound",
     steps: [{ delay_days: 0, … }, { delay_days: 3, … }]
   })
    cmp_7d2 created · draft

▸ "Connect tomas@mercer.com as the sending mailbox, then launch."
   numail.mailbox.connect({ provider: "google", email: "tomas@mercer.com" })
   → returns OAuth URL · opened in browser · connected ✓
   numail.campaign.launch("cmp_7d2")
    launched · 1,204 leads enrolled

▸ "Who replied positive today? Draft short responses."
   numail.unibox.list({ filter: "positive", since: "24h" })
   → 6 threads · drafting…
   numail.unibox.draft(thr_2c1, { length: "short" })
    6 drafts ready for your approval
▸ Supported clients

Runs in the agent you already use.

@numail/mcp is a standard stdio MCP server. If your client speaks MCP, it works — here are the ones our customers wire up most.

CC
Claude Code
.mcp.json
CD
Claude Desktop
config.json
Cu
Cursor
.cursor/mcp.json
Cx
OpenAI Codex
CLI · config.toml
Wi
Windsurf
mcp_config.json
Cl
Cline
VS Code ext.
Ze
Zed
settings.json
Any MCP client
stdio · npx

Same npx @numail/mcp command everywhere — only the config file path differs. Custom agent runtime? It's a plain stdio server you can launch from any process.

▸ Install · 30 seconds

One key. One config block.

No Python, no Docker, no Node version dance — npx pulls the right version on first run. Mac, Windows, Linux.

1

Get a scoped API key

In NuMail · Settings · API Keys, create a key and scope it to the workspaces this agent may touch. Read tools work read-only; write tools need an explicit scope.

NUMAIL_API_KEY="nm_live_•••"
2

Add the server block

Drop this into your client's MCP config (Claude Code .mcp.json shown — Cursor, Codex, Windsurf, Zed use the same shape).

{ "mcpServers": { "numail": { "command": "npx", "args": ["-y", "@numail/mcp"], "env": { "NUMAIL_API_KEY": "nm_live_•••" } } } }
3

Reload & talk

Reload the client — the NuMail tools register automatically. Then just ask in plain language.

# in any connected client"What's my reply rate this week?" 8.3% over 1,247 sends 0.4 pp WoW
Claude Code, even fasterclaude mcp add numail -e NUMAIL_API_KEY=nm_live_••• -- npx -y @numail/mcp
▸ Tool catalog

Every dashboard action, callable by name.

One tool per capability, mapped one-to-one to the NuMail REST API. Names are stable and self-describing, so the agent picks the right one without prompting.

Campaigns create · launch · pause
campaign.create
Build a multi-step sequence — subject, body and delay per step, with a mailbox pool.
maps to POST /v1/campaigns
campaign.launch
Move a draft to active and enroll its audience. Returns the live campaign id.
maps to POST /v1/campaigns/:id/launch
campaign.pause
Pause indefinitely or with an auto-resume timestamp — “until Monday 9am ET.”
maps to POST /v1/campaigns/:id/pause
campaign.list / .get
Browse and inspect campaigns: state, steps, mailbox pool, enrolled counts.
maps to GET /v1/campaigns
campaign.update
Edit a step, swap the mailbox pool, change the send window or tracking.
maps to PUT /v1/campaigns/:id
campaign.duplicate
Clone a campaign and its steps — your “standard” template, ready to tweak.
maps to POST /v1/campaigns/:id/duplicate
Leads import · enroll
lead.import
Bulk import a CSV with auto column → field mapping. Async job with progress.
maps to POST /v1/leads/bulk_import
lead.create
Add a single lead with custom fields and tags. Returns the new lead id.
maps to POST /v1/leads
lead.enroll
Enroll lead(s) into a campaign. Respects the workspace suppression list.
maps to POST /v1/leads/:id/enroll
lead.list / .get
Filter by status, tags, campaign or custom field; pull full send + reply history.
maps to GET /v1/leads
lead.unsubscribe
Add a lead to the suppression list across the workspace. Idempotent.
maps to POST /v1/leads/:id/unsubscribe
lead.tag
Bulk add or remove tags — useful for segmenting before enrollment.
maps to PUT /v1/leads/:id
Mailboxes connect · warm up
mailbox.connect
Start a Gmail, Microsoft Graph or SMTP connection — returns the OAuth URL to finish.
maps to POST /v1/mailboxes/connect
mailbox.get / .list
Health, reputation tier, daily volume and recent activity per mailbox.
maps to GET /v1/mailboxes
mailbox.warmup
Toggle the cross-customer warmup pool and intra-workspace warmup independently.
maps to POST /v1/mailboxes/:id/warmup
mailbox.pause
Stop sending from a mailbox without revoking its OAuth grant.
maps to POST /v1/mailboxes/:id/pause
mailbox.test_send
Fire a single test email — handy right after an OAuth connect.
maps to POST /v1/mailboxes/:id/test_send
mailbox.update
Change the daily limit, send schedule or timezone (capped at the provider limit).
maps to PUT /v1/mailboxes/:id
Unibox & replies read · draft · approve
unibox.list
Read the unibox: threads filtered by classification, recency, campaign or mailbox.
maps to GET /v1/unibox
unibox.get
Full thread with classification, prior sends and the AI draft if one exists.
maps to GET /v1/unibox/:id
unibox.draft
Generate a Claude-written reply tuned to length, tone and your sending voice.
maps to POST /v1/unibox/:id/draft
unibox.approve
Approve & send a draft. Returns the sent message id and mailbox used.
maps to POST /v1/unibox/:id/approve
unibox.reply
Send an arbitrary reply without going through a generated draft.
maps to POST /v1/unibox/:id/reply
unibox.snooze / .mark
Snooze a thread, or reclassify it to correct the classifier.
maps to POST /v1/unibox/:id/mark
Analytics & A/B measure · declare a winner
analytics.overview
Sends, opens, clicks, replies and bounces for any period or campaign.
maps to GET /v1/analytics/overview
analytics.funnel
Enrolled → sent → opened → replied → booked, per campaign.
maps to GET /v1/analytics/campaigns/:id/funnel
ab.variant_stats
Per-variant performance with a statistical-significance score.
maps to GET /v1/ab/variants/:id
ab.promote
Declare the A/B winner — manually promote a variant over auto-promotion.
maps to POST /v1/ab/variants/:id/promote
workspace.create
Spin up a workspace — or a client sub-workspace on the Agency tier.
maps to POST /v1/workspaces
billing.usage
Current-period sends, AI drafts and overage. Read-only.
maps to GET /v1/billing/usage
Every tool maps to a documented REST endpoint → see the API reference
▸ What you can hand off

Outbound, run by conversation.

Four workflows that turn into a single sentence once the MCP server is connected.

Stand up a new client in one prompt

Import the CSV, clone your standard sequence, connect the sending mailbox, and launch — the agent chains lead.import → campaign.duplicate → mailbox.connect → campaign.launch.

“Import mercer-leads.csv, clone our ‘B2B SaaS standard’ campaign for Mercer, connect tomas@mercer.com, and launch it.”

Triage the unibox over coffee

Read every positive reply since yesterday, grouped by campaign, and have a short draft waiting on each one. Approve the good ones in a single follow-up.

“Show me every positive reply from the last 24h grouped by campaign, and draft a short response for each.”

Pause everything before a holiday

Friday at 4pm: pause every active campaign across every workspace and schedule the resume for Tuesday 9am — campaign.pause with an auto-resume timestamp.

“Pause every active campaign in every workspace and resume them Tuesday at 9am local time.”

Call the A/B winner, then scale it

Pull variant stats, declare the significant winner, and roll the losing variant's remaining sends onto it — ab.variant_stats → ab.promote.

“Which subject-line variant on cmp_3f9 is winning? If it's significant, promote it.”

Where the MCP server is today

The NuMail REST API is live and stable, and @numail/mcp is the thin MCP layer over it — each tool above is a 1:1 wrapper around a documented endpoint. The package is rolling out to early-access workspaces now.

Want it the moment it ships? Every capability here already works over the REST API and SDKs today — start there and your agent loses nothing in the switch. Start a trial and ask us to flag your workspace for MCP early access.

Talk to your outbound
like it's a teammate.

One config block. npx -y @numail/mcp in the agent you already use.