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, with 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 and 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, e.g. “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.