Skip to content

AI Craft & Content

Draft messages with the workspace playbook and voice, inspect how a draft was built, and manage content posts.

Full name: campaignstack_explain_draft

workflows:read Read-only

Why a draft says what it says: each sentence attributed to the piece of configuration that produced it (the offer context, a playbook section, the campaign guidance, an agent’s script, the outreach intent, the voice profile, a node’s instructions, an agent memory, the contact details, the calendar availability, the conversation so far, the product’s built-in rules, the lead’s own facts), plus the tool and field that changes each one. Works on in-app and MCP-crafted drafts alike. Every citation is re-checked against the prompt section it names, so an unverifiable one comes back as unattributed rather than as a plausible guess. Call this when a draft reads wrong and you need to know WHICH setting to edit; campaignstack_preview_craft_prompt shows the same prompt for a draft that has not been written yet. Charges mcp_craft credits per call; campaignstack_estimate_cost gives the number before you commit. One model call over a stored draft and its prompt; writes nothing.

NameTypeRequiredDefaultDescription
craftAuditLogIdstringNo—A craft audit log row id, usually copied from an internal audit export or previous explain-draft result.
entryIdstringNo—A workflow entry id, e.g. from campaignstack_get_reviews. Resolves to the newest accepted draft for that entry’s lead.
workspaceIdstringNo—Workspace ID. Omit it when this connection reaches one workspace: a workspace key (cs_) is bound to its own, and a user key (csu_) or connected app whose person belongs to exactly one workspace defaults to that one. Required only when the person belongs to several; the error then lists them, and campaignstack_whoami reports them too.

Full name: campaignstack_get_content

content:read Read-only

Read one or many content records in a stable items[] envelope. Includes can add bounded calendar projection, suggestions, media/full records, and analytics; include.limit caps each include. Results are one page. When pagination reports more, say so rather than presenting the page as the whole set, and page through before counting anything.

NameTypeRequiredDefaultDescription
workspaceIdstringNo—Workspace ID. Omit it when this connection reaches one workspace: a workspace key (cs_) is bound to its own, and a user key (csu_) or connected app whose person belongs to exactly one workspace defaults to that one. Required only when the person belongs to several; the error then lists them, and campaignstack_whoami reports them too.
idsstring[]No—
filtersobjectNo—
filters.statusdraft | pending_approval | scheduled | publishing | published | failed | archivedNo—
filters.platformlinkedinNo—
filters.tagsstring[]No—
includeobjectNo{}
include.calendarobjectNo—
include.suggestionsbooleanNofalse
include.mediabooleanNofalseFull single-post reads already include media; list rows remain compact.
include.analyticsobjectNo—
include.limitintegerNo10(min: 1, max: 50)
limitintegerNo20(min: 1, max: 100)
cursorstringNo—

Full name: campaignstack_get_craft_config_tree

content:read Read-only

Everything a craft prompt is built from, in one read: the workspace’s five playbook sections with their caps, offerContext, capabilities and outreach intents; every campaign’s guidance, offer addendum and intents; every workflow’s craft nodes with the text a human wrote into them; every signal agent’s script; and one voice profile summary per person and language. It also returns warnings: tone language in an agent script, a section written as an explanation of itself, the same sentence sitting at two levels, a campaign goal promising something the offer never states, a greeting that is really a whole message, a voice built on almost no real writing. Each warning names the tool and field that fixes it. Call this before editing craft configuration, or when the user asks to change how CampaignStack writes messages. It does not show one node’s actual rendered prompt: campaignstack_preview_craft_prompt does that for a specific lead. Exemplars and message bodies are never returned.

NameTypeRequiredDefaultDescription
workspaceIdstringNo—Workspace ID. Omit it when this connection reaches one workspace: a workspace key (cs_) is bound to its own, and a user key (csu_) or connected app whose person belongs to exactly one workspace defaults to that one. Required only when the person belongs to several; the error then lists them, and campaignstack_whoami reports them too.
includestring[]No—Subtrees to return. Default: all five.
campaignIdstringNo—Narrow campaigns and their workflows to this one campaign.
resolveForWorkflowIdstringNo—Also return what THIS workflow resolves to: which intent level wins, which sections its scope is sent, and the campaign guidance and offer addendum it carries.
resolveForSignalAgentIdstringNo—Same, for a signal agent. An agent resolves workflow then workspace and never sees a campaign’s guidance or intents.

Full name: campaignstack_preview_craft_prompt

content:read Read-only

Render the exact prompt a craft node would send for one lead, without sending it. Call this when the user asks to see what a draft would look like, or to debug why a node’s wording keeps going wrong. Runs the real craft path and stops immediately before the model call, so what comes back is the same bytes the model would read. index lists the named blocks in the system prompt with their character offsets and sizes (COMPANY CONTEXT, WHAT WE WANT, the playbook sections, RED LINES, the voice), which is how you find out WHICH piece of configuration produces a phrase you do not want. Writes no audit row, records no AI usage, assigns no voice experiment arm, fetches no web context, and costs nothing. Pair it with campaignstack_get_craft_config_tree, which shows where each block comes from.

