Skip to content

stage_campaign

Prepare the campaign

Act · mcp:actOpens at: Setting up the sending infrastructure30 calls / 10 minCalls a providerIdempotent

Creates the campaign at the email provider from the approved sequence, as a draft: it sends nothing and is not active. Until it is launched, its dates can still change.

Description the model readsSent as is in tools/list.
Create the campaign at the email provider from the approved sequence saved under this name, as a draft: it sends nothing and is not active. Ask the user first when it should start — a day they name (and an end only if they want one), or as soon as it is launched — and pass dates only when they named a day. Until it is launched its dates can still change: call this again with every date it should carry, or removeDates alone. Then read the launch figures with get_campaign and call launch_campaign.

The user says

Prepare the campaign to start on Monday 3 November.

tools/call · Arguments the assistant sends
{
"name": "stage_campaign",
"arguments": {
"name": "Dentists FR — missed calls",
"startDate": "2026-11-03"
}
}
namestringrequired2–120 chars

The name the sequence was saved under — the same one you approved. Never guess it: read it back with get_workspace_context.

startDatestringoptional

Only when the founder chose to schedule it: the first day it may send, as YYYY-MM-DD — exactly the calendar date they gave you. If they name a weekday or a delay instead of a date, ask them for the date rather than working it out. On a campaign already staged, pass the start it should carry even when only its end moves.

endDatestringoptional

Only with startDate, and only if the founder wants the campaign to stop on a given day: that day, as YYYY-MM-DD. On it the provider ends the campaign even if some leads were never reached — tell them so before you pass it. On a campaign already staged with an end, leaving it out drops that end.

removeDatesbooleanoptional

Only when the founder wants a campaign that is not launched yet to carry no date any more, so that it sends as soon as it is launched: true, with no startDate and no endDate. Once launched, it then sends inside its weekly window straight away.

Input schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 2,
"maxLength": 120,
"description": "The name the sequence was saved under — the same one you approved. Never guess it: read it back with get_workspace_context."
},
"startDate": {
"description": "Only when the founder chose to schedule it: the first day it may send, as YYYY-MM-DD — exactly the calendar date they gave you. If they name a weekday or a delay instead of a date, ask them for the date rather than working it out. On a campaign already staged, pass the start it should carry even when only its end moves.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"endDate": {
"description": "Only with startDate, and only if the founder wants the campaign to stop on a given day: that day, as YYYY-MM-DD. On it the provider ends the campaign even if some leads were never reached — tell them so before you pass it. On a campaign already staged with an end, leaving it out drops that end.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"removeDates": {
"description": "Only when the founder wants a campaign that is not launched yet to carry no date any more, so that it sends as soon as it is launched: true, with no startDate and no endDate. Once launched, it then sends inside its weekly window straight away.",
"type": "boolean"
}
},
"required": ["name"]
}

Result kindcampaign

kind"campaign"
outcomestring | null

What the call that rendered it did, in a sentence. Null for a plain read.

campaignobject | null

The live campaign, or the last one when none is live. Null before any.

  • id string — The campaign id launch, stop and resume take. Never invent one.
  • name string
  • state string
  • stateLabel string
  • live boolean
  • startsOn string | null
  • endsOn string | null
  • stats object | null — The last counters read from the provider. Null until a first reading.
launchRecapobject | null

What the user confirms before a launch. Null before the sending setup step.

  • complete boolean — False while one of the four figures is missing.
  • contacts integer — Leads ready to be pushed into the campaign.
  • sendingMailboxes string[]
  • firstDayEmails integer | null
  • window object | null — The weekly sending window, in the workspace's timezone.
appUrlstring
Output schema
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "campaign"
},
"outcome": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "What the call that rendered it did, in a sentence. Null for a plain read."
},
"campaign": {
"anyOf": [
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The campaign id launch, stop and resume take. Never invent one."
},
"name": {
"type": "string"
},
"state": {
"type": "string"
},
"stateLabel": {
"type": "string"
},
"live": {
"type": "boolean"
},
"startsOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"endsOn": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"stats": {
"anyOf": [
{
"type": "object",
"properties": {
"sent": {
"type": "integer"
},
"replies": {
"type": "integer"
},
"opens": {
"type": "integer"
},
"bounces": {
"type": "integer"
},
"measuredAt": {
"type": "string",
"description": "When the provider's counters were last read."
}
},
"required": ["sent", "replies", "opens", "bounces", "measuredAt"],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The last counters read from the provider. Null until a first reading."
}
},
"required": [
"id",
"name",
"state",
"stateLabel",
"live",
"startsOn",
"endsOn",
"stats"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The live campaign, or the last one when none is live. Null before any."
},
"launchRecap": {
"anyOf": [
{
"type": "object",
"properties": {
"complete": {
"type": "boolean",
"description": "False while one of the four figures is missing."
},
"contacts": {
"type": "integer",
"description": "Leads ready to be pushed into the campaign."
},
"sendingMailboxes": {
"type": "array",
"items": {
"type": "string"
}
},
"firstDayEmails": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
]
},
"window": {
"anyOf": [
{
"type": "object",
"properties": {
"days": {
"type": "array",
"items": {
"type": "string"
}
},
"from": {
"type": "string"
},
"to": {
"type": "string"
}
},
"required": ["days", "from", "to"],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The weekly sending window, in the workspace's timezone."
}
},
"required": [
"complete",
"contacts",
"sendingMailboxes",
"firstDayEmails",
"window"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "What the user confirms before a launch. Null before the sending setup step."
},
"appUrl": {
"type": "string"
}
},
"required": ["kind", "outcome", "campaign", "launchRecap", "appUrl"],
"additionalProperties": false
}
  • The assistant asks the user when it should start — a day they name, or as soon as it is launched — and passes dates only when they named a day.
  • To change the dates before launch: call it again with every date it should carry, or removeDates alone.
  • Then read the launch figures with get_campaign, and call launch_campaign.