Warm up mailboxes, check the ready-for-outbound gate, run cold email and get checkout links.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
BobWork Email Warm-up API key (bwk_...). An agent can get one with no browser: POST https://app-emailwarmup.bobwork.ai/api/v1/signup/code then /signup/verify.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Add up to 1,000 contacts to a campaign. Each needs email; other fields (first_name, company…) fill the placeholders. Duplicates and unsubscribed addresses are skipped.
Campaign id from list_campaigns
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http emailwarmup https://app-emailwarmup.bobwork.ai/mcp \ --header 'Authorization: YOUR_CREDENTIALS'
Headers
Authorization (required): BobWork Email Warm-up API key (bwk_...). An agent can get one with no browser: POST https://app-emailwarmup.bobwork.ai/api/v1/signup/code then /signup/verify.Add up to 1,000 contacts to a campaign. Each needs email; other fields (first_name, company…) fill the placeholders. Duplicates and unsubscribed addresses are skipped.
| Argument | Type | Description |
|---|---|---|
| contacts* | array | |
| campaign_id* | string | Campaign id from list_campaigns |
{
"type": "object",
"required": [
"campaign_id",
"contacts"
],
"properties": {
"contacts": {
"type": "array",
"items": {
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string"
}
}
}
},
"campaign_id": {
"type": "string",
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": false
}Add a DNS record to a domain you bought here. name = subdomain ('' for the domain itself). Types A, AAAA, CNAME, ALIAS, MX, TXT, CAA, SRV.
| Argument | Type | Description |
|---|---|---|
| ttl | integer | |
| name | string | |
| prio | integer | |
| type* | string | |
| domain* | string | Domain, e.g. yourdomain.com |
| content* | string |
{
"type": "object",
"required": [
"domain",
"type",
"content"
],
"properties": {
"ttl": {
"type": "integer"
},
"name": {
"type": "string"
},
"prio": {
"type": "integer"
},
"type": {
"type": "string"
},
"domain": {
"type": "string",
"description": "Domain, e.g. yourdomain.com"
},
"content": {
"type": "string"
}
},
"additionalProperties": false
}Add mailboxes to a domain you bought here ($3 per mailbox per month). Returns a Stripe checkout link.
| Argument | Type | Description |
|---|---|---|
| domain* | string | Domain, e.g. yourdomain.com |
| mailboxes* | array |
{
"type": "object",
"required": [
"domain",
"mailboxes"
],
"properties": {
"domain": {
"type": "string",
"description": "Domain, e.g. yourdomain.com"
},
"mailboxes": {
"type": "array",
"items": {
"type": "object",
"required": [
"local"
],
"properties": {
"name": {
"type": "string",
"description": "Display name"
},
"local": {
"type": "string",
"description": "Part before @, e.g. john"
}
}
}
}
},
"additionalProperties": false
}Buy domains with up to 3 mailboxes each. Returns a Stripe checkout link for the person to pay; setup starts once paid. Needs accept_sending_rules true.
| Argument | Type | Description |
|---|---|---|
| domains* | array | |
| accept_sending_rules* | boolean |
{
"type": "object",
"required": [
"domains",
"accept_sending_rules"
],
"properties": {
"domains": {
"type": "array",
"items": {
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "Domain, e.g. yourdomain.com"
},
"mailboxes": {
"type": "array",
"items": {
"type": "object",
"required": [
"local"
],
"properties": {
"name": {
"type": "string",
"description": "Display name"
},
"local": {
"type": "string",
"description": "Part before @, e.g. john"
}
}
}
}
}
}
},
"accept_sending_rules": {
"type": "boolean"
}
},
"additionalProperties": false
}Find a domain's DKIM key: tries the selector you give, selectors seen in real mail, then 45 common ones.
| Argument | Type | Description |
|---|---|---|
| domain* | string | Domain, e.g. yourdomain.com |
| selector | string |
{
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "Domain, e.g. yourdomain.com"
},
"selector": {
"type": "string"
}
},
"additionalProperties": false
}Look up a domain's DMARC record and policy.
| Argument | Type | Description |
|---|---|---|
| domain* | string | Domain, e.g. yourdomain.com |
{
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "Domain, e.g. yourdomain.com"
}
},
"additionalProperties": false
}Look up a domain's SPF record.
| Argument | Type | Description |
|---|---|---|
| domain* | string | Domain, e.g. yourdomain.com |
{
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "Domain, e.g. yourdomain.com"
}
},
"additionalProperties": false
}Connect any mailbox with IMAP + SMTP. The login is tested before it is saved. Use an app password when two-factor sign-in is on. Give a preset (see list_providers) or the hosts. Warm-up starts the same day.
| Argument | Type | Description |
|---|---|---|
| host | string | IMAP host (if no preset) |
| name | string | Display name on sent mail |
| port | integer | |
| user | string | Login if not the email |
| email* | string | Mailbox address, e.g. [email protected] |
| preset | string | e.g. gmail-imap, yahoo, icloud, zoho, lark, aws-ses, sendgrid, mailgun, other |
| password* | string | Mailbox password or app password |
| smtp_host | string | |
| smtp_port | integer | |
| smtp_user | string | Relay platforms only (SES/SendGrid/Mailgun) |
Connect a Zoho Mail mailbox through the Zoho API (works on Zoho's free plan). Needs a Self Client id, secret and a generated code from api-console.zoho.com.
| Argument | Type | Description |
|---|---|---|
| dc | string | Zoho data centre: com, eu, in, com.au, jp, ca |
| code* | string | Self Client code (valid 10 minutes) |
| name | string | |
| email* | string | Mailbox address, e.g. [email protected] |
| client_id* | string | |
| client_secret* | string |
{
"type": "object",
"required": [
"email",
"client_id",
"client_secret",
"code"
],
"properties": {
"dc": {
"type": "string",
"default": "com",
"description": "Zoho data centre: com, eu, in, com.au, jp, ca"
},
"code": {
"type": "string",
"description": "Self Client code (valid 10 minutes)"
},
"name": {
"type": "string"
},
"email": {
"type": "string",
"description": "Mailbox address, e.g. [email protected]"
},
"client_id": {
"type": "string"
},
"client_secret": {
"type": "string"
}
},
"additionalProperties": false
}Get a Stripe Checkout url for extra mailboxes beyond the free limit (monthly, or yearly = 10 months' price for 12). The USER opens it and pays; you cannot. Then poll get_billing_status. Returns already:true when the account is subscribed. Prices come back in the result (prices).
| Argument | Type | Description |
|---|---|---|
| yearly | boolean | Bill yearly instead of monthly |
{
"type": "object",
"required": [],
"properties": {
"yearly": {
"type": "boolean",
"description": "Bill yearly instead of monthly"
}
},
"additionalProperties": false
}Create a draft Outbound campaign (nothing is sent). Emails can use {first_name}, {company} and any contact field. Any connected mailbox can send; one that is still warming shows a warning first.
| Argument | Type | Description |
|---|---|---|
| name* | string | |
| emails* | array | 1-4 emails in order |
| mailboxes | array | |
| daily_limit | integer | Per mailbox per day |
{
"type": "object",
"required": [
"name",
"emails"
],
"properties": {
"name": {
"type": "string"
},
"emails": {
"type": "array",
"items": {
"type": "object",
"required": [
"body"
],
"properties": {
"body": {
"type": "string"
},
"subject": {
"type": "string"
},
"wait_days": {
"type": "integer",
"description": "Days after the previous email (ignored for the first)"
}
}
},
"description": "1-4 emails in order"
},
"mailboxes": {
"type": "array",
"items": {
"type": "string"
}
},
"daily_limit": {
"type": "integer",
"description": "Per mailbox per day"
}
},
"additionalProperties": false
}Get a Stripe Checkout url to top up prepaid credits for Outbound sending and AI drafts (one-off $5, $10, $25 or $100; credits never expire). The USER opens it and pays; you cannot. Then poll get_billing_status.
| Argument | Type | Description |
|---|---|---|
| usd* | integer |
{
"type": "object",
"required": [
"usd"
],
"properties": {
"usd": {
"enum": [
5,
10,
25,
100
],
"type": "integer"
}
},
"additionalProperties": false
}Delete a DNS record by id (from list_dns_records). Deleting MX, SPF, DKIM or DMARC stops the mailboxes working.
| Argument | Type | Description |
|---|---|---|
| domain* | string | Domain, e.g. yourdomain.com |
| record_id* | string |
{
"type": "object",
"required": [
"domain",
"record_id"
],
"properties": {
"domain": {
"type": "string",
"description": "Domain, e.g. yourdomain.com"
},
"record_id": {
"type": "string"
}
},
"additionalProperties": false
}SPF, DKIM selector, DMARC policy and MX for every domain you have connected.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Your account: email, credit balance, free mailbox allowance (10, or 20 for accounts created before 27 October 2026, plus referral bonus), paid extras and your referral link.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Payment status after you gave the user a checkout link: credit balance, whether the extra-mailbox subscription is active, mailboxes vs the free limit, and checkouts still waiting for payment. Confirms a paid checkout straight away.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}One campaign: its emails, mailboxes, stats and time left.
| Argument | Type | Description |
|---|---|---|
| campaign_id* | string | Campaign id from list_campaigns |
{
"type": "object",
"required": [
"campaign_id"
],
"properties": {
"campaign_id": {
"type": "string",
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": false
}Prepaid credit balance, prices and recent charges (Outbound emails, AI drafts).
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}One mailbox's warm-up status and health.
| Argument | Type | Description |
|---|---|---|
| email* | string | Mailbox address, e.g. [email protected] |
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "Mailbox address, e.g. [email protected]"
}
},
"additionalProperties": false
}Get a link the user opens to connect Gmail / Google Workspace with Google sign-in (one click, any device). The mailbox appears in list_mailboxes a few minutes after they allow it.
| Argument | Type | Description |
|---|---|---|
| renew | boolean | Make a fresh link |
{
"type": "object",
"required": [],
"properties": {
"renew": {
"type": "boolean",
"description": "Make a fresh link"
}
},
"additionalProperties": false
}Password, IMAP and SMTP settings for one of your hosted mailboxes.
| Argument | Type | Description |
|---|---|---|
| email* | string | Mailbox address, e.g. [email protected] |
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "Mailbox address, e.g. [email protected]"
}
},
"additionalProperties": false
}Domains bought in the domain shop, their hosted mailboxes, renewal date and price, plus IMAP/SMTP settings.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Contacts in a campaign and where each is in the sequence (first 200).
| Argument | Type | Description |
|---|---|---|
| campaign_id* | string | Campaign id from list_campaigns |
{
"type": "object",
"required": [
"campaign_id"
],
"properties": {
"campaign_id": {
"type": "string",
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": false
}Your Outbound campaigns with status and stats.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}DNS records on a domain you bought here.
| Argument | Type | Description |
|---|---|---|
| domain* | string | Domain, e.g. yourdomain.com |
{
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "Domain, e.g. yourdomain.com"
}
},
"additionalProperties": false
}Every connected mailbox with warm-up day, status, 7-day spam rate, today's and last 7 days' numbers, and whether it is ready for outbound.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}IMAP/SMTP presets (Gmail app password, Yahoo, iCloud, Zoho, Lark, SES, SendGrid, Mailgun…) with hosts and ports, plus the Google and Zoho API routes.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}The last 100 warm-up events for a mailbox (sent, received, replied, rescued from spam, errors).
| Argument | Type | Description |
|---|---|---|
| email* | string | Mailbox address, e.g. [email protected] |
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "Mailbox address, e.g. [email protected]"
}
},
"additionalProperties": false
}Pause a running campaign.
| Argument | Type | Description |
|---|---|---|
| campaign_id* | string | Campaign id from list_campaigns |
{
"type": "object",
"required": [
"campaign_id"
],
"properties": {
"campaign_id": {
"type": "string",
"description": "Campaign id from list_campaigns"
}
},
"additionalProperties": false
}Pause warm-up for a mailbox.
| Argument | Type | Description |
|---|---|---|
| email* | string | Mailbox address, e.g. [email protected] |
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "Mailbox address, e.g. [email protected]"
}
},
"additionalProperties": false
}Remove a mailbox and delete its stored login. Irreversible: ask the user first, then pass confirm=true.
| Argument | Type | Description |
|---|---|---|
| email* | string | Mailbox address, e.g. [email protected] |
| confirm* | boolean |
{
"type": "object",
"required": [
"email",
"confirm"
],
"properties": {
"email": {
"type": "string",
"description": "Mailbox address, e.g. [email protected]"
},
"confirm": {
"type": "boolean"
}
},
"additionalProperties": false
}Resume warm-up for a mailbox.
| Argument | Type | Description |
|---|---|---|
| email* | string | Mailbox address, e.g. [email protected] |
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "Mailbox address, e.g. [email protected]"
}
},
"additionalProperties": false
}Find available lookalike domains for cold email, with first-term and renewal prices.
| Argument | Type | Description |
|---|---|---|
| q* | string | Brand or domain, e.g. acme |
{
"type": "object",
"required": [
"q"
],
"properties": {
"q": {
"type": "string",
"description": "Brand or domain, e.g. acme"
}
},
"additionalProperties": false
}Shared network (default: warm with every mailbox on the service) or private pool (only your own mailboxes write to each other; needs 2+).
| Argument | Type | Description |
|---|---|---|
| private_pool* | boolean |
{
"type": "object",
"required": [
"private_pool"
],
"properties": {
"private_pool": {
"type": "boolean"
}
},
"additionalProperties": false
}Start or resume a campaign. This SENDS real email and uses credits. Confirm with the user first. accept_sending_rules=true means the user agrees to https://emailwarmup.bobwork.ai/terms#outbound-beta (only people who may receive it, honest sender, unsubscribe honoured). If a chosen mailbox is still warming the call fails with warming:true; show the user the message and set accept_warming_risk=true only after they explicitly agree. Without credits it fails with credits_required:true: use create_credits_checkout.
| Argument | Type | Description |
|---|---|---|
| campaign_id* | string | Campaign id from list_campaigns |
| accept_warming_risk | boolean | The user agreed to send from mailboxes that have not finished warm-up |
| accept_sending_rules | boolean |
{
"type": "object",
"required": [
"campaign_id"
],
"properties": {
"campaign_id": {
"type": "string",
"description": "Campaign id from list_campaigns"
},
"accept_warming_risk": {
"type": "boolean",
"description": "The user agreed to send from mailboxes that have not finished warm-up"
},
"accept_sending_rules": {
"type": "boolean"
}
},
"additionalProperties": false
}Sign in to the mailbox now and report whether the stored login still works.
| Argument | Type | Description |
|---|---|---|
| email* | string | Mailbox address, e.g. [email protected] |
{
"type": "object",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"description": "Mailbox address, e.g. [email protected]"
}
},
"additionalProperties": false
}Edit a paused or draft campaign. Fields you leave out keep their value.
| Argument | Type | Description |
|---|---|---|
| name | string | |
| emails | array | |
| mailboxes | array | |
| campaign_id* | string | Campaign id from list_campaigns |
| daily_limit | integer |
{
"type": "object",
"required": [
"campaign_id"
],
"properties": {
"name": {
"type": "string"
},
"emails": {
"type": "array",
"items": {
"type": "object"
}
},
"mailboxes": {
"type": "array",
"items": {
"type": "string"
}
},
"campaign_id": {
"type": "string",
"description": "Campaign id from list_campaigns"
},
"daily_limit": {
"type": "integer"
}
},
"additionalProperties": false
}Change a mailbox's display name, daily warm-up cap (1-100, null = default) or time zone (IANA, e.g. Europe/London).
| Argument | Type | Description |
|---|---|---|
| name | string | |
| email* | string | Mailbox address, e.g. [email protected] |
| timezone | string | |
| daily_cap | integer | null |
{
"type": "object",
"required": [
"email"
],
"properties": {
"name": {
"type": "string"
},
"email": {
"type": "string",
"description": "Mailbox address, e.g. [email protected]"
},
"timezone": {
"type": "string"
},
"daily_cap": {
"type": [
"integer",
"null"
]
}
},
"additionalProperties": false
}Totals across your mailboxes: today and last 7 days (sent, received, rescued, replied), active and ready counts.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 2, 2026.
Takes a password, API key or token as an argument, so the secret passes through the model's context and chat logs.
Fix: Read credentials from the server's own configuration (environment, OAuth) instead of a tool argument.
| smtp_password | string |
{
"type": "object",
"required": [
"email",
"password"
],
"properties": {
"host": {
"type": "string",
"description": "IMAP host (if no preset)"
},
"name": {
"type": "string",
"description": "Display name on sent mail"
},
"port": {
"type": "integer"
},
"user": {
"type": "string",
"description": "Login if not the email"
},
"email": {
"type": "string",
"description": "Mailbox address, e.g. [email protected]"
},
"preset": {
"type": "string",
"description": "e.g. gmail-imap, yahoo, icloud, zoho, lark, aws-ses, sendgrid, mailgun, other"
},
"password": {
"type": "string",
"description": "Mailbox password or app password"
},
"smtp_host": {
"type": "string"
},
"smtp_port": {
"type": "integer"
},
"smtp_user": {
"type": "string",
"description": "Relay platforms only (SES/SendGrid/Mailgun)"
},
"smtp_password": {
"type": "string"
}
},
"additionalProperties": false
}