NameTypeRequiredDefaultDescription
workflowIdstringYes—The workflow the node belongs to. (min length: 1)
nodeIdstringYes—A craft node: ai:craft_note, ai:craft_message, ai:craft_comment, ai:reply_conversation, ai:craft_email, or a send node in its AI mode. (min length: 1)
leadIdstringYes—The lead to render the prompt for. Different leads produce different prompts. (min length: 1)
leadSourceglobal | privateNo—Optional. Leave it out: the server reads it from the leadId and refuses a value that disagrees.
includestring[]No—What to return. Default: index and user. The system prompt runs to thousands of characters, so ask for it when you are going to read it.
workspaceIdstringNo—Workspace ID. Omit it when this connection reaches one workspace: a workspace key (cs_) is bound to its own, and a user key (csu_) or connected app whose person belongs to exactly one workspace defaults to that one. Required only when the person belongs to several; the error then lists them, and campaignstack_whoami reports them too.

Full name: campaignstack_craft_message

workflows:write

Draft one outbound message without sending anything. Select channel linkedin/email and kind first_touch, connection_note, comment, comment_reply, followup, or meeting_followup. Returns sent:false; callers must read the draft back and use a separate send/action tool only after explicit approval. It never books a meeting for you: when a follow-up finds the lead accepted a time offered earlier, schedulingAcceptance names it (booked:false) for a person to book.

NameTypeRequiredDefaultDescription
workspaceIdstringNo—Workspace ID. Omit it when this connection reaches one workspace: a workspace key (cs_) is bound to its own, and a user key (csu_) or connected app whose person belongs to exactly one workspace defaults to that one. Required only when the person belongs to several; the error then lists them, and campaignstack_whoami reports them too.
channellinkedin | emailYes—Draft channel. LinkedIn drafts do not send; email drafts do not send.
kindfirst_touch | connection_note | comment | comment_reply | followup | meeting_followupYes—
leadIdstringNo—
campaignIdstringNo—
workflowIdstringNo—
accountIdstringNo—LinkedIn account that will send the draft: names the speaker and picks the voice on every LinkedIn kind. Required for a LinkedIn follow-up, where it also reads the thread.
meetingIdstringNo—Required for kind=meeting_followup.
meetingKindreschedule | no_show | cancelledNo—
newStartAtstringNo—
newEndAtstringNo—
postContentstringNo—
commentTextstringNo—
conversationMessagesobject[]No—
instructionsstringNo—(max length: 4000)
templatestringNo—(max length: 4000)

Full name: campaignstack_delete_content

content:write Destructive Needs confirmation

Permanently delete draft or failed content. Requires confirmed:true. This permanently deletes a root record. Before calling it, name exactly what will be deleted, explain that it cannot be undone, and wait for an explicit yes.

NameTypeRequiredDefaultDescription
workspaceIdstringNo—Workspace ID. Omit it when this connection reaches one workspace: a workspace key (cs_) is bound to its own, and a user key (csu_) or connected app whose person belongs to exactly one workspace defaults to that one. Required only when the person belongs to several; the error then lists them, and campaignstack_whoami reports them too.
contentIdsstring[]Yes—
confirmedbooleanYes—This permanently deletes a root record. Before calling it, name exactly what will be deleted, explain that it cannot be undone, and wait for an explicit yes.

Full name: campaignstack_edit_content

content:write

Create, update, duplicate (copyFromId), or request legal desired-state transitions for content. generator.type=lead_magnet drafts a post from a lead-magnet candidate; generator.type=search_console_demand drafts a post from Search Console demand. Generators create draft posts only. Scheduling/approval/reject/retry transitions are validated and return per-operation results; nothing is published by this tool.

NameTypeRequiredDefaultDescription
workspaceIdstringNo—Workspace ID. Omit it when this connection reaches one workspace: a workspace key (cs_) is bound to its own, and a user key (csu_) or connected app whose person belongs to exactly one workspace defaults to that one. Required only when the person belongs to several; the error then lists them, and campaignstack_whoami reports them too.
operationsoperation[]Yes—One or more operations, see below.
NameTypeRequiredDefaultDescription
clientOperationIdstringNo—
kindstringNo"post"
generatorobject | objectNo—
authorAccountIdstringNo—
platformlinkedinNo"linkedin"
bodystringNo—(min length: 1)
mediaIdsstring[]No[]
tagsstring[]No—
postTypetext | image | video | documentNo—
NameTypeRequiredDefaultDescription
clientOperationIdstringNo—
contentIdstringYes—(min length: 1)
patchobjectYes—
patch.bodystringNo—(min length: 1)
patch.mediaIdsstring[]No—
patch.tagsstring[]No—
patch.postTypetext | image | video | documentNo—
NameTypeRequiredDefaultDescription
clientOperationIdstringNo—
copyFromIdstringYes—(min length: 1)
NameTypeRequiredDefaultDescription
clientOperationIdstringNo—
contentIdstringYes—(min length: 1)
desiredStatepending_approval | scheduled | approved | rejected | draft | retry_draftYes—
scheduledAtintegerNo—
autoSchedulebooleanNo—
reasonstringNo—(min length: 1)