Read and edit workspaces, campaigns (with their ICP and personas), members, identities and the workspace playbook.
Full name: campaignstack_get_campaigns
campaigns:read
Read-only
Read campaigns and optional campaign planning details in one stable collection envelope. Use this when the user needs campaign identity, ICP, personas, roadmap, topics, weights, metrics, automations, job history, guidance history, ICP match scores, or the topic vocabulary (include.topicVocabulary, the ids a campaign topic can be set to). Pass include.personas.ids or include.roadmap.ids to target one specific persona or phase directly instead of scanning the capped list, and include.icpScores.icpId to read match scores for one ICP. Omit ids to list matching records, pass one id for one record, or pass several ids for several records. The response still uses the same collection envelope. Use include only for extra details the user asked for. Large, computed, historical, or external includes must use their documented caps and must report when data is truncated or paginated. This read-only tool does not change data. Instead use campaignstack_get_workspaces for workspace-level setup, and campaignstack_get_identities for sender accounts or voice. The result returns items, pagination, missingIds when requested ids are unavailable, and warnings for capped includes.
| Name | Type | Required | Default | Description |
|---|
ids | string[] | No | — | Optional entity ids to fetch, capped at 50. |
filters | object | No | — | |
filters.workspaceId | string | No | — | 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. |
filters.includeArchived | boolean | No | — | |
include | object | No | — | |
include.icp | object | No | — | Campaign ICP records. |
include.personas | object | No | — | Campaign personas. Pass ids to target one or more specific personas directly. |
include.roadmap | object | No | — | Campaign phases or roadmap. Pass ids to target one or more specific phases directly. |
include.topics | object | No | — | Campaign topic weights, plus the topics the workspace’s search watches are active on. |
include.topicVocabulary | object | No | — | The topic taxonomy a campaign can focus on: every topicId, exact name and category the topic operation of campaignstack_edit_campaign accepts. Returned once at the top level as topicVocabulary, even when no campaign matches. Filter with category. |
include.weights | object | No | — | Campaign signal weights. |
include.metrics | object | No | — | Daily campaign metric rows, newest first. Each row counts people, campaign to date, as of the end of its UTC date: totalLeads (in the campaign), leadsContacted (sent a connection request, message or email by this campaign), leadsResponded (contacted people who replied on the account the campaign wrote from), leadsConverted (contacted people who booked a meeting afterwards), leadsAdded (in the campaign and not contacted yet), leadsFailed (a workflow step failed for them), avgMatchScore (mean ICP match). The newest row holds the current totals; rows dated before 2026-10-09 may still carry older workflow-step counts. |
include.automations | object | No | — | Workflow automation summary. |
include.jobHistory | object | No | — | Recent campaign job history. |
include.guidanceHistory | object | No | — | Campaign guidance history. |
include.icpScores | object | No | — | ICP match scores for one campaign ICP, selected by icpId. Stale until an icp_rescore edit_campaign operation runs. |
limit | integer | No | 20 | Maximum items to return, capped at 50. (min: 1, max: 50) |
cursor | string | No | — | Opaque pagination cursor. (min length: 1, max length: 1000) |
Full name: campaignstack_get_identities
accounts:read
Read-only
Read sender identities and optional account or voice details in one stable collection envelope. Use this when the user needs to resolve an identity, LinkedIn account, or Google account to the human sender and voice profile. Omit ids to list matching records, pass one id for one record, or pass several ids for several records. The response still uses the same collection envelope. Use include only for extra details the user asked for. Large, computed, historical, or external includes must use their documented caps and must report when data is truncated or paginated. This read-only tool does not change data. Instead use campaignstack_get_campaigns for campaign guidance, and campaignstack_get_workspaces for team or workspace settings. The result returns items, pagination, missingIds when requested ids are unavailable, and warnings for capped includes.
| Name | Type | Required | Default | Description |
|---|
ids | string[] | No | — | Optional entity ids to fetch, capped at 50. |
filters | object | No | — | |
filters.workspaceId | string | No | — | 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. |
filters.linkedinAccountId | string | No | — | |
filters.googleAccountId | string | No | — | |
include | object | No | — | |
include.accounts | object | No | — | Workspace-visible platform accounts. |
include.voice | object | No | — | Current identity voice profiles. |
include.voiceHistory | object | No | — | Voice profile versions. |
limit | integer | No | 20 | Maximum items to return, capped at 50. (min: 1, max: 50) |
cursor | string | No | — | Opaque pagination cursor. (min length: 1, max length: 1000) |
Full name: campaignstack_get_workspaces
workspace:read
Read-only
Read workspaces and optional workspace details in one stable collection envelope. Use this when the user needs workspace identity, settings, members, billing, credits, metrics, setup, branding, compliance, playbook, playbook history, or the pending playbook proposal. Omit ids to list matching records, pass one id for one record, or pass several ids for several records. The response still uses the same collection envelope. Use include only for extra details the user asked for. Large, computed, historical, or external includes must use their documented caps and must report when data is truncated or paginated. This read-only tool does not change data. Instead use campaignstack_get_campaigns for campaign setup, and campaignstack_get_identities for account or voice ownership. The result returns items, pagination, missingIds when requested ids are unavailable, and warnings for capped includes.
| Name | Type | Required | Default | Description |
|---|
ids | string[] | No | — | Optional entity ids to fetch, capped at 25. |
filters | object | No | — | |
filters.workspaceId | string | No | — | 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. |
include | object | No | — | |
include.settings | object | No | — | Workspace setup fields and company basics. |
include.branding | object | No | — | Workspace branding profile. |
include.compliance | object | No | — | Workspace compliance settings. |
include.metrics | object | No | — | Workspace metrics summary. |
include.billing | object | No | — | Workspace billing state. |
include.credits | object | No | — | Workspace credit balance and limits. |
include.members | object | No | — | Workspace members. |
include.invitations | object | No | — | Workspace invitations. |
include.playbook | object | No | — | Current workspace playbook. |
include.playbookHistory | object | No | — | Previous workspace playbook versions. |
include.setup | object | No | — | Workspace setup and onboarding state. |
include.playbookProposal | object | No | — | The workspace’s pending playbook proposal awaiting accept/reject, or null when none is waiting. |
limit | integer | No | 20 | Maximum items to return, capped at 50. (min: 1, max: 50) |
cursor | string | No | — | Opaque pagination cursor. (min length: 1, max length: 1000) |
Full name: campaignstack_propose_workspace_playbook_change
workspace:write
Ask CampaignStack to draft a proposed playbook change for review instead of directly overwriting the live playbook.
| Name | Type | Required | Default | Description |
|---|
workspaceId | string | No | — | 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. |
instruction | string | Yes | — | (min length: 1) |
sectionKey | string | No | — | |
Full name: campaignstack_refresh_identity_voice
content:write
Queue voice re-extraction for all LinkedIn accounts linked to an identity visible in the workspace.
| Name | Type | Required | Default | Description |
|---|
workspaceId | string | No | — | 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. |
identityId | string | No | — | |
linkedinAccountId | string | No | — | |
googleAccountId | string | No | — | |
Full name: campaignstack_refresh_workspace_playbook
workspace:write
Regenerate the workspace playbook from current campaigns, ICPs, personas, and company context. User-authored passages are preserved and prior text is snapshotted.
| Name | Type | Required | Default | Description |
|---|
workspaceId | string | No | — | 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_edit_campaign
campaigns:write
Destructive
Needs confirmation
Create, update, archive, unarchive, or edit singular campaign components: ICP, persona, roadmap phase, topic (add, reweight or remove by topicId or exact taxonomy name; an unknown one fails with the valid names), a LinkedIn search watch on a topic (search_watch: start, stop or resume it, and choose which of the workspace’s LinkedIn accounts run it; it takes any taxonomy topic, even one the campaign does not carry; a workspace runs one watch per topic, so a second watch returns enabled:false with a disabledReason), signal weight, and automation state. An icp operation already schedules a rescore of already-scored leads automatically; set rescore:true (optionally with rescoreLeadIds) on it to also score every unscored campaign lead against the new criteria, since that is not automatic. This can spend credits, paid provider quota, or model-backed work. Tell the user the cost or budget meaning first when the tool reports one. Also permanently deletes a whole campaign and cascades its data (delete), or a single ICP, persona, or phase (delete_icp/delete_persona/delete_phase); each requires confirmed:true and cannot be undone, so name what will be deleted and wait for an explicit yes first. Use archive to stop work without deleting history, and restores a previous campaign guidance or offer addendum version with the top-level restoreVersionId field, using a versionId from campaignstack_get_campaigns’ guidanceHistory include. Each operation returns success or failure independently. Score impacts and topic weights are bounded; archive requires confirmed:true and does not send messages; unarchive reverses it and needs no confirmation.
| Name | Type | Required | Default | Description |
|---|
workspaceId | string | No | — | 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. |
restoreVersionId | string | No | — | (min length: 1) |
operations | operation[] | Yes | — | One or more operations, see below. |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | string | No | — | (min length: 1) |
title | string | Yes | — | (min length: 1) |
description | string | No | — | |
goal | string | Yes | — | (min length: 1) |
connectionDegreeMode | discovery | relationship | No | — | |
outreachIntents | object[] | No | — | An UNRANKED menu of acceptable outcomes for this outreach. Answers ‘why are we writing to these people’: a message with no stated purpose reads as a compliment plus an open question. The craft picks the outcome this reader and this thread can plausibly give and says the reason in its own words, and it switches when the lead’s own words open another door, so order carries no meaning and listing several is how a non-buyer still gets a relevant message. Resolution is workspace then campaign then workflow, and the narrowest non-empty list REPLACES the wider ones rather than merging, so setting it here overrides the level above. Pass an empty array to clear this level and fall back. |
offerAddendum | string | No | — | (max length: 1500) |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
campaignId | string | Yes | — | (min length: 1) |
title | string | No | — | (min length: 1) |
description | string | No | — | |
connectionDegreeMode | discovery | relationship | No | — | |
outreachIntents | unknown | No | — | An UNRANKED menu of acceptable outcomes for this outreach. Answers ‘why are we writing to these people’: a message with no stated purpose reads as a compliment plus an open question. The craft picks the outcome this reader and this thread can plausibly give and says the reason in its own words, and it switches when the lead’s own words open another door, so order carries no meaning and listing several is how a non-buyer still gets a relevant message. Resolution is workspace then campaign then workflow, and the narrowest non-empty list REPLACES the wider ones rather than merging, so setting it here overrides the level above. Pass an empty array to clear this level and fall back. |
campaignGuidance | string | No | — | (max length: 2000) |
offerAddendum | string | No | — | (max length: 1500) |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
campaignId | string | Yes | — | (min length: 1) |
confirmed | boolean | Yes | — | |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
campaignId | string | Yes | — | (min length: 1) |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
campaignId | string | Yes | — | (min length: 1) |
confirmed | boolean | Yes | — | |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
campaignId | string | Yes | — | (min length: 1) |
data | object | Yes | — | |
data.icpId | string | No | — | |
data.titles | string[] | No | — | |
data.industries | string[] | No | — | |
data.seniorities | string[] | No | — | |
data.companySizes | string[] | No | — | |
data.locations | object[] | No | — | |
data.keywords | string[] | No | — | |
data.fitStatement | string | No | — | |
data.requirePersonaCoverage | covered | covered_or_hiring | No | — | |
rescore | boolean | No | — | |
rescoreLeadIds | string[] | No | — | |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
campaignId | string | Yes | — | (min length: 1) |
data | object | Yes | — | |
data.personaId | string | No | — | |
data.icpId | string | No | — | |
data.name | string | No | — | (min length: 1) |
data.description | string | No | — | |
data.painPoints | string[] | No | — | |
data.goals | string[] | No | — | |
data.objections | string[] | No | — | |
data.objectionResponses | object[] | No | — | |
data.fitStatement | string | No | — | |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
campaignId | string | Yes | — | (min length: 1) |
data | object | Yes | — | |
data.phaseId | string | No | — | |
data.name | string | No | — | (min length: 1) |
data.description | string | No | — | |
data.objectives | string[] | No | — | |
data.phaseType | string | No | — | |
data.order | integer | No | — | |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
campaignId | string | Yes | — | (min length: 1) |
data | object | Yes | — | |
data.topicId | string | No | — | A topicId from include.topicVocabulary of campaignstack_get_campaigns. (min length: 1) |
data.name | string | No | — | Or the exact taxonomy name, instead of topicId. (min length: 1) |
data.weight | number | No | — | 0 to 1, default 1. Above 0.8 runs a LinkedIn search watch on the topic (at most 3 per campaign, 5 topics in all). (min: 0, max: 1) |
data.remove | boolean | No | — | true takes the topic off the campaign. |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
campaignId | string | Yes | — | (min length: 1) |
data | object | Yes | — | |
data.topicId | string | No | — | A topicId from include.topicVocabulary of campaignstack_get_campaigns. Any taxonomy topic works, including one the campaign does not carry. (min length: 1) |
data.name | string | No | — | Or the exact taxonomy name, instead of topicId. (min length: 1) |
data.accountIds | string[] | No | — | LinkedIn account ids from this workspace that run the search. Omit to keep the current accounts (any available account on a new watch); pass [] to go back to any available account. |
data.enabled | boolean | No | — | Default true: start the watch, or resume a stopped one. false stops it. |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
campaignId | string | Yes | — | (min length: 1) |
data | object | Yes | — | |
data.signalType | string | Yes | — | (min length: 1) |
data.scoreImpact | number | Yes | — | (min: -100, max: 100) |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
data | object | Yes | — | |
data.automationId | string | Yes | — | (min length: 1) |
data.enabled | boolean | Yes | — | |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
icpId | string | Yes | — | (min length: 1) |
confirmed | boolean | Yes | — | |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
personaId | string | Yes | — | (min length: 1) |
confirmed | boolean | Yes | — | |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
phaseId | string | Yes | — | (min length: 1) |
confirmed | boolean | Yes | — | |
Full name: campaignstack_edit_identity
content:write
Edit or restore one identity voice profile language. Provide identityId, linkedinAccountId, or googleAccountId; full core/overlays replace the stored object. Restores are versioned.
| Name | Type | Required | Default | Description |
|---|
workspaceId | string | No | — | 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. |
identityId | string | No | — | |
linkedinAccountId | string | No | — | |
googleAccountId | string | No | — | |
language | string | Yes | — | (min length: 2, max length: 3) |
core | object | No | — | |
overlays | object | No | — | |
readableSummary | string | No | — | (max length: 1500) |
active | boolean | No | — | |
restoreVoiceVersionId | string | No | — | (min length: 1) |
Full name: campaignstack_edit_user
notifications:write
Edit the calling user’s notification preferences only. Requires a user API key; workspace keys cannot change personal preferences.
| Name | Type | Required | Default | Description |
|---|
notificationPreferences | object | Yes | — | |
notificationPreferences.category | account_health | billing | reviews | engagement | meetings | workflow | reports | signals | No | — | |
notificationPreferences.value | immediate | off | No | — | |
notificationPreferences.clear | boolean | No | — | |
notificationPreferences.workspaceId | string | No | — | 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. |
notificationPreferences.weeklyReport | boolean | No | — | |
Full name: campaignstack_edit_workspace
workspace:write
Write workspace settings, branding, compliance, restore one playbook version, or accept/reject the pending playbook proposal. Only supplied components change. Branding affects client-facing shared artifacts only; compliance toggles the fixed lawful-basis notice; playbook restores are versioned. Read the pending proposal with campaignstack_get_workspaces’ playbookProposal include before deciding it.
| Name | Type | Required | Default | Description |
|---|
workspaceId | string | No | — | 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. |
settings | object | No | — | |
settings.name | string | No | — | (min length: 1) |
settings.companyName | string | No | — | |
settings.companyWebsiteUrl | string | No | — | |
settings.industry | string | No | — | |
settings.offerContext | string | No | — | |
settings.capabilities | string | No | — | |
settings.outreachIntents | object[] | No | — | An UNRANKED menu of acceptable outcomes for this outreach. Answers ‘why are we writing to these people’: a message with no stated purpose reads as a compliment plus an open question. The craft picks the outcome this reader and this thread can plausibly give and says the reason in its own words, and it switches when the lead’s own words open another door, so order carries no meaning and listing several is how a non-buyer still gets a relevant message. Resolution is workspace then campaign then workflow, and the narrowest non-empty list REPLACES the wider ones rather than merging, so setting it here overrides the level above. Pass an empty array to clear this level and fall back. |
settings.sections | object | No | — | The workspace playbook, one field per section. Only the fields you pass are changed. Each field has a target length and a HARD character cap; a write over the cap is REJECTED, not truncated. Write to the target, not the cap: identity (aim for about 400, max 1200, sent on every message): who we are, positioning, what makes us different; voice (aim for about 400, max 1200, sent on every message): rules that survive any voice: what to answer first, one ask per message, length caps. Never adjectives about tone, which get written into the drafts; angles (aim for about 1000, max 3000, sent on messages we send first): reasons to reach out that land, and the levers that persuade; objections (aim for about 2000, max 6000, sent on replies, after they have written back): what people push back with, and the real answers; boundaries (aim for about 500, max 1500, sent on every message): topics to avoid, claims never to make. Each section is model-facing text the model reads verbatim under its own heading: explanations of how the field works belong in the interface, not in the field, and a section must stand alone rather than refer to another one. Sections are selected per message, so a long objections list costs a first message nothing. Do NOT restate the offer, the personas or the campaign goal here: all three already reach the prompt from structured data, and a second copy can only contradict the first. |
settings.jevFeatures | object | No | — | |
branding | object | No | — | |
branding.brandName | string | null | No | — | |
branding.primaryColor | string | null | No | — | |
branding.hidePoweredBy | boolean | null | No | — | |
compliance | object | No | — | |
compliance.lawfulBasisNoticeEnabled | boolean | null | No | — | |
restorePlaybookVersionId | string | No | — | (min length: 1) |
proposalDecision | object | No | — | |
proposalDecision.proposalId | string | Yes | — | (min length: 1) |
proposalDecision.decision | accept | reject | Yes | — | |
Full name: campaignstack_edit_workspace_members
workspace:write
Destructive
Acts outside CampaignStack
Needs confirmation
Apply bounded member and invitation operations with per-operation results. Removes, invitations, and revocations require confirmed:true because they affect another person’s access or send/cancel an email. Admin/owner grants are intentionally unavailable here.
| Name | Type | Required | Default | Description |
|---|
workspaceId | string | No | — | 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. |
operations | operation[] | Yes | — | One or more operations, see below. |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | string | No | — | (min length: 1) |
memberId | string | Yes | — | (min length: 1) |
role | member | Yes | — | |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
memberId | string | Yes | — | (min length: 1) |
confirmed | boolean | Yes | — | |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
email | string | Yes | — | |
role | member | Yes | — | |
confirmed | boolean | Yes | — | |
| Name | Type | Required | Default | Description |
|---|
clientOperationId | unknown | No | — | |
invitationId | string | Yes | — | (min length: 1) |
confirmed | boolean | Yes | — | |