Skip to main content
Glama

Server Details

Run B2B outreach from your AI agent: 250+ tools for campaigns, leads, LinkedIn and email workflows.

Ownership verified
Status
Healthy
Uptime
85.7% over 76 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.5/5.0

Scored across 102 tools

Disambiguation3/5

Most tools are distinguishable by resource and action, and descriptions often cross-reference the right alternative. However, with 102 tools there are overlapping surfaces, especially around watch deletion vs. editing, draft/review/content handling, and workflow vs. workflow-graph operations. Descriptions help, but an agent can still misselect among similar lifecycle tools.

Naming Consistency4/5

Names are consistently prefixed with campaignstack_ and use snake_case, mostly following a verb_noun pattern such as get_leads, edit_campaign, delete_workflow, and send_message. Minor deviations like whoami, onboard_workspace, and explain_capabilities keep it from being perfectly uniform.

Tool Count1/5

The server exposes 102 tools, far beyond the 50+ threshold for extreme mismatch. Even though the domain is broad, this many tools makes selection and maintenance burdensome. The surface should be consolidated into fewer multi-operation tools or split into narrower servers.

Completeness4/5

The tool surface covers a very wide lifecycle: workspaces, accounts, campaigns, leads, enrichment, workflows, reviews, conversations, job applications, watches, exclusions, and integrations. Coverage is strong, with only minor gaps such as no standalone email-send action outside workflow/draft flows. Overall it is comprehensive for the apparent domain.

Available Tools

102 tools
campaignstack_add_leads_to_external_destinationAdd leads to external destinationA
DestructiveIdempotent
Inspect

Add up to 25 leads to one provider list or sequence. This changes a third-party workspace and may make contacts available for outreach there. This reaches a real person. Before calling it, tell the user exactly who it goes to and read the wording back to them, and wait for an explicit yes.

NameRequiredDescriptionDefault
leadsYes
providerYes
confirmedYesThis reaches a real person. Before calling it, tell the user exactly who it goes to and read the wording back to them, and wait for an explicit yes.
destinationYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
failedNo
resultNo
resultsNo
warningsNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, openWorldHint=true, readOnlyHint=false, but the description adds real behavioral context: it modifies a third-party workspace and 'may make contacts available for outreach there,' plus the human-in-the-loop confirmation requirement. Auth needs and failure modes are still unstated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short front-loaded sentences, with the scope first and the safety prerequisite after. 'This reaches a real person' is echoed verbatim in the confirmed param description, a minor redundancy that keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need no explanation, and annotations carry the safety profile (destructive, open-world, idempotent). The description supplies the missing confirmation and real-person stakes, leaving nothing essential absent for a mutation of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 40%, so the description must compensate, and it does partially by pinning 'up to 25 leads' (the maxItems) and 'one provider list or sequence' (destination.type). But provider, destination.id, and activateSequence/skipIfInWorkspace flags are left entirely to the schema, and the confirmation text is essentially duplicated from the confirmed param.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource+scope: 'Add up to 25 leads to one provider list or sequence' names exactly what the tool does and the bounded size. It is distinguishable from write-siblings like import_external_leads or export_leads_to_crm by the 'external destination' target, but no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context and a precondition: it changes a third-party workspace and reaches a real person, so the agent must read wording back and wait for an explicit yes. It stops short of naming alternatives or exclusions (e.g., when to prefer import_external_leads), so it is not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_analyze_company_websiteAnalyze company websiteA
Read-onlyIdempotent
Inspect

Renamed V2 website-analysis read for a company's own public website. Cached analyses are reused; fresh AI extraction is credit-gated and charged to the bound workspace. Charges website_intel credits per call; campaignstack_estimate_cost gives the number before you commit.

NameRequiredDescriptionDefault
urlYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
itemsNo
failedNo
resultsNo
warningsNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety (readOnly, idempotent, non-destructive), and the description adds real behavioral context beyond them: cached analyses are reused, fresh AI extraction is credit-gated, and charges hit the bound workspace. This is exactly the kind of cost/side-effect disclosure the annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences with the scope statement front-loaded and the cost path last. The 'Renamed V2' opener is the one piece of low-value text, but overall there is little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description covers the key operational facts an agent needs: caching, credit cost, and workspace charge attribution. Only the url parameter's invocation semantics remain unexplained, which is a minor gap for a plainly named URI field.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: workspaceId carries a thorough schema description, but url has only format:uri with no textual guidance. The description implies url is the company's own public website but adds no format or constraint detail, so it neither compensates for nor exceeds the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: a read-only analysis of a company's own public website. The 'Renamed V2' prefix is internal jargon that adds no selection value, and it does not explicitly differentiate from siblings like enrich_companies, but the core purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives useful usage context — cached results are reused, fresh extraction is credit-gated, and it routes the agent to campaignstack_estimate_cost before committing. However it never states when to prefer this over sibling enrichment tools or what conditions select it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_answer_job_questionAnswer job questionA
Destructive
Inspect

Send the person's answers for an application stopped at needs_answer. Answers are saved to the watcher's application profile for future matching questions, then CampaignStack continues the application under review, credit, and account daily-limit gates. Use only answers the person gave you; read every answer back first. confirmed:true is required.

NameRequiredDescriptionDefault
answersYes
confirmedYesRequired after reading the answers back and getting explicit approval to send them.
workspaceIdNoWorkspace 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.
applicationIdYes

Output Schema

NameRequiredDescription
statusNo
applicationIdNo
creditAttemptNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive=true, openWorld and non-idempotent. The description goes further, disclosing that answers are persisted to the watcher's profile for future matching questions and that the application resumes under review, credit, and account daily-limit gates — meaningful side-effect context. It still does not detail what data is destroyed or reversibility.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the eligible state and followed by the side effects and the confirmation rule. No filler, though the gating clause is rather dense.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. Combined with annotations and schema for workspaceId, the description covers persistence, resumption gates, and the confirmation requirement adequately; only applicationId lacks any documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 50% schema coverage, the description must compensate. It clarifies that answers must be the person's verbatim input and that confirmed is required after read-back, but applicationId (required, undocumented in both) remains unexplained, leaving a real gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (send answers) and resource (application stopped at needs_answer), pinpointing the exact precondition. An agent can distinguish it from campaignstack_apply_to_job or campaignstack_get_job_applications without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear condition ('Use only answers the person gave you; read every answer back first. confirmed:true is required') and the state gating eligibility (needs_answer). It does not name a sibling alternative or exclusion, but the when-to-use context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_apply_to_jobApply to jobA
Destructive
Inspect

Start an application for exactly one matched posting. CampaignStack reads the posting, drafts a cover letter in the person's voice, then parks it for review or submits later under the watcher's automatic-mode and account-safety gates. Pass applicationId, or postingId only when exactly one live watcher matched that posting. confirmed:true is required after naming the posting and company and getting explicit approval.

NameRequiredDescriptionDefault
confirmedYesRequired after naming the posting and company and getting explicit approval to apply.
postingIdNoOr a posting id when only one live watcher matched it.
workspaceIdNoWorkspace 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.
applicationIdNoThe match/application id from campaignstack_get_job_applications.

Output Schema

NameRequiredDescription
statusNo
applicationIdNo
creditAttemptNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive=true, idempotent=false, and openWorld=true, so the safety burden is partly carried. The description still adds real value by explaining that the tool drafts a cover letter in the person's voice and parks it for review before submitting under automatic-mode and account-safety gates, clarifying what 'apply' actually does.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the verb and scope, then the pipeline, then parameter/precondition rules. Dense but every sentence carries information; no filler or marketing fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, non-idempotent mutation with an output schema, the description covers scope, approval precondition, parameter selection, and what happens downstream. It omits failure modes and any rate/permission constraints, but the core is complete enough to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all four parameters are already documented, including the workspaceId defaulting logic and the postingId 'one live watcher' condition. The description largely restates the schema's confirmed/applicationId/postingId guidance rather than adding format or edge-case detail, making 3 the correct baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('start an application for exactly one matched posting') and distinguishes itself from the read-side siblings like campaignstack_get_job_applications by describing the drafting/parking pipeline it kicks off. An agent can tell what this does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete selection rules: pass applicationId, or postingId only when exactly one live watcher matched, and requires explicit human approval before confirmed:true. It does not name the sibling tools to consult first (e.g. get_job_applications), but the preconditions are clear enough to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_archive_job_watcherArchive job watcherA
Destructive
Inspect

Archive one job watcher permanently. It leaves live watcher lists and never searches or applies again, while previous applications remain readable. Use pause in campaignstack_edit_job_watcher for temporary stops. confirmed:true is required after naming the watcher/account back to the user.

NameRequiredDescriptionDefault
confirmedYesRequired because archiving is one-way; say the watcher/account back to the user before setting true.
watcherIdYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okYes
itemNo
resultsNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the destructiveHint=true annotation: it states the watcher leaves live lists, never searches or applies again, and that previous applications remain readable. That is the exact irreversibility/side-effect profile an agent needs before calling a destructive mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no waste, front-loaded with the permanent/archival nature before the alternative and the confirmation requirement. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description covers irreversibility, the reversible alternative, the confirmation gate, and the workspace resolution is handled by the schema. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%; workspaceId and confirmed are richly documented in the schema, and the description reinforces the confirmed semantics and its user-facing obligation. watcherId remains undocumented in both places, so it falls short of full coverage but adds real meaning for the risky parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Archive one job watcher permanently') and immediately contrasts with the reversible sibling (pause in campaignstack_edit_job_watcher). An agent can distinguish it from edit_job_watcher without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative tool and the condition that selects it: 'Use pause in campaignstack_edit_job_watcher for temporary stops.' It also states the precondition for the destructive path (confirmed:true after naming the watcher/account back to the user).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_cancel_workflow_node_leadsCancel workflow node leadsA
Destructive
Inspect

Confirmed drain operation for one workflow node. Waiting, event-waiting, and pending-review entries are cancelled; processing or already sent work cannot be recalled and is reported separately.

NameRequiredDescriptionDefault
nodeIdYes
confirmedYesConfirms queued node entries may be cancelled; processing/sent work cannot be recalled.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workflowIdNo
workspaceIdNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and idempotentHint=false. The description goes further by enumerating exactly which entry states are cancelled (waiting, event-waiting, pending-review) and disclosing that processing or sent work cannot be recalled and is reported separately, which is genuinely useful beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, and the operation type is front-loaded before the state-level detail. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and annotations cover the safety profile. The description supplies the cancellation scope and irreversibility caveat, leaving only minor gaps around nodeId format and permission prerequisites.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%: workspaceId and confirmed are self-documented in the schema, and nodeId has no description at all. The description adds only the indirect hint that the node is a single unit of work; it does not explain nodeId format or how workspaceId omission behaves. Baseline 3 given the schema already carries most parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource combination ("cancel" on "leads" for "one workflow node") and scopes it to a single node. An agent can distinguish it from broader siblings like campaignstack_delete_workflow or campaignstack_retry_workflow_entries, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase "Confirmed drain operation" implies when this is appropriate, and the note that processing/sent work cannot be recalled sets a boundary. However, it never states when to prefer this over retry_workflow_entries or delete_workflow, so usage is inferred rather than guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_comment_on_postA
Destructive
Inspect

Ask CampaignStack to post a comment on a lead's most recent post from a connected LinkedIn account. Call this when the user has approved specific comment wording for a specific lead's post. platform is required (currently "linkedin"). Name the person with leadId, which is the supported form; profileUrl is accepted for someone already in the workspace. commentText must be the owner's own words or wording they approved: draft it with campaignstack_craft_message, or park it for approval with campaignstack_submit_comment_for_review instead of posting it here. The workspace's only connected LinkedIn account is used automatically, or pass accountId (campaignstack_get_accounts). A comment is public and stays under the owner's name. This reaches a real person. Before calling it, tell the user exactly who it goes to and read the wording back to them, and wait for an explicit yes. It goes out as soon as this call succeeds: there is no draft state and nothing to recall. One person per call. There is no bulk form, and calling this in a loop over a list is not the supported way to reach a list: add the leads with campaignstack_edit_lead_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Business hours do not apply. CampaignStack's daily limit for this action (and the weekly limit for invitations) still applies and counts sends already queued, so a run of calls stops at the limit; the owner sets those limits in the app. A paused account, or an action LinkedIn has challenged, refuses the send whatever the limit.

NameRequiredDescriptionDefault
leadIdNo
platformYes
accountIdNoAccount that acts (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one.
profileUrlNo
commentTextYes
workspaceIdNoWorkspace 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.
idempotencyKeyNoOptional. A key you choose for this one send. Calling again with the same key returns the send already made instead of sending twice (use it when a call timed out); a key reused for a different send is refused. Without a key, the same words to the same person within a few minutes are refused as a repeat.

Output Schema

NameRequiredDescription
jobIdNo
statusNo
successNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations flag destructive/openWorld but the description adds far more: the comment is public and stays under the owner's name, there is no draft state and nothing to recall, one person per call, daily limits count already-queued sends, and a paused or challenged account refuses the send. These are exactly the operational facts annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long, but front-loaded with purpose and then ordered by importance (identity, wording source, account, then safety and limits). Nearly every sentence carries decision-relevant information, though a few safety points ('no draft state and nothing to recall') could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a high-stakes public write with a low-coverage schema, the description supplies the prerequisites (approval, account, identifier choice), the send semantics, and the failure/limit conditions. An output schema exists, so return values need not be explained. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 43%, but the description compensates well for the important params: it explains leadId is the supported identifier while profileUrl works for existing workspace people, confirms platform is currently 'linkedin', constrains commentText to owner-approved wording, and points accountId at get_accounts. workspaceId and idempotencyKey are left to the schema's own descriptions, which is a minor residual gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource+scope: 'post a comment on a lead's most recent post from a connected LinkedIn account.' This clearly separates it from siblings like campaignstack_send_message, campaignstack_like_post, and campaignstack_send_inmail without the agent needing to open any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('when the user has approved specific comment wording for a specific lead's post') and names concrete alternatives for adjacent cases: campaignstack_craft_message for drafting and campaignstack_submit_comment_for_review for parking. It also explains the correct bulk path (edit_lead_list + trigger_workflow) and why a loop is wrong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_configure_integrationConfigure integrationAInspect

Store or replace one provider integration using provider-nested credentials. This tool is non-OAuth because it accepts secrets; connected apps should direct the user to the workspace settings, Integrations section, in the CampaignStack app. Secrets are validated and never echoed back.

NameRequiredDescriptionDefault
providerYes
credentialsYesProvider-nested secrets. This tool is non-OAuth and never echoes secrets.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
failedNo
resultNo
resultsNo
warningsNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds behavior beyond the annotations: secrets are validated, never echoed back, and the tool is non-OAuth because it accepts secrets. That complements the write/idempotency hints meaningfully, though it doesn't state what a replace does to prior credentials.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action and scope, with no filler. The routing note and the secret-handling note each carry distinct value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description covers the security posture and routing constraint. The main residual gap is whether replacing an integration silently overwrites existing credentials or requires removal first.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the workspaceId semantics and credential nesting are already documented in the schema. The description reinforces 'provider-nested credentials' but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair ('Store or replace') and resource ('one provider integration') plus the credential shape. An agent can tell it apart from read siblings like get_integrations, though it never names edit_workspace_integrations or connect_account explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear usage rule: connected apps are told to send the user to workspace settings instead of calling this tool, and it explains the non-OAuth rationale. It stops short of naming the alternative API tool, so it is context-rich but not full when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_connect_accountConnect accountAInspect

Return a browser handoff for connecting a new LinkedIn or Google account. Never asks for OAuth secrets, cookies, or passwords in chat.

NameRequiredDescriptionDefault
platformYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
itemNo
resultsNo
warningNo
nextStepNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), and the description adds real value beyond them: it discloses that the result is a browser handoff rather than a direct connection, and it explicitly commits that OAuth secrets, cookies and passwords are never collected in chat. It stops short of saying what the handoff payload contains or what completes the flow.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the capability front-loaded and the security constraint following. No filler, no redundancy, and nothing that could be cut without losing information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value details are rightly omitted, and annotations already declare the mutating/open-world nature. The description supplies the remaining agent-critical facts: the two supported platforms, the browser-handoff mechanism, and the no-credential-in-chat guarantee.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: workspaceId carries a thorough schema description covering key types and the multi-workspace error case, while platform is an undocumented enum. The description's "LinkedIn or Google" merely restates the enum values and adds nothing to workspaceId semantics, so it neither compensates for the gap nor falls below the baseline for this coverage level.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("return a browser handoff") and resource ("connecting a new LinkedIn or Google account"), which is much more precise than the bare title. It scopes to NEW connections, implicitly separating it from campaignstack_get_accounts or edit_workspace_accounts, though it never names those siblings directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the word "new" suggests this is for onboarding an additional account rather than editing an existing one, steering the agent away from edit_workspace_accounts. There is no explicit when-to-use statement, no prerequisites, and no named alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_craft_messageCraft messageAInspect

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.

NameRequiredDescriptionDefault
kindYes
leadIdNo
channelYesDraft channel. LinkedIn drafts do not send; email drafts do not send.
postUrlNoRequired for comment drafts: the target LinkedIn post URL containing its activity id, or its urn:li:activity URN. Posts older than five days are skipped before crafting.
newEndAtNo
templateNo
accountIdNoLinkedIn account that will send the draft: names the speaker and picks the voice on every LinkedIn kind. For a LinkedIn follow-up it also reads the thread, and defaults to the workspace's only LinkedIn account ready to use; with several, the error lists them so you can ask the person.
meetingIdNoRequired for kind=meeting_followup.
campaignIdNo
newStartAtNo
workflowIdNo
commentTextNo
meetingKindNo
postContentNo
workspaceIdNoWorkspace 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.
instructionsNo
conversationMessagesNo

Output Schema

NameRequiredDescription
okNo
resultsNo
workspaceIdNo

TDQS

A4.2/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses the no-send contract, the returned sent:false signal, the requirement to read the draft back, the explicit-approval workflow for sending, and the booking:false schedulingAcceptance behavior. These details materially help an agent understand what the tool will and will not do.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core no-send behavior, then adds approval and scheduling context. The four sentences are dense and none appears wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema and annotations already cover return shape and safety, and the description adds useful workflow and scheduling context. However, for a 17-parameter tool with low schema description coverage, it leaves too many input semantics unexplained to be fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 29% across 17 parameters, so the description needs to compensate, but it mostly repeats the enum values for channel and kind. It does not explain the roles of leadId, template, instructions, conversationMessages, postContent, meetingKind, or several other inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Draft one outbound message.' It also distinguishes the tool from send/action siblings by saying it works 'without sending anything' and that a separate send tool is needed after approval, while enumerating the supported channels and kinds.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly says to use this tool for drafting and to use a separate send/action tool only after explicit approval, and it notes that scheduling is never automatic. It stops short of naming the exact sibling send/action tools or clarifying when to prefer edit_draft, explain_draft, or preview_craft_prompt.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_create_workspaceAInspect

Create a workspace and build it. Give a company website (acme.com), a LinkedIn profile URL, or both, and CampaignStack sets up what a new sign-up gets: the company context, the playbook, a first campaign with its ideal customer profile, a workflow, and a lead pool. Pass goal when the user told you what the workspace is for, in their words and in the first person: it becomes the campaign goal word for word, and without it one is written from the website and profile. Leave name out unless the user chose one; the company's name is used. A website alone is enough and needs no LinkedIn account: the workspace is whole and outreach waits until an account is linked with campaignstack_edit_workspace_accounts or connected under Accounts in the app. A profile URL is read through the user's own connected LinkedIn account, so it needs one. With neither URL you get a blank workspace and must name it. Returns the workspaceId at once and, when a build started, a generationId to follow with campaignstack_get_workspaces. Needs a user key or a signed-in connection: a workspace key is one workspace and cannot create another. One build runs at a time, and a free account owns one workspace.

NameRequiredDescriptionDefault
goalNoWhat this workspace should get done, first person, as the user said it. Becomes the campaign goal verbatim.
nameNoOnly when the user chose a name. Otherwise the company name from the website is used.
profileUrlNolinkedin.com/in/... of the person the workspace writes as, when it is not the user's own profile (an agency setting up a client). Read through the user's own connected LinkedIn account.
websiteUrlNoThe company website this workspace sells for, e.g. acme.com. Enough on its own.

Output Schema

NameRequiredDescription
modeNo
nextNo
workspaceIdNo
generationIdNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover only the generic mutation profile (readOnly=false, openWorld=true, idempotent=false, destructive=false), and the description adds the operationally important traits: the auth requirement, the workspace-key restriction, single-build concurrency, free-account quota, the immediate workspaceId plus optional generationId return, and that outreach stays dormant until an account is linked. This is behavioral context an agent cannot get from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and the what-gets-built payload in the first two sentences, then moves through per-parameter conditionals and constraints. It is dense and runs long as a single block, but nearly every sentence carries a distinct rule (goal fallback, name fallback, auth model, build concurrency, quota) rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex, zero-required-param creation tool this covers everything an agent needs: input conditionals, auth prerequisites, quotas, concurrency, the immediate return values, and the follow-up tool (campaignstack_get_workspaces) for tracking the build. The output schema exists, so return-value shape is correctly left to it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description contributes meaning beyond the schema: it explains what goal becomes when omitted (written from website and profile), and contrasts the website path (no LinkedIn needed) against the profile path (requires the user's connected account). Some statements, such as the name fallback, duplicate the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Create a workspace and build it') and enumerates exactly what the build produces: company context, playbook, a first campaign with ICP, a workflow, and a lead pool. The purpose is unmistakable, but the description never differentiates itself from the similarly-named sibling campaignstack_onboard_workspace, leaving that distinction to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use rules for every input: pass goal only when the user stated the purpose, omit name unless the user chose one, website alone suffices, a profile URL requires a connected LinkedIn account, and neither URL yields a blank workspace that must be named. It also states entry prerequisites (user key or signed-in connection; a workspace key cannot create another) and limits (one build at a time, one workspace on a free account).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_decide_reviewDecide reviewA
Destructive
Inspect

Approve, reject, or edit-and-approve one pending review. To save a revised draft for a person to sign off instead of deciding it, use campaignstack_edit_draft. For kind workflow, an approved message goes out later, on the account's pacing (business hours, daily budget, spacing between sends), which can take hours; with priority:true it is sent within seconds instead. Use priority only when the user asked for this message to go out now, and tell them it is sending immediately. For kind job_application, approval sends or schedules the application within limits; edit_and_approve accepts updatedContent { letter?, answers?: [{ question, answer }] }, and reject may include reason. confirmed:true is required.

NameRequiredDescriptionDefault
kindNoThe item kind from campaignstack_get_reviews. "workflow" (default) is a drafted workflow touch; "job_application" is a job watcher application, where entryId is the application id.
reasonNoJob applications only: why the user rejected the application. Stored on the application.
entryIdYes
decisionYes
priorityNoSend in priority: approve AND send this one message within seconds, instead of waiting its turn in the queue. It skips the queue's own limits for this message (business hours, the daily budget, pacing, the weekly connection cap) but never what the account itself says (a paused, expired or risk-paused account refuses it with an error). Set it only when the user asked for this specific message to go out now. Workflow drafts on LinkedIn only; not with reject or job applications.
confirmedYesConfirms the review decision; approve/edit_and_approve can send a real message on the workflow's pacing or submit a job application.
workspaceIdNoWorkspace 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.
expectedTurnNoFor a conversation reply, the turn campaignstack_get_reviews returned on the item. If the lead wrote again and a newer draft replaced it, the decision is refused so you can read the new one.
updatedContentNo

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workflowIdNo
workspaceIdNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructive/openWorld/non-idempotent, and the description adds what they cannot: approved workflow messages go out later on account pacing (hours), priority jumps the queue but still respects account states (paused/expired refused with error), and confirmed:true is mandatory because a real message or application may be submitted. No contradiction with the destructive annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and the sibling alternative first, then kind-specific detail. Dense but every clause carries operational consequence; only the kind-specific paragraph runs long and could be tightened slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter destructive tool with an output schema, the description covers pacing, priority semantics, kind branching, confirmation, and rejection reasons. The remaining gap is what edit_and_approve's updatedContent means for the workflow kind and what a reject returns, though the output schema covers return shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

At 67% schema coverage the description earns credit for documenting the otherwise opaque updatedContent shape for job_application ({ letter?, answers?: [{question, answer}] }) and for explaining priority constraints beyond the schema text. It leaves entryId/decision and workspace resolution to the schema, which is reasonable, but the workflow-kind use of updatedContent is not addressed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb set (approve, reject, edit-and-approve) against a precise resource (one pending review) and immediately names the sibling it is not (campaignstack_edit_draft). An agent can distinguish it from nearby review/draft tools without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: use campaignstack_edit_draft when a revised draft needs human sign-off instead of a decision. It also gives a when/when-not rule for priority (only when the user asked for immediate send, and tell them) and states that priority cannot be combined with reject or job applications.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_delete_company_employee_watchA
Destructive
Inspect

Delete company employee watches by archiving them so they no longer refresh. Call this only after the user confirms the exact watches to remove. 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. Batch edits are bounded. Return one result per requested item, and report partial failures instead of describing the whole batch as successful.

NameRequiredDescriptionDefault
watchIdsYes
confirmedYesThis 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.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
resultsNo
warningsNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish destructiveHint=true and non-idempotency, but the description adds value beyond them: the archive-based mechanism, bounded batch edits, one result per item, and the instruction to report partial failures rather than claiming whole-batch success. The mild internal tension between 'archiving' and 'permanently deletes a root record' is a wording wrinkle, not a contradiction of the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, but the confirmation requirement is stated twice in near-identical terms ('Call this only after the user confirms the exact watches to remove' vs 'name exactly what will be deleted ... wait for an explicit yes'), which is redundant bulk for a six-sentence description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive batch delete gated by explicit confirmation, the description covers irreversibility, batch bounds, and partial-failure reporting, and an output schema exists to cover return shape. The only gap is the absence of any hint about the workspaceId parameter's multi-workspace requirement, which is left entirely to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, so the schema already does most of the work, and the description never discusses watchIds or the workspaceId fallback logic. It only implies the batch nature ('Batch edits are bounded', 'one result per requested item'), and the confirmation text duplicates the 'confirmed' parameter's own schema description. Baseline 3 fits.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb plus resource ('Delete company employee watches') with the mechanism disclosed ('by archiving them so they no longer refresh'). This cleanly separates it from siblings like campaignstack_edit_company_employee_watch and campaignstack_get_company_employee_watches, so an agent can route without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Call this only after the user confirms the exact watches to remove' gives a clear precondition for use. It does not, however, name the alternative to reach for when the user only wants to modify a watch rather than remove it (e.g. edit_company_employee_watch), so the when-not/alternative half of the guidance is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_delete_competitor_watchA
Destructive
Inspect

Delete competitor watches and disable their scheduled automations. Call this only after the user confirms the exact watches to remove. 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. Batch edits are bounded. Return one result per requested item, and report partial failures instead of describing the whole batch as successful.

NameRequiredDescriptionDefault
watchIdsYes
confirmedYesThis 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.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
resultsNo
warningsNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds substantial context beyond them: permanent root-record deletion, irreversibility, disabling of scheduled automations, bounded batch size, one result per requested item, and the requirement to report partial failures. This is unusually rich disclosure for a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose, then confirmation precondition, then batch/result semantics. The confirmation instruction largely duplicates the `confirmed` schema description, which is mild redundancy, but no sentence is wasted within the description itself.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value formatting needn't be explained, and the description correctly focuses on preconditions and partial-failure semantics. It leaves workspace-scoping behavior to the schema, which is reasonable, though a note on multi-workspace ambiguity would have made it fully self-contained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%. The description implies bounded batching (max 25 watchIds) and echoes the confirmation requirement that the `confirmed` schema field already documents verbatim, but adds no syntax, ID format, or workspace-resolution guidance beyond the schema's own workspaceId text. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (delete competitor watches) plus a secondary effect (disable their scheduled automations), which distinguishes it from campaignstack_edit_competitor_watch and campaignstack_get_competitor_watches. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition (call only after the user confirms the exact watches to remove) and a required confirmation protocol. It does not name the obvious alternative (edit_competitor_watch) for partial changes, so it stops short of full when-not/alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_delete_contentDelete contentA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
confirmedYesThis 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.
contentIdsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
resultsNo
workspaceIdNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is known. The description adds that this is permanent, irreversible, targets a 'root record' (implying cascading deletion), and requires explicit user confirmation — real context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and scope, then the precondition, then the confirmation protocol. Only mild redundancy with the schema's identical confirmed description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and the confirmation flow is fully specified for a destructive tool. Minor gaps remain: what qualifies as 'draft or failed' content, and whether deletion cascades to related records.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%; workspaceId is thoroughly documented in the schema, and confirmed's schema description duplicates the tool description. contentIds, however, is undocumented in both places — the description never explains what a content ID is or the 25-item batch cap, so it does not compensate for the gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with a meaningful scope restriction: 'Permanently delete draft or failed content.' That restriction distinguishes it from campaignstack_edit_content and campaignstack_get_content, though it does not explicitly name the sibling to prefer.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear precondition ('Requires confirmed:true') and a concrete pre-call protocol: name what will be deleted, state it cannot be undone, wait for explicit yes. No exclusion of alternatives, but the usage context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_delete_lead_listDelete lead listA
Destructive
Inspect

Delete up to 50 lead lists from the bound workspace. The list row is removed and entries drain asynchronously. 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.

NameRequiredDescriptionDefault
confirmedYesThis 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.
leadListIdsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
itemsNo
failedNo
resultsNo
warningsNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds genuinely new traits: the list row is removed immediately while entries drain asynchronously, and it is a permanent root-record deletion. This goes beyond the boolean hints, though the confirmation protocol is duplicated verbatim in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose, scope, and behavior in a logical order. Slightly undermined by the confirmation sentence being repeated word-for-word in the confirmed parameter description, but within the description itself nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and annotations covering the safety profile, the description supplies everything an agent needs: purpose, scope, async behavior, permanence, and the confirmation gate. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, and workspaceId plus confirmed carry rich schema descriptions. The description only reinforces the 50-item cap on leadListIds and adds no syntax or format detail; leadListIds itself has no schema description, so the gap is only partly compensated. Baseline 3 for adequate but not value-adding param guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete ... lead lists') with explicit scope ('up to 50', 'from the bound workspace'). This is clearly distinguishable from siblings like campaignstack_get_lead_lists and campaignstack_edit_lead_list without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a strong precondition for invocation: name exactly what will be deleted, state it cannot be undone, and wait for an explicit yes. It does not name alternative tools or contrast with soft-delete paths, so it falls short of a full when/when-not/alternatives treatment.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_delete_signal_agentA
Destructive
Inspect

Delete signal agents by running the supported archive/remove contract and clearing linked watch pointers. Call this only after the user confirms the exact agents to remove. 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. Batch edits are bounded. Return one result per requested item, and report partial failures instead of describing the whole batch as successful.

NameRequiredDescriptionDefault
agentIdsYes
confirmedYesThis 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.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
resultsNo
warningsNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, but the description adds substantial context beyond them: the delete is permanent and irreversible, it is a root record, linked watch pointers are cleared, batches are bounded, and results come back per item with partial failures surfaced. That is exactly the disclosure a mutation tool needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then the guardrails, then the response contract. It is slightly repetitive in restating the confirmation requirement that also appears in the confirmed parameter schema, but every sentence carries operational weight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description rightly avoids describing return shape in detail while still noting per-item results and partial-failure reporting. Combined with the confirmation contract and cascade behavior, an agent has enough to call this safely; only ID formatting guidance is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, with agentIds carrying no inline description and workspaceId and confirmed well documented. The description adds the batch bounding and one-result-per-item semantics, but says nothing about agent ID format or limits beyond what the schema's maxItems implies. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete signal agents') plus the mechanism ('archive/remove contract and clearing linked watch pointers'). The resource is distinct enough from siblings such as delete_signal_watch and edit_signal_agent, but no sibling is named explicitly, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear precondition ('Call this only after the user confirms the exact agents to remove') and an explicit confirmation ritual. It does not, however, point to an alternative when the user merely wants to modify an agent (e.g., edit_signal_agent), which would be the natural when-not case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_delete_signal_watchA
Destructive
Inspect

Delete person signal watches by archiving them so they no longer refresh. Call this only after the user confirms the exact watches to remove. 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. Batch edits are bounded. Return one result per requested item, and report partial failures instead of describing the whole batch as successful.

NameRequiredDescriptionDefault
watchIdsYes
confirmedYesThis 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.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
resultsNo
warningsNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true, and the description adds real value beyond that: the archiving mechanism, the permanence of the operation, the required explicit user confirmation, bounded batching, and partial-failure reporting. The only wobble is mild tension between 'archiving' and 'permanently deletes a root record'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and mechanism, and sized reasonably for a destructive tool. There is some duplication: the deletion/confirmation instructions are repeated almost verbatim in the confirmed parameter description, costing a little density.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the safety workflow, batch bounds, and even touches on return semantics ('one result per requested item', partial failures) despite an output schema existing. For a destructive batch tool this is close to complete; missing only return-shape detail that the output schema carries.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%; workspaceId and confirmed are well documented in the schema itself, but watchIds has no description in either place. 'Batch edits are bounded' restates the maxItems:25 constraint without adding meaning, so the description adds little beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Delete person signal watches') and explains the mechanism ('by archiving them so they no longer refresh'), which separates it from edit_signal_watch. It does not explicitly route against sibling delete tools (delete_signal_agent, delete_company_employee_watch), so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition ('Call this only after the user confirms the exact watches to remove'), which is clear usage context. It does not name an alternative tool for modifying rather than removing watches, so no exclusion/alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_delete_workflowDelete workflowA
Destructive
Inspect

Permanently delete one workflow and its associated records. Requires confirmed:true. Use edit_workflow set_enabled:false to pause without deleting history.

NameRequiredDescriptionDefault
confirmedYesThis 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.
workflowIdYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workflowIdNo
workspaceIdNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds substantive context beyond them: the deletion is permanent AND cascades to associated records, and a confirmation flag is mandatory. The only gap is that it doesn't describe the failure/response shape, which is partly covered by the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, both load-bearing: the first defines the action and its blast radius, the second defines the safer alternative. No filler. Slightly terse on return/cascade edge cases, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering the destructive profile, an output schema covering returns, and 3 params of which two are documented in the schema, the description's remaining job is scope and safety framing — both delivered. Only minor omission is guidance on what happens on a failed/partial cascade.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, with the confirmed and workspaceId parameters already well documented in the schema (including the multi-workspace fallback behavior). The description adds the confirmed:true requirement, but says nothing new about workflowId or workspace resolution, so this sits at the baseline where the schema does most of the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (delete one workflow) and immediately scopes it ("and its associated records"), which is the key semantic difference from a soft disable. It also names the sibling alternative, so an agent can distinguish it from edit_workflow without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: use edit_workflow set_enabled:false when the goal is pausing without losing history, and use this tool only for permanent removal. The precondition (requires confirmed:true) is also stated up front.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_delete_workspace_memoryA
Destructive
Inspect

Permanently delete one workspace memory candidate or active fact. 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.

NameRequiredDescriptionDefault
memoryIdYesMemory id from campaignstack_get_workspace_memories
confirmedYesThis 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.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
idNo
deletedNo
successNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds that this deletes a ROOT record (implying cascade/side effects), that it cannot be undone, and that a confirmation gate is enforced. That is meaningful context beyond the flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, no waste, with the irreversible/root-record warning front-loaded before the confirmation workflow.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists so return values need no explanation; annotations carry the safety profile; the description covers the remaining agent-facing concerns (irreversibility, root-record scope, confirmation gate) for a 3-param destructive tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the confirmed parameter's schema description is verbatim identical to this text, so the description adds no new parameter meaning. memoryId and workspaceId semantics are left entirely to the schema. Baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope: 'Permanently delete one workspace memory candidate or active fact.' An agent can distinguish it from campaignstack_edit_workspace_memory and campaignstack_get_workspace_memories immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit precondition chain (requires confirmed:true; name what will be deleted, state irreversibility, wait for explicit yes), which defines when the tool may be called. It does not name edit_workspace_memory as the non-destructive alternative, so it falls short of full alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_diagnose_workflow_sourcingDiagnose workflow sourcingA
Read-onlyIdempotent
Inspect

Explain why one lead did or did not enter one workflow, including score, dedup, exclusions, provider filters, and verdict. Read-only diagnostic only.

NameRequiredDescriptionDefault
leadIdNo
profileUrlNo
workflowIdYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
errorNo
resultNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and non-open-world, so the safety profile is covered. The description repeats that ('Read-only diagnostic only') rather than adding new behavior, though listing the diagnostic dimensions tells the agent what reasoning is exposed. No rate limits, auth requirements, or failure modes are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the core purpose front-loaded and the read-only constraint appended. No filler or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value detail is rightly omitted, and annotations cover safety. But with 3 of 4 parameters undocumented and no routing guidance to sibling diagnostic or retry tools, the definition leaves real gaps for an agent trying to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 25% (just workspaceId). The description says 'one lead' but never disambiguates leadId versus profileUrl, which appear to be alternative lead identifiers, nor explains workflowId's expected format. Only workspaceId is documented, and that documentation lives in the schema, not the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Explain why one lead did or did not enter one workflow') and scopes it to a single lead/workflow pair, which distinguishes it from siblings such as campaignstack_trigger_workflow, campaignstack_retry_workflow_entries, and campaignstack_get_workflows. The enumerated analysis dimensions (score, dedup, exclusions, provider filters, verdict) make the output intent unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Read-only diagnostic only' implies this is for investigation rather than mutation, which is useful framing. However, it never says when to reach for this versus trigger_workflow, retry_workflow_entries, or get_workflows, nor does it state prerequisites. Usage is implied, not specified.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_accountEdit accountA
Destructive
Inspect

Edit one connected LinkedIn account. Use operation=set_owner_workspace to change the workspace that pays for maintenance/watchers. Use operation=set_watcher to turn the account's connection watcher, message watcher, own-posts watcher or invitation hygiene on or off (state is in campaignstack_get_accounts include.maintenance): name the account and kind and get a yes first, because enabling a watcher starts drafting outbound messages for review. The first enable creates the watcher and its review-first workflow, later calls pause or resume it; one watcher per kind per account across all workspaces (DUPLICATE_*_EXTERNAL means another workspace runs it; it has to be turned off there first) and it needs a live session (AGENT_ACCOUNT_UNAVAILABLE). Use operation=delete only after naming the account and getting explicit confirmation: delete removes the account from every workspace and clears its CampaignStack session/proxy/budgets/credentials, unlike campaignstack_edit_workspace_accounts unlink which only removes workspace access. With platform google, operation=set_scheduling_hours sets the hours meetings are offered in, which also bound when campaign email sends; it needs a person key and only changes a Google account that person connected.

NameRequiredDescriptionDefault
platformYesgoogle only takes set_scheduling_hours; every other operation is LinkedIn.
accountIdNoConnected account (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one. Always required to delete. With platform google, the Google account ID, same default rule.
operationYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
itemNo
resultsNo
warningNo
nextStepNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations flag destructive/openWorld, and the description adds real depth beyond them: delete wipes session/proxy/budgets/credentials across every workspace, enabling a watcher starts drafting outbound messages, one watcher per kind is enforced globally (DUPLICATE_*_EXTERNAL), and a live session is required (AGENT_ACCOUNT_UNAVAILABLE). This is exactly the kind of context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and organized around operation=, with each sentence carrying distinct operational content. It runs long as a single dense paragraph and would scan better as bullets, but little is truly wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given four operations, a nested operation union, destructive semantics, and an output schema, the description covers all decision-relevant behavior: prerequisites, cross-workspace constraints, confirmation rules, and the difference from the sibling unlink tool. Nothing an agent needs to call it safely is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75% and already documents the operation union well. The description still adds meaning the schema doesn't: confirmation preconditions for delete/set_watcher, the person-key requirement for google scheduling hours, and the error semantics of DUPLICATE_*_EXTERNAL and AGENT_ACCOUNT_UNAVAILABLE.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Edit one connected LinkedIn account') and names every operation it supports (set_owner_workspace, set_watcher, delete, set_scheduling_hours), clearly separating it from the sibling campaignstack_edit_workspace_accounts. Minor ding for the opening framing as LinkedIn-only when the schema also accepts platform=google, though the last sentence corrects this.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing per operation, plus explicit exclusions and alternatives: delete vs. campaignstack_edit_workspace_accounts unlink, and the requirement to get a yes/explicit confirmation before destructive or outbound-drafting changes. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_campaignEdit campaignA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
operationsYes
workspaceIdNoWorkspace 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.
restoreVersionIdNo

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workspaceIdNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (destructive=true, idempotent=false), it discloses cost implications ('can spend credits, paid provider quota, or model-backed work'), that deletes cascade and cannot be undone, that confirmed:true is required for archive/deletes, that archive does not send messages, and edge cases like a second watch returning enabled:false with a disabledReason. This is richer behavioral context than annotations alone provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core operations are front-loaded, but the description is a dense, run-on block that packs cost, deletion, restore, and watch behavior into long compound sentences. Nearly every clause is informative, yet the lack of paragraphing or bullets makes it harder to scan than it needs to be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-variant polymorphic operation tool with an output schema already defined, the description covers the safety-critical operations (delete/archive confirmations, irreversibility), cost signaling, and the restore path. It is largely complete, with minor gaps in per-op field detail that the schema carries.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 33% schema description coverage, the description compensates for the most non-obvious parameters: rescore/rescoreLeadIds semantics, topic addressing by topicId or exact taxonomy name, search_watch enabled/accountIds behavior, and bounded score weights. Many nested data fields (icpId, titles, persona goals, etc.) are left to the schema, so it does not fully close the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names specific verbs (create, update, archive, unarchive, edit, delete) and the exact resources (ICP, persona, roadmap phase, topic, search watch, signal weight, automation state). It clearly distinguishes itself from read siblings like campaignstack_get_campaigns and from neighboring edit_* tools by scoping to campaign components.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete when-to-use routing: 'Use archive to stop work without deleting history', 'unarchive reverses it and needs no confirmation', and points to campaignstack_get_campaigns' guidanceHistory include for restoreVersionId. It does not, however, explicitly exclude or contrast sibling tools such as edit_workflow or edit_signal_agent, leaving some selection inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_companiesEdit companiesAInspect

Patch per-workspace company overlays (tags/notes) for up to 50 shared or private companies. This does not mutate shared firmographics.

NameRequiredDescriptionDefault
companiesYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
itemsNo
failedNo
resultsNo
warningsNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false and notably idempotentHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: it is a per-workspace overlay patch and explicitly does NOT touch shared firmographics, defining the blast radius of the write. It omits partial-failure behavior and whether omitted fields are cleared.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste, with the scope of the mutation front-loaded and the negative scope constraint immediately after. Nothing redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and workspaceId resolution is fully covered by the schema description. For a bounded mutation tool the description covers resource, field scope, limits and non-effects; only edge-case semantics (partial failure, clearing fields) are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%: workspaceId is richly documented in the schema while the nested companyId/tags/notes items have no descriptions. The description names the patchable fields and the 50-item cap (the cap is already in the schema as maxItems), so it adds mild clarification rather than compensating for the undocumented nested fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (patch) and a specific resource (per-workspace company overlays), and clarifies the exact mutable fields (tags/notes) plus the blast radius (not shared firmographics). It is clearly separable from get_companies, refresh_companies and enrich_companies, though it does not name a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the scope statement (edit tags/notes on up to 50 companies), and the negative clause 'does not mutate shared firmographics' nudges the agent toward other tools for firmographic changes. However, there is no explicit when-to-use/when-not or named alternative, so guidance stays at the implied level.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_company_employee_watchAInspect

Create company employee watches or change their active/paused state. Call this when the user asks CampaignStack to watch a company for new hires or pause/resume an existing company watch. It does not delete watches; use campaignstack_delete_company_employee_watch for removal. Batch edits are bounded. Return one result per requested item, and report partial failures instead of describing the whole batch as successful.

NameRequiredDescriptionDefault
operationsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
resultsNo
warningsNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds real behavioral context beyond the annotations: batch edits are bounded, one result is returned per requested item, and partial failures must be surfaced rather than reporting the whole batch as successful. The annotations only say readOnly=false, destructive=false, idempotent=false, so this partial-failure contract is genuine added value. Minor gap: it doesn't clarify permission or auth requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded action statement followed by trigger, exclusion, and batch/result semantics. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers triggering, the delete alternative, batch bounds, and partial-failure reporting. The only residual gap is the absence of parameter-level detail to compensate for the 50% schema coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%; the description only vaguely maps to the two modes ('create' vs 'set_status') without naming the operations array, companyId, watchId, or status fields. The anyOf schema itself documents the mode structure, so the description adds little beyond what structured data already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create company employee watches or change their active/paused state') and explicitly names the sibling operation it is not ('does not delete watches; use campaignstack_delete_company_employee_watch'). An agent can distinguish it from related edit/delete watcher tools without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('when the user asks CampaignStack to watch a company for new hires or pause/resume an existing company watch') and an explicit exclusion with the named alternative tool for deletion. Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_competitor_watchA
Destructive
Inspect

Create competitor watches, pause/resume them, assign LinkedIn accounts used by CampaignStack to observe those competitors, or delete them. Omit sendAccountIds (or pass []) to collect engagers without contacting anyone. A delete operation runs the same removal as campaignstack_delete_competitor_watch and requires confirmed:true on that operation. Batch edits are bounded. Return one result per requested item, and report partial failures instead of describing the whole batch as successful.

NameRequiredDescriptionDefault
operationsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
resultsNo
warningsNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and non-idempotent, and the description adds real detail beyond them: which operation is destructive (delete), the confirmed:true gate, that batch edits are bounded, and that results report partial failures rather than a blanket success. It does not quantify the batch bound or describe permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The verbs are front-loaded in the first sentence, and the follow-on sentences each carry a distinct operational fact (opt-out sending, delete confirmation, batch result semantics). It is dense but every sentence earns its place, with only mild verbosity in the account-assignment phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multiplexed write tool with a rich anyOf schema and an output schema, the description supplies the missing operational context: per-mode behavior, delete confirmation, batch bounding, and partial-failure reporting. Return-value detail is correctly left to the output schema, so coverage is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is around 50% and the description mostly restates schema-level semantics for sendAccountIds (omit/[] to avoid contacting engagers) rather than adding new meaning. It does not clarify the mode enum values or the workspaceId resolution behavior from a description standpoint, so it only partially compensates for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (competitor watches) and enumerates the specific operations the tool performs: create, pause/resume, assign observing LinkedIn accounts, and delete. It also differentiates from the sibling by noting that delete runs the same removal as campaignstack_delete_competitor_watch, so an agent can place the tool without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear situational context for each mode and explicitly routes the delete case via a named sibling plus a required confirmed:true precondition. It stops short of stating when NOT to use this tool (e.g. versus get_competitor_watches for reads), so it is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_contentEdit contentAInspect

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.

NameRequiredDescriptionDefault
operationsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
resultsNo
workspaceIdNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations present (readOnly=false, destructive=false, idempotent=false), the description still adds real context: generators create drafts only, state transitions are validated and return per-operation results, and nothing is published. It omits idempotency/retry semantics despite idempotentHint=false and does not explain clientOperationId's role.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the operation verbs, then generator behavior, then scope limits. No filler; each sentence adds distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-op mutation tool with an output schema (returns need not be described), the description covers the operation space, generator semantics, and the no-publish guarantee. Gaps remain around batch/error behavior and idempotency handling, which an agent invoking 25-item operation arrays would benefit from knowing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

At 50% schema coverage the description must compensate, and it does for the highest-value field: it explains the behavioral difference between generator.type=lead_magnet and generator.type=search_console_demand, which the schema only declares as consts. It does not clarify reason, scheduledAt, autoSchedule, or clientOperationId.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific and complete verb set ('Create, update, duplicate (copyFromId), or request legal desired-state transitions for content'), naming both the resource and each operation. It is readily distinguishable from siblings like campaignstack_delete_content and campaignstack_get_content, and it explicitly bounds scope with 'nothing is published by this tool.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is clear: generator.type values are enumerated with what each drafts from, and it states that generators produce draft posts only while scheduling/approval/reject/retry are validated transitions. There is no explicit naming of alternative sibling tools or a 'use X instead' clause, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_conversationsEdit conversationsA
Idempotent
Inspect

Batch small inbox state changes: mark conversations read, or cancel/edit a pending campaignstack_send_message sendAt row (scheduledMessages, id from campaignstack_get_conversations include.scheduledMessages). Sending remains campaignstack_send_message.

NameRequiredDescriptionDefault
workspaceIdNoWorkspace 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.
conversationsNo
scheduledMessagesNo

Output Schema

NameRequiredDescription
okNo
itemNo
resultsNo
warningNo
nextStepNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false and readOnlyHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: that edits apply only to a *pending* scheduled message, that cancellation is part of this tool, and that this tool is deliberately not the send path. It omits limits (e.g. the 25-item cap) and permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One dense sentence, front-loaded with the core 'what' before the sibling references. The parenthetical about scheduledMessages/id source is information-dense, though the packaging is a little thick for a single sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need no explanation, and annotations carry the safety profile. For a mutation with 0 required params, the description covers both mutation paths and the id provenance. Only minor details (item limits, partial-failure behavior) are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% (workspaceId is the documented one). The description partially compensates by mapping the two undocumented arrays to their semantics and telling the agent where the scheduled message `id` originates (get_conversations with include.scheduledMessages). It still leaves the conversationRef shape and the edit-vs-cancel field constraints to the schema, so it is additive but not fully compensating.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope: 'Batch small inbox state changes' covering two concrete operations (mark read, cancel/edit a pending scheduled send). It distinguishes itself from the two overlapping siblings by name, saying concerns route to campaignstack_send_message and ids come from campaignstack_get_conversations. An agent can place it correctly without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear when-to-use conditions ('mark conversations read, or cancel/edit a pending ... sendAt row') and explicitly names the alternative for the adjacent case: 'Sending remains campaignstack_send_message.' It stops short of stating exclusions against other edit_* tools, so it is strong context rather than a complete routing guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_draftEdit draftAInspect

Save new words on one draft without changing its approval state. Call this when the user asks to revise a draft for someone to sign off later, or to reword a message that is already approved and scheduled. Workflow drafts awaiting review can teach durable writing preferences from the edit immediately. A draft waiting for review stays waiting (a person still approves it, and the approval is recorded as an edit of the model's draft); a scheduled message keeps its slot; a job application keeps its status and is not approved. It never approves, rejects or sends (campaignstack_decide_review does that).

NameRequiredDescriptionDefault
kindNoThe item kind from campaignstack_get_reviews. "workflow" (default) is a drafted workflow touch; "job_application" is a job watcher application, where entryId is the application id.
entryIdYes
confirmedYesConfirms saving new words on this draft. A scheduled message goes out with them at its slot without another review.
workspaceIdNoWorkspace 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.
updatedContentYesThe fields to change. For a workflow draft, write the text under the draft.field key campaignstack_get_reviews returned (e.g. { messageText }). For a job application, { letter?, answers?: [{ question, answer }] }.

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workflowIdNo
workspaceIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by describing state-preservation semantics for each case: a review-pending draft stays pending, a scheduled message keeps its slot and goes out without re-review, a job application keeps its status. It also notes the side effect that workflow edits feed durable writing preferences, and it is consistent with destructiveHint=false and idempotentHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and the key constraint, then the when-to-use, then state semantics, then the exclusion. Dense but every sentence carries information; the parenthetical about approval being 'recorded as an edit of the model's draft' is slightly heavy but still informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema covers return values, and for a mutation tool with a nested updatedContent object the description supplies the necessary behavioral context (state preservation, no approval/send, scheduled-slot behavior). Nothing an agent needs in order to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 80%, so the schema already explains kind, confirmed, workspaceId, and updatedContent. The description's overlap ('revise a draft', 'scheduled message keeps its slot') reinforces intent but adds little parameter-level meaning beyond what the schema documents. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+constraint: 'Save new words on one draft without changing its approval state.' It explicitly contrasts itself with campaignstack_decide_review ('It never approves, rejects or sends'), so an agent can separate it from the sibling that handles review decisions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit trigger conditions ('when the user asks to revise a draft for someone to sign off later, or to reword a message that is already approved and scheduled') and names the alternative tool for the approval path. Both when-to-use and when-not are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_exclusionsAInspect

Edit exclusion policy for a workspace, signal agent, or workflow. Call this when the user asks to add/remove blocked profiles, change filter rules, or enable/disable exclusion rules. To block a profile, use add_manual_profiles without exclusionId: it adds to the workspace block list (created on first use) and stops running workflows from drafting to or contacting that person. Child targets are additive only: they can add restrictions but cannot release workspace restrictions. Batch edits are bounded. Return one result per requested item, and report partial failures instead of describing the whole batch as successful.

NameRequiredDescriptionDefault
targetYesworkspace edits level-0 policy. signal_agent and workflow edits are additive level-1 policy and cannot release workspace exclusions.
operationsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
resultsNo
warningsNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations it discloses the policy hierarchy (level-0 workspace vs additive level-1 child), the side effect that blocking stops running workflows from drafting to or contacting that person, and the partial-failure reporting contract ('report partial failures instead of describing the whole batch as successful'). These are semantic traits annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb and resource, then triggers, then the alternative path, then constraints. Mostly dense and earnable, though 'Batch edits are bounded' is vague and largely restates the schema's maxItems/minItems limits.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A five-mode, nested-object mutation tool with an output schema, and the description covers the highest-risk semantics (target hierarchy, partial failures, workspace fallback). Minor gaps remain around replace_child_exclusions and the meaning of exclusion state/config, but the essentials for correct invocation are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the description adds real meaning: target type semantics, the effect of omitting exclusionId (workspace block list created on first use), and the additive constraint on child ids. It does not explain the replace_child_exclusions mode or the opaque state/config fields, leaving one operation under-described.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Edit exclusion policy') plus the three target scopes it operates on (workspace, signal agent, workflow), which separates it cleanly from the read-only sibling campaignstack_get_exclusions. It also carves out the add_manual_profiles path so the agent knows which behavior lives where.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit invocation triggers ('when the user asks to add/remove blocked profiles, change filter rules, or enable/disable exclusion rules') and names the alternate route for the block-a-profile case, including the condition for omitting exclusionId. The boundary between workspace-level and child-level policy is stated as a hard rule ('additive only... cannot release workspace restrictions').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_identityEdit identity voiceAInspect

Edit or restore one identity voice profile language. Provide identityId, linkedinAccountId, or googleAccountId, or none of them when the workspace has one LinkedIn account; full core/overlays replace the stored object. Restores are versioned.

NameRequiredDescriptionDefault
coreNo
activeNo
languageYes
overlaysNo
identityIdNo
workspaceIdNoWorkspace 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.
googleAccountIdNo
readableSummaryNo
linkedinAccountIdNoNames the identity by its LinkedIn account. With no identityId, linkedinAccountId or googleAccountId, the workspace's only LinkedIn account ready to use is meant; with several, the error lists them so you can ask the person.
restoreVoiceVersionIdNo

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workspaceIdNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the write/non-destructive/non-idempotent profile, and the description adds genuinely new behavior: 'full core/overlays replace the stored object' discloses replacement (not merge) semantics, and 'Restores are versioned' explains that reverting is version-tracked. Missing auth/permission requirements keep it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense sentence that is front-loaded with the purpose and packs identity resolution plus replacement/versioning semantics without filler. The semicolon-clause structure is a little cramped but every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter mutation tool with nested core/overlays and low schema coverage, the description covers identity resolution and replace/restore behavior but omits the meaning of 'active', 'readableSummary', and the restore-version flow. An output schema exists, so return values need not be described, but input-side gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 20% (only workspaceId and linkedinAccountId documented), so the description must compensate. It usefully clarifies the identity-resolution trio and the replace semantics of core/overlays, but leaves 'active', 'readableSummary', and 'restoreVoiceVersionId' unexplained, so compensation is partial and the 3 baseline applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Edit or restore one identity voice profile language'), so the agent knows it mutates and can restore a voice profile. However it does not explicitly distinguish itself from sibling campaignstack_refresh_identity_voice, which an agent could otherwise confuse with the restore path.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives implicit when-to-use guidance by explaining how to target the identity (provide identityId, linkedinAccountId, googleAccountId, or none when the workspace has only one LinkedIn account). It stops short of naming alternatives or stating exclusions relative to refresh_identity_voice or get_identities.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_job_watcherEdit job watcherAInspect

Create, update, pause, or resume job watchers in one bounded request. Create binds a watcher to one connected LinkedIn account; update replaces searches only when queries is supplied and merges applicationProfile so old answers remain; pause stops new searches/applications; resume starts again if the account is usable. If outboundMode is automatic or applyEnabled is true, confirm that the user wants applications to proceed under the account's limits before calling.

NameRequiredDescriptionDefault
operationsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okYes
itemNo
resultsNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=false). The description goes beyond by disclosing mutation semantics — queries replacement vs applicationProfile merge so prior answers persist, the account-usability gate on resume, and a confirmation requirement before automatic/applyEnabled calls. It omits return/error behavior, but an output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single dense paragraph, front-loaded with the four operations before branching into per-op detail and the confirmation caveat. Every sentence carries information, though it is on the long side.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-op tool with nested anyOf operations, 50% schema coverage, and an output schema, the description covers the behavioral essentials an agent needs (op semantics, merge/replace behavior, confirmation gate). Remaining gaps like workspaceId disambiguation are handled by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%, so the description must compensate. It does add meaning for queries (full replacement) and applicationProfile (merge semantics), plus the outboundMode/applyEnabled gating, but these largely restate schema text, and it says nothing about watcherId, clientOperationId, or workspaceId. Baseline 3 for partial compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verbs (create, update, pause, resume) against a specific resource (job watchers), and clarifies the name's ambiguity by noting it also creates. An agent can distinguish this from get_job_watchers (read) and archive_job_watcher (archive) without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Each operation is given its operational context (create binds to an account; pause stops new searches/applications; resume restarts if the account is usable), which tells the agent when each branch applies. It stops short of naming sibling alternatives (e.g. archive_job_watcher) or explicit when-not conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_lead_listEdit lead listAInspect

Create set/query lead lists, update list metadata/query, or add/remove up to 50 members. Query-list membership is predicate-owned; explicit add/remove requires an editable set list.

NameRequiredDescriptionDefault
opYes
nameNo
queryNo
membersNo
campaignIdNo
leadListIdNo
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
itemsNo
failedNo
resultsNo
warningsNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation profile (readOnly=false, destructive=false, non-idempotent), so the bar is lower. The description adds real behavioral context beyond that: the 50-member cap and the predicate-ownership rule governing whether add/remove is legal. It omits permission/reversibility details, keeping it out of 5 territory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences, front-loaded with the operations and ending with the key constraint. Every clause carries meaning, though the phrasing is compressed enough to require a second read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description covers the critical set-vs-query distinction and the member cap. Given the complex nested query object and 5-way op enum, more op-specific guidance would help, but the core is complete enough to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 14%, so the schema documents almost none of the 7 parameters. The description partially compensates by mapping the op enum values to intents (create/create_query/update/add_members/remove_members) and by implying name/query in 'update list metadata/query', but it leaves most parameter semantics implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names specific verbs and the resource (create set/query lead lists, update, add/remove members), so an agent immediately knows this edits lead lists. It does not explicitly differentiate itself from adjacent siblings like delete_lead_list or edit_leads, but the verb+resource pairing is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear conditional rule: query-list membership is predicate-owned, and explicit add/remove only works on an editable set list. That tells the agent when add_members/remove_members will succeed vs fail. It stops short of naming an alternative tool for the query-list case, so it earns a 4 rather than a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_leadsEdit leadsAInspect

Apply bounded lead edits. Metadata patches write workspace overlays for global or private leads; contact patches are global-row contact updates only after workspace membership proof; profile link/unlink is provenance-bounded to private leads. Max 50 leads per call.

NameRequiredDescriptionDefault
leadsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
itemsNo
failedNo
resultsNo
warningsNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say this is a non-read, non-destructive, non-idempotent write. The description adds substantive behavior the annotations cannot convey: metadata edits land in a workspace overlay rather than the global row, contact edits touch global rows only after membership proof, and linking is provenance-bounded to private leads. It does not cover partial-failure or per-lead error behavior, which keeps it out of the top band.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences plus a batch limit, front-loaded with the core verb and scoped by patch type; every clause carries operational information. The heavy domain jargon ("provenance-bounded", "workspace overlays") is terse but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return-value explanation is unnecessary, and the description plus annotations together cover mutation semantics, per-patch-type constraints, and the 50-lead cap. Missing only edge-case behavior such as what occurs when membership proof fails or when a leadId resolves to neither store.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 50%, and the description does add the overlay-vs-global-row semantics for the metadata parameter that the schema never states. However, leadId, leadSource, and workspaceId receive no treatment in the description, and the contact/profileLink constraints it repeats are already spelled out in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Apply bounded lead edits") and enumerates the three edit classes (metadata patches, contact patches, profile link/unlink), which separates it from read/enrich/import siblings like get_leads or enrich_leads. It stops short of naming an alternative, but the operation is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the text tells the agent that contact patches apply to global-row leads and profile link/unlink applies to private leads, which functions as implicit eligibility guidance. There is no explicit when-not and no named sibling to prefer for adjacent tasks such as enrichment or list management.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_notificationsEdit notificationsAInspect

Mark notifications read by ids, or mark all notifications read for the resolved workspace. User-key and OAuth callers are restricted to their own notification rows plus legacy shared rows.

NameRequiredDescriptionDefault
allNo
idsNo
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
failedNo
resultNo
resultsNo
warningsNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false); the description goes further by disclosing a real access-control constraint - user-key and OAuth callers can only touch their own rows plus legacy shared rows. It stops short of saying whether marking read is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the action and followed by the scope restriction - no wasted phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and the description covers modes plus auth scoping. It leaves a small gap on interactions between 'all' and 'ids' for a mutation tool with no required parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% (workspaceId is documented; 'all' and 'ids' are bare), and the description compensates by explaining both modes and their target scope. However, it omits useful constraints such as the 25-id cap and whether 'all' and 'ids' are mutually exclusive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Mark notifications read by ids' or mark all read for the workspace. An agent can distinguish this from the read-side sibling campaignstack_get_notifications, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The two operational modes (by ids vs. all for the workspace) are implied as branches, but the description never says when to prefer this tool over the read-only get_notifications sibling or any alternative, and lists no exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_signal_agentA
Destructive
Inspect

Create signal agents, update their account assignment, script or approval mode (approvalMode: whether what the agent drafts waits for a person), pause/resume them, replace their additive exclusions, or restore a previous agentScript version (restore_guidance, using a versionId from campaignstack_get_signal_agents include.guidanceHistory). On a create, omitted accountIds and actAccountIds default to the workspace's only LinkedIn account; with several, ask the person which accounts read the target (accountIds) and which send and act (actAccountIds). actAccountIds [] means collect without contacting anyone. Setting status to 'archived' runs the same permanent removal as campaignstack_delete_signal_agent and requires confirmed:true on that operation. Batch edits are bounded. Return one result per requested item, and report partial failures instead of describing the whole batch as successful.

NameRequiredDescriptionDefault
operationsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
resultsNo
warningsNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only give coarse hints (destructive, not idempotent, not read-only). The description adds real behavioral context: archived status performs the same permanent removal as delete and needs confirmed:true, actAccountIds [] means collect without contacting, batch edits are bounded, and per-item results with partial-failure reporting rather than claiming whole-batch success.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operation list, then defaults and constraints; nearly every sentence carries actionable content such as confirmed:true, batch bounding, and partial-failure reporting. It is dense and somewhat long, with a little overlap against the schema's approvalMode text, but not padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, return values need not be explained, yet the description still notes one result per requested item and partial-failure reporting. Combined with defaults, deletion safety, and admin-only restrictions, an agent has everything needed to invoke the batch correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds the account-defaulting rule (omitted accountIds/actAccountIds fall back to the workspace's only ready LinkedIn account, otherwise an error listing them) and the read-vs-act account distinction. However, much of this is already restated in the schema's own field descriptions, so the marginal lift over the schema is moderate rather than large.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verbs and resources (create/update/pause/restore signal agents, replace exclusions) and enumerates the operations the batch tool supports. It explicitly distinguishes itself from campaignstack_delete_signal_agent (archiving behaves the same) and campaignstack_get_signal_agents (source of versionId/history), so an agent can route correctly without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use guidance: on create with multiple accounts, ask the person which accounts read vs. act; set approvalMode automatic only when the user asked for unreviewed messages; restore_guidance requires a versionId from campaignstack_get_signal_agents include.guidanceHistory. It also names alternatives and the conditions that select them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_signal_watchAInspect

Create person signal watches or change their active/paused state. Call this when the user asks CampaignStack to watch a lead for profile changes or pause/resume an existing person watch. It does not delete watches; use campaignstack_delete_signal_watch for removal. Batch edits are bounded. Return one result per requested item, and report partial failures instead of describing the whole batch as successful.

NameRequiredDescriptionDefault
operationsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
resultsNo
warningsNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=false, so the safety profile is covered. The description adds meaningful context beyond that: batch edits are bounded and partial failures must be reported per item rather than as a whole-batch success. Missing auth/rate-limit details, but the partial-failure contract is valuable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action in the first sentence, then layers usage, exclusions, and behavioral notes. Five sentences, all informative, though a bit more compact phrasing could tighten it further without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, return values need not be explained. The description covers purpose, usage, alternatives, batch bounds, and partial-failure behavior. WorkspaceId semantics are full in the schema. Complete enough for a batch mutation tool, though it could mention idempotency or re-run implications.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50% (only workspaceId is documented). The operations parameter has no schema description, but its anyOf structure and mode constants are self-explanatory. The description's 'create person signal watches or change their active/paused state' maps to the two modes but adds little beyond what the schema already conveys. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (create/change state) and resource (person signal watches), and explicitly contrasts with the deletion sibling tool. An agent can distinguish it from similar edit tools like campaignstack_edit_company_employee_watch without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use conditions ('user asks CampaignStack to watch a lead for profile changes or pause/resume an existing person watch') and a clear when-not with the named alternative ('does not delete watches; use campaignstack_delete_signal_watch for removal'). No inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_userEdit userAInspect

Edit the calling user's notification preferences only. Requires a user API key; workspace keys cannot change personal preferences.

NameRequiredDescriptionDefault
notificationPreferencesYes

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workspaceIdNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly=false, destructive=false, idempotent=false), so the bar is lower. The description adds genuinely non-obvious context the annotations do not: the required key type and the fact that workspace keys are rejected. It does not discuss idempotency or reversibility, so it falls short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences, front-loaded with the scope ('calling user's ... only') before the auth constraint. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the auth requirement is covered. But for a tool whose sole parameter is a nested object with a 'clear' flag and multiple enums, the description leaves the mutation semantics unexplained, which is a notable gap for a write operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is effectively 0% for the nested object's meaningful fields (clear, value, category, weeklyReport); only the nested workspaceId carries a description. The description merely restates the parameter name ('notification preferences') and adds no semantics for the 'clear' flag, the immediate/off value, or the category enum. With low coverage, the description fails to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope: 'Edit the calling user's notification preferences only.' The word 'calling user's' and 'only' usefully delimit it. However, it does not explicitly differentiate from the adjacent sibling campaignstack_edit_notifications, which an agent could easily confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear precondition and an exclusion: a user API key is required, and workspace keys cannot change personal preferences. That is real when/when-not guidance for auth context, though it never names the alternative tool to use for workspace-level preferences.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_workflowEdit workflowAInspect

Create workflows, edit metadata, set whether the workflow sends without review (approvalMode), enable or pause execution, set LinkedIn account pools, set email sender account, set workflow-level outreach intents, and restore a previous node instructions version (restore_guidance, using a versionId from campaignstack_get_workflows include.guidanceHistory). Graph changes belong in campaignstack_edit_workflow_graph. Each operation returns independently.

NameRequiredDescriptionDefault
operationsYesBatch edits are bounded. Return one result per requested item, and report partial failures instead of describing the whole batch as successful.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workflowIdNo
workspaceIdNo

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutability profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), reducing the description's burden. The description adds the useful behavioral note that each operation returns independently, but does not add much else beyond annotations, such as permission requirements, rate limits, or irreversible effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the tool's operations and includes the key sibling routing directly afterward. The first sentence is a long enumerated list, which is dense but earns its place by covering the tool's full scope without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the high-complexity batch schema and the presence of an output schema, the description is largely complete: it names all operation families, routes graph edits to the sibling, and explains the restore version source. It omits details like batch bounds, partial-failure semantics, and workspace scoping, but those are supplied by the schema and output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the baseline is 3, but the description adds meaning by naming several operations and clarifying that restore_guidance takes a versionId sourced from campaignstack_get_workflows include.guidanceHistory. It also translates some schema fields into plain language, such as email sender account and workflow-level outreach intents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource (workflow) and enumerates the exact operation types it supports, including create, metadata edits, approval mode, execution state, LinkedIn account pools, email sender, outreach intents, and guidance restore. It also explicitly distinguishes itself from campaignstack_edit_workflow_graph, so an agent can separate the two without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear routing rule for graph changes, directing them to campaignstack_edit_workflow_graph, and notes that restore_guidance needs a versionId from campaignstack_get_workflows include.guidanceHistory. However, it does not provide broader when-to-use or when-not guidance for the many other operation types relative to other workflow tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_workflow_graphEdit workflow graphAInspect

Atomically patch or replace one workflow graph. replace supplies the full non-anchor graph. patch starts from the current non-anchor graph, upserts/removes nodes, and replaces edges when supplied. A patched node's config is merged into the stored one: only the keys you send change, and a key sent as null is cleared. Invalid graphs are rejected before persistence; active-lead safety remains enforced by the workflow backend. Optional split-node optimization runs after the graph write.

NameRequiredDescriptionDefault
modeYes
graphNo
patchNo
workflowIdYes
workspaceIdNoWorkspace 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.
optimizeSplitNodeIdsNoOptional named split nodes to optimize after a valid graph write.

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workflowIdNo
workspaceIdNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses behavior well beyond the annotations: atomicity, validation-before-persistence, config merge with null-clears-key semantics, edge replacement rules, and post-write split-node optimization. The one tension is that 'replace' discards the existing graph while destructiveHint=false, though the tool does not destroy the workflow itself, so this is a scoping nuance rather than a contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five tight sentences, front-loaded with the core action and mode split, then merge semantics, then safety and optimization notes. Every sentence carries distinct information; nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A mutation tool with a rich nested schema, an output schema, and annotations; the description covers mode behavior, merge semantics, validation, and the optional optimization pass. It lacks only preconditions (permissions, whether active workflows can be edited mid-run) which the description leaves to 'active-lead safety remains enforced by the workflow backend'.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 33% schema description coverage, the description does the heavy lifting: it explains mode semantics, the graph-vs-patch relationship, per-node config merging (only sent keys change, null clears), and when patch.edges replaces the edge set. workspaceId is left to the schema, which already documents it thoroughly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (patch or replace), resource (one workflow graph), and atomicity guarantee. This is clearly distinguished from the sibling campaignstack_edit_workflow, which edits the workflow itself rather than its graph structure.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives precise operational guidance on choosing between the two modes: 'replace supplies the full non-anchor graph' vs 'patch starts from the current non-anchor graph'. It does not, however, state when to prefer one mode over the other or warn against calling this on an active workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_workspaceEdit workspaceAInspect

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.

NameRequiredDescriptionDefault
brandingNo
settingsNo
complianceNo
workspaceIdNoWorkspace 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.
proposalDecisionNo
restorePlaybookVersionIdNo

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workspaceIdNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish a non-destructive, non-read-only, non-idempotent write. The description adds real behavioral context beyond them: partial-update semantics ('Only supplied components change'), the blast radius of branding (client-facing shared artifacts only), what compliance toggles, and that restores are versioned. It omits permissions/auth requirements and reversibility details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The operation list is front-loaded in the first sentence, followed by the partial-update rule and per-component effects, ending with the cross-tool instruction. Dense but every sentence carries information; minor compression is possible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-purpose mutation with an output schema present, the description covers operation scope, partial-update behavior, per-component effects, and prerequisites for the proposal decision. It is complete enough to call correctly, with only permission/reversibility details left unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Top-level schema coverage is low (17%), but the nested schemas carry deep inline documentation (sections, companyProfile, outreachIntents). The description adds meaning by mapping components to effects (branding, compliance toggle, versioned restore, proposal decision) but supplies no syntax, format, or required-combination detail, so it only partially compensates.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description enumerates the concrete operations (write settings, branding, compliance, restore a playbook version, accept/reject a proposal) on the workspace resource, so an agent knows exactly what it does. It implicitly distinguishes from siblings like edit_workspace_accounts or edit_workspace_members by limiting scope to settings/branding/compliance/playbook, though it does not name those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear routing instruction for the proposal case: read the pending proposal via campaignstack_get_workspaces' playbookProposal include before deciding. It also states the optimistic-update rule ('Only supplied components change'). It lacks explicit when-not guidance for the settings/branding/compliance operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_workspace_accountsEdit workspace accountsA
Idempotent
Inspect

Link or unlink already-connected LinkedIn/Google accounts to a workspace. Nothing is re-authenticated or sent.

NameRequiredDescriptionDefault
operationsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
itemNo
resultsNo
warningNo
nextStepNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false and readOnlyHint=false. The description adds real value beyond that by clarifying 'Nothing is re-authenticated or sent' — an agent learns no OAuth flow is triggered and no outbound messages occur, which is not derivable from the structured fields. It still omits permission requirements and side effects on campaigns referencing an unlinked account.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with no filler; the action is front-loaded and the clarifying constraint follows immediately. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation and the workspaceId resolution rules are covered in the schema. However, for a mutation tool the description never says what happens to downstream artifacts when an account is unlinked, nor does it mention the 25-operation batch limit — meaningful omissions, though the annotations carry the safety profile adequately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Coverage is 50%: the schema fully documents workspaceId including the cs_/csu_ key rules, while the operations array carries no description. The description adds nothing about parameter semantics — it doesn't explain op values, the 25-operation cap, or what accountId must reference — though the nested enums and maxItems make operations largely self-describing, so the gap is real but not severe.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb pair (link/unlink) plus the resource (already-connected LinkedIn/Google accounts in a workspace), which is concrete enough to act on. The word 'already-connected' implicitly separates it from campaignstack_connect_account, but no sibling is named, so the differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'already-connected' implies the tool is only for re-associating existing accounts, suggesting connect_account handles new connections, but this is never stated and no condition or alternative is named. Usage is implied rather than guided, and nothing says when *not* to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_workspace_integrationsEdit workspace integrationsA
Destructive
Inspect

Link an integration the person owns into this workspace, unlink it from this workspace, or disconnect it by deleting this workspace's stored credentials. Disconnect and unlink do not undo provider-side data already sent.

NameRequiredDescriptionDefault
operationsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
failedNo
resultNo
resultsNo
warningsNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare destructiveHint=true, but the description adds valuable context beyond them: it clarifies that disconnect deletes the workspace's stored credentials and that neither unlink nor disconnect undoes provider-side data already sent. This exceeds the annotation baseline meaningfully.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the first enumerates the operations, the second delivers the irreversible-data caveat. No waste, front-loaded action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive multi-operation tool with an output schema present, the description covers the operations and the key irreversibility caveat. It could go further on the fromWorkspaceId parameter and confirmDisconnect flag, but the core behavioral risk is disclosed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%; workspaceId is fully documented in the schema with rich omission logic, while the operations array fields (op, provider) have no descriptions. The description names the three op values but does not explain fromWorkspaceId or confirmDisconnect, leaving some parameters undocumented but doing better than the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verbs (link, unlink, disconnect) and resource (integration into/from workspace) with a clear three-way scope. An agent can distinguish this from campaignstack_configure_integration and campaignstack_edit_workspace_accounts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The three operations are enumerated but there is no explicit guidance on when to choose link vs unlink vs disconnect, nor any routing to sibling tools like campaignstack_configure_integration. Usage is implied by the operation names rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_workspace_membersEdit workspace membersA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
operationsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workspaceIdNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With destructiveHint=true and non-idempotent annotations already set, the description adds real value: it explains that certain ops require explicit confirmation because they affect another person's access or send/cancel email, and that results are per-operation. It does not clarify whether partial batch failures roll back or how clientOperationId affects retry safety.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with what the tool does, then the confirmation requirement, then the exclusion. No filler or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive multi-op mutation with an output schema, the description covers the safety-relevant requirements well. Remaining gaps are minor: batch size limits, idempotency/retry behavior via clientOperationId, and whether operations are applied atomically.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%; workspaceId is richly documented in the schema, but the description does not discuss clientOperationId, the 25-operation batch cap, or ordering/atomicity semantics of the operations array. It does justify the confirmed field for three op types, which adds meaning beyond the schema — enough for baseline-plus, not full compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (apply/edit) and resource (member and invitation operations) and enumerates the operation families — removes, invitations, revocations, role changes. It is clear, though it doesn't explicitly contrast with any sibling (there is no obvious competing member-editing tool in the sibling list, so differentiation is less critical here).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states a concrete precondition (confirmed:true for removes, invitations, revocations) with the reason, and explicitly excludes admin/owner grants, which is genuine when-not guidance. It doesn't say what to use instead for those grants, so it stops short of a full routing instruction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_edit_workspace_memoryA
Idempotent
Inspect

Apply a pending workspace memory candidate so it becomes active in future prompts. A no-op when the memory is already active.

NameRequiredDescriptionDefault
memoryIdYesMemory id from campaignstack_get_workspace_memories
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
idNo
statusNo
changedNo
successNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the practically important consequence – the memory becomes active in future prompts – and confirms idempotent behavior via the no-op case.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with zero filler; the core action is front-loaded and the edge case follows. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and annotations cover the mutation/idempotency profile. The description supplies the state transition (pending -> active) and the no-op case, leaving little an agent needs missing, though it is silent on any confirmation or permission requirements.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with the workspaceId description itself explaining the cs_/csu_ key semantics and multi-workspace error behavior. The description adds nothing beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource: applying (activating) a pending workspace memory candidate. The effect on future prompts is spelled out, making it distinguishable from get/delete workspace memory siblings. It stops short of naming the sibling it supersedes (e.g. get_workspace_memories as the source of the candidate).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'no-op when already active' clause gives a useful precondition, and the schema points to campaignstack_get_workspace_memories as the source of memoryId. However there is no explicit when-to-use guidance relative to siblings like propose_workspace_playbook_change or refresh_workspace_playbook, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_enrich_companiesEnrich companiesBInspect

Run provider firmographic enrichment for up to 25 companies. Company firmographics are shared public-domain data; provider/API-key errors are reported per company.

NameRequiredDescriptionDefault
providerNoapollo
companyIdsYes
workspaceIdNoWorkspace 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.
clayRoutineIdNo

Output Schema

NameRequiredDescription
okNo
itemsNo
failedNo
resultsNo
warningsNo

TDQS

B3.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-read-only, open-world, non-idempotent, non-destructive, but the description adds genuinely useful behaviors beyond them: firmographics are shared public-domain data, and provider/API-key failures are surfaced per company rather than failing the whole batch. It stays silent on whether results are persisted and on cost implications of repeated calls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences; the operational fact (enrichment, batch limit) is front-loaded and the partial-failure note follows. The public-domain-data clause is somewhat terse and its purpose (privacy/storage guidance?) could be clarified, keeping it short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and partial-failure behavior is covered. Yet the description leaves important gaps: the provider/clayRoutineId contract, whether existing data is overwritten, and how this differs from refresh_companies.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 25% (workspaceId is documented, the rest are not). The description never mentions provider (apollo/clay enum with a default), clayRoutineId, or workspaceId, so the undocumented clayRoutineId – presumably required when provider=clay – is left entirely opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb+resource ('Run provider firmographic enrichment ... for companies') and gives the 25-company batch cap. It does not, however, distinguish this from close siblings like refresh_companies, edit_companies, or enrich_leads, so an agent can't route purely from the description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No statement of when to use this versus refresh_companies / enrich_leads / get_companies, nor prerequisites (does it overwrite existing firmographics? should it run only for un-enriched companies?). The only guidance-like content is the batch-size limit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_enrich_leadsEnrich leadsAInspect

Run contact enrichment for up to 25 leads with bounded include flags. Email is on by default; phone must be explicitly requested and can cost more. Per-lead provider errors are returned independently. Charges vary by mode (email reveal: contact_email_reveal credits per result found; phone reveal: contact_phone_reveal credits per result found). campaignstack_estimate_cost accepts variant or variantCounts before you commit. Email is on by default; phone is charged separately only when include.phone is true.

NameRequiredDescriptionDefault
leadsYes
includeNo
providerNobettercontact
workspaceIdNoWorkspace 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.
clayRoutineIdNo

Output Schema

NameRequiredDescription
okNo
itemsNo
failedNo
resultsNo
warningsNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare openWorld/non-idempotent/non-destructive. The description adds real value beyond them: per-lead provider errors are returned independently, and billing is per result found in each mode. The per-result charge implicitly warns that re-running costs again, which is meaningful for a non-idempotent operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The final sentence repeats information already stated in the opening ('Email is on by default', phone charged only when requested), burning a whole sentence on redundancy. The cost-mode and estimate_cost guidance is front-loaded reasonably, but the duplication is wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers the key behavioral facts an agent needs: scope cap, defaults, independent per-lead errors, and billing model. Minor gaps remain around provider choice and non-listed parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 20% and several parameters (provider, clayRoutineId, workspaceId) get no description coverage. The text does clarify include.email default true and include.phone default false with its cost implication, but it leaves the provider selection and clayRoutineId semantics unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Run contact enrichment ... leads') with a clear scope cap of 25. The resource noun distinguishes it from campaignstack_enrich_companies, but the description never names a sibling explicitly. Clear enough that an agent knows what it does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives useful pre-commit guidance by pointing to campaignstack_estimate_cost with variant/variantCounts, and clarifies the email-default/phone-opt-in condition. It never states when to choose this over adjacent tools like refresh_leads, get_lead_enrichments, or enrich_companies, so usage is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_estimate_costA
Read-onlyIdempotent
Inspect

What a costed final MCP tool would spend, before you call it. Returns creditsPerUnit, the total for the count you name, the workspace's remaining free balance, and whether the spend is allowed. It only calculates, never reserves or spends. A paid workspace overflows to overage in its subscription currency (USD or EUR). The response includes the current overageRate and currency from billing. It reports a null balance rather than a refusal. Prices come from the same table the charge is made from, so single-action tools cannot drift from billing. For tools with multiple charge modes, pass variant for one mode or variantCounts for the full exposure; otherwise the tool refuses to guess.

NameRequiredDescriptionDefault
toolYesA costed final tool name, e.g. campaignstack_craft_message. Known costed tools: campaignstack_analyze_company_website, campaignstack_answer_job_question, campaignstack_apply_to_job, campaignstack_comment_on_post, campaignstack_craft_message, campaignstack_decide_review, campaignstack_discover_lead_magnets, campaignstack_enrich_leads, campaignstack_explain_draft, campaignstack_export_seo_report, campaignstack_follow_profile, campaignstack_get_lead_comments, campaignstack_like_post, campaignstack_refresh_companies, campaignstack_refresh_identity_voice, campaignstack_refresh_workspace_playbook, campaignstack_run_seo_audit, campaignstack_send_connection_request, campaignstack_send_email, campaignstack_send_inmail, campaignstack_send_message.
countNoHow many units you are about to spend for a single-cost tool or one selected variant. What a unit IS depends on the tool (a call, a result found, a page read); the response repeats it as `per`. Default 1.
variantNoFor multi-cost tools, estimate one variant by name (for example email, phone, audit, probe, serp).
workspaceIdNoWorkspace 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.
variantCountsNoFor multi-cost tools, estimate multiple variants at once. Keys are variant names and values are unit counts, e.g. {audit:1, probe:30, serp:10}.

Output Schema

NameRequiredDescription
perNo
noteNo
toolNo
countNo
labelNo
totalNo
isPaidNo
allowedNo
balanceNo
variantNo
currencyNo
variantsNo
actionTypeNo
overageRateNo
creditsPerUnitNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, yet the description still adds real substance: it never reserves or spends, it reports a null balance instead of refusing, overage and currency behavior are explained, and prices come from the same table as the actual charge. It also discloses the refusal mode for ambiguous multi-mode calls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with what it returns, then the safety and pricing guarantees, then the parameter rule. Seven sentences is dense, and a couple (currency/overage rate) lean toward output-schema detail, but every sentence carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so restating creditsPerUnit, total, balance and allowed is largely redundant, though harmless. Nothing an agent needs to call this correctly is missing: input semantics, refusal behavior, and workspace resolution are all covered either here or in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by framing variant versus variantCounts as one-mode versus full-exposure and warning that omitting both causes a refusal. It does not spell out mutual exclusivity or how `count` interacts with variant selection.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: it estimates what a named costed tool would spend, and it distinguishes itself immediately from every sibling, none of which price anything. The opening line tells an agent exactly what the tool returns before it opens the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"before you call it" establishes the pre-flight use case, and the closing sentence gives a concrete directive for multi-mode tools (pass variant or variantCounts; the tool refuses to guess). It never names an alternative or an explicit when-not, but for a read-only cost estimator with no competing sibling that gap is small.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_explain_capabilitiesA
Read-onlyIdempotent
Inspect

Explain how the pieces of this workspace fit together, so you can pick the right tool without opening several to compare them. Call this when you are choosing between similar tools, when a request does not obviously map to one tool, or when an error tells you to consult it. topic: overview (default), watchers (how to choose between the eight ways to monitor something), workflows (how a workflow gets its leads, and which tool creates which kind), platforms (what can be acted on and what is tracking-only), outreach_and_safety (who sends, what the limits are, and what to confirm with the user first). It is a static reference and returns no live counts: each topic names the list tool that does (campaignstack_get_signal_agents, campaignstack_get_workflows, and so on). Costs nothing and reads no workspace data.

NameRequiredDescriptionDefault
topicNoWhich map to return. Defaults to overview.

Output Schema

NameRequiredDescription
topicNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior. The description adds meaningful behavioral context beyond annotations: it is a static reference, returns no live counts, reads no workspace data, and costs nothing. This fully sets expectations for a safe, side-effect-free tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but every sentence earns its place: purpose, when-to-use, topic breakdown, and behavioral caveat. It front-loads the core purpose and usage guidance before enumerating topics, keeping the structure logical and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers purpose, usage conditions, topic semantics, behavior, and limitations, and an output schema exists to describe the return value. For a zero-parameter-required, read-only reference tool, nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already covers the single optional topic parameter with an enum and description, the description greatly enriches each enum value by explaining what each topic covers (e.g., watchers: how to choose between eight monitoring methods; outreach_and_safety: who sends, limits, what to confirm with the user). It also reinforces the default, adding real decision-making value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific purpose: explaining how workspace pieces fit together to help select the right tool. It clearly differentiates itself from the many get_* and edit_* siblings by positioning itself as a static reference that names the appropriate list tool per topic.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit trigger conditions: when choosing between similar tools, when a request does not map obviously to one tool, or when an error directs consultation. It also clarifies what it is not for by stating it returns no live counts and that each topic names the actual list tool, guiding the agent to the correct alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_explain_draftA
Read-only
Inspect

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. Pass include ["attempts"] to see whether a draft held for review was rewritten on each attempt and why each one was rejected. 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.

NameRequiredDescriptionDefault
entryIdNoA current review entry id from campaignstack_get_reviews. Resolves to the draft's recorded craft session. Use craftAuditLogId for historical drafts.
includeNoExtra sections. "attempts": every draft the review loop wrote for this message, in order, with a text hash, word count and each check's verdict and objection.
workspaceIdNoWorkspace 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.
craftAuditLogIdNoA craft audit log row id, usually copied from an internal audit export or previous explain-draft result.

Output Schema

NameRequiredDescription
draftNo
fixesNo
callerNo
verdictNo
attemptsNo
createdAtNo
sentencesNo
craftAuditLogIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, non-destructive, closed-world), and the description adds genuinely new context: it charges mcp_craft credits per call with estimate_cost as the pre-check, makes exactly one model call over a stored draft, and writes nothing. It also discloses a non-obvious behavior – citations are re-verified against the named prompt section, so unverifiable ones return as unattributed rather than a plausible guess.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose before the alternatives and cost caveats, and every sentence carries information. The parenthetical list of ~14 attribution sources is long and slightly dense, but it does define the tool's scope, so it largely earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only diagnostic tool with an output schema (so return shape needn't be explained), the description covers purpose, trigger, alternative, cost, side-effect profile, and the verification caveat. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents entryId vs craftAuditLogId and the workspaceId fallback logic, and the description's mention of include ['attempts'] largely restates the schema's own description. The description adds only marginal framing beyond the structured fields, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('explain why a draft says what it says') and enumerates the config sources each sentence is attributed to, plus the tool/field that changes each one. It explicitly distinguishes itself from the sibling campaignstack_preview_craft_prompt (draft not yet written) so an agent can route without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('Call this when a draft reads wrong and you need to know WHICH setting to edit') and names the alternative plus the condition that selects it ('preview_craft_prompt shows the same prompt for a draft that has not been written yet'). It also tells the agent when to pass include ['attempts'].

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_export_leads_to_crmExport leads to CRMA
DestructiveIdempotent
Inspect

Export up to 25 leads to a connected CRM provider. Today this supports HubSpot contact upsert, optional company association, and optional timeline note. This reaches a real person. Before calling it, tell the user exactly who it goes to and read the wording back to them, and wait for an explicit yes.

NameRequiredDescriptionDefault
noteNo
leadsYes
providerNohubspot
confirmedYesThis reaches a real person. Before calling it, tell the user exactly who it goes to and read the wording back to them, and wait for an explicit yes.
syncCompanyNo
workspaceIdNoWorkspace 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.
lifecycleStageNo

Output Schema

NameRequiredDescription
okNo
failedNo
resultNo
resultsNo
warningsNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds genuinely new behavior: the 25-lead cap, that the export lands on a real person, and the mandatory confirmation/read-back protocol. The 'reaches a real person' line largely restates the destructive annotation, so it is not a 5, but the confirmation workflow is valuable beyond the structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with capability then constraint then safety protocol, with no filler. The repetition of 'This reaches a real person' in both the description and the confirmed field's schema description is slightly redundant but harmless.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and the confirmation requirement is well covered. However, for a destructive, open-world write the description omits failure/partial-success behavior, what happens if no CRM is connected, and per-lead error semantics, leaving meaningful gaps for a 7-parameter mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is low (29%), so the description carries more burden, and it only partially compensates: it covers the 25-lead limit, the HubSpot provider, optional company association, and the optional note. It says nothing about lifecycleStage, and the note object's channel/sentAt and the leads array shape are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+destination ('Export up to 25 leads to a connected CRM provider') and names the supported provider (HubSpot contact upsert). An agent can tell what this does at a glance. It does not, however, distinguish itself from the confusable sibling campaignstack_add_leads_to_external_destination, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit, concrete precondition: tell the user exactly who it goes to, read the wording back, and wait for an explicit yes before calling. That is strong when-to-use guidance. It does not address when NOT to use this versus other lead-routing siblings (e.g. add_leads_to_external_destination), so it is not a full 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_export_linkedin_connectionsExport LinkedIn connectionsAInspect

Start a runner job that exports an account's first-degree LinkedIn connections into a lead list. This does not send connection requests.

NameRequiredDescriptionDefault
listNameNo
accountIdNoThe account to use (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one.
workspaceIdNoWorkspace 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.
keepUpToDateNo
maxConnectionsNo

Output Schema

NameRequiredDescription
okNo
itemNo
resultsNo
warningNo
nextStepNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a non-read-only, open-world, non-idempotent operation, and the description usefully adds that the work runs as an asynchronous runner job and that no connection requests are sent. It still omits operational traits such as how long the job takes, how to track its status, or that repeating it creates a new run.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the action front-loaded and zero filler; the negative scoping clause earns its place by preventing a common confusion.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the async nature is disclosed. However, the three undescribed parameters and total absence of usage context leave the definition only minimally adequate for a job-launching mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 40%: listName, keepUpToDate, and maxConnections have no schema descriptions, and the description never mentions any of the five parameters. With three undocumented inputs, the description fails to compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (start a runner job that exports), a specific resource (an account's first-degree LinkedIn connections), and the destination artifact (a lead list). The closing negative clause explicitly separates it from campaignstack_send_connection_request and other outreach siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use conditions, prerequisites, or alternatives are given. The agent must infer from the name that this is the export path versus campaignstack_import_leads or campaignstack_export_leads_to_crm; nothing in the text routes it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_follow_profileA
Destructive
Inspect

Ask CampaignStack to follow a profile from a connected LinkedIn account, so their posts reach the owner's feed. Call this when the user asks to follow a specific person. platform is required (currently "linkedin"). Name the person with leadId, which is the supported form; profileUrl is accepted for someone already in the workspace. The workspace's only connected LinkedIn account is used automatically, or pass accountId (campaignstack_get_accounts). A follow is visible to that person and notifies them; it does not send a connection request, use campaignstack_send_connection_request for that. This reaches a real person. Before calling it, tell the user exactly who it goes to and read the wording back to them, and wait for an explicit yes. One person per call. There is no bulk form, and calling this in a loop over a list is not the supported way to reach a list: add the leads with campaignstack_edit_lead_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Business hours do not apply. CampaignStack's daily limit for this action (and the weekly limit for invitations) still applies and counts sends already queued, so a run of calls stops at the limit; the owner sets those limits in the app. A paused account, or an action LinkedIn has challenged, refuses the send whatever the limit.

NameRequiredDescriptionDefault
leadIdNo
platformYes
accountIdNoAccount that acts (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one.
profileUrlNo
workspaceIdNoWorkspace 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.
idempotencyKeyNoOptional. A key you choose for this one send. Calling again with the same key returns the send already made instead of sending twice (use it when a call timed out); a key reused for a different send is refused. Without a key, the same words to the same person within a few minutes are refused as a repeat.

Output Schema

NameRequiredDescription
jobIdNo
statusNo
successNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: the follow is visible to and notifies the target, it is not a connection request, it requires reading the wording back and an explicit yes, business hours do not apply, daily/weekly limits count already-queued sends, and paused or LinkedIn-challenged accounts refuse the send. The idempotencyKey explanation also clarifies the send-already-made behavior that the idempotentHint=false annotation does not.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then routing, then safety constraints, and nearly every sentence carries actionable information (confirmation requirement, no bulk, rate limits). It is long, but the length is justified by the number of behavioral traps it pre-empts.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, outward-facing, open-world action with an output schema already present, the description covers everything an agent needs: who is reached, required confirmation, one-person-per-call, the supported bulk alternative, and the rate-limit and account-state failure modes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%, and the description compensates meaningfully, stating that leadId is the supported identifier while profileUrl is accepted only for someone already in the workspace, and that accountId comes from campaignstack_get_accounts. It adds no syntax detail for the idempotency or workspace parameters, but the schema already documents those.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (follow) and resource (a profile from a connected LinkedIn account) with the outcome ('their posts reach the owner's feed'). It also explicitly distinguishes itself from campaignstack_send_connection_request and from the bulk path via edit_lead_list + trigger_workflow, so an agent can separate it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('Call this when the user asks to follow a specific person'), names the alternative for connection requests, and warns that looping over a list is not supported, routing bulk to campaignstack_edit_lead_list plus campaignstack_trigger_workflow. When-not-to-use is covered as thoroughly as when-to-use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_accountsGet accountsA
Read-onlyIdempotent
Inspect

Read one or many connected accounts. LinkedIn rows include safety by default because it gates outreach; maintenance is opt-in and bounded. Google rows omit LinkedIn-only safety, budgets and ramp fields and carry schedulingHours (meeting hours, default 9 to 18). 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.

NameRequiredDescriptionDefault
idsNo
limitNo
cursorNo
includeNo
platformNo
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
itemsYes
slotsNo
warningsNo
availableNo
conflictsNo
missingIdsNo
paginationYes
unreadCountNo
schedulingHoursNoThe Google account's meeting hours (0-23, its own time zone) that slots respect.

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare a safe, idempotent read, yet the description adds real substance: platform-dependent row shapes (Google rows omit LinkedIn safety/budget/ramp and add schedulingHours with a 9–18 default), safety included by default, and maintenance opt-in and bounded. The "bounded" claim is left vague, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence and each subsequent sentence carries a distinct payload about inclusion defaults, platform shape, and pagination. It is dense but free of filler; the pagination advice is slightly over-worded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be spelled out, and the description covers the important platform-conditional shape and the one-page/pagination caveat. It is still thin on the lookup-by-ids path and the practical limits of limit/cursor for a 6-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 17%, so the description needs to compensate; it does explain include.safety (on by default) and include.maintenance (opt-in, bounded) and implicitly the platform split. It says nothing about ids (max 25), limit (max 50), or how cursor relates to "results are one page," leaving half the parameters unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

"Read one or many connected accounts" gives a clear verb and resource plus the single-vs-bulk scope. It does not differentiate itself from nearby siblings like campaignstack_get_identities or campaignstack_edit_account, so the agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when the tool applies (reading connected accounts) and gives operational guidance about paging through results before counting. It never states when to prefer this over alternatives such as get_identities, or when to look up by ids versus listing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_campaignsGet campaignsA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idsNoOptional entity ids to fetch, capped at 50.
limitNoMaximum items to return, capped at 50.
cursorNoOpaque pagination cursor.
filtersNo
includeNo

Output Schema

NameRequiredDescription
itemsNo
warningsNo
missingIdsNo
paginationNo
topicVocabularyNoPresent when include.topicVocabulary was requested.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the sentence 'This read-only tool does not change data' mostly restates structured data. Beyond that, the description adds real behavioral context: large/computed/historical includes must respect caps and report truncation or pagination, and the response surfaces missingIds and warnings. It does not discuss auth requirements, but the coverage added on top of annotations is solid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded and most sentences carry distinct information (targeting, ids semantics, include discipline, alternatives, envelope guarantees). It is dense and slightly repetitive about the 'collection envelope' and re-states the read-only nature, which keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter read tool with a rich nested include schema and an output schema, the description covers what an agent needs: when to call it, how to target specific entities, how ids behave, cap/truncation expectations, and the sibling tools for adjacent data. Return-value detail is appropriately delegated to the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 60% schema description coverage, the description compensates meaningfully: it explains the include.personas.ids and include.roadmap.ids targeting trick (bypassing list caps and scanning), include.icpScores.icpId for per-ICP match scores, and that topicVocabulary returns the ids a campaign topic may be set to. It reinforces rather than repeats the schema on ids/limit semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read campaigns and optional campaign planning details') and enumerates exactly which related records can be hydrated (ICP, personas, roadmap, topics, weights, metrics, job history, guidance history, scores, vocabulary). It also distinguishes itself from campaignstack_get_workspaces and campaignstack_get_identities, so an agent can route without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit selection rules: 'Omit ids to list matching records, pass one id for one record, or pass several ids for several records', and 'Use include only for extra details the user asked for'. It names the alternatives ('Instead use campaignstack_get_workspaces for workspace-level setup, and campaignstack_get_identities for sender accounts or voice'), leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_companiesGet companiesA
Read-onlyIdempotent
Inspect

Read companies by ids or page workspace companies in one bounded V2 envelope. Optional includes cover signals, funding, discovery rows, employees, metric history, reviews, news, and a bounded jobs page with filters. Use nearest specialist tools for deeper company intelligence or refreshes; this read does not fetch new data. 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.

NameRequiredDescriptionDefault
idsNoSpecific company IDs to hydrate. Max 25.
limitNo
queryNoSearch by name prefix, domain or LinkedIn company URL across this workspace's companies and the shared company database. Returns up to 10, each marked inWorkspace.
cursorNo
includeNo
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
itemsYes
warningsNo
missingIdsNo
paginationYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/non-destructive, so the bar is lower. The description adds genuinely useful behavior: it is a pure read that does not refresh data, results are a single page, and the agent should disclose truncation rather than present a page as the whole set. It omits rate limits or auth requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with the two operating modes, then includes, then routing, then pagination caveat. The final pagination sentence is slightly instructional rather than definitional, but every sentence carries information the agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-shape explanation is unnecessary; the description still covers the key operational caveats (single page, no new data, include catalog) for a nested-schema tool. Missing only explicit mention of the workspaceId defaulting behavior and limits on id hydration, though those live in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%; the schema already documents ids, query, jobs and workspaceId. The description enumerates the include options (signals, funding, discoveries, employees, metricHistory, reviews, news, jobs with filters), reinforcing the include object, but adds no semantics for limit, cursor, or the workspaceId resolution rules, and no detail on filter syntax.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Read) and resource (companies) plus the two distinct modes of operation: hydration by ids and paging of workspace companies. It also scopes the payload ('one bounded V2 envelope'), which separates it from export/enrich/lookup siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when NOT to use it ('this read does not fetch new data') and points to specialist tools for deeper intelligence or refreshes, plus pagination guidance. The alternative is described generically as 'nearest specialist tools' rather than named (e.g. enrich_companies, refresh_companies), so the routing is clear but not maximally precise.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_company_employee_watchesA
Read-onlyIdempotent
Inspect

Get company employee watches with optional ids, company filter, state filter, and pagination. Returns the stable V2 collection shape and never leaks watches outside the resolved workspace.

NameRequiredDescriptionDefault
idsNoOptional company employee watch ids to fetch.
limitNoMaximum items to return, capped at 100.
cursorNoOpaque pagination cursor.
filtersNo
includeNo

Output Schema

NameRequiredDescription
itemsNo
warningsNo
missingIdsNo
paginationNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely new behavioral context: it returns a 'stable V2 collection shape' and never leaks watches outside the resolved workspace, which tells the agent about scoping guarantees it could not infer from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with the core operation front-loaded and the scoping guarantee second. Efficient, though not maximally terse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is unnecessary, and the description supplies the workspace-scoping guarantee an agent needs. Only the relationship to sibling watch tools is missing, keeping it just below fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

At 60% schema description coverage, the schema carries most parameter meaning, and the workspaceId description is unusually detailed. The prose only restates that ids, company, state and pagination exist without adding format or interaction detail, so it doesn't compensate for the uncovered portion.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get company employee watches') and enumerates the axes it operates on (ids, company filter, state filter, pagination). It does not differentiate itself from the sibling campaignstack_get_competitor_watches, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through the filter list but never says when to call this versus the edit/delete watch siblings or how it relates to get_competitor_watches. No exclusions or prerequisites are given, leaving selection to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_competitor_watchesA
Read-onlyIdempotent
Inspect

Get competitor watches with optional ids, filters, pagination, and a bounded latestPosts include. Use this before changing a watch so the named target and current state can be read back.

NameRequiredDescriptionDefault
idsNoOptional competitor watch ids to fetch.
limitNoMaximum items to return, capped at 100.
cursorNoOpaque pagination cursor.
filtersNo
includeNo

Output Schema

NameRequiredDescription
itemsNo
warningsNo
missingIdsNo
paginationNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds that the latestPosts include is 'bounded' and frames the tool as a read-back step before mutation, which is useful context, but it discloses nothing about permissions, rate limits, or return shape beyond what annotations and the output schema convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences with no filler: the capability summary leads and the operational guidance follows. Every clause earns its place and nothing is repeated from structured fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering safety, an output schema covering returns, and the schema documenting most parameters, the description supplies the remaining operational context (read-before-mutate guidance, bounded include). It is essentially complete for a no-required-param read tool, though it could say more about how filters combine.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 60%, with ids, limit, cursor, and workspaceId all documented in-schema. The description only names the parameter families ('ids, filters, pagination, and a bounded latestPosts include') without adding syntax, defaults, or constraints beyond the schema. Baseline 3 is appropriate when the schema carries most of the semantic load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get competitor watches') and distinguishes itself from the sibling watch readers (company employee watches, signal watches) by naming the exact resource. It also enumerates the supported capabilities (ids, filters, pagination, bounded latestPosts include), so an agent can tell what the call can do without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete when-to-use: 'Use this before changing a watch so the named target and current state can be read back,' which establishes the read-before-write pattern linking it to edit_competitor_watch. It stops short of naming the write sibling explicitly or stating when not to use it, so it is clear context without full exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_contentGet contentA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idsNo
limitNo
cursorNo
filtersNo
includeNo
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
itemsYes
warningsNo
missingIdsNo
paginationYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only, idempotent, non-destructive profile, so the description's job is to add value — and it does: a stable items[] envelope, bounded includes with include.limit capping each, single-page results, and explicit pagination-disclosure behavior. That is meaningful operational context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with the return envelope and then the include behavior before the pagination caveat. Dense but every sentence carries information; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description appropriately focuses on the envelope, include bounding, and pagination semantics. The main gap is filter/limit/cursor semantics, but the structured schema carries those keys adequately.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 17% (essentially just workspaceId and a nested media note), so the description is expected to compensate. It explains the include object's semantics (calendar projection, suggestions, media/full records, analytics, include.limit) but says nothing about ids, limit, cursor, or filters, leaving the list/pagination parameters undocumented in prose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Read one or many content records'), immediately distinguishing it as a read operation from the mutation siblings edit_content and delete_content. It doesn't explicitly name those siblings as alternatives, but the verb makes the boundary obvious.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides real operating guidance (page through before counting, don't present a page as the whole set) and describes what includes add, but never states when to prefer this tool over the edit/delete content siblings or what prerequisites (workspace scoping) select it. Usage is implied rather than explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_conversationsGet conversationsA
Read-onlyIdempotent
Inspect

Read inbox conversation summaries, unread count, or full threads when include.messages is true. Always returns a stable items/pagination envelope. A conversation with hasSuspiciousInbound true holds a message that offers something of value and asks the reader to act on it (the shape of a fake recruiter or investor): say so to the person before you book, open a link or reply on their behalf. include.scheduledMessages lists this thread's pending campaignstack_send_message sendAt rows. A workflow draft that has not gone out has delivered false and deliveredAt null; its nextSendAt is when it will send (null while it waits for a review).

NameRequiredDescriptionDefault
idsNo
limitNo
cursorNo
searchNo
includeNo
unreadOnlyNo
workspaceIdNoWorkspace 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.
identityFilterNo

Output Schema

NameRequiredDescription
itemsYes
slotsNo
warningsNo
availableNo
conflictsNo
missingIdsNo
paginationYes
unreadCountNo
schedulingHoursNoThe Google account's meeting hours (0-23, its own time zone) that slots respect.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, yet the description adds real value: it promises a stable items/pagination envelope, defines hasSuspiciousInbound and prescribes how to act on it, and explains delivered/deliveredAt/nextSendAt for scheduled drafts. It stops short of a 5 because rate limits, ordering, and pagination semantics are only gestured at.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and return-shape are correctly front-loaded, but the suspicious-inbound explanation is a multi-clause digression and the trailing draft-status sentence only loosely relates to reading conversations. Several clauses could be trimmed or moved to field-level schema descriptions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present the description needn't enumerate return fields, and it does explain the two non-obvious flags. However, for an 8-parameter tool at 13% schema coverage, it leaves search scoping, cursor pagination, unreadOnly behavior, and identityFilter entirely undocumented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 13%, so the description must carry the load, and it explains just two of eight parameters (include.messages, include.scheduledMessages). ids, limit, cursor, search, unreadOnly, and identityFilter — including the identity filter's purpose and the ids targeting shape — get no clarification beyond their types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource ('Read inbox conversation summaries ... or full threads') and distinguishes the two modes via include.messages. It never names a sibling (e.g. campaignstack_refresh_inbox or campaignstack_edit_conversations) to draw the read/edit/refresh boundary, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied through parameter conditions ('full threads when include.messages is true', 'include.scheduledMessages lists ... pending sendAt rows') rather than stated selection criteria. There is no guidance on when to call this instead of refresh_inbox or the edit/read complements, so the agent must infer the workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_craft_config_treeA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
includeNoSubtrees to return. Default: all five.
campaignIdNoNarrow campaigns and their workflows to this one campaign.
workspaceIdNoWorkspace 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.
resolveForWorkflowIdNoAlso 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.
resolveForSignalAgentIdNoSame, for a signal agent. An agent resolves workflow then workspace and never sees a campaign's guidance or intents.

Output Schema

NameRequiredDescription
voiceNo
warningsNo
campaignsNo
workflowsNo
workspaceNo
signalAgentsNo
resolvedForWorkflowNo
resolvedForSignalAgentNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this a safe, idempotent, read-only operation, so the bar is lower. The description still adds real context beyond them: the six categories of warnings returned and the fact that each warning names the tool/field that fixes it, and the hard exclusion that exemplars and message bodies are never returned. It does not discuss cost or pagination, hence not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is long but front-loaded: scope first, then warnings, then usage, then exclusions. Every sentence carries distinct information, though the warning enumeration reads as a run-on list that could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. Combined with the scope statement, the warning inventory, the explicit exclusions, and the routing to the sibling preview tool, an agent has everything required to call this correctly for a 5-parameter optional-all read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents include, campaignId, workspaceId, and both resolveFor options in detail. The description adds no syntax, format, or interaction guidance for these parameters (e.g. how include interacts with resolveForWorkflowId), so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific resource (the craft config tree) and enumerates its contents — playbook sections, campaign guidance, workflow craft nodes, signal agent scripts, voice profiles. It explicitly distinguishes itself from the sibling campaignstack_preview_craft_prompt, so an agent can route between the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('Call this before editing craft configuration, or when the user asks to change how CampaignStack writes messages') paired with a named alternative for the adjacent need ('It does not show one node's actual rendered prompt: campaignstack_preview_craft_prompt does that for a specific lead').

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_exclusionsA
Read-onlyIdempotent
Inspect

Get exclusion policy rows with a stable {items,pagination} shape. Target workspace returns level-0 policy; target signal_agent or workflow returns the effective cascade (workspace policy plus that consumer's additive exclusions). Use include.manualProfiles with a cap to inspect bounded manual profile samples.

NameRequiredDescriptionDefault
idsNoOptional exclusion ids to fetch after the target cascade is resolved.
limitNoMaximum items to return, capped at 100.
cursorNoOpaque pagination cursor.
filtersNo
includeNo

Output Schema

NameRequiredDescription
itemsNo
warningsNo
missingIdsNo
paginationNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower; the description still adds real value by disclosing the cascade-resolution behavior (level-0 workspace policy vs. effective cascade with a consumer's additive exclusions) and the bounded nature of manual profile sampling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight, front-loaded sentences with no filler; the return shape and target semantics come first and the optional-sampling tip last. Slightly dense but every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be spelled out, and the description still sketches the {items,pagination} envelope. Combined with the cascade explanation for a 5-param nested tool, it is nearly complete; only the ids/cursor semantics are left entirely to the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 60% schema coverage the schema carries much of the load, and the description's explanation of target semantics largely restates the schema's own target description. It adds nothing about ids, cursor, or limit behavior, so it neither compensates for nor exceeds the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get exclusion policy rows') and immediately clarifies the return shape ({items,pagination}). It distinguishes the two target modes well, but never names the obvious sibling edit_exclusions, so an agent must infer the read/write split from the name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage direction for the non-obvious path ('Use include.manualProfiles with a cap to inspect bounded manual profile samples') and explains which target produces which result set. It stops short of naming the alternative tool or an explicit when-not condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_identitiesGet identitiesA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idsNoOptional entity ids to fetch, capped at 50.
limitNoMaximum items to return, capped at 50.
cursorNoOpaque pagination cursor.
filtersNo
includeNo

Output Schema

NameRequiredDescription
itemsNo
warningsNo
missingIdsNo
paginationNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry readOnly/idempotent/non-destructive, so the description earns credit for adding envelope behavior: missingIds for unavailable ids, warnings for capped includes, and the requirement to report truncation/pagination. The sentence "This read-only tool does not change data" largely restates the annotations, which keeps this from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and usage are front-loaded, and the include-caps and alternatives are logically ordered. It is somewhat dense at seven sentences with some overlap between the second and third sentences, but almost every sentence carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter tool with nested objects, an output schema, and four annotations, the definition covers purpose, routing, id semantics, include caps, and error/truncation signals. Nothing an agent needs to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 60%, and the description compensates: it explains the ids omit/one/several semantics and the meaning of include (only extra details the user asked for, with documented caps). The workspaceId/account filter semantics, however, live primarily in the schema rather than the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ("Read sender identities and optional account or voice details") and names the scope ("one stable collection envelope"). It also explicitly distinguishes itself from two siblings, get_campaigns for campaign guidance and get_workspaces for team/workspace settings, so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit trigger ("when the user needs to resolve an identity, LinkedIn account, or Google account to the human sender") and names alternative tools with the conditions that select them. The id-usage rules (omit = list, one = single record, several = several) further pin down invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_integrationsGet integrationsA
Read-onlyIdempotent
Inspect

Read connected integrations plus optional bounded provider resources and import progress. Secrets and OAuth tokens are never returned. Use this before provider export/import calls; it does not connect, disconnect, or send leads to a provider. 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.

NameRequiredDescriptionDefault
limitNo
providersNo
resourcesNo
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
itemsYes
warningsNo
resourcesNo
paginationYes
unreadCountNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the annotations: states secrets and OAuth tokens are never returned, that results are one page, and gives explicit pagination handling instructions ('say so rather than presenting the page as the whole set'). Annotations already cover read-only/idempotent/non-destructive, so this adds genuinely new behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and safety note, and each sentence is substantive. It is slightly long, using two sentences to make the single pagination point, but nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value detail is not required, and the description covers the safety, scope, and pagination behavior an agent needs. The remaining gap is parameter guidance for the under-documented schema, which keeps it short of complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 25% (only workspaceId is documented), so the description should carry more weight. It gestures at 'optional bounded provider resources' but never explains limit, providers, or the resources/include structure, and doesn't clarify the workspaceId scoping rules that matter in multi-workspace accounts.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Read) and resource (connected integrations) plus the optional extra surface (bounded provider resources and import progress). It also explicitly fences off what it is not (connect, disconnect, send leads), which separates it from siblings like connect_account and configure_integration without naming them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete trigger ('Use this before provider export/import calls') and three exclusions, which is more than most definitions offer. It stops short of naming a specific sibling or the alternative to use when the intent is actually to connect/import, so it is clear context rather than full routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_job_applicationsGet job applicationsA
Read-onlyIdempotent
Inspect

Read job watcher results through one selector. selector.kind='matches' lists postings a watcher found, including found rows nobody acted on yet. selector.kind='applications' lists acted-on applications across the workspace. selector.kind='application' reads one full review payload with letter, screening answers, pending questions, account, resume, and confirmation. Use status filters for found/needs_answer/pending_review/submitted/etc. 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.

NameRequiredDescriptionDefault
selectorYesChoose matches for found postings, applications for acted-on applications, or application for one full review payload.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
itemsYes
watcherIdNo
missingIdsNo
paginationYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish the safe, read-only, idempotent profile, so the description earns credit for adding real behavioral context: the 'application' payload contents and, importantly, the pagination rule ('Results are one page... page through before counting anything'). That pagination guidance is behavior an agent could otherwise get wrong.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The three selector modes are front-loaded and the sentences each carry weight. The closing pagination instructions are slightly dense and repetitive but justified for a paged tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-mode selector tool with an output schema present, the description covers what each mode returns, filtering, and pagination behavior. Coverage is strong, though sibling disambiguation is only implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% (baseline 3), but the description goes beyond the schema's one-line selector summary by detailing what each kind yields (letter, screening answers, pending questions, etc.) and the meaning of status filters. It adds semantic value over the structured fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (read) and resource (job watcher results) and immediately decomposes the three selector modes with distinct scopes. An agent can distinguish this from siblings like campaignstack_get_job_watchers (lists watchers) or campaignstack_get_reviews (review queue) without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly routes between the three selector kinds and explains what each returns, plus when to apply status filters. It stops short of naming alternative sibling tools or explicit exclusions, so it is strong context without full when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_job_watchersGet job watchersA
Read-onlyIdempotent
Inspect

Read live job watchers for a workspace: connected LinkedIn account, saved searches, apply mode, application profile completeness, resume, and last search time. Pass ids to select specific watchers from the bounded live set; use this before editing, pausing, resuming, or archiving a watcher. This read does not include matched jobs; use campaignstack_get_job_applications for matches and applications.

NameRequiredDescriptionDefault
idsNoSpecific watcher ids. Omit to list live watchers.
statusNoOptional live-watcher status filter.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
itemsYes
watcherIdNo
missingIdsNo
paginationYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent and non-destructive behavior, so the safety profile is covered. The description adds useful non-obvious scope facts: the set is 'live' and 'bounded,' and it is a read that excludes matched jobs. It doesn't discuss pagination or ordering, so it stops short of 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the resource scope, then selection semantics, then the when-to-use and the sibling exclusion. Every clause carries distinct information and nothing is repeated from the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present (so return shape need not be described), rich annotations, and 100% schema coverage, the remaining job is scope and routing — both handled. The agent knows what it returns, when to call it, and which sibling covers the adjacent need.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema by framing 'ids' as a selection from a 'bounded live set' — clarifying that omitting ids lists a finite live collection rather than everything. The status/workspaceId nuance is left to the schema, which already handles it well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Read live job watchers for a workspace') and enumerates exactly what is returned (LinkedIn account, saved searches, apply mode, profile completeness, resume, last search time). It also explicitly separates itself from the sibling campaignstack_get_job_applications by stating matched jobs are not included.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit usage context: 'use this before editing, pausing, resuming, or archiving a watcher.' It also names the alternative for a different need (matches/applications → campaignstack_get_job_applications), so the agent can route correctly without inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_lead_commentsGet lead commentsA
Read-only
Inspect

Freshly read recent LinkedIn comments for one lead/profile with a hard maxRequests cap. Nothing is written to the other platform and nothing is stored from this read. Charges recent_comments_read credits per call; campaignstack_estimate_cost gives the number before you commit. Charged per Voyager call the runner makes, not per comment returned. The workspace's own connected account reads free.

NameRequiredDescriptionDefault
accountIdNo
untilDateYesISO date to read back to, e.g. 2026-08-10.
profileUrlYesLinkedIn profile URL to read comments from.
maxRequestsNo
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
itemsNo
failedNo
resultsNo
warningsNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/destructive annotations by disclosing the billing model (recent_comments_read credits charged per Voyager call the runner makes, not per comment returned), that nothing is written or stored, and that the workspace's own connected account reads free. This is exactly the cost and side-effect context an agent needs before invoking a metered read.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core action and cap, then layers in cost and side-effect facts. Four sentences, each carrying distinct information, though the phrasing ('Freshly read...') is slightly informal and the credit paragraphs could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape needn't be described, and the description covers the safety/billing dimensions that matter. It lacks any hint about result volume, pagination, or what happens when the cap is hit, which matters for an idempotentHint=false, open-world read.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 60%; accountId and maxRequests carry no schema descriptions. The description ties maxRequests to the billing/charge model, which adds real meaning, but it doesn't explain the 30-request ceiling, the default of 10, or which account is charged. Baseline 3 for partial coverage with partial compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (read) and a precisely scoped resource (recent LinkedIn comments for one lead/profile), plus the maxRequests cap constraint. No sibling tool reads comments, so an agent can unambiguously identify this one against get_leads, get_lead_enrichments, and comment_on_post.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when to reach for it: per-lead comment retrieval, with an explicit pointer to campaignstack_estimate_cost to preview cost before committing. It stops short of stating when-not-to-use or an alternative reader.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_lead_enrichmentsGet lead enrichmentsA
Read-onlyIdempotent
Inspect

List recent workspace lead enrichment rows for async audit: type enrichment_queue (default) covers profile/company refresh jobs, type contact_finder covers built-in email/phone lookups (pass requestId for one specific lookup). The two job kinds have different status vocabularies and are never merged into one list. Use when queue counts are not enough and the user needs bounded row-level evidence. It reads audit state only and never retries work. 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.

NameRequiredDescriptionDefault
typeNoenrichment_queue = profile/company refresh jobs (status: pending/processing/completed/failed). contact_finder = built-in email/phone lookups (status: queued/linked/submitted/completed/failed). Different systems with different status vocabularies; never mixed in one list.enrichment_queue
limitNo
cursorNo
statusNoStatus filter in the selected type's own vocabulary (validated against enrichment_queue or contact_finder statuses).
requestIdNoWhen type is contact_finder, look up exactly this request instead of listing.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
itemsYes
warningsNo
missingIdsNo
paginationYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond the read-only/idempotent annotations by disclosing that it reads audit state only, never retries work, returns exactly one page, and that the two job kinds have incompatible status vocabularies that are never merged. Missing only things like rate limits, which are minor given annotations already cover the safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: the resource and type split come first, then the usage condition and caveats. Every sentence carries information, though the pagination warning is slightly verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and the description fills in the remaining behavioral gaps (type semantics, single-page paging, audit-only reads). Complete for correct invocation, with only minor parameter detail left implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the schema's own type enum description already spells out the enrichment_queue vs contact_finder distinction, so the description largely restates it. It adds nothing about limit, cursor, status, or workspaceId, leaving some parameters undocumented in both places – adequate but not compensating for the gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('List recent workspace lead enrichment rows') and immediately splits it into the two distinct job kinds with their own semantics. An agent can tell this apart from sibling audit/queue tools without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear when-to-use condition ('when queue counts are not enough and the user needs bounded row-level evidence') and explains when to pass requestId versus listing. It does not name a specific alternative tool by name, so it falls just short of the top band.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_lead_listsGet lead listsA
Read-onlyIdempotent
Inspect

Read lead lists by ids, or list a campaign's or the workspace's lead lists, narrowed by origin (source) or by LinkedIn account (accountId: that account's connections, invited and post engagers lists). Optionally includes a bounded page of members. Use this when the user asks which lists exist or who is in them; it does not add or remove members. 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.

NameRequiredDescriptionDefault
idsNoSpecific lead-list IDs. Max 25.
limitNo
cursorNo
sourceNoOnly lists of this origin. linkedin_connections, linkedin_invited (people the account's workflows sent a connection request to) and linkedin_post_engagers (people who reacted to, commented on or reposted the account's posts) are the lists a LinkedIn account owns; the last two are kept up to date by CampaignStack and their members cannot be edited.
accountIdNoOnly the lists this LinkedIn account owns in the workspace (its connections, invited and post engagers lists).
campaignIdNoList lead lists in this campaign when ids are omitted. Without it, the workspace's lists are listed.
workspaceIdNoWorkspace 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.
includeMembersNo

Output Schema

NameRequiredDescription
itemsYes
warningsNo
missingIdsNo
paginationYes

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses that results are a single bounded page, that pagination may report more, and that the agent must page through before counting or presenting results as complete. That is exactly the operational context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five dense sentences, front-loaded with the access modes, then filters, then the usage trigger, then the pagination caveat. No filler; each sentence carries operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return shape need not be explained. The description covers access modes, filter semantics, mutation exclusion, and pagination behavior — everything an agent needs to call and interpret this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

At 63% schema coverage, the schema already documents ids, source, accountId, campaignId and workspaceId richly. The description adds the ids-vs-campaignId-vs-workspaceId precedence and the accountId/source relationship, but says nothing about limit or cursor and only hints at includeMembers. Baseline 3 for mostly-covered params with partial added value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (read/list lead lists) and enumerates the three access modes — by ids, by campaign, or by workspace — plus the narrowing filters (source, accountId). An agent can distinguish this from campaignstack_delete_lead_list and campaignstack_edit_lead_list immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use this when the user asks which lists exist or who is in them; it does not add or remove members" gives a clear when-to-use and an explicit when-not (membership mutation). It also instructs the agent to page through before counting. It stops short of naming the sibling that handles member changes or reads leads within a list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_lead_refresh_statusGet lead refresh statusA
Read-onlyIdempotent
Inspect

Read workspace lead-enrichment queue status counts, optionally for one campaign. Use this when the user asks whether lead refresh/enrichment is moving; it does not enqueue refreshes. completed and failed cover about the last 6 hours, not all time.

NameRequiredDescriptionDefault
campaignIdNoOptional campaign filter for enrichment queue status.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
itemsNo
totalNo
failedNoFailed in about the last 6 hours; older rows are purged.
pendingNo
strandedNoPart of pending held on an account that can no longer read (disconnected, expired or blocked); these move to another account or fail on their own.
warningsNo
completedNoFinished in about the last 6 hours; older rows are purged, so this is not a lifetime count.
paginationNo
processingNo
accountGatesNo
creditsExhaustedNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description still adds genuinely non-structured context: completed and failed counts cover roughly the last 6 hours rather than all time, a caveat that meaningfully changes interpretation of the numbers.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the core read operation and its scope front-loaded before the usage routing and the time-window caveat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema covering the returned counts and annotations covering safety, the only thing an agent could get wrong is the semantic window of the counts and whether this triggers work – both are addressed explicitly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including a detailed explanation of workspaceId resolution and the optional campaignId filter, so the baseline is 3. The description adds only the phrase 'optionally for one campaign' beyond what the schema already says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Read workspace lead-enrichment queue status counts') and qualifies scope ('optionally for one campaign'), then explicitly separates the tool from the enqueue path with 'it does not enqueue refreshes', distinguishing it from campaignstack_refresh_leads.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states exactly when to reach for it ('when the user asks whether lead refresh/enrichment is moving') and when not to ('it does not enqueue refreshes'), implicitly routing enqueue requests to the refresh tool. Both the positive and negative conditions are present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_leadsGet leadsA
Read-onlyIdempotent
Inspect

Read leads by ids or search filters in one bounded V2 envelope. Includes are capped; campaign-specific scoreBreakdown requires campaignId. Use this instead of legacy search/get pairs when the user needs leads plus selected context. It does not modify leads or enqueue outreach. 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.

NameRequiredDescriptionDefault
idsNoSpecific lead IDs to hydrate. Max 25.
limitNo
queryNoName, email, or LinkedIn URL search when ids are omitted.
cursorNo
includeNo
companyIdNoRestrict search to leads attached to this company.
campaignIdNoRequired when include.scoreBreakdown is true.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
itemsYes
warningsNo
missingIdsNo
paginationYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower, yet the description adds real behavioral context: includes are capped, scoreBreakdown is campaign-scoped, results are a single page, and pagination must be followed before counting. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads purpose in the first clause, then layers constraints and pagination guidance. Six sentences are mostly justified, though the pagination instruction is slightly verbose for a description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values needn't be described, and annotations carry the safety profile. The description fills in the operationally important gaps: include caps, the campaignId dependency, and one-page pagination behavior. Complete enough to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 63% and the schema already documents the campaignId/scoreBreakdown dependency and the ids/query roles, so the description adds little parameter meaning beyond restating the include cap and campaignId requirement. Baseline 3 for partially-covered params is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Read) and resource (leads) plus the two access modes (by ids or search filters), and explicitly positions itself against 'legacy search/get pairs.' An agent can tell it apart from write siblings like edit_leads or enrich_leads without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear selection rule: use this instead of legacy search/get pairs when the user needs leads plus selected context, and clarifies it does not modify leads or enqueue outreach. It stops short of naming the specific sibling read tools (e.g. get_lead_enrichments) it might compete with, so no explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_notificationsGet notificationsA
Read-onlyIdempotent
Inspect

Read notifications in a stable envelope with the unread count for the same caller. Use this when the user asks what needs attention; it does not change read state. 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.

NameRequiredDescriptionDefault
typeNo
limitNo
cursorNo
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
itemsYes
warningsNo
resourcesNo
paginationYes
unreadCountNo

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds genuinely new behavior: it preserves read state, returns a single page, and instructs the agent to disclose truncation rather than present the page as complete and to paginate before counting. That is actionable, non-obvious agent behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: identity/scope first, usage trigger second, pagination discipline last. Front-loaded and free of boilerplate.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema and annotations handle return shape and safety, and the description supplies the missing behavioral context (read-state preservation, pagination). It falls short only on parameter semantics, the one gap an agent must consult the schema for.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 25% (only workspaceId is documented in-schema), so the description is expected to carry weight for type/limit/cursor. It mentions none of them: no indication that a type enum filter exists, no explanation of limit bounds or cursor pagination semantics beyond 'one page'. The low coverage is not compensated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (read notifications), adds the scope 'for the same caller' and the return payload (unread count). The clause 'it does not change read state' implicitly separates it from the sibling mutation tool campaignstack_edit_notifications, so an agent can place it without schema inspection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete triggering condition ('when the user asks what needs attention') plus operational guidance about paging through before counting. It doesn't explicitly name an alternative or state when *not* to use it, but the read-state clause rules out the edit tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_platform_capabilitiesA
Read-onlyIdempotent
Inspect

Lists every platform action (like_post, comment_on_post, follow_profile, send_message, send_connection_request, send_inmail, extract_post_engagements) with the platforms it supports and, per platform, the accepted target fields and optional params. Returns platforms, which says for each platform whether accounts can be connected, how many this workspace has, and which actions exist there: a platform with no actions is tracking-only by design, not unfinished. connectedPlatforms is the older shape and lists only platforms with a connected account. Call this when an action tool returns wrong_target_for_platform or unsupported_capability.

NameRequiredDescriptionDefault
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
actionsNo
platformsNo
connectedPlatformsNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond them: a platform with no actions is 'tracking-only by design, not unfinished,' and that connectedPlatforms is the older, narrower shape. Useful interpretive guidance an agent would otherwise misread as an error condition.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads what is returned, then the two return shapes, then the trigger condition. The parenthetical action list is long but genuinely informative about coverage. Slightly dense, though every sentence carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still correctly frames the two keys an agent must interpret (platforms vs. connectedPlatforms) and the tracking-only edge case that would otherwise look like a defect. For a zero-input discovery tool with annotations covering safety, nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the workspaceId description is already detailed (key-type defaults, when it becomes required, which error reports the alternatives). The tool description adds nothing further about the parameter, so the schema does the work — baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Lists) and resource (every platform action) plus the exact per-action metadata returned (supported platforms, accepted target fields, optional params). The enumerated action names make it unmistakable against siblings like like_post, send_inmail, or follow_profile, which are the very actions this tool describes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit, concrete trigger: 'Call this when an action tool returns wrong_target_for_platform or unsupported_capability.' That is strong when-to-use guidance tied to observed error states. It stops short of stating when not to call it (e.g., as a substitute for explain_capabilities).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_reviewsGet reviewsA
Read-onlyIdempotent
Inspect

Read pending review drafts and optional pending count in one stable envelope. Each item carries what a decision needs: the draft text and the key it sits under, the lead's name, headline, company and profile URL, the channel, the workflow or campaign, the sending account and any flag with its reason. 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. Includes add the lead's full profile, the thread, what the draft answers, the stored draft with its reasoning, and the critic history. Items include kind: workflow for drafted workflow touches and kind: job_application for job watcher cover letters; pass that kind back to campaignstack_decide_review or campaignstack_edit_draft. Use before deciding a review; a page is not the whole queue.

NameRequiredDescriptionDefault
limitNo
cursorNo
includeNoOpt-in heavy detail per item. Each item already carries the draft, the lead's name, headline, company and profile URL, and any flag.
accountIdNo
workspaceIdNoWorkspace 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.
includeCountNo

Output Schema

NameRequiredDescription
itemsNo
warningsNo
missingIdsNo
paginationNo
pendingCountNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so safety is covered. The description adds genuinely non-obvious behavior: a 'stable envelope', truncation/pagination reporting, and the requirement that large/computed/historical/external includes respect documented caps. That is real added value beyond structured fields, though it does not explain auth or rate-limit traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose and the decision-relevant item contents, then the include semantics, then the usage directive. It is dense and somewhat long, but nearly every sentence carries new information; the only mild inefficiency is restating the conversation cap that the schema already documents.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is unnecessary. Given six parameters, nested include objects, and two item kinds, the description covers the pagination model, the include/cap contract, the kind routing to sibling tools, and the per-item payload — enough for an agent to invoke correctly without further context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33%, so the description must compensate, and it does: it enumerates what each include adds (leadProfile, context, conversation, draftDetails, criticHistory, applicationDetails) and what items already carry, letting an agent decide whether an include is needed. limit, cursor, and accountId are left to the schema, which is a minor gap given their simplicity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read pending review drafts and optional pending count') and immediately describes the envelope's contents down to individual item fields. It also names the sibling tools the item kinds feed into (campaignstack_decide_review, campaignstack_edit_draft), so an agent can distinguish it from get_job_applications, recover_review, and get_review_time without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context: 'Use before deciding a review; a page is not the whole queue,' which tells the agent when to call it and warns about pagination completeness. It also scopes the include parameter ('only for extra details the user asked for') and states that kind must be passed back to decide_review/edit_draft. It stops short of naming an explicit alternative for other review-reading needs, so it is not a full when/when-not statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_review_timeGet review timeA
Read-onlyIdempotent
Inspect

Get the calling user's time-in-review history: an 8-week series of minutes spent in the inbox review queue, this week's decisions split by who made them (app, your agent via MCP, automatic), and whether minutes per decision fell from last week. Call this when the user asks how much time they're spending reviewing drafts, or whether the queue is getting faster. Renders no series (empty weeks, distinctWeeksWithData omitted) until at least 2 weeks of data exist. Requires a USER API key (csu_); workspace keys have no user identity.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
weeksNo
decisionsThisWeekNo
distinctWeeksWithDataNo
minutesPerDecisionTrendNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and non-destructive behavior, so the bar is lower; the description still adds valuable context beyond them: the series is suppressed until 2 weeks of data exist, empty weeks are omitted, and the tool requires a USER API key because workspace keys lack user identity. This goes well beyond the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences with no filler. It front-loads the output meaning, then gives the invocation trigger, then adds the behavioral edge case and auth requirement. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with complete annotations and an output schema, the description covers everything needed to call it correctly: what it returns, when to use it, the empty-data behavior, and the API key requirement. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and schema coverage is 100%, so there are no parameter semantics for the description to clarify. Baseline 4 is appropriate; the description does not need to compensate for any schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: retrieving the calling user's time-in-review history. It spells out the exact contents (an 8-week series of minutes, decision splits, week-over-week change), which makes it easy to distinguish from the sibling `campaignstack_get_reviews` and other read tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit when-to-use trigger: when the user asks how much time they are spending reviewing drafts or whether the queue is getting faster. It does not name alternatives or state when not to use it, but the context is clear enough for an agent to route appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_signal_agentsA
Read-onlyIdempotent
Inspect

Get signal agents with optional ids, filters, pagination, and bounded stats/leads includes. Account-maintenance watchers stay hidden unless includeAccountMaintenance is true.

NameRequiredDescriptionDefault
idsNoOptional signal agent ids to fetch.
limitNoMaximum items to return, capped at 100.
cursorNoOpaque pagination cursor.
filtersNo
includeNo

Output Schema

NameRequiredDescription
itemsNo
warningsNo
missingIdsNo
paginationNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds meaningful behavior beyond that: account-maintenance watchers are hidden by default and only surface when includeAccountMaintenance is true, and includes are described as bounded.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, densely packed and front-loaded with the resource and capability summary, then the important hidden-by-default caveat. Little wasted text, though the first sentence is slightly overloaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description covers the key non-obvious behavior (hidden account-maintenance watchers, bounded includes). Sufficient for a five-parameter, zero-required read tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60%, so the schema documents much of the surface (notably the workspaceId fallback rules). The description signals the roles of ids/filters/pagination/includes but adds no syntax or format detail beyond what the schema provides; "bounded" is the main added nuance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ("Get") and resource ("signal agents"), plus the capability surface: optional ids, filters, pagination, and stats/leads includes. An agent can distinguish this from sibling listing tools like get_signal_watches, though it does not explicitly contrast the two related concepts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (fetch by ids, filter, paginate, expand includes) but never states when to choose this over alternatives like get_signal_watches or which filters apply. The one real guideline is the includeAccountMaintenance condition, which is genuine but narrow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_signal_watchesA
Read-onlyIdempotent
Inspect

Get person signal watches with optional ids, filters, and pagination. Returns only watches inside the resolved workspace; missing requested ids are reported as missingIds.

NameRequiredDescriptionDefault
idsNoOptional lead signal watch ids to fetch.
limitNoMaximum items to return, capped at 100.
cursorNoOpaque pagination cursor.
filtersNo
includeNo

Output Schema

NameRequiredDescription
itemsNo
warningsNo
missingIdsNo
paginationNo

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds real behavioral context beyond that: results are scoped to the resolved workspace, and requested ids that don't resolve are surfaced as missingIds rather than silently omitted.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the scoping constraint front-loaded. Every clause carries information an agent can act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the description covers workspace scoping, filter/pagination capability, and missing-id reporting. Slightly thin on the include object and filter state semantics, but complete enough for a read-only list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 60%, and the schema itself documents ids, limit, cursor, and the workspaceId resolution rule well. The description only restates the parameter categories (ids, filters, pagination) plus the missingIds behavior, adding little semantic detail the schema doesn't already carry.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Get person signal watches') with scope modifiers (ids, filters, pagination). The resource phrase 'person signal watches' implicitly distinguishes it from the sibling watch-getters get_company_employee_watches and get_competitor_watches, though it never names them explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use, when-not-to-use, or named alternatives. Usage is only implied by the verb and the resource. The workspace-resolution note is contextual but doesn't tell the agent when to pick this over the edit/delete signal watch siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_workflow_node_typesGet workflow node typesA
Read-onlyIdempotent
Inspect

Discover supported workflow node types before graph edits. Includes graph shape docs, examples, and webhook templates for integration:webhook nodes.

NameRequiredDescriptionDefault
includeWebhookTemplatesNo

Output Schema

NameRequiredDescription
nodeTypesNo
graphShapeNo
exampleGraphNo
webhookTemplatesNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds value by disclosing that the output includes graph shape docs, examples, and webhook templates, which goes beyond the annotations and helps the agent understand the content returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two concise sentences, front-loaded with the core purpose. Every word adds value—no fluff, no repetition. It efficiently conveys the tool's role and the key content included.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only discovery tool with one optional parameter and an output schema, the description is complete. It covers the purpose, timing, and content types, and the annotations plus output schema cover the remaining behavioral and return details. No critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description must clarify the parameter. It mentions 'webhook templates' in the context of the tool's output, which implicitly relates to includeWebhookTemplates, but does not explicitly state that the parameter controls this. The parameter's default and behavior are left to inference, so while some meaning is added, it's not fully explicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool discovers supported workflow node types, with a specific purpose ('before graph edits'). It also details what's included (graph shape docs, examples, webhook templates), making it unambiguous and distinct from sibling tools like get_workflows or edit_workflow_graph.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'before graph edits' implies it should be used as a preparatory step prior to modifying a workflow graph, providing clear context. It doesn't explicitly name alternatives or exclusions, but the usage timing is evident and sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_workflowsGet workflowsA
Read-onlyIdempotent
Inspect

Read one or many workflows in a stable envelope. 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. Includes can add graph, stats, bounded split optimization history, node activity, and leads at nodes.

NameRequiredDescriptionDefault
idsNoWorkflow ids to hydrate. Omit to list workflows in the workspace or campaign.
limitNoMaximum items to return, capped at 100.
nodesNo
cursorNoOpaque pagination cursor.
filtersNo
includeNo

Output Schema

NameRequiredDescription
itemsNo
warningsNo
missingIdsNo
paginationNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, closed-world. The description adds genuinely new context: responses always use the same collection envelope regardless of arity, and includes must respect caps and report truncation/pagination. It doesn't cover auth/workspace binding, but the annotation bar is already met.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core read behavior, then the id-count semantics, then the include contract. The final sentence ('Includes can add graph, stats...') partially restates include listings already present in the schema, making it slightly padded, but the rest earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be re-explained, and annotations cover safety. The description still adds the envelope-stability and truncation contract, which is meaningful. Minor gaps remain around filter semantics, but the tool is adequately described for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%, so the schema documents ids, limit, cursor, and each include. The description reinforces the ids semantics and the include caps/truncation contract, but adds little on the undocumented filters (status, enabled, campaignId, signalAgentId) or workspaceId behavior.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Read') and resource ('workflows'), and clarifies the single-vs-many behavior. It does not name any sibling to distinguish against, but no sibling is a competing read-workflows tool (the near neighbors are edit_workflow/delete_workflow, clearly writes).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit conditional guidance: omit ids to list, pass one id for one record, several for several. Also advises using 'include' only for details the user asked for. Lacks any exclusion against an alternative tool, but the when-to-use conditions are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_workspace_memoriesA
Read-onlyIdempotent
Inspect

List workspace memories: active notes already used in prompts first, then candidate notes awaiting confirmation, each newest first. Each item carries status, observations (a candidate goes live at 3, from three different leads), direction (include: asks drafts to contain something; avoid: asks them to leave it out) and source (agent, user, user_edit for app edits, or mcp_edit for MCP edits). Page with pagination.nextCursor while pagination.hasMore is true.

NameRequiredDescriptionDefault
limitNoPage size, default 50, at most 100.
cursorNopagination.nextCursor from the previous page.
categoryNo
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
dataNo
paginationNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower, and the description still adds real domain behavior: the promotion rule ('a candidate goes live at 3, from three different leads'), what 'direction' include/avoid means for drafts, and the source taxonomy. It stops short of stating auth or scale limits, but the domain semantics are substantive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both dense with information and no filler: the first states scope and ordering, the second decodes the returned fields and pagination. Information is front-loaded with the listing semantics ahead of field-level detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't explain return shape, yet it helpfully glosses the key item fields and the pagination contract. What's missing is whether the category filter narrows memory type and any cue about when an agent should reach for this list.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 75% and workspaceId is documented thoroughly in-schema, so the baseline is 3; the description earns an extra point by explaining the cursor loop concretely ('page with pagination.nextCursor while pagination.hasMore is true'), adding a termination condition the schema does not. The gap is that the category enum (rule/voice/audience/lesson/other) is never explained in either the schema or the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('List workspace memories') and immediately specifies the scope composition: active notes first, then candidates, each newest first. An agent can distinguish this read/list tool from siblings like campaignstack_edit_workspace_memory and campaignstack_delete_workspace_memory without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description is about what the tool returns, not when to call it — there is no guidance such as 'call this before drafting to learn workspace preferences' and no explicit statement that mutations belong to campaignstack_edit_workspace_memory. Usage is only implied by 'List' versus the edit/delete siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_get_workspacesGet workspacesA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idsNoOptional entity ids to fetch, capped at 25.
limitNoMaximum items to return, capped at 50.
cursorNoOpaque pagination cursor.
filtersNo
includeNo

Output Schema

NameRequiredDescription
itemsNo
warningsNo
missingIdsNo
paginationNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive. The description adds real value beyond them: caps on includes, that truncation and pagination must be reported, and that results carry missingIds and warnings. It repeats 'read-only' from the annotation, which is minor redundancy rather than added disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then usage, then alternatives. Slightly verbose — the 'stable collection envelope' idea is restated ('The response still uses the same collection envelope'), which is mild padding in an otherwise dense paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read tool with a rich nested include schema and an output schema, the description covers identity, usage, id semantics, include discipline, and truncation/pagination reporting. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60% and the description compensates: it explains the ids list-vs-fetch behavior and that include should only be used for extra details the user asked for, going beyond the schema's per-field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read workspaces and optional workspace details') and names the sibling tools it is not (campaignstack_get_campaigns, campaignstack_get_identities), so an agent can distinguish it without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it ('when the user needs workspace identity, settings, members, billing...') and routes elsewhere for campaign setup and identity/voice ownership. It also spells out the id-passing semantics (omit/one/several).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_import_external_leadsImport external leadsAInspect

Import leads from a provider list, campaign, or portal into CampaignStack. The job may continue server-side; read progress through campaignstack_get_integrations resources.importProgress.

NameRequiredDescriptionDefault
providerYes
sourceIdYes
campaignIdNo
sourceKindYes
sourceNameNo
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
failedNo
resultNo
resultsNo
warningsNo

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (not read-only, not idempotent, non-destructive, open-world), so the bar is lower. The description adds genuine value by disclosing that the job may continue server-side and naming exactly how to read progress via campaignstack_get_integrations resources.importProgress, which is not derivable from the schema or annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the purpose front-loaded and the async/progress pointer as the second beat. No filler; every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return-value detail is not needed, and the async nature is covered. However, with 17% param coverage and an undifferentiated near-twin sibling (campaignstack_import_leads), the definition is only minimally complete for an operationally complex, open-world import tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 17% (just workspaceId), so the description must carry the parameter burden. It maps loosely to the sourceKind enum ('list, campaign, portal') but never explains provider values (apollo/instantly/hubspot), sourceId, campaignId, or sourceName semantics, leaving most of the six parameters undocumented in both places.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Import) and resource (external leads) plus the accepted source kinds (provider list, campaign, portal) and the destination (CampaignStack). It does not, however, distinguish itself from the close sibling campaignstack_import_leads or campaignstack_add_leads_to_external_destination, so an agent cannot tell from the text alone which import path to choose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies its usage by naming the three source kinds, and it points to where to follow async progress. But it never states when to prefer this over the similar campaignstack_import_leads or export/add-leads siblings, and gives no prerequisites or exclusions, leaving the routing decision to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_import_leadsImport leadsAInspect

Import parsed CSV lead rows into private workspace leads with CSV provenance, optionally attaching successful rows to one lead list. Max 100 rows per call; per-row failures are returned without aborting the whole import.

NameRequiredDescriptionDefault
rowsYesCSV rows already parsed into fields. Max 100 per call.
leadListIdNoOptional set lead-list to attach imported rows to.
workspaceIdNoWorkspace 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.
importedFromNo

Output Schema

NameRequiredDescription
okNo
itemsNo
failedNo
resultsNo
warningsNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly=false, destructive=false, openWorld=false, idempotent=false). The description adds genuinely useful traits beyond them: a hard 100-row-per-call limit and non-aborting per-row failure handling, which materially affects how an agent batches and interprets results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the core action and the notable constraint both front-loaded. No filler, though the row-cap and failure semantics could be slightly more separated for scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is unnecessary, and the description covers the key behavioral surprises (batch cap, partial-failure results, list attachment). For a non-idempotent mutation with no required destructive warnings, this is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, so most parameters are documented structurally (workspaceId, importedFrom, rows). The description adds meaning to leadListId ('optionally attaching successful rows to one lead list'), but does not elaborate on row field semantics or the workspaceId resolution logic. Baseline 3 fits.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Import parsed CSV lead rows into private workspace leads.' The 'parsed CSV lead rows' phrasing implicitly distinguishes it from the sibling campaignstack_import_external_leads, though it never names that alternative. An agent can tell what it does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (importing already-parsed CSV rows, with an optional lead-list attachment) but gives no explicit when-to-use vs when-not guidance, nor does it point to campaignstack_import_external_leads for the non-CSV path. The 100-row cap and per-row failure semantics give operational context but not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_like_postA
Destructive
Inspect

Ask CampaignStack to like a lead's most recent post from a connected LinkedIn account, as a light way to be seen before writing. Call this when the user asks to like or engage with a specific lead's post before an outreach step. platform is required (currently "linkedin"). Name the person with leadId, which is the supported form; profileUrl is accepted for someone already in the workspace. The workspace's only connected LinkedIn account is used automatically, or pass accountId (campaignstack_get_accounts). A like is public and puts a notification on that person's account under the owner's name. It does not comment; use campaignstack_comment_on_post for that. This reaches a real person. Before calling it, tell the user exactly who it goes to and read the wording back to them, and wait for an explicit yes. One person per call. There is no bulk form, and calling this in a loop over a list is not the supported way to reach a list: add the leads with campaignstack_edit_lead_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Business hours do not apply. CampaignStack's daily limit for this action (and the weekly limit for invitations) still applies and counts sends already queued, so a run of calls stops at the limit; the owner sets those limits in the app. A paused account, or an action LinkedIn has challenged, refuses the send whatever the limit.

NameRequiredDescriptionDefault
leadIdNo
platformYes
accountIdNoAccount that acts (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one.
profileUrlNo
workspaceIdNoWorkspace 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.
idempotencyKeyNoOptional. A key you choose for this one send. Calling again with the same key returns the send already made instead of sending twice (use it when a call timed out); a key reused for a different send is refused. Without a key, the same words to the same person within a few minutes are refused as a repeat.

Output Schema

NameRequiredDescription
jobIdNo
statusNo
successNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far exceeds what the annotations convey. It discloses that the like is public and notifies the target under the owner's name, that it reaches a real person, that daily/weekly limits count already-queued sends so a loop stops at the limit, that business hours do not apply, and that paused or LinkedIn-challenged accounts refuse the send. These are exactly the side-effect and failure-mode facts an agent needs for a destructive, open-world write.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in sentence one and most sentences carry distinct, load-bearing information (consent, sibling routing, bulk alternative, limits). It is nonetheless a long block, and lines like 'a light way to be seen before writing' and the business-hours aside add length without much decision value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter, real-world side-effect tool with an output schema, the description covers everything an agent would otherwise have to guess: consent gating, one-person-per-call, account defaulting, no bulk path, and limit/refusal behavior. Return values are the output schema's job and are not redundantly restated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%, so the description must carry weight, and it does: platform is stated as required (currently only 'linkedin'), leadId is named as the supported identifier while profileUrl is the fallback for someone already in the workspace, and accountId is cross-referenced to campaignstack_get_accounts. The workspaceId and idempotencyKey semantics are left entirely to their schema descriptions, which is the only gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: like a lead's most recent post from a connected LinkedIn account. It immediately distinguishes itself from the nearest sibling by saying it 'does not comment; use campaignstack_comment_on_post for that', so an agent can route correctly without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use (like/engage with a specific lead's post before an outreach step), names the alternative for commenting, and addresses the bulk case by routing to campaignstack_edit_lead_list plus campaignstack_trigger_workflow instead of looping. It also states a required prerequisite (explicit user confirmation before sending).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_lookup_companyLook up a company on LinkedInAInspect

Call this when the user asks for a company that campaignstack_get_companies with a query does not find. With query, CampaignStack searches the web for matching LinkedIn company pages and returns up to 5 (companyId is set when CampaignStack already holds one). With linkedinUrl, CampaignStack reads that public company page and adds the company to the shared company database; the answer is ready with a companyId, or queued (call again with the same linkedinUrl to check), or failed. Pass exactly one of the two. Free, up to 50 searches and 50 new pages per workspace per day. It does not add the company to a campaign or reach anyone at it.

NameRequiredDescriptionDefault
queryNoCompany name or domain to find on LinkedIn. Returns up to 5 company pages; none is added yet.
linkedinUrlNoA linkedin.com/company/ page to add. Call again with the same URL to read where the read stands.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
itemsNo
failedNo
resultsNo
warningsNo

TDQS

A4.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnly=false, openWorld=true, idempotent=false, destructive=false, so the write/open-world profile is already structured. The description adds real value beyond that: rate limits ('50 searches and 50 new pages per workspace per day'), the shared-database write side effect, and async states (ready / queued / failed) with a re-poll instruction. However, most of the async detail is already implied by the linkedinUrl schema, so with annotations plus 100% schema coverage this lands at a solid 3 rather than higher.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the call condition, then the two modes, then limits and exclusions. Dense but every sentence carries information; slightly long, with a couple of parenthetical asides that could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return format needn't be spelled out, and the description still covers the async result states, rate limits, side effects, and mutual exclusivity of parameters. Nothing an agent needs to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description clarifies behavioral differences between the modes: query returns up to 5 pages with none added, while linkedinUrl reads and adds the page and can be re-called to check progress. That meaning goes beyond the schema text, particularly the polling semantics of linkedinUrl.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (look up) and resource (a company on LinkedIn), and explicitly frames it as the fallback to campaignstack_get_companies with a query. An agent can distinguish this from siblings like get_companies or enrich_companies without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger: 'Call this when the user asks for a company that campaignstack_get_companies with a query does not find.' It also names the two mutually exclusive input modes ('Pass exactly one of the two') and states the exclusion that it does not add to a campaign or reach anyone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_onboard_workspaceAInspect

Set up a CampaignStack workspace: who the user works for, what that company sells, why it exists, how they write, and who they sell to.

Call this with no arguments FIRST. It returns what CampaignStack already knows, including the employer company resolved from the user's LinkedIn profile and any facts already gathered on it, plus every field you can write and its current value. Read that before you propose anything: your job is to correct and complete what is there, not to describe the company from scratch.

Then call it again with the fields you are confident about. Confidence means you can point to something specific: their profile, their company page, their site, something they told you. When you are not confident about a field, leave it out. An empty field is fixed in ten seconds by the user. A plausible sentence that is wrong gets read into every message the system writes for them, and nobody catches it until a prospect does.

Report back in plain language what you set and what you left empty, so the user can correct you before any of it reaches a message.

NameRequiredDescriptionDefault
voiceNoHow this person writes: sentence length, formality, punctuation habits, phrases they reuse. Describe, never instruct.
firstIcpNoA first ideal customer profile. At least one list is required for it to be written.
whatWeSellNoWhat the company sells, in one or two plain sentences. Facts only.
companyNameNoThe company the user works for.
workspaceIdNoDefaults to the workspace the extension set up for this key, or the key's workspace.
whyWeBuiltItNoWhy the company exists: the specific thing the founder saw that made it worth building. Omit unless it is concrete and checkable.

Output Schema

NameRequiredDescription
nextNo
noteNo
stateNo
writtenNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With all annotations false, the description carries the full burden, and it delivers: it discloses the non-obvious read-modify-write pattern, that the no-argument call returns the employer resolved from LinkedIn plus current field values, and the rule that unconfident fields must be omitted. It also explains the real consequence of a wrong guess (plausible errors get read into outbound messages). The one gap is that it never explicitly states whether a partial second call merges with or overwrites existing field values, though 'correct and complete what is there' implies a merge.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short paragraphs follow the workflow in strict order: what the tool does, first call, second call, reporting. The opening sentence front-loads the purpose, and the roughly 220-word length is proportionate to a two-phase tool with 6 parameters and a nested object; the consequence-framing sentences earn their place because they change agent behavior toward safe omission.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully specifies the non-obvious two-phase protocol, what the first call returns, the confidence threshold, and the required plain-language report, while the output schema covers the write call's return value. Nothing an agent needs to invoke this correctly is missing; the only soft spot, merge-versus-overwrite semantics, is resolved well enough by 'correct and complete what is there.'

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds parameter-level guidance the schema cannot express: omit any field you cannot support with evidence, because an empty field is cheap to fix while a plausible wrong one is costly. It also maps the five onboarding questions to the parameter groups (companyName, whatWeSell, whyWeBuiltIt, voice, firstIcp), reinforcing which parameters serve which goal.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair ('Set up a CampaignStack workspace') and enumerates the exact scope of what gets configured: the employer, what the company sells, why it exists, how the user writes, and who they sell to. The two-phase read-then-write framing further separates it from siblings like update_workspace or get_workspace_setup, so an agent can tell this onboarding flow apart without inspecting those tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit invocation protocol: 'Call this with no arguments FIRST,' then call again with only confident fields, then 'Report back in plain language what you set and what you left empty.' It also states the confidence standard (point to a profile, company page, site, or something the user said). However, it never names alternative tools or states when not to use this one in favor of a sibling, so it stops short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_preview_craft_promptA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
leadIdYesThe lead to render the prompt for. Different leads produce different prompts.
nodeIdYesA 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.
includeNoWhat 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.
leadSourceNoOptional. Leave it out: the server reads it from the leadId and refuses a value that disagrees.
workflowIdYesThe workflow the node belongs to.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
charsNo
indexNo
callerNo
nodeTypeNo
userPromptNo
systemPromptNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the readOnly/idempotent annotations by enumerating concrete side effects that do NOT occur: no audit row, no AI usage record, no voice experiment arm, no web fetch, no cost. This is exactly the kind of behavior an agent cannot infer from the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then trigger conditions, then mechanics, side effects, and pairing. It is on the long side, but each sentence carries distinct information; little is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no prose, and the description still covers scope, side effects, the index structure, and the sibling relationship. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description still adds value by explaining what 'index' actually returns (named blocks with character offsets and sizes, e.g. COMPANY CONTEXT, RED LINES) and by noting leads produce different prompts, which clarifies the leadId dimension.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Render the exact prompt a craft node would send for one lead, without sending it') and immediately clarifies the non-sending scope, which separates it from sibling send/craft tools like campaignstack_craft_message and campaignstack_send_message.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit triggers ('when the user asks to see what a draft would look like, or to debug why a node's wording keeps going wrong') and names a complementary sibling, campaignstack_get_craft_config_tree, with the distinction between them (bytes vs. provenance).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_propose_workspace_playbook_changePropose workspace playbook changeBInspect

Ask CampaignStack to draft a proposed playbook change for review instead of directly overwriting the live playbook.

NameRequiredDescriptionDefault
sectionKeyNo
instructionYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workspaceIdNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=false and readOnlyHint=false, so the agent knows writes are not destructive. The description usefully clarifies that the output is a draft for review rather than a live mutation, but adds nothing about permissions, the review/approval flow, or rate/repeat behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the contrastive 'instead of...' clause carries the key distinction. It is efficient, though a bit terse given the schema gaps it could have covered.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and annotations cover the safety profile. However, for a proposal/review workflow the description omits what happens after the draft is produced or how it relates to the refresh/approval siblings, leaving a modest gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33%: workspaceId is richly documented in the schema while sectionKey and instruction have no descriptions. The tool description adds no meaning for any of the three parameters, so it fails to compensate for the two undocumented fields.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('draft a proposed playbook change') and resource (workspace playbook), and contrasts it with the direct-overwrite alternative, so an agent knows this produces a proposal rather than a live edit. It does not name the sibling it pairs with (e.g. campaignstack_refresh_workspace_playbook), so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Instead of directly overwriting the live playbook' implies the intent (changes for review), but no explicit when-to-use/when-not conditions, prerequisites, or named alternative tools are given. Usage must be inferred from the contrastive clause alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_recover_reviewRecover reviewAInspect

Recover one review with mode retry, restore_superseded_draft, or reopen. Retry may spend a fresh model generation; reopen validates downstream safety.

NameRequiredDescriptionDefault
modeYes
entryIdYes
confirmedYesThis can spend credits, paid provider quota, or model-backed work. Tell the user the cost or budget meaning first when the tool reports one.
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workflowIdNo
workspaceIdNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the safety envelope (readOnly=false, destructive=false, idempotent=false). The description adds behavior beyond that: retry 'may spend a fresh model generation' (cost/quota implication) and reopen 'validates downstream safety'. Missing detail on reversibility and any permission requirements keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with zero filler; the resource and mode enumeration are front-loaded before the cost caveat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and the cost note covers the mutation risk. However, for a confirmed-required mutation with an undefined entryId and no guidance on when to prefer recovery over decide_review, the description leaves meaningful gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: confirmed and workspaceId are documented inline, but entryId and mode are not. The description compensates partly by spelling out the three valid mode values, yet says nothing about what entryId expects (an id vs a review object). Baseline 3 for partial coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Recover one review') and enumerates the three modes it supports, which makes it clearly distinct from read siblings like get_reviews or decide_review. It stops short of naming the closest alternative (decide_review) explicitly, so differentiation is inferred rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The mode list implies the situations (retry a failed generation, restore a superseded draft, reopen a decision), but there is no explicit when-to-use vs when-not-to-use guidance or reference to the sibling decide_review, which handles the non-recovery path.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_refresh_companiesRefresh companiesAInspect

Start a full company refresh for up to 25 companies. There is no sections argument: the backend schedules all available company-refresh components and returns per-company partial status including gates and already-queued rows. Charges company_refresh credits per call; campaignstack_estimate_cost gives the number before you commit.

NameRequiredDescriptionDefault
companyIdsYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
itemsNo
failedNo
resultsNo
warningsNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a mutating (readOnlyHint=false), non-idempotent, non-destructive, open-world call, and the description adds real value on top: it discloses the credit cost per call, the absence of a sections argument, that the backend schedules all available components, and that queued rows are reported rather than re-run. That is substantive behavioral context beyond the annotation flags.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with the operation and its cap, followed by behavioral facts and the cost pointer. Every sentence carries information, though 'There is no sections argument' addresses a parameter that does not exist and is a slightly defensive use of space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be enumerated, and the description still previews that per-company partial status is returned. Cost, batch limit, and mutation semantics are covered; the remaining gap is the missing distinction from enrich_companies and any failure/permission behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%: workspaceId carries a long, detailed schema description while companyIds has none. The description only restates the 25-item cap that maxItems already encodes and notes a missing 'sections' argument; it adds no input format or identifier guidance for companyIds, so it neither compensates for the gap nor wastes effort.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Start a full company refresh for up to 25 companies') with the batch limit inline. It is distinguishable from refresh_leads by resource, but it never contrasts itself with the closest sibling, enrich_companies, leaving the refresh-vs-enrich boundary to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear context (a full refresh, capped at 25) and explicitly routes the agent to campaignstack_estimate_cost to learn the credit cost before committing. However, it offers no when-not guidance or explicit comparison against enrich_companies or edit_companies, so selection among similar company tools remains implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_refresh_identity_voiceRefresh identity voiceBInspect

Queue voice re-extraction for all LinkedIn accounts linked to an identity visible in the workspace.

NameRequiredDescriptionDefault
identityIdNo
workspaceIdNoWorkspace 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.
googleAccountIdNo
linkedinAccountIdNoNames the identity by its LinkedIn account. With no identityId, linkedinAccountId or googleAccountId, the workspace's only LinkedIn account ready to use is meant; with several, the error lists them so you can ask the person.

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workspaceIdNo

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already tell the agent this is a non-read-only, non-idempotent, non-destructive operation. The word 'Queue' usefully signals asynchronous/background processing rather than a synchronous result, which is genuine added context. However, it never says whether existing voice data is replaced, what approvals/limits apply (rate limits, cost), or that repeat calls queue duplicate work despite idempotentHint=false.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the operation and its scope come first. It is arguably too terse for the behavioral gaps, but the structure itself is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. But for a queuing/mutation tool with no usage guidance and half the parameters undocumented, the definition leaves real gaps around when to invoke it and how its identity-selection parameters interact.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50% and the description adds no parameter-level meaning beyond the schema; googleAccountId is undocumented in both places. The description's mention of 'an identity visible in the workspace' loosely frames the identity selection, but doesn't clarify the identityId/googleAccountId/linkedinAccountId alternatives that the schema partially explains.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource: 'Queue voice re-extraction for all LinkedIn accounts linked to an identity.' An agent can tell this triggers a voice-profile re-extraction rather than a generic refresh. It does not name or contrast any sibling (e.g. edit_identity, refresh_leads), so it stops short of 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use, prerequisites, or alternatives are given. Nothing explains why you'd re-extract voice versus editing the identity directly via campaignstack_edit_identity, nor what state the identity must be in. Usage must be inferred entirely from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_refresh_inboxAInspect

Ask CampaignStack to poll its connected LinkedIn accounts for new messages now. Call this when the user wants the inbox brought up to date before you read it. Respects a 20-second freshness dedup window per account. Returns { refreshed, skipped, errors }. It does not fetch one thread's older history: use campaignstack_get_conversations with ids and include.messages for that.

NameRequiredDescriptionDefault
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
errorsNo
skippedNo
refreshedNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations covering safety (readOnlyHint=false, destructiveHint=false, openWorldHint=true), the description still adds real behavior: a 20-second per-account freshness dedup window. It also names the return keys, though the output schema already carries that, so it's slightly redundant rather than additive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action, then the trigger, then the constraint and the sibling routing. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a refresh-style tool, the description covers the trigger, the dedup limit, the return shape, and the boundary against the closest sibling. With the output schema present, return values need no further explanation, so nothing an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single workspaceId parameter is thoroughly documented in-schema, so the baseline is 3. The description never mentions workspaceId or how to resolve it, adding no meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('poll its connected LinkedIn accounts for new messages now') with a scope qualifier ('now'). It explicitly distinguishes itself from campaignstack_get_conversations, so an agent can tell the two apart without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives both the positive trigger ('call this when the user wants the inbox brought up to date before you read it') and an explicit exclusion naming the alternative and its required parameters ('use campaignstack_get_conversations with ids and include.messages'). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_refresh_leadsRefresh leadsAInspect

Queue up to 50 LinkedIn lead profiles for fresh enrichment. normal joins the standard queue, which reads during the account's business hours. high with up to 5 profiles reads them right away, even outside business hours, like opening the profiles yourself; high with more goes to the front of the queue and still waits for business hours. Daily limits, pauses and a disconnected account still apply. Enrichment from an existing LinkedIn URL costs no credits; identity finding is charged only when found.

NameRequiredDescriptionDefault
resultsYes
priorityNonormal
accountIdNoAccount that reads the profiles (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one.
campaignIdNo
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
itemsNo
failedNo
resultsNo
warningsNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the annotations (readOnly=false, idempotent=false, openWorld=true): the queue-wait semantics, business-hours dependency, that limits/pauses/disconnected accounts override priority, and a precise credit model (existing URL free, identity finding charged only on success). Those cost and throttling disclosures are exactly what an agent needs before spending the user's credits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and the 50-profile limit, then the priority rules, then the caveats and cost note — a sensible information order. The single dense paragraph is efficient, though the priority clause is packed tightly enough that it takes a second read.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description covers the remaining agent-relevant concerns: queue timing, priority thresholds, throttling, and credit cost. The only absent piece is sibling differentiation, which is a routing concern rather than a completeness gap in calling this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The priority enum is explained in depth and the 50-item cap is stated, both mapping to schema fields. But schema description coverage is only 40%, and the description says nothing about the 'results' item shape (required profileUrl, the global/private leadSource enum, why optional identity fields like fullName or headline would be supplied) or about campaignId. It partially compensates but leaves real gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with a hard scope limit: 'Queue up to 50 LinkedIn lead profiles for fresh enrichment.' An agent immediately knows this is an async enrichment-queueing operation rather than a read or an edit. It does not, however, distinguish itself from the sibling campaignstack_enrich_leads, which an agent could plausibly confuse it with.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear within-tool routing guidance: 'normal' vs 'high', including the concrete threshold of up to 5 profiles for immediate reading and the 'like opening the profiles yourself' analogy. It also warns that daily limits, pauses and a disconnected account still apply. It stops short of naming when to prefer this over campaignstack_enrich_leads or campaignstack_get_lead_refresh_status.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_refresh_workspace_playbookRefresh workspace playbookAInspect

Regenerate the workspace playbook from current campaigns, ICPs, personas, and company context. User-authored passages are preserved and prior text is snapshotted.

NameRequiredDescriptionDefault
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workspaceIdNo

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare it is not read-only and not idempotent, so the description's value is elsewhere: it discloses that user-authored passages are preserved and prior text is snapshotted, which reassures the agent that regeneration is non-destructive to custom edits. It doesn't mention cost, latency, or confirmation needs, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, action first, behavioral caveat second. Every clause carries information and nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and annotations cover the mutation/safety profile. The description covers the mutation's content effects (preservation, snapshot); the main missing piece is routing relative to the propose-playbook-change sibling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With a single optional parameter at 100% schema coverage, the schema already fully documents workspaceId, including the single-workspace omission rule. The description adds nothing about the parameter, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Regenerate the workspace playbook') and enumerates the source inputs (campaigns, ICPs, personas, company context). It does not name the closely related sibling campaignstack_propose_workspace_playbook_change, so the agent must infer the distinction between regenerating and proposing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use or when-not-to-use guidance is given. A sibling named campaignstack_propose_workspace_playbook_change is the obvious alternative for playbook changes, yet the description never explains when to refresh versus propose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_retry_workflow_entriesRetry workflow entriesAInspect

Retry one or many failed workflow entries by explicit entry ids, or retry all failed entries at one node. Returns per-entry partial results for explicit ids and node batch counts for node selectors.

NameRequiredDescriptionDefault
selectorYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workflowIdNo
workspaceIdNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations establish the safety profile (not read-only, not idempotent, not destructive, closed-world), so the burden is partly lifted. The description adds that id-based retries return partial per-entry results, which is useful behavioral context, but it omits what re-running a failed entry actually does to workflow state and any permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and followed by the selector modes; nothing is padded. The second sentence partly restates return-shape information that the output schema already carries, which is the only waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so describing return shapes is redundant rather than necessary, and the description otherwise covers purpose and parameter modes. It lacks any routing guidance against the many workflow siblings (trigger, cancel, diagnose) and any note on failure handling, leaving the definition adequate but thin.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 50%, and the description compensates by explaining the two selector variants ('explicit entry ids' vs 'all failed entries at one node'), which maps directly onto the anyOf structure. workspaceId semantics are fully covered by the schema's own description, so nothing critical is missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Retry ... failed workflow entries') and enumerates the two addressing modes (explicit entry ids, or all failed entries at one node). That implicitly separates it from trigger_workflow and cancel_workflow_node_leads, but no sibling is named explicitly, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description distinguishes the two retry modes, which implies when each selector applies, but it never states prerequisites, when retry is appropriate versus re-triggering or cancelling, or any exclusions. Usage is inferable rather than guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_send_connection_requestA
Destructive
Inspect

Ask CampaignStack to send one connection request from a LinkedIn account the workspace owner connected. Call this when the user has named one specific person and confirmed sending the request. platform is required ("linkedin"; connection requests are a LinkedIn-only concept, and on other networks you follow instead with campaignstack_follow_profile). Name the person with leadId, which is the supported form; profileUrl is accepted for someone already in the workspace. An optional note is capped at 300 characters by LinkedIn. The workspace's only connected LinkedIn account is used automatically, or pass accountId (campaignstack_get_accounts). This reaches a real person. Before calling it, tell the user exactly who it goes to and read the wording back to them, and wait for an explicit yes. It goes out as soon as this call succeeds: there is no draft state and nothing to recall. One person per call. There is no bulk form, and calling this in a loop over a list is not the supported way to reach a list: add the leads with campaignstack_edit_lead_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Business hours do not apply. CampaignStack's daily limit for this action (and the weekly limit for invitations) still applies and counts sends already queued, so a run of calls stops at the limit; the owner sets those limits in the app. A paused account, or an action LinkedIn has challenged, refuses the send whatever the limit.

NameRequiredDescriptionDefault
noteNo
leadIdNo
platformYes
accountIdNoAccount that acts (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one.
profileUrlNo
workspaceIdNoWorkspace 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.
idempotencyKeyNoOptional. A key you choose for this one send. Calling again with the same key returns the send already made instead of sending twice (use it when a call timed out); a key reused for a different send is refused. Without a key, the same words to the same person within a few minutes are refused as a repeat.

Output Schema

NameRequiredDescription
jobIdNo
statusNo
successNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (destructive, open-world, non-idempotent), but the description adds substantial context beyond them: mandatory read-back and explicit-yes confirmation, no draft state or recall ('goes out as soon as this call succeeds'), daily/weekly limit accounting of queued sends, and refusals from paused or LinkedIn-challenged accounts. These are behavioral traits the annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and routing, and for a destructive open-world action most sentences carry real weight. It is dense and runs long, with a few lines (the 300-character note cap already encoded as maxLength, the 'business hours do not apply' aside) that add marginal value rather than essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-format explanation is unnecessary, and the remaining complexity is covered: confirmation protocol, account/workspace defaulting behavior, rate and account-state failure modes, and the bulk alternative. An agent has everything needed to call this safely and correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 43% schema coverage, the description compensates well: it establishes platform as required and LinkedIn-only, disambiguates leadId (the supported form) from profileUrl (only for existing workspace members), notes the 300-character note cap, and points accountId at campaignstack_get_accounts. workspaceId and idempotencyKey are left to their schema descriptions, which is a reasonable division.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource+scope: 'send one connection request from a LinkedIn account the workspace owner connected.' It explicitly distinguishes the LinkedIn-only concept from the follow-based alternative ('on other networks you follow instead with campaignstack_follow_profile'), so the agent can separate this from siblings without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States the triggering condition precisely ('when the user has named one specific person and confirmed sending the request') and enumerates when-not: no bulk form, not for loops over a list, use edit_lead_list + trigger_workflow instead. It also names follow_profile as the non-LinkedIn alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_send_inmailA
Destructive
Inspect

Ask CampaignStack to send one InMail to someone the owner is not connected to, from a connected LinkedIn account. Call this when the user has confirmed subject and body for a named person the owner is not connected to; for a connected lead use campaignstack_send_message instead. platform is required ("linkedin"; InMail is a LinkedIn-only premium product and needs Premium, Sales Navigator or Recruiter on the sending account, so a free account has a budget of zero here). Name the person with leadId, which is the supported form; profileUrl is accepted for someone already in the workspace. subject is capped at 200 characters and messageText at 1900. The workspace's only connected LinkedIn account is used automatically, or pass accountId (campaignstack_get_accounts). This reaches a real person. Before calling it, tell the user exactly who it goes to and read the wording back to them, and wait for an explicit yes. It goes out as soon as this call succeeds: there is no draft state and nothing to recall. One person per call. There is no bulk form, and calling this in a loop over a list is not the supported way to reach a list: add the leads with campaignstack_edit_lead_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Business hours do not apply. CampaignStack's daily limit for this action (and the weekly limit for invitations) still applies and counts sends already queued, so a run of calls stops at the limit; the owner sets those limits in the app. A paused account, or an action LinkedIn has challenged, refuses the send whatever the limit.

NameRequiredDescriptionDefault
leadIdNo
subjectYes
platformYes
accountIdNoAccount that acts (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one.
profileUrlNo
messageTextYes
workspaceIdNoWorkspace 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.
idempotencyKeyNoOptional. A key you choose for this one send. Calling again with the same key returns the send already made instead of sending twice (use it when a call timed out); a key reused for a different send is refused. Without a key, the same words to the same person within a few minutes are refused as a repeat.

Output Schema

NameRequiredDescription
jobIdNo
statusNo
successNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive/openWorld/non-idempotent, but the description adds substantial behavioral context beyond them: it goes out immediately with no draft or recall, Premium/Sales Navigator/Recruiter is required on the sender, business hours do not apply, daily limits count queued sends, and paused or LinkedIn-challenged accounts refuse the send.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then routing, then parameters, then operational warnings, and every sentence carries content. It is long and the limits paragraph could be tightened, but there is little pure filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, real-world-send mutation with an output schema available for return values, the description covers the confirmation protocol, targeting, account selection, rate limits, idempotency, and anti-patterns; an agent has what it needs to call it safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 38%, so the description must compensate and largely does: it defines leadId as the supported identifier, profileUrl for someone already in the workspace, platform's LinkedIn-only/premium semantics, and the subject/messageText caps. It does not describe workspaceId or idempotencyKey, which sit in the schema, leaving a small gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource: 'send one InMail to someone the owner is not connected to, from a connected LinkedIn account.' It immediately contrasts with the sibling campaignstack_send_message for connected leads, so the agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('user has confirmed subject and body for a named person the owner is not connected to'), names the alternative for the adjacent case, and states when-not with the supported bulk path (edit_lead_list + trigger_workflow). Nothing is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_send_messageA
Destructive
Inspect

Ask CampaignStack to send one message into a LinkedIn conversation the owner's connected account is already part of, optionally with attachments given as public URLs. Takes a conversationRef { platform, id } from campaignstack_get_conversations. Read the thread with campaignstack_get_conversations using ids and include.messages first. If the last message is the owner's and the other person has not answered since, do not send: say so, and send only if the user confirms they want to follow up again. This reaches a real person. Before calling it, tell the user exactly who it goes to and read the wording back to them, and wait for an explicit yes. The send is dispatched asynchronously and the response carries a messageEntityUrn; campaignstack_get_conversations reports delivery. Pass sendAt to hold the message and send it later instead of now; it is cancelled if the other person replies first, so read the wording and the time back and wait for a yes. campaignstack_get_conversations with include.scheduledMessages lists pending ones; campaignstack_edit_conversations cancels or edits one. One person per call. There is no bulk form, and calling this in a loop over a list is not the supported way to reach a list: add the leads with campaignstack_edit_lead_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Business hours do not apply. A message past the account's daily message limit is still sent, and the result carries a warning to pass on to the user. A paused account, or messaging LinkedIn has challenged, refuses the send.

NameRequiredDescriptionDefault
textYes
sendAtNoISO 8601 with a UTC offset. Omit to send now. With it, the message is held and sent at that time instead (1 minute to 180 days out) - cancelled automatically if the other person replies first. Read the wording and the time back to the user and wait for a yes before calling this with sendAt set.
attachmentsNoUp to 5 files to attach (images or documents). Downloaded server-side and validated against the LinkedIn attachment policy.
workspaceIdNoWorkspace 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.
idempotencyKeyNoOptional. A key you choose for this one send. Calling again with the same key returns the send already made instead of sending twice (use it when a call timed out); a key reused for a different send is refused. Without a key, the same words to the same person within a few minutes are refused as a repeat.
conversationRefYes

Output Schema

NameRequiredDescription
sendAtNo
statusNo
warningNo
messageEntityUrnNo
scheduledMessageIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: it discloses asynchronous dispatch with a messageEntityUrn, delivery confirmation via get_conversations, that a message past the daily limit still sends with a warning to pass on, that paused or LinkedIn-challenged accounts refuse the send, that business hours do not apply, and that sendAt is auto-cancelled if the other party replies first. The human-in-the-loop confirmation requirement is spelled out.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and constraint, and nearly every sentence carries operational weight (safety gating, bulk alternative, failure modes). However it is long and repeats the 'read the wording back and wait for a yes' instruction twice (once generally, once for sendAt), which is mild redundancy rather than waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, yet the description still notes the messageEntityUrn and delivery reporting. Combined with prerequisites, refusal conditions, scheduling semantics, and the supported bulk path, an agent has everything needed to call this correctly and safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is moderate (67%) and the schema already documents sendAt, attachments, workspaceId, and idempotencyKey in detail. The description's main added value is telling the agent where conversationRef comes from (campaignstack_get_conversations), but for the other parameters it largely restates the schema, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb and resource: send one message into a LinkedIn conversation the owner is already part of, and immediately scopes it with 'One person per call. There is no bulk form.' This distinguishes it from siblings like campaignstack_send_connection_request, campaignstack_send_inmail, and campaignstack_craft_message without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly covers when to use (conversationRef from get_conversations, read the thread with include.messages first), when NOT to send (last message is the owner's with no reply since), and the correct alternative for bulk outreach (edit_lead_list + trigger_workflow, which paces sends and applies the configured review). It also routes cancellation/edits to edit_conversations and pending messages to include.scheduledMessages.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_submit_feedbackAInspect

Submit a feedback report or bug report to the CampaignStack team. Call this when the user asks to report a bug, request a feature, or send feedback from this conversation. Mirrors the in-app feedback widget: same store, same email notification. Categories: 'bug', 'feature', 'question', 'other'. It does not open a support ticket or get a reply back through this connection.

NameRequiredDescriptionDefault
routeYesThe app route or context where the feedback originates (e.g. '/dashboard/campaigns' or 'mcp-agent')
messageYesThe feedback body text
categoryYesFeedback category: bug (something broken), feature (new capability request), question (how-to), other
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
reportIdNo
submittedNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the generic mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds real behavioral context beyond that: it mirrors the in-app feedback widget, writes to the same store, triggers the same email notification, and produces no reply path. It stops short of saying whether duplicate submissions are deduplicated or who receives the email beyond 'the team'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then trigger, then behavior, then non-goals — a sensible ordering with no filler sentences. Minor redundancy: the category enumeration duplicates the enum in the input schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be described, and the workspaceId resolution logic is fully covered by the schema. For a low-complexity 4-param submission tool, the description covers purpose, trigger, side effects, and limits completely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including the enum values and the fairly detailed workspaceId resolution rules, so the schema already carries the parameter burden. The description merely restates the category list ('bug', 'feature', 'question', 'other'), adding no meaning beyond the enum already present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (submit) and resource (feedback report / bug report) and names the recipient (the CampaignStack team). It is trivially distinguishable from every sibling tool in the list, none of which touch feedback submission.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly gives the invocation trigger ('when the user asks to report a bug, request a feature, or send feedback from this conversation') and states the non-goals ('does not open a support ticket or get a reply back through this connection'), so the agent knows both when to call it and what it will not accomplish.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_suggest_job_application_profileSuggest job application profileA
Read-onlyIdempotent
Inspect

Propose answers for a job watcher's application profile from the person's own LinkedIn profile and resume: searches from their current titles, the country they live in, the languages their profile and resume are written in or name, the local currency, and years per listed skill (added up from the dated positions judged to use that skill; a skill with no years was not matched to any position). Nothing is saved. Call this before filling a profile, read the proposal back to the person, and save only what they confirm with campaignstack_edit_job_watcher (op update). Living in a country is not a work permit, so ask. Salary, notice period and relocation are never proposed: ask for them.

NameRequiredDescriptionDefault
watcherIdYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
skillsYes
currencyNo
searchesYes
languagesYes
resumeReadYes
profileReadYesFalse when the account's LinkedIn profile has not been read yet
skillsJudgedYesFalse when years per skill could not be judged; ask for them
workAuthorizationYesWhere they live, to confirm as a place they may work

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnly/idempotent/non-destructive, and the description reinforces this with 'Nothing is saved' while adding context annotations cannot carry: the derivation rules (titles, country, languages, currency, summed skill years), the warning that living in a country is not a work permit, and the explicit list of fields never proposed (salary, notice period, relocation). This is unusually rich behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and the save-workflow constraint, and every sentence earns its place. The years-per-skill parenthetical is dense but conveys a real derivation rule, so it is defensible; slightly long overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description covers the derivation logic, the confirmation workflow, and non-proposed fields. The only gap is any mention of the required watcherId input, which is a minor omission given the surrounding completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 50% schema description coverage, the description must compensate, but it never mentions watcherId at all — the single required parameter — nor adds meaning to workspaceId. The explanation given is about proposed output fields, not input parameters, so the required input remains semantically undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (propose), resource (job watcher's application profile), and the source data (the person's LinkedIn profile and resume), then enumerates exactly what gets proposed. An agent can distinguish it from sibling tools like campaignstack_edit_job_watcher or campaignstack_get_job_watchers without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly sequences the workflow: call this before filling a profile, read the proposal back, and save only confirmed values via campaignstack_edit_job_watcher (op update). It names the follow-up tool and the conditions that select it, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_trigger_workflowTrigger workflowAInspect

Confirmed consequential execution: adds the selected leads to a workflow, or with no leadIds runs its sourcing now. A lead enters a workflow once: leads already in it, in any status, and leads an exclusion matches are skipped and counted in skipped. It joins the workflow queue and obeys pacing, review, account, and safety limits. To retry failed entries, use campaignstack_retry_workflow_entries.

NameRequiredDescriptionDefault
leadIdsNo
confirmedYesConfirms this starts workflow execution for real leads.
workflowIdYes
workspaceIdNoWorkspace 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.

Output Schema

NameRequiredDescription
okNo
resultsNo
warningsNo
workflowIdNo
workspaceIdNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare non-readonly, non-destructive, open-world, non-idempotent, so the safety profile is partly covered. The description adds substantial context the annotations lack: one-time entry per lead, skip-and-count semantics, and that the run obeys pacing, review, account, and safety limits. It stops short of auth prerequisites or return shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences that are front-loaded with the consequential-execution warning and mode selection, then semantics, then the sibling hand-off. Each sentence earns its place with no padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. For a 4-param mutation with full annotations, the description covers mode selection, skip semantics, queue/limit behavior, and the retry alternative, which is complete enough to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, with leadIds and workflowId undocumented in the schema. The description compensates by defining leadIds behavior (present = add leads, absent = run sourcing) and reinforcing the confirmed gate, adding meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource, and explicitly distinguishes its two modes: adds selected leads to a workflow, or with no leadIds runs its sourcing now. It names the retry sibling, so an agent can separate it from campaignstack_retry_workflow_entries without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear conditional usage: pass leadIds to enqueue leads, omit them to run sourcing. It explicitly routes retries to campaignstack_retry_workflow_entries and explains what happens to leads already present or matching an exclusion, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

campaignstack_whoamiA
Read-onlyIdempotent
Inspect

Who this connection is and what it may do: the workspace it is bound to, the permissions the owner approved, and whether it is an API key or a connected app. Call it when a tool asks which workspace a call is for (a person in several workspaces names one; with only one, workspaceId defaults to it), and use campaignstack_explain_capabilities when the question is which tool to reach for rather than what is permitted. It reads nothing about leads or campaigns.

NameRequiredDescriptionDefault
includeNo

Output Schema

NameRequiredDescription
userNo
scopesNo
keyTypeNoworkspace, user, oauth or stdio
keyPrefixNo
workspacesNoEvery workspace this person can reach, for the workspaceId argument. gettingStarted: setup rewards still open
workspaceIdNoSet only for a key bound to one workspace
capabilitiesNoEach granted scope in plain words
workspaceNameNo
gettingStartedNoteNo
notificationPreferencesNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, so the bar is lower. The description adds real value on top: the exact scope of what is disclosed (binding, approved permissions, credential type) and an explicit statement of what is not read (leads/campaigns), plus the workspaceId defaulting rule.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the identity/purpose clause before the routing guidance. Dense but essentially waste-free; the long parenthetical slightly reduces readability but every clause carries information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape need not be described. The description covers identity, permissions, routing, and negative scope for a zero-required-param read tool; the only omission is any mention of the optional 'include' parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single optional parameter 'include' (nested, with notificationPreferences) is never mentioned in the description. There is only one optional param and its name is semi-intuitive, which keeps this above a 1, but the description does not compensate for the documentation gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: reports who the connection is (identity), which workspace it is bound to, which permissions the owner approved, and whether it is an API key or connected app. It also explicitly distinguishes itself from campaignstack_explain_capabilities, so an agent can route without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger ('call it when a tool asks which workspace a call is for'), a named alternative for the adjacent question ('use campaignstack_explain_capabilities when the question is which tool to reach for'), and a negative scope ('reads nothing about leads or campaigns'). When/when-not/alternative are all present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 5 tool updates
    • Changedcampaignstack_edit_account5 fields changed
      • changedInput schema / properties / accountId / description
        Previous value: -"Connected account (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one. Always required to delete."New value: +"Connected account (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one. Always required to delete. With platform google, the Google account ID, same default rule."
      • changedInput schema / properties / operation / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "op": {
        -        "const": "set_owner_workspace",
        -        "type": "string"
        -      },
        -      "ownerWorkspaceId": {
        -        "description": "Workspace that pays for account maintenance watchers and inbox sends.",
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "ownerWorkspaceId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "enabled": {
        -        "type": "boolean"
        -      },
        -      "kind": {
        -        "description": "connection_watcher welcomes new connections, message answers inbound DMs, own_posts_watcher follows up with people engaging with the account's posts, invitation_hygiene withdraws the account's oldest pending invitations.",
        -        "enum": [
        -          "connection_watcher",
        -          "message",
        -          "own_posts_watcher",
        -          "invitation_hygiene"
        -        ],
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "set_watcher",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "kind",
        -      "enabled"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "confirmed": {
        -        "const": true,
        -        "description": "Required acknowledgement that the named account should be deleted from CampaignStack.",
        -        "type": "boolean"
        -      },
        -      "op": {
        -        "const": "delete",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "confirmed"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "endHour": {
        +        "description": "Hour the window closes, after startHour.",
        +        "maximum": 23,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "op": {
        +        "const": "set_scheduling_hours",
        +        "type": "string"
        +      },
        +      "startHour": {
        +        "description": "First hour meetings may start, 0-23 in the Google account's time zone.",
        +        "maximum": 23,
        +        "minimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "startHour",
        +      "endHour"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "op": {
        +        "const": "set_owner_workspace",
        +        "type": "string"
        +      },
        +      "ownerWorkspaceId": {
        +        "description": "Workspace that pays for account maintenance watchers and inbox sends.",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "ownerWorkspaceId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "enabled": {
        +        "type": "boolean"
        +      },
        +      "kind": {
        +        "description": "connection_watcher welcomes new connections, message answers inbound DMs, own_posts_watcher follows up with people engaging with the account's posts, invitation_hygiene withdraws the account's oldest pending invitations.",
        +        "enum": [
        +          "connection_watcher",
        +          "message",
        +          "own_posts_watcher",
        +          "invitation_hygiene"
        +        ],
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "set_watcher",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "kind",
        +      "enabled"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "confirmed": {
        +        "const": true,
        +        "description": "Required acknowledgement that the named account should be deleted from CampaignStack.",
        +        "type": "boolean"
        +      },
        +      "op": {
        +        "const": "delete",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "confirmed"
        +    ],
        +    "type": "object"
        +  }
        +]
      • removedInput schema / properties / platform / const
        Removed value: -"linkedin"
      • addedInput schema / properties / platform / description
        Added value: +"google only takes set_scheduling_hours; every other operation is LinkedIn."
      • addedInput schema / properties / platform / enum
        Added value: +[
        +  "linkedin",
        +  "google"
        +]
    • Changedcampaignstack_edit_exclusions1 field changed
      • changedInput schema / properties / operations / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "exclusionId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "mode": {
        -        "const": "add_manual_profiles",
        -        "type": "string"
        -      },
        -      "profileUrls": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "minItems": 1,
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "exclusionId",
        -      "profileUrls"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "exclusionId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "importedLeadId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "mode": {
        -        "const": "remove_manual_profile",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "exclusionId",
        -      "importedLeadId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "exclusionId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "logic": {
        -        "default": "or",
        -        "enum": [
        -          "and",
        -          "or"
        -        ],
        -        "type": "string"
        -      },
        -      "mode": {
        -        "const": "set_filter_rules",
        -        "type": "string"
        -      },
        -      "rules": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "field": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "operator": {
        -              "enum": [
        -                "equals",
        -                "contains",
        -                "gt",
        -                "lt",
        -                "exists",
        -                "not_exists"
        -              ],
        -              "type": "string"
        -            },
        -            "value": {
        -              "type": [
        -                "string",
        -                "number",
        -                "boolean"
        -              ]
        -            }
        -          },
        -          "required": [
        -            "field",
        -            "operator"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 100,
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "exclusionId",
        -      "rules"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "enabled": {
        -        "type": "boolean"
        -      },
        -      "exclusionId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "mode": {
        -        "const": "set_enabled",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "exclusionId",
        -      "enabled"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "exclusions": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "config": {},
        -            "enabled": {
        -              "default": true,
        -              "type": "boolean"
        -            },
        -            "id": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "state": {},
        -            "type": {
        -              "minLength": 1,
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "type"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 100,
        -        "type": "array"
        -      },
        -      "mode": {
        -        "const": "replace_child_exclusions",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "exclusions"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "exclusionId": {
        +        "description": "Manual exclusion to add to. Omit to use the workspace's block list, created on first use.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "add_manual_profiles",
        +        "type": "string"
        +      },
        +      "profileUrls": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "minItems": 1,
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "profileUrls"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "exclusionId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "importedLeadId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "remove_manual_profile",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "exclusionId",
        +      "importedLeadId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "exclusionId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "logic": {
        +        "default": "or",
        +        "enum": [
        +          "and",
        +          "or"
        +        ],
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "set_filter_rules",
        +        "type": "string"
        +      },
        +      "rules": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "field": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "operator": {
        +              "enum": [
        +                "equals",
        +                "contains",
        +                "gt",
        +                "lt",
        +                "exists",
        +                "not_exists"
        +              ],
        +              "type": "string"
        +            },
        +            "value": {
        +              "type": [
        +                "string",
        +                "number",
        +                "boolean"
        +              ]
        +            }
        +          },
        +          "required": [
        +            "field",
        +            "operator"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 100,
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "exclusionId",
        +      "rules"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "enabled": {
        +        "type": "boolean"
        +      },
        +      "exclusionId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "set_enabled",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "exclusionId",
        +      "enabled"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "exclusions": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "config": {},
        +            "enabled": {
        +              "default": true,
        +              "type": "boolean"
        +            },
        +            "id": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "state": {},
        +            "type": {
        +              "minLength": 1,
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "type"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 100,
        +        "type": "array"
        +      },
        +      "mode": {
        +        "const": "replace_child_exclusions",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "exclusions"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcampaignstack_estimate_cost1 field changed
      • changedInput schema / properties / tool / description
        Previous value: -"A costed final tool name, e.g. campaignstack_craft_message. Known costed tools: campaignstack_analyze_company_website, campaignstack_answer_job_question, campaignstack_apply_to_job, campaignstack_comment_on_post, campaignstack_craft_message, campaignstack_decide_review, campaignstack_discover_lead_magnets, campaignstack_enrich_leads, campaignstack_explain_draft, campaignstack_export_seo_report, campaignstack_follow_profile, campaignstack_get_lead_comments, campaignstack_like_post, campaignstack_prepare_meeting_brief, campaignstack_refresh_companies, campaignstack_refresh_identity_voice, campaignstack_refresh_workspace_playbook, campaignstack_run_seo_audit, campaignstack_send_connection_request, campaignstack_send_email, campaignstack_send_inmail, campaignstack_send_message."New value: +"A costed final tool name, e.g. campaignstack_craft_message. Known costed tools: campaignstack_analyze_company_website, campaignstack_answer_job_question, campaignstack_apply_to_job, campaignstack_comment_on_post, campaignstack_craft_message, campaignstack_decide_review, campaignstack_discover_lead_magnets, campaignstack_enrich_leads, campaignstack_explain_draft, campaignstack_export_seo_report, campaignstack_follow_profile, campaignstack_get_lead_comments, campaignstack_like_post, campaignstack_refresh_companies, campaignstack_refresh_identity_voice, campaignstack_refresh_workspace_playbook, campaignstack_run_seo_audit, campaignstack_send_connection_request, campaignstack_send_email, campaignstack_send_inmail, campaignstack_send_message."
    • Changedcampaignstack_get_accounts1 field changed
      • addedOutput schema / properties / schedulingHours
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The Google account's meeting hours (0-23, its own time zone) that slots respect.",
        +  "properties": {
        +    "endHour": {
        +      "type": "number"
        +    },
        +    "startHour": {
        +      "type": "number"
        +    },
        +    "timeZone": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "startHour",
        +    "endHour",
        +    "timeZone"
        +  ],
        +  "type": "object"
        +}
    • Changedcampaignstack_get_conversations1 field changed
      • addedOutput schema / properties / schedulingHours
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The Google account's meeting hours (0-23, its own time zone) that slots respect.",
        +  "properties": {
        +    "endHour": {
        +      "type": "number"
        +    },
        +    "startHour": {
        +      "type": "number"
        +    },
        +    "timeZone": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "required": [
        +    "startHour",
        +    "endHour",
        +    "timeZone"
        +  ],
        +  "type": "object"
        +}
  2. 1 tool update
    • Changedcampaignstack_get_lead_refresh_status3 fields changed
      • addedOutput schema / properties / completed / description
        Added value: +"Finished in about the last 6 hours; older rows are purged, so this is not a lifetime count."
      • addedOutput schema / properties / failed / description
        Added value: +"Failed in about the last 6 hours; older rows are purged."
      • addedOutput schema / properties / stranded
        Added value: +{
        +  "description": "Part of pending held on an account that can no longer read (disconnected, expired or blocked); these move to another account or fail on their own.",
        +  "type": "number"
        +}
  3. 1 tool update
    • Changedcampaignstack_craft_message1 field changed
      • addedInput schema / properties / postUrl
        Added value: +{
        +  "description": "Required for comment drafts: the target LinkedIn post URL containing its activity id, or its urn:li:activity URN. Posts older than five days are skipped before crafting.",
        +  "type": "string"
        +}
  4. 1 tool update
    • Changedcampaignstack_decide_review1 field changed
      • addedInput schema / properties / expectedTurn
        Added value: +{
        +  "description": "For a conversation reply, the turn campaignstack_get_reviews returned on the item. If the lead wrote again and a newer draft replaced it, the decision is refused so you can read the new one.",
        +  "minimum": 0,
        +  "type": "integer"
        +}
  5. 1 tool update
    • Changedcampaignstack_explain_draft1 field changed
      • changedInput schema / properties / entryId / description
        Previous value: -"A workflow entry id, e.g. from campaignstack_get_reviews. Resolves to the newest accepted draft for that entry's lead."New value: +"A current review entry id from campaignstack_get_reviews. Resolves to the draft's recorded craft session. Use craftAuditLogId for historical drafts."
  6. 2 tool updates
    • Changedcampaignstack_edit_signal_agent1 field changed
      • changedInput schema / properties / operations / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "accountIds": {
        -        "description": "Reads with: accounts that watch the target (LinkedIn account IDs). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them so you can ask the person.",
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "actAccountIds": {
        -        "description": "Acts with: accounts that contact the people found (LinkedIn account IDs). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them so you can ask the person. An explicit [] stays empty: the agent collects without contacting anyone.",
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "approvalMode": {
        -        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed.",
        -        "enum": [
        -          "manual_review",
        -          "auto_when_confident",
        -          "automatic"
        -        ],
        -        "type": "string"
        -      },
        -      "mode": {
        -        "const": "create",
        -        "type": "string"
        -      },
        -      "name": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "publicReplyConfig": {
        -        "additionalProperties": {
        -          "type": "boolean"
        -        },
        -        "type": "object"
        -      },
        -      "silenceHours": {
        -        "type": "number"
        -      },
        -      "target": {
        -        "anyOf": [
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "kind": {
        -                "const": "profile",
        -                "type": "string"
        -              },
        -              "platform": {
        -                "const": "linkedin",
        -                "type": "string"
        -              },
        -              "url": {
        -                "type": "string"
        -              },
        -              "urn": {
        -                "minLength": 1,
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "platform",
        -              "kind",
        -              "urn"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "groupId": {
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "kind": {
        -                "const": "group",
        -                "type": "string"
        -              },
        -              "platform": {
        -                "const": "linkedin",
        -                "type": "string"
        -              },
        -              "url": {
        -                "minLength": 1,
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "platform",
        -              "kind",
        -              "url",
        -              "groupId"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "activityId": {
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "kind": {
        -                "const": "post",
        -                "type": "string"
        -              },
        -              "platform": {
        -                "const": "linkedin",
        -                "type": "string"
        -              },
        -              "url": {
        -                "minLength": 1,
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "platform",
        -              "kind",
        -              "url",
        -              "activityId"
        -            ],
        -            "type": "object"
        -          }
        -        ]
        -      },
        -      "targetName": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "profile_feed",
        -          "company_feed",
        -          "group_watch",
        -          "post_engagement"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "name",
        -      "type",
        -      "target",
        -      "targetName"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "accountIds": {
        -        "description": "Reads with: LinkedIn account IDs that watch the target. Omit to keep the current accounts.",
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "actAccountIds": {
        -        "description": "Acts with: LinkedIn account IDs that contact the people found. Omit to keep the current accounts; pass [] to stop contacting anyone while the agent keeps collecting.",
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "agentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "agentScript": {
        -        "type": "string"
        -      },
        -      "approvalMode": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/approvalMode",
        -        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed."
        -      },
        -      "mode": {
        -        "const": "update",
        -        "type": "string"
        -      },
        -      "name": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "publicReplyConfig": {
        -        "additionalProperties": {
        -          "type": "boolean"
        -        },
        -        "type": "object"
        -      },
        -      "silenceHours": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "agentId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "agentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "confirmed": {
        -        "description": "Required (must be true) when status is 'archived': archiving here runs the same permanent removal as campaignstack_delete_signal_agent. 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.",
        -        "type": "boolean"
        -      },
        -      "mode": {
        -        "const": "set_status",
        -        "type": "string"
        -      },
        -      "status": {
        -        "enum": [
        -          "active",
        -          "paused",
        -          "archived"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "agentId",
        -      "status"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "agentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "exclusions": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "config": {},
        -            "enabled": {
        -              "default": true,
        -              "type": "boolean"
        -            },
        -            "id": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "state": {},
        -            "type": {
        -              "minLength": 1,
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "type"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 100,
        -        "type": "array"
        -      },
        -      "mode": {
        -        "const": "set_exclusions",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "agentId",
        -      "exclusions"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "mode": {
        -        "const": "restore_guidance",
        -        "type": "string"
        -      },
        -      "versionId": {
        -        "description": "versionId of a previous agentScript version to restore.",
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "versionId"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "accountIds": {
        +        "description": "Reads with: accounts that watch the target (LinkedIn account IDs). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them so you can ask the person.",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "actAccountIds": {
        +        "description": "Acts with: accounts that contact the people found (LinkedIn account IDs). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them so you can ask the person. An explicit [] stays empty: the agent collects without contacting anyone.",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "approvalMode": {
        +        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed.",
        +        "enum": [
        +          "manual_review",
        +          "auto_when_confident",
        +          "automatic"
        +        ],
        +        "type": "string"
        +      },
        +      "captureMode": {
        +        "description": "Post watchers only. all_commenters: a lead-magnet post, where every commenter asked for the resource, so each one gets a message asking whether it arrived. intent (default): only comments that show buying intent.",
        +        "enum": [
        +          "intent",
        +          "all_commenters"
        +        ],
        +        "type": "string"
        +      },
        +      "followUps": {
        +        "description": "Follow up if no reply: \"off\", 1 or 2 follow-ups, each drafted for review after 4 days of silence. Omit for the default: off for a lead-magnet post (captureMode all_commenters), 1 for every other agent.",
        +        "enum": [
        +          "off",
        +          1,
        +          2
        +        ],
        +        "type": [
        +          "string",
        +          "number"
        +        ]
        +      },
        +      "mode": {
        +        "const": "create",
        +        "type": "string"
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "publicReplyConfig": {
        +        "additionalProperties": {
        +          "type": "boolean"
        +        },
        +        "type": "object"
        +      },
        +      "silenceHours": {
        +        "type": "number"
        +      },
        +      "target": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "kind": {
        +                "const": "profile",
        +                "type": "string"
        +              },
        +              "platform": {
        +                "const": "linkedin",
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              },
        +              "urn": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "platform",
        +              "kind",
        +              "urn"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "groupId": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "kind": {
        +                "const": "group",
        +                "type": "string"
        +              },
        +              "platform": {
        +                "const": "linkedin",
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "platform",
        +              "kind",
        +              "url",
        +              "groupId"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "activityId": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "kind": {
        +                "const": "post",
        +                "type": "string"
        +              },
        +              "platform": {
        +                "const": "linkedin",
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "platform",
        +              "kind",
        +              "url",
        +              "activityId"
        +            ],
        +            "type": "object"
        +          }
        +        ]
        +      },
        +      "targetName": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "profile_feed",
        +          "company_feed",
        +          "group_watch",
        +          "post_engagement"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "name",
        +      "type",
        +      "target",
        +      "targetName"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "accountIds": {
        +        "description": "Reads with: LinkedIn account IDs that watch the target. Omit to keep the current accounts.",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "actAccountIds": {
        +        "description": "Acts with: LinkedIn account IDs that contact the people found. Omit to keep the current accounts; pass [] to stop contacting anyone while the agent keeps collecting.",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "agentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "agentScript": {
        +        "type": "string"
        +      },
        +      "approvalMode": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/approvalMode",
        +        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed."
        +      },
        +      "followUpAfterHours": {
        +        "description": "Hours of silence before each follow-up (default 96). It must leave room inside silenceHours, so it is shortened when it does not fit.",
        +        "maximum": 720,
        +        "minimum": 1,
        +        "type": "integer"
        +      },
        +      "followUps": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/followUps",
        +        "description": "Follow up if no reply: \"off\", 1 or 2. Omit to keep the current setting. Applies to people who reach the conversation step from now on."
        +      },
        +      "mode": {
        +        "const": "update",
        +        "type": "string"
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "publicReplyConfig": {
        +        "additionalProperties": {
        +          "type": "boolean"
        +        },
        +        "type": "object"
        +      },
        +      "silenceHours": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "agentId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "agentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "confirmed": {
        +        "description": "Required (must be true) when status is 'archived': archiving here runs the same permanent removal as campaignstack_delete_signal_agent. 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.",
        +        "type": "boolean"
        +      },
        +      "mode": {
        +        "const": "set_status",
        +        "type": "string"
        +      },
        +      "status": {
        +        "enum": [
        +          "active",
        +          "paused",
        +          "archived"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "agentId",
        +      "status"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "agentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "exclusions": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "config": {},
        +            "enabled": {
        +              "default": true,
        +              "type": "boolean"
        +            },
        +            "id": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "state": {},
        +            "type": {
        +              "minLength": 1,
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "type"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 100,
        +        "type": "array"
        +      },
        +      "mode": {
        +        "const": "set_exclusions",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "agentId",
        +      "exclusions"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "mode": {
        +        "const": "restore_guidance",
        +        "type": "string"
        +      },
        +      "versionId": {
        +        "description": "versionId of a previous agentScript version to restore.",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "versionId"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcampaignstack_estimate_cost3 fields changed
      • addedOutput schema / properties / currency
        Added value: +{
        +  "anyOf": [
        +    {
        +      "anyOf": [
        +        {
        +          "not": {}
        +        },
        +        {
        +          "enum": [
        +            "usd",
        +            "eur"
        +          ],
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / overageRate
        Added value: +{
        +  "anyOf": [
        +    {
        +      "anyOf": [
        +        {
        +          "not": {}
        +        },
        +        {
        +          "type": "number"
        +        }
        +      ]
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • changedOutput schema / properties / variants / anyOf
        Previous value: -[
        -  {
        -    "anyOf": [
        -      {
        -        "not": {}
        -      },
        -      {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "actionType": {
        -              "type": "string"
        -            },
        -            "allowed": {
        -              "type": "boolean"
        -            },
        -            "balance": {
        -              "type": [
        -                "number",
        -                "null"
        -              ]
        -            },
        -            "count": {
        -              "type": "number"
        -            },
        -            "creditsPerUnit": {
        -              "type": "number"
        -            },
        -            "isPaid": {
        -              "type": "boolean"
        -            },
        -            "label": {
        -              "type": "string"
        -            },
        -            "note": {
        -              "type": "string"
        -            },
        -            "per": {
        -              "type": "string"
        -            },
        -            "total": {
        -              "type": "number"
        -            },
        -            "variant": {
        -              "type": "string"
        -            }
        -          },
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    ]
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "anyOf": [
        +      {
        +        "not": {}
        +      },
        +      {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "actionType": {
        +              "type": "string"
        +            },
        +            "allowed": {
        +              "type": "boolean"
        +            },
        +            "balance": {
        +              "type": [
        +                "number",
        +                "null"
        +              ]
        +            },
        +            "count": {
        +              "type": "number"
        +            },
        +            "creditsPerUnit": {
        +              "type": "number"
        +            },
        +            "currency": {
        +              "enum": [
        +                "usd",
        +                "eur"
        +              ],
        +              "type": "string"
        +            },
        +            "isPaid": {
        +              "type": "boolean"
        +            },
        +            "label": {
        +              "type": "string"
        +            },
        +            "note": {
        +              "type": "string"
        +            },
        +            "overageRate": {
        +              "type": "number"
        +            },
        +            "per": {
        +              "type": "string"
        +            },
        +            "total": {
        +              "type": "number"
        +            },
        +            "variant": {
        +              "type": "string"
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    ]
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
  7. 22 tool updates
    • Changedcampaignstack_comment_on_post4 fields changed
      • addedInput schema / properties / accountId / description
        Added value: +"Account that acts (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one."
      • removedInput schema / properties / dangerouslyBypassSafetySystem
        Removed value: -{
        -  "description": "Deprecated name for overrideOwnLimits. Use overrideOwnLimits.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / idempotencyKey
        Added value: +{
        +  "description": "Optional. A key you choose for this one send. Calling again with the same key returns the send already made instead of sending twice (use it when a call timed out); a key reused for a different send is refused. Without a key, the same words to the same person within a few minutes are refused as a repeat.",
        +  "maxLength": 128,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / overrideOwnLimits
        Removed value: -{
        -  "description": "Tells CampaignStack to skip its OWN protective pacing for this one call: the daily budget, the weekly cap, the business-hours window, the account status check and the risk pause. These are limits CampaignStack sets to keep the account healthy. They are not LinkedIn's controls, and nothing here touches, negotiates with or works around anything LinkedIn enforces. LinkedIn's own measured ceiling is a separate check that is never overridable, and neither is a pause the account's owner set. Default false, and it should stay false. Setting it true voids the safety guarantee: from that call on, CampaignStack can no longer promise the pacing that keeps the account out of trouble, and the risk of a restriction sits with the owner. Every use is recorded in the workspace audit log. Ask the owner in plain words and get an explicit yes first. A refusal from the safety system is that system working, not a fault to route around: report the reason and let the person decide, and never retry the same send with this set.",
        -  "type": "boolean"
        -}
    • Changedcampaignstack_craft_message1 field changed
      • changedInput schema / properties / accountId / description
        Previous value: -"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."New value: +"LinkedIn account that will send the draft: names the speaker and picks the voice on every LinkedIn kind. For a LinkedIn follow-up it also reads the thread, and defaults to the workspace's only LinkedIn account ready to use; with several, the error lists them so you can ask the person."
    • Changedcampaignstack_edit_account2 fields changed
      • changedInput schema / properties / accountId / description
        Previous value: -"Connected LinkedIn account id from campaignstack_get_accounts."New value: +"Connected account (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one. Always required to delete."
      • changedInput schema / required
        Previous value: -[
        -  "platform",
        -  "accountId",
        -  "operation"
        -]New value: +[
        +  "platform",
        +  "operation"
        +]
    • Changedcampaignstack_edit_competitor_watch1 field changed
      • changedInput schema / properties / operations / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "entityType": {
        -        "enum": [
        -          "company",
        -          "influencer"
        -        ],
        -        "type": "string"
        -      },
        -      "linkedinAccountIds": {
        -        "description": "Reads with: LinkedIn account IDs that open watched competitor pages and collect engagers. Defaults to backend automatic selection.",
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "linkedinUrl": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "mode": {
        -        "const": "create",
        -        "type": "string"
        -      },
        -      "name": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "sendAccountIds": {
        -        "description": "Sends from: LinkedIn account IDs the engagers hear from when the watch creates a new signal agent. Omit to collect engagers without contacting anyone.",
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "linkedinUrl",
        -      "name",
        -      "entityType"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "mode": {
        -        "const": "set_status",
        -        "type": "string"
        -      },
        -      "status": {
        -        "enum": [
        -          "active",
        -          "paused"
        -        ],
        -        "type": "string"
        -      },
        -      "watchId": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "watchId",
        -      "status"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "linkedinAccountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "mode": {
        -        "const": "set_accounts",
        -        "type": "string"
        -      },
        -      "watchId": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "watchId",
        -      "linkedinAccountIds"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "entityType": {
        +        "enum": [
        +          "company",
        +          "influencer"
        +        ],
        +        "type": "string"
        +      },
        +      "linkedinAccountIds": {
        +        "description": "Reads with: LinkedIn account IDs that open watched competitor pages and collect engagers. Defaults to backend automatic selection.",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "linkedinUrl": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "create",
        +        "type": "string"
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "sendAccountIds": {
        +        "description": "Sends from: LinkedIn account IDs the engagers hear from when the watch creates a new signal agent. Omit sendAccountIds (or pass []) to collect engagers without contacting anyone.",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "linkedinUrl",
        +      "name",
        +      "entityType"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "mode": {
        +        "const": "set_status",
        +        "type": "string"
        +      },
        +      "status": {
        +        "enum": [
        +          "active",
        +          "paused"
        +        ],
        +        "type": "string"
        +      },
        +      "watchId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "watchId",
        +      "status"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "linkedinAccountIds": {
        +        "description": "Reads with: accounts that open the watched page (LinkedIn account IDs). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them so you can ask the person.",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "mode": {
        +        "const": "set_accounts",
        +        "type": "string"
        +      },
        +      "watchId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "watchId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "confirmed": {
        +        "const": true,
        +        "description": "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.",
        +        "type": "boolean"
        +      },
        +      "mode": {
        +        "const": "delete",
        +        "type": "string"
        +      },
        +      "watchId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "watchId",
        +      "confirmed"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcampaignstack_edit_content1 field changed
      • changedInput schema / properties / operations / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "authorAccountId": {
        -        "type": "string"
        -      },
        -      "body": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "generator": {
        -        "anyOf": [
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "force": {
        -                "type": "boolean"
        -              },
        -              "keyword": {
        -                "maxLength": 20,
        -                "minLength": 2,
        -                "type": "string"
        -              },
        -              "niche": {
        -                "maxLength": 80,
        -                "type": "string"
        -              },
        -              "resource": {
        -                "maxLength": 120,
        -                "minLength": 3,
        -                "type": "string"
        -              },
        -              "type": {
        -                "const": "lead_magnet",
        -                "type": "string"
        -              },
        -              "watermarkEnabled": {
        -                "description": "Use relevant stored workspace buyer evidence. Defaults on when evidence is relevant; false removes the added writing bias. Drafting never launches paid research or adds probe questions.",
        -                "type": "boolean"
        -              }
        -            },
        -            "required": [
        -              "type",
        -              "resource"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "force": {
        -                "type": "boolean"
        -              },
        -              "slug": {
        -                "maxLength": 80,
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "type": {
        -                "const": "search_console_demand",
        -                "type": "string"
        -              },
        -              "watermarkEnabled": {
        -                "description": "Use relevant stored workspace buyer evidence. Defaults on when evidence is relevant; false removes the added writing bias. Drafting never launches paid research or adds probe questions.",
        -                "type": "boolean"
        -              }
        -            },
        -            "required": [
        -              "type",
        -              "slug"
        -            ],
        -            "type": "object"
        -          }
        -        ]
        -      },
        -      "kind": {
        -        "const": "post",
        -        "default": "post",
        -        "type": "string"
        -      },
        -      "mediaIds": {
        -        "default": [],
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "op": {
        -        "const": "create",
        -        "type": "string"
        -      },
        -      "platform": {
        -        "default": "linkedin",
        -        "enum": [
        -          "linkedin"
        -        ],
        -        "type": "string"
        -      },
        -      "postType": {
        -        "enum": [
        -          "text",
        -          "image",
        -          "video",
        -          "document"
        -        ],
        -        "type": "string"
        -      },
        -      "tags": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "op"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "contentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "update",
        -        "type": "string"
        -      },
        -      "patch": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "body": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "mediaIds": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 25,
        -            "type": "array"
        -          },
        -          "postType": {
        -            "enum": [
        -              "text",
        -              "image",
        -              "video",
        -              "document"
        -            ],
        -            "type": "string"
        -          },
        -          "tags": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 25,
        -            "type": "array"
        -          }
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "contentId",
        -      "patch"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "copyFromId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "copy",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "copyFromId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "autoSchedule": {
        -        "type": "boolean"
        -      },
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "contentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "desiredState": {
        -        "enum": [
        -          "pending_approval",
        -          "scheduled",
        -          "approved",
        -          "rejected",
        -          "draft",
        -          "retry_draft"
        -        ],
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "state",
        -        "type": "string"
        -      },
        -      "reason": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "scheduledAt": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "contentId",
        -      "desiredState"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "authorAccountId": {
        +        "description": "Author account (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one.",
        +        "type": "string"
        +      },
        +      "body": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "generator": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "force": {
        +                "type": "boolean"
        +              },
        +              "keyword": {
        +                "maxLength": 20,
        +                "minLength": 2,
        +                "type": "string"
        +              },
        +              "niche": {
        +                "maxLength": 80,
        +                "type": "string"
        +              },
        +              "resource": {
        +                "maxLength": 120,
        +                "minLength": 3,
        +                "type": "string"
        +              },
        +              "type": {
        +                "const": "lead_magnet",
        +                "type": "string"
        +              },
        +              "watermarkEnabled": {
        +                "description": "Use relevant stored workspace buyer evidence. Defaults on when evidence is relevant; false removes the added writing bias. Drafting never launches paid research or adds probe questions.",
        +                "type": "boolean"
        +              }
        +            },
        +            "required": [
        +              "type",
        +              "resource"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "force": {
        +                "type": "boolean"
        +              },
        +              "slug": {
        +                "maxLength": 80,
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "type": {
        +                "const": "search_console_demand",
        +                "type": "string"
        +              },
        +              "watermarkEnabled": {
        +                "description": "Use relevant stored workspace buyer evidence. Defaults on when evidence is relevant; false removes the added writing bias. Drafting never launches paid research or adds probe questions.",
        +                "type": "boolean"
        +              }
        +            },
        +            "required": [
        +              "type",
        +              "slug"
        +            ],
        +            "type": "object"
        +          }
        +        ]
        +      },
        +      "kind": {
        +        "const": "post",
        +        "default": "post",
        +        "type": "string"
        +      },
        +      "mediaIds": {
        +        "default": [],
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "op": {
        +        "const": "create",
        +        "type": "string"
        +      },
        +      "platform": {
        +        "default": "linkedin",
        +        "enum": [
        +          "linkedin"
        +        ],
        +        "type": "string"
        +      },
        +      "postType": {
        +        "enum": [
        +          "text",
        +          "image",
        +          "video",
        +          "document"
        +        ],
        +        "type": "string"
        +      },
        +      "tags": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "op"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "contentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "update",
        +        "type": "string"
        +      },
        +      "patch": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "body": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "mediaIds": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 25,
        +            "type": "array"
        +          },
        +          "postType": {
        +            "enum": [
        +              "text",
        +              "image",
        +              "video",
        +              "document"
        +            ],
        +            "type": "string"
        +          },
        +          "tags": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 25,
        +            "type": "array"
        +          }
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "contentId",
        +      "patch"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "copyFromId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "copy",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "copyFromId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "autoSchedule": {
        +        "type": "boolean"
        +      },
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "contentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "desiredState": {
        +        "enum": [
        +          "pending_approval",
        +          "scheduled",
        +          "approved",
        +          "rejected",
        +          "draft",
        +          "retry_draft"
        +        ],
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "state",
        +        "type": "string"
        +      },
        +      "reason": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "scheduledAt": {
        +        "exclusiveMinimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "contentId",
        +      "desiredState"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcampaignstack_edit_identity1 field changed
      • addedInput schema / properties / linkedinAccountId / description
        Added value: +"Names the identity by its LinkedIn account. With no identityId, linkedinAccountId or googleAccountId, the workspace's only LinkedIn account ready to use is meant; with several, the error lists them so you can ask the person."
    • Changedcampaignstack_edit_job_watcher1 field changed
      • changedInput schema / properties / operations / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "applicationProfile": {
        -        "additionalProperties": false,
        -        "description": "Facts the person supplied. Empty fields mean ask them; never guess screening answers.",
        -        "properties": {
        -          "freeTextFacts": {
        -            "description": "Short facts in the person's own words, such as their start date.",
        -            "maxLength": 500,
        -            "type": "string"
        -          },
        -          "languages": {
        -            "items": {
        -              "maxLength": 80,
        -              "type": "string"
        -            },
        -            "maxItems": 20,
        -            "type": "array"
        -          },
        -          "noticePeriodDays": {
        -            "maximum": 365,
        -            "minimum": 0,
        -            "type": "integer"
        -          },
        -          "salaryRange": {
        -            "additionalProperties": false,
        -            "properties": {
        -              "currency": {
        -                "maxLength": 8,
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "max": {
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "min": {
        -                "minimum": 0,
        -                "type": "number"
        -              },
        -              "period": {
        -                "enum": [
        -                  "year",
        -                  "month",
        -                  "day",
        -                  "hour"
        -                ],
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "min",
        -              "max",
        -              "currency",
        -              "period"
        -            ],
        -            "type": "object"
        -          },
        -          "willingToRelocate": {
        -            "type": "boolean"
        -          },
        -          "workAuthorization": {
        -            "description": "Countries the person may work in.",
        -            "items": {
        -              "maxLength": 80,
        -              "type": "string"
        -            },
        -            "maxItems": 20,
        -            "type": "array"
        -          },
        -          "yearsPerSkill": {
        -            "items": {
        -              "additionalProperties": false,
        -              "properties": {
        -                "skill": {
        -                  "maxLength": 80,
        -                  "minLength": 1,
        -                  "type": "string"
        -                },
        -                "years": {
        -                  "maximum": 60,
        -                  "minimum": 0,
        -                  "type": "number"
        -                }
        -              },
        -              "required": [
        -                "skill",
        -                "years"
        -              ],
        -              "type": "object"
        -            },
        -            "maxItems": 30,
        -            "type": "array"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "applyEnabled": {
        -        "description": "False/default only finds matches; true can start applications.",
        -        "type": "boolean"
        -      },
        -      "clientOperationId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "linkedinAccountId": {
        -        "description": "The connected account applications go out under (campaignstack_get_accounts).",
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "create",
        -        "type": "string"
        -      },
        -      "outboundMode": {
        -        "description": "manual_review parks applications for approval; automatic may submit within safety gates.",
        -        "enum": [
        -          "manual_review",
        -          "automatic"
        -        ],
        -        "type": "string"
        -      },
        -      "queries": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "keywords": {
        -              "description": "What the role is called or involves, as a job-board search.",
        -              "maxLength": 200,
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "location": {
        -              "description": "City, region, or country, as the person would write it.",
        -              "maxLength": 200,
        -              "type": "string"
        -            },
        -            "postedWithinDays": {
        -              "description": "Only postings this recent; 30 days at most.",
        -              "maximum": 30,
        -              "minimum": 1,
        -              "type": "integer"
        -            },
        -            "workplaceType": {
        -              "enum": [
        -                "remote",
        -                "hybrid",
        -                "onsite"
        -              ],
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "keywords"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 5,
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "linkedinAccountId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "applicationProfile": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/applicationProfile",
        -        "description": "Merged into the stored profile; omitted fields keep their old value."
        -      },
        -      "applyEnabled": {
        -        "type": "boolean"
        -      },
        -      "clientOperationId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "update",
        -        "type": "string"
        -      },
        -      "outboundMode": {
        -        "enum": [
        -          "manual_review",
        -          "automatic"
        -        ],
        -        "type": "string"
        -      },
        -      "queries": {
        -        "description": "Replaces every saved search when supplied.",
        -        "items": {
        -          "$ref": "#/properties/operations/items/anyOf/0/properties/queries/items"
        -        },
        -        "maxItems": 5,
        -        "type": "array"
        -      },
        -      "watcherId": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "watcherId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "op": {
        -        "enum": [
        -          "pause",
        -          "resume"
        -        ],
        -        "type": "string"
        -      },
        -      "watcherId": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "watcherId"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "applicationProfile": {
        +        "additionalProperties": false,
        +        "description": "Facts the person supplied. Empty fields mean ask them; never guess screening answers.",
        +        "properties": {
        +          "freeTextFacts": {
        +            "description": "Short facts in the person's own words, such as their start date.",
        +            "maxLength": 500,
        +            "type": "string"
        +          },
        +          "languages": {
        +            "items": {
        +              "maxLength": 80,
        +              "type": "string"
        +            },
        +            "maxItems": 20,
        +            "type": "array"
        +          },
        +          "noticePeriodDays": {
        +            "maximum": 365,
        +            "minimum": 0,
        +            "type": "integer"
        +          },
        +          "salaryRange": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "currency": {
        +                "maxLength": 8,
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "max": {
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "min": {
        +                "minimum": 0,
        +                "type": "number"
        +              },
        +              "period": {
        +                "enum": [
        +                  "year",
        +                  "month",
        +                  "day",
        +                  "hour"
        +                ],
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "min",
        +              "max",
        +              "currency",
        +              "period"
        +            ],
        +            "type": "object"
        +          },
        +          "willingToRelocate": {
        +            "type": "boolean"
        +          },
        +          "workAuthorization": {
        +            "description": "Countries the person may work in.",
        +            "items": {
        +              "maxLength": 80,
        +              "type": "string"
        +            },
        +            "maxItems": 20,
        +            "type": "array"
        +          },
        +          "yearsPerSkill": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "skill": {
        +                  "maxLength": 80,
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "years": {
        +                  "maximum": 60,
        +                  "minimum": 0,
        +                  "type": "number"
        +                }
        +              },
        +              "required": [
        +                "skill",
        +                "years"
        +              ],
        +              "type": "object"
        +            },
        +            "maxItems": 30,
        +            "type": "array"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "applyEnabled": {
        +        "description": "False/default only finds matches; true can start applications.",
        +        "type": "boolean"
        +      },
        +      "clientOperationId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "linkedinAccountId": {
        +        "description": "The connected account applications go out under (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one.",
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "create",
        +        "type": "string"
        +      },
        +      "outboundMode": {
        +        "description": "manual_review parks applications for approval; automatic may submit within safety gates.",
        +        "enum": [
        +          "manual_review",
        +          "automatic"
        +        ],
        +        "type": "string"
        +      },
        +      "queries": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "keywords": {
        +              "description": "What the role is called or involves, as a job-board search.",
        +              "maxLength": 200,
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "location": {
        +              "description": "City, region, or country, as the person would write it.",
        +              "maxLength": 200,
        +              "type": "string"
        +            },
        +            "postedWithinDays": {
        +              "description": "Only postings this recent; 30 days at most.",
        +              "maximum": 30,
        +              "minimum": 1,
        +              "type": "integer"
        +            },
        +            "workplaceType": {
        +              "enum": [
        +                "remote",
        +                "hybrid",
        +                "onsite"
        +              ],
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "keywords"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 5,
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "op"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "applicationProfile": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/applicationProfile",
        +        "description": "Merged into the stored profile; omitted fields keep their old value."
        +      },
        +      "applyEnabled": {
        +        "type": "boolean"
        +      },
        +      "clientOperationId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "update",
        +        "type": "string"
        +      },
        +      "outboundMode": {
        +        "enum": [
        +          "manual_review",
        +          "automatic"
        +        ],
        +        "type": "string"
        +      },
        +      "queries": {
        +        "description": "Replaces every saved search when supplied.",
        +        "items": {
        +          "$ref": "#/properties/operations/items/anyOf/0/properties/queries/items"
        +        },
        +        "maxItems": 5,
        +        "type": "array"
        +      },
        +      "watcherId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "watcherId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "enum": [
        +          "pause",
        +          "resume"
        +        ],
        +        "type": "string"
        +      },
        +      "watcherId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "watcherId"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcampaignstack_edit_signal_agent1 field changed
      • changedInput schema / properties / operations / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "accountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "actAccountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "approvalMode": {
        -        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed.",
        -        "enum": [
        -          "manual_review",
        -          "auto_when_confident",
        -          "automatic"
        -        ],
        -        "type": "string"
        -      },
        -      "mode": {
        -        "const": "create",
        -        "type": "string"
        -      },
        -      "name": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "publicReplyConfig": {
        -        "additionalProperties": {
        -          "type": "boolean"
        -        },
        -        "type": "object"
        -      },
        -      "silenceHours": {
        -        "type": "number"
        -      },
        -      "target": {
        -        "anyOf": [
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "kind": {
        -                "const": "profile",
        -                "type": "string"
        -              },
        -              "platform": {
        -                "const": "linkedin",
        -                "type": "string"
        -              },
        -              "url": {
        -                "type": "string"
        -              },
        -              "urn": {
        -                "minLength": 1,
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "platform",
        -              "kind",
        -              "urn"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "groupId": {
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "kind": {
        -                "const": "group",
        -                "type": "string"
        -              },
        -              "platform": {
        -                "const": "linkedin",
        -                "type": "string"
        -              },
        -              "url": {
        -                "minLength": 1,
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "platform",
        -              "kind",
        -              "url",
        -              "groupId"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "activityId": {
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "kind": {
        -                "const": "post",
        -                "type": "string"
        -              },
        -              "platform": {
        -                "const": "linkedin",
        -                "type": "string"
        -              },
        -              "url": {
        -                "minLength": 1,
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "platform",
        -              "kind",
        -              "url",
        -              "activityId"
        -            ],
        -            "type": "object"
        -          }
        -        ]
        -      },
        -      "targetName": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "profile_feed",
        -          "company_feed",
        -          "group_watch",
        -          "post_engagement"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "name",
        -      "type",
        -      "target",
        -      "targetName",
        -      "accountIds",
        -      "actAccountIds"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "accountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "actAccountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "agentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "agentScript": {
        -        "type": "string"
        -      },
        -      "approvalMode": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/approvalMode",
        -        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed."
        -      },
        -      "mode": {
        -        "const": "update",
        -        "type": "string"
        -      },
        -      "name": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "publicReplyConfig": {
        -        "additionalProperties": {
        -          "type": "boolean"
        -        },
        -        "type": "object"
        -      },
        -      "silenceHours": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "agentId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "agentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "confirmed": {
        -        "description": "Required (must be true) when status is 'archived': archiving here runs the same permanent removal as campaignstack_delete_signal_agent. 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.",
        -        "type": "boolean"
        -      },
        -      "mode": {
        -        "const": "set_status",
        -        "type": "string"
        -      },
        -      "status": {
        -        "enum": [
        -          "active",
        -          "paused",
        -          "archived"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "agentId",
        -      "status"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "agentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "exclusions": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "config": {},
        -            "enabled": {
        -              "default": true,
        -              "type": "boolean"
        -            },
        -            "id": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "state": {},
        -            "type": {
        -              "minLength": 1,
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "type"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 100,
        -        "type": "array"
        -      },
        -      "mode": {
        -        "const": "set_exclusions",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "agentId",
        -      "exclusions"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "mode": {
        -        "const": "restore_guidance",
        -        "type": "string"
        -      },
        -      "versionId": {
        -        "description": "versionId of a previous agentScript version to restore.",
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "versionId"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "accountIds": {
        +        "description": "Reads with: accounts that watch the target (LinkedIn account IDs). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them so you can ask the person.",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "actAccountIds": {
        +        "description": "Acts with: accounts that contact the people found (LinkedIn account IDs). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them so you can ask the person. An explicit [] stays empty: the agent collects without contacting anyone.",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "approvalMode": {
        +        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed.",
        +        "enum": [
        +          "manual_review",
        +          "auto_when_confident",
        +          "automatic"
        +        ],
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "create",
        +        "type": "string"
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "publicReplyConfig": {
        +        "additionalProperties": {
        +          "type": "boolean"
        +        },
        +        "type": "object"
        +      },
        +      "silenceHours": {
        +        "type": "number"
        +      },
        +      "target": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "kind": {
        +                "const": "profile",
        +                "type": "string"
        +              },
        +              "platform": {
        +                "const": "linkedin",
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              },
        +              "urn": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "platform",
        +              "kind",
        +              "urn"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "groupId": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "kind": {
        +                "const": "group",
        +                "type": "string"
        +              },
        +              "platform": {
        +                "const": "linkedin",
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "platform",
        +              "kind",
        +              "url",
        +              "groupId"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "activityId": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "kind": {
        +                "const": "post",
        +                "type": "string"
        +              },
        +              "platform": {
        +                "const": "linkedin",
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "platform",
        +              "kind",
        +              "url",
        +              "activityId"
        +            ],
        +            "type": "object"
        +          }
        +        ]
        +      },
        +      "targetName": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "profile_feed",
        +          "company_feed",
        +          "group_watch",
        +          "post_engagement"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "name",
        +      "type",
        +      "target",
        +      "targetName"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "accountIds": {
        +        "description": "Reads with: LinkedIn account IDs that watch the target. Omit to keep the current accounts.",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "actAccountIds": {
        +        "description": "Acts with: LinkedIn account IDs that contact the people found. Omit to keep the current accounts; pass [] to stop contacting anyone while the agent keeps collecting.",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "agentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "agentScript": {
        +        "type": "string"
        +      },
        +      "approvalMode": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/approvalMode",
        +        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed."
        +      },
        +      "mode": {
        +        "const": "update",
        +        "type": "string"
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "publicReplyConfig": {
        +        "additionalProperties": {
        +          "type": "boolean"
        +        },
        +        "type": "object"
        +      },
        +      "silenceHours": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "agentId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "agentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "confirmed": {
        +        "description": "Required (must be true) when status is 'archived': archiving here runs the same permanent removal as campaignstack_delete_signal_agent. 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.",
        +        "type": "boolean"
        +      },
        +      "mode": {
        +        "const": "set_status",
        +        "type": "string"
        +      },
        +      "status": {
        +        "enum": [
        +          "active",
        +          "paused",
        +          "archived"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "agentId",
        +      "status"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "agentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "exclusions": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "config": {},
        +            "enabled": {
        +              "default": true,
        +              "type": "boolean"
        +            },
        +            "id": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "state": {},
        +            "type": {
        +              "minLength": 1,
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "type"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 100,
        +        "type": "array"
        +      },
        +      "mode": {
        +        "const": "set_exclusions",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "agentId",
        +      "exclusions"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "mode": {
        +        "const": "restore_guidance",
        +        "type": "string"
        +      },
        +      "versionId": {
        +        "description": "versionId of a previous agentScript version to restore.",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "versionId"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcampaignstack_edit_workflow1 field changed
      • changedInput schema / properties / operations / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "approvalMode": {
        -        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed.",
        -        "enum": [
        -          "manual_review",
        -          "auto_when_confident",
        -          "automatic"
        -        ],
        -        "type": "string"
        -      },
        -      "campaignId": {
        -        "type": "string"
        -      },
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "description": {
        -        "type": "string"
        -      },
        -      "graph": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "anchorEdges": {
        -            "items": {
        -              "additionalProperties": false,
        -              "properties": {
        -                "label": {
        -                  "minLength": 1,
        -                  "type": "string"
        -                },
        -                "targetIndex": {
        -                  "minimum": 0,
        -                  "type": "integer"
        -                }
        -              },
        -              "required": [
        -                "targetIndex",
        -                "label"
        -              ],
        -              "type": "object"
        -            },
        -            "maxItems": 200,
        -            "type": "array"
        -          },
        -          "edges": {
        -            "items": {
        -              "additionalProperties": false,
        -              "properties": {
        -                "condition": {},
        -                "label": {
        -                  "type": "string"
        -                },
        -                "sourceIndex": {
        -                  "minimum": 0,
        -                  "type": "integer"
        -                },
        -                "targetIndex": {
        -                  "minimum": 0,
        -                  "type": "integer"
        -                }
        -              },
        -              "required": [
        -                "sourceIndex",
        -                "targetIndex"
        -              ],
        -              "type": "object"
        -            },
        -            "maxItems": 200,
        -            "type": "array"
        -          },
        -          "nodes": {
        -            "items": {
        -              "additionalProperties": false,
        -              "properties": {
        -                "config": {
        -                  "default": {}
        -                },
        -                "existingNodeId": {
        -                  "minLength": 1,
        -                  "type": "string"
        -                },
        -                "label": {
        -                  "minLength": 1,
        -                  "type": "string"
        -                },
        -                "nodeType": {
        -                  "minLength": 1,
        -                  "type": "string"
        -                },
        -                "position": {
        -                  "additionalProperties": false,
        -                  "properties": {
        -                    "x": {
        -                      "type": "number"
        -                    },
        -                    "y": {
        -                      "type": "number"
        -                    }
        -                  },
        -                  "required": [
        -                    "x",
        -                    "y"
        -                  ],
        -                  "type": "object"
        -                }
        -              },
        -              "required": [
        -                "nodeType",
        -                "label"
        -              ],
        -              "type": "object"
        -            },
        -            "maxItems": 100,
        -            "type": "array"
        -          }
        -        },
        -        "required": [
        -          "nodes",
        -          "edges"
        -        ],
        -        "type": "object"
        -      },
        -      "name": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "create",
        -        "type": "string"
        -      },
        -      "sourceConfig": {
        -        "additionalProperties": {},
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "name",
        -      "sourceConfig",
        -      "graph"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "approvalMode": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/approvalMode",
        -        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed."
        -      },
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "description": {
        -        "type": "string"
        -      },
        -      "emailGoogleAccountId": {
        -        "anyOf": [
        -          {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "name": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "set_meta",
        -        "type": "string"
        -      },
        -      "outreachIntents": {
        -        "items": {
        -          "additionalProperties": {},
        -          "type": "object"
        -        },
        -        "maxItems": 20,
        -        "type": "array"
        -      },
        -      "workflowId": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "workflowId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "enabled": {
        -        "type": "boolean"
        -      },
        -      "op": {
        -        "const": "set_enabled",
        -        "type": "string"
        -      },
        -      "workflowId": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "workflowId",
        -      "enabled"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "accountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "set_linkedin_accounts",
        -        "type": "string"
        -      },
        -      "workflowId": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "workflowId",
        -      "accountIds"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "restore_guidance",
        -        "type": "string"
        -      },
        -      "versionId": {
        -        "description": "versionId of a previous node instructions version to restore.",
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "versionId"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "approvalMode": {
        +        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed.",
        +        "enum": [
        +          "manual_review",
        +          "auto_when_confident",
        +          "automatic"
        +        ],
        +        "type": "string"
        +      },
        +      "campaignId": {
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "graph": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "anchorEdges": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "label": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "targetIndex": {
        +                  "minimum": 0,
        +                  "type": "integer"
        +                }
        +              },
        +              "required": [
        +                "targetIndex",
        +                "label"
        +              ],
        +              "type": "object"
        +            },
        +            "maxItems": 200,
        +            "type": "array"
        +          },
        +          "edges": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "condition": {},
        +                "label": {
        +                  "type": "string"
        +                },
        +                "sourceIndex": {
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "targetIndex": {
        +                  "minimum": 0,
        +                  "type": "integer"
        +                }
        +              },
        +              "required": [
        +                "sourceIndex",
        +                "targetIndex"
        +              ],
        +              "type": "object"
        +            },
        +            "maxItems": 200,
        +            "type": "array"
        +          },
        +          "nodes": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "config": {
        +                  "default": {}
        +                },
        +                "existingNodeId": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "label": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "nodeType": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "position": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "x": {
        +                      "type": "number"
        +                    },
        +                    "y": {
        +                      "type": "number"
        +                    }
        +                  },
        +                  "required": [
        +                    "x",
        +                    "y"
        +                  ],
        +                  "type": "object"
        +                }
        +              },
        +              "required": [
        +                "nodeType",
        +                "label"
        +              ],
        +              "type": "object"
        +            },
        +            "maxItems": 100,
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "nodes",
        +          "edges"
        +        ],
        +        "type": "object"
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "create",
        +        "type": "string"
        +      },
        +      "sourceConfig": {
        +        "additionalProperties": {},
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "name",
        +      "sourceConfig",
        +      "graph"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "approvalMode": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/approvalMode",
        +        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed."
        +      },
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "emailGoogleAccountId": {
        +        "anyOf": [
        +          {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "set_meta",
        +        "type": "string"
        +      },
        +      "outreachIntents": {
        +        "items": {
        +          "additionalProperties": {},
        +          "type": "object"
        +        },
        +        "maxItems": 20,
        +        "type": "array"
        +      },
        +      "workflowId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "workflowId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "enabled": {
        +        "type": "boolean"
        +      },
        +      "op": {
        +        "const": "set_enabled",
        +        "type": "string"
        +      },
        +      "workflowId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "workflowId",
        +      "enabled"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "accountIds": {
        +        "description": "Accounts the workflow sends from (LinkedIn account IDs). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them so you can ask the person. An explicit [] stays empty: the LinkedIn steps send from no account and their leads wait until one is set.",
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "set_linkedin_accounts",
        +        "type": "string"
        +      },
        +      "workflowId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "workflowId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "restore_guidance",
        +        "type": "string"
        +      },
        +      "versionId": {
        +        "description": "versionId of a previous node instructions version to restore.",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "versionId"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcampaignstack_edit_workspace1 field changed
      • addedInput schema / properties / settings / properties / companyProfile
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "The company facts the playbook asks for. null clears one.",
        +  "properties": {
        +    "businessModel": {
        +      "anyOf": [
        +        {
        +          "maxLength": 2000,
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "deliverables": {
        +      "anyOf": [
        +        {
        +          "maxLength": 2000,
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "whatWeAreNot": {
        +      "anyOf": [
        +        {
        +          "maxLength": 2000,
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "whatWeDo": {
        +      "anyOf": [
        +        {
        +          "maxLength": 2000,
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "whyWeBuiltIt": {
        +      "anyOf": [
        +        {
        +          "maxLength": 2000,
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcampaignstack_explain_draft2 fields changed
      • addedInput schema / properties / include
        Added value: +{
        +  "description": "Extra sections. \"attempts\": every draft the review loop wrote for this message, in order, with a text hash, word count and each check's verdict and objection.",
        +  "items": {
        +    "enum": [
        +      "attempts"
        +    ],
        +    "type": "string"
        +  },
        +  "maxItems": 25,
        +  "type": "array"
        +}
      • addedOutput schema / properties / attempts
        Added value: +{
        +  "anyOf": [
        +    {
        +      "anyOf": [
        +        {
        +          "not": {}
        +        },
        +        {
        +          "items": {},
        +          "type": "array"
        +        }
        +      ]
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
    • Changedcampaignstack_export_linkedin_connections2 fields changed
      • addedInput schema / properties / accountId / description
        Added value: +"The account to use (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one."
      • removedInput schema / required
        Removed value: -[
        -  "accountId"
        -]
    • Changedcampaignstack_follow_profile4 fields changed
      • addedInput schema / properties / accountId / description
        Added value: +"Account that acts (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one."
      • removedInput schema / properties / dangerouslyBypassSafetySystem
        Removed value: -{
        -  "description": "Deprecated name for overrideOwnLimits. Use overrideOwnLimits.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / idempotencyKey
        Added value: +{
        +  "description": "Optional. A key you choose for this one send. Calling again with the same key returns the send already made instead of sending twice (use it when a call timed out); a key reused for a different send is refused. Without a key, the same words to the same person within a few minutes are refused as a repeat.",
        +  "maxLength": 128,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / overrideOwnLimits
        Removed value: -{
        -  "description": "Tells CampaignStack to skip its OWN protective pacing for this one call: the daily budget, the weekly cap, the business-hours window, the account status check and the risk pause. These are limits CampaignStack sets to keep the account healthy. They are not LinkedIn's controls, and nothing here touches, negotiates with or works around anything LinkedIn enforces. LinkedIn's own measured ceiling is a separate check that is never overridable, and neither is a pause the account's owner set. Default false, and it should stay false. Setting it true voids the safety guarantee: from that call on, CampaignStack can no longer promise the pacing that keeps the account out of trouble, and the risk of a restriction sits with the owner. Every use is recorded in the workspace audit log. Ask the owner in plain words and get an explicit yes first. A refusal from the safety system is that system working, not a fault to route around: report the reason and let the person decide, and never retry the same send with this set.",
        -  "type": "boolean"
        -}
    • Changedcampaignstack_get_signal_agents1 field changed
      • changedInput schema / properties / include / properties / leads / description
        Previous value: -"Include a bounded newest-first sample of leads discovered by each returned signal agent."New value: +"Include a bounded sample of leads discovered by each returned signal agent: name, headline, job title, current company, LinkedIn profile URL, where the lead is in the agent's flow, and the comment that brought them in (engagement)."
    • Changedcampaignstack_get_workspaces1 field changed
      • addedInput schema / properties / include / properties / checklist
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Setup rewards: each step, its credits, whether it is claimed, and how to complete it.",
        +  "properties": {},
        +  "type": "object"
        +}
    • Changedcampaignstack_like_post4 fields changed
      • addedInput schema / properties / accountId / description
        Added value: +"Account that acts (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one."
      • removedInput schema / properties / dangerouslyBypassSafetySystem
        Removed value: -{
        -  "description": "Deprecated name for overrideOwnLimits. Use overrideOwnLimits.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / idempotencyKey
        Added value: +{
        +  "description": "Optional. A key you choose for this one send. Calling again with the same key returns the send already made instead of sending twice (use it when a call timed out); a key reused for a different send is refused. Without a key, the same words to the same person within a few minutes are refused as a repeat.",
        +  "maxLength": 128,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / overrideOwnLimits
        Removed value: -{
        -  "description": "Tells CampaignStack to skip its OWN protective pacing for this one call: the daily budget, the weekly cap, the business-hours window, the account status check and the risk pause. These are limits CampaignStack sets to keep the account healthy. They are not LinkedIn's controls, and nothing here touches, negotiates with or works around anything LinkedIn enforces. LinkedIn's own measured ceiling is a separate check that is never overridable, and neither is a pause the account's owner set. Default false, and it should stay false. Setting it true voids the safety guarantee: from that call on, CampaignStack can no longer promise the pacing that keeps the account out of trouble, and the risk of a restriction sits with the owner. Every use is recorded in the workspace audit log. Ask the owner in plain words and get an explicit yes first. A refusal from the safety system is that system working, not a fault to route around: report the reason and let the person decide, and never retry the same send with this set.",
        -  "type": "boolean"
        -}
    • Changedcampaignstack_refresh_identity_voice1 field changed
      • addedInput schema / properties / linkedinAccountId / description
        Added value: +"Names the identity by its LinkedIn account. With no identityId, linkedinAccountId or googleAccountId, the workspace's only LinkedIn account ready to use is meant; with several, the error lists them so you can ask the person."
    • Changedcampaignstack_refresh_leads2 fields changed
      • addedInput schema / properties / accountId / description
        Added value: +"Account that reads the profiles (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one."
      • changedInput schema / required
        Previous value: -[
        -  "accountId",
        -  "results"
        -]New value: +[
        +  "results"
        +]
    • Changedcampaignstack_send_connection_request4 fields changed
      • addedInput schema / properties / accountId / description
        Added value: +"Account that acts (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one."
      • removedInput schema / properties / dangerouslyBypassSafetySystem
        Removed value: -{
        -  "description": "Deprecated name for overrideOwnLimits. Use overrideOwnLimits.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / idempotencyKey
        Added value: +{
        +  "description": "Optional. A key you choose for this one send. Calling again with the same key returns the send already made instead of sending twice (use it when a call timed out); a key reused for a different send is refused. Without a key, the same words to the same person within a few minutes are refused as a repeat.",
        +  "maxLength": 128,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / overrideOwnLimits
        Removed value: -{
        -  "description": "Tells CampaignStack to skip its OWN protective pacing for this one call: the daily budget, the weekly cap, the business-hours window, the account status check and the risk pause. These are limits CampaignStack sets to keep the account healthy. They are not LinkedIn's controls, and nothing here touches, negotiates with or works around anything LinkedIn enforces. LinkedIn's own measured ceiling is a separate check that is never overridable, and neither is a pause the account's owner set. Default false, and it should stay false. Setting it true voids the safety guarantee: from that call on, CampaignStack can no longer promise the pacing that keeps the account out of trouble, and the risk of a restriction sits with the owner. Every use is recorded in the workspace audit log. Ask the owner in plain words and get an explicit yes first. A refusal from the safety system is that system working, not a fault to route around: report the reason and let the person decide, and never retry the same send with this set.",
        -  "type": "boolean"
        -}
    • Changedcampaignstack_send_inmail4 fields changed
      • addedInput schema / properties / accountId / description
        Added value: +"Account that acts (LinkedIn account ID). Omit it to default to the workspace's only LinkedIn account that is ready; with several, the error lists them (id and name) so you can ask the person which one."
      • removedInput schema / properties / dangerouslyBypassSafetySystem
        Removed value: -{
        -  "description": "Deprecated name for overrideOwnLimits. Use overrideOwnLimits.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / idempotencyKey
        Added value: +{
        +  "description": "Optional. A key you choose for this one send. Calling again with the same key returns the send already made instead of sending twice (use it when a call timed out); a key reused for a different send is refused. Without a key, the same words to the same person within a few minutes are refused as a repeat.",
        +  "maxLength": 128,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / overrideOwnLimits
        Removed value: -{
        -  "description": "Tells CampaignStack to skip its OWN protective pacing for this one call: the daily budget, the weekly cap, the business-hours window, the account status check and the risk pause. These are limits CampaignStack sets to keep the account healthy. They are not LinkedIn's controls, and nothing here touches, negotiates with or works around anything LinkedIn enforces. LinkedIn's own measured ceiling is a separate check that is never overridable, and neither is a pause the account's owner set. Default false, and it should stay false. Setting it true voids the safety guarantee: from that call on, CampaignStack can no longer promise the pacing that keeps the account out of trouble, and the risk of a restriction sits with the owner. Every use is recorded in the workspace audit log. Ask the owner in plain words and get an explicit yes first. A refusal from the safety system is that system working, not a fault to route around: report the reason and let the person decide, and never retry the same send with this set.",
        -  "type": "boolean"
        -}
    • Changedcampaignstack_send_message4 fields changed
      • removedInput schema / properties / dangerouslyBypassSafetySystem
        Removed value: -{
        -  "description": "Deprecated name for overrideOwnLimits. Use overrideOwnLimits.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / idempotencyKey
        Added value: +{
        +  "description": "Optional. A key you choose for this one send. Calling again with the same key returns the send already made instead of sending twice (use it when a call timed out); a key reused for a different send is refused. Without a key, the same words to the same person within a few minutes are refused as a repeat.",
        +  "maxLength": 128,
        +  "minLength": 1,
        +  "type": "string"
        +}
      • removedInput schema / properties / overrideOwnLimits
        Removed value: -{
        -  "description": "Tells CampaignStack to skip its OWN protective pacing for this one call: the daily budget, the weekly cap, the business-hours window, the account status check and the risk pause. These are limits CampaignStack sets to keep the account healthy. They are not LinkedIn's controls, and nothing here touches, negotiates with or works around anything LinkedIn enforces. LinkedIn's own measured ceiling is a separate check that is never overridable, and neither is a pause the account's owner set. Default false, and it should stay false. Setting it true voids the safety guarantee: from that call on, CampaignStack can no longer promise the pacing that keeps the account out of trouble, and the risk of a restriction sits with the owner. Every use is recorded in the workspace audit log. Ask the owner in plain words and get an explicit yes first. A refusal from the safety system is that system working, not a fault to route around: report the reason and let the person decide, and never retry the same send with this set.",
        -  "type": "boolean"
        -}
      • addedOutput schema / properties / warning
        Added value: +{
        +  "anyOf": [
        +    {
        +      "anyOf": [
        +        {
        +          "not": {}
        +        },
        +        {
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
    • Changedcampaignstack_whoami3 fields changed
      • addedOutput schema / properties / gettingStartedNote
        Added value: +{
        +  "anyOf": [
        +    {
        +      "anyOf": [
        +        {
        +          "not": {}
        +        },
        +        {
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • changedOutput schema / properties / workspaces / anyOf
        Previous value: -[
        -  {
        -    "anyOf": [
        -      {
        -        "not": {}
        -      },
        -      {
        -        "items": {
        -          "additionalProperties": true,
        -          "properties": {
        -            "name": {
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "role": {
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            },
        -            "workspaceId": {
        -              "type": [
        -                "string",
        -                "null"
        -              ]
        -            }
        -          },
        -          "type": "object"
        -        },
        -        "type": "array"
        -      }
        -    ],
        -    "description": "Every workspace this person can reach, for the workspaceId argument"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "anyOf": [
        +      {
        +        "not": {}
        +      },
        +      {
        +        "items": {
        +          "additionalProperties": true,
        +          "properties": {
        +            "name": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "role": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            },
        +            "workspaceId": {
        +              "type": [
        +                "string",
        +                "null"
        +              ]
        +            }
        +          },
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    ],
        +    "description": "Every workspace this person can reach, for the workspaceId argument. gettingStarted: setup rewards still open"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedOutput schema / properties / workspaces / description
        Previous value: -"Every workspace this person can reach, for the workspaceId argument"New value: +"Every workspace this person can reach, for the workspaceId argument. gettingStarted: setup rewards still open"
  8. 1 tool update
    • Changedcampaignstack_edit_content1 field changed
      • changedInput schema / properties / operations / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "authorAccountId": {
        -        "type": "string"
        -      },
        -      "body": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "generator": {
        -        "anyOf": [
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "force": {
        -                "type": "boolean"
        -              },
        -              "keyword": {
        -                "maxLength": 20,
        -                "minLength": 2,
        -                "type": "string"
        -              },
        -              "niche": {
        -                "maxLength": 80,
        -                "type": "string"
        -              },
        -              "resource": {
        -                "maxLength": 120,
        -                "minLength": 3,
        -                "type": "string"
        -              },
        -              "type": {
        -                "const": "lead_magnet",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "type",
        -              "resource"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "force": {
        -                "type": "boolean"
        -              },
        -              "slug": {
        -                "maxLength": 80,
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "type": {
        -                "const": "search_console_demand",
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "type",
        -              "slug"
        -            ],
        -            "type": "object"
        -          }
        -        ]
        -      },
        -      "kind": {
        -        "const": "post",
        -        "default": "post",
        -        "type": "string"
        -      },
        -      "mediaIds": {
        -        "default": [],
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "op": {
        -        "const": "create",
        -        "type": "string"
        -      },
        -      "platform": {
        -        "default": "linkedin",
        -        "enum": [
        -          "linkedin"
        -        ],
        -        "type": "string"
        -      },
        -      "postType": {
        -        "enum": [
        -          "text",
        -          "image",
        -          "video",
        -          "document"
        -        ],
        -        "type": "string"
        -      },
        -      "tags": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "op"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "contentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "update",
        -        "type": "string"
        -      },
        -      "patch": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "body": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "mediaIds": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 25,
        -            "type": "array"
        -          },
        -          "postType": {
        -            "enum": [
        -              "text",
        -              "image",
        -              "video",
        -              "document"
        -            ],
        -            "type": "string"
        -          },
        -          "tags": {
        -            "items": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "maxItems": 25,
        -            "type": "array"
        -          }
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "contentId",
        -      "patch"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "copyFromId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "copy",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "copyFromId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "autoSchedule": {
        -        "type": "boolean"
        -      },
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "contentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "desiredState": {
        -        "enum": [
        -          "pending_approval",
        -          "scheduled",
        -          "approved",
        -          "rejected",
        -          "draft",
        -          "retry_draft"
        -        ],
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "state",
        -        "type": "string"
        -      },
        -      "reason": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "scheduledAt": {
        -        "exclusiveMinimum": 0,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "contentId",
        -      "desiredState"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "authorAccountId": {
        +        "type": "string"
        +      },
        +      "body": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "generator": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "force": {
        +                "type": "boolean"
        +              },
        +              "keyword": {
        +                "maxLength": 20,
        +                "minLength": 2,
        +                "type": "string"
        +              },
        +              "niche": {
        +                "maxLength": 80,
        +                "type": "string"
        +              },
        +              "resource": {
        +                "maxLength": 120,
        +                "minLength": 3,
        +                "type": "string"
        +              },
        +              "type": {
        +                "const": "lead_magnet",
        +                "type": "string"
        +              },
        +              "watermarkEnabled": {
        +                "description": "Use relevant stored workspace buyer evidence. Defaults on when evidence is relevant; false removes the added writing bias. Drafting never launches paid research or adds probe questions.",
        +                "type": "boolean"
        +              }
        +            },
        +            "required": [
        +              "type",
        +              "resource"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "force": {
        +                "type": "boolean"
        +              },
        +              "slug": {
        +                "maxLength": 80,
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "type": {
        +                "const": "search_console_demand",
        +                "type": "string"
        +              },
        +              "watermarkEnabled": {
        +                "description": "Use relevant stored workspace buyer evidence. Defaults on when evidence is relevant; false removes the added writing bias. Drafting never launches paid research or adds probe questions.",
        +                "type": "boolean"
        +              }
        +            },
        +            "required": [
        +              "type",
        +              "slug"
        +            ],
        +            "type": "object"
        +          }
        +        ]
        +      },
        +      "kind": {
        +        "const": "post",
        +        "default": "post",
        +        "type": "string"
        +      },
        +      "mediaIds": {
        +        "default": [],
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "op": {
        +        "const": "create",
        +        "type": "string"
        +      },
        +      "platform": {
        +        "default": "linkedin",
        +        "enum": [
        +          "linkedin"
        +        ],
        +        "type": "string"
        +      },
        +      "postType": {
        +        "enum": [
        +          "text",
        +          "image",
        +          "video",
        +          "document"
        +        ],
        +        "type": "string"
        +      },
        +      "tags": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "op"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "contentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "update",
        +        "type": "string"
        +      },
        +      "patch": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "body": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "mediaIds": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 25,
        +            "type": "array"
        +          },
        +          "postType": {
        +            "enum": [
        +              "text",
        +              "image",
        +              "video",
        +              "document"
        +            ],
        +            "type": "string"
        +          },
        +          "tags": {
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 25,
        +            "type": "array"
        +          }
        +        },
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "contentId",
        +      "patch"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "copyFromId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "copy",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "copyFromId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "autoSchedule": {
        +        "type": "boolean"
        +      },
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "contentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "desiredState": {
        +        "enum": [
        +          "pending_approval",
        +          "scheduled",
        +          "approved",
        +          "rejected",
        +          "draft",
        +          "retry_draft"
        +        ],
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "state",
        +        "type": "string"
        +      },
        +      "reason": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "scheduledAt": {
        +        "exclusiveMinimum": 0,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "contentId",
        +      "desiredState"
        +    ],
        +    "type": "object"
        +  }
        +]
  9. 4 tool updates
    • Changedcampaignstack_edit_signal_agent1 field changed
      • changedInput schema / properties / operations / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "accountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "actAccountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "mode": {
        -        "const": "create",
        -        "type": "string"
        -      },
        -      "name": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "publicReplyConfig": {
        -        "additionalProperties": {
        -          "type": "boolean"
        -        },
        -        "type": "object"
        -      },
        -      "responseMode": {
        -        "enum": [
        -          "auto_send",
        -          "review_first"
        -        ],
        -        "type": "string"
        -      },
        -      "silenceHours": {
        -        "type": "number"
        -      },
        -      "target": {
        -        "anyOf": [
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "kind": {
        -                "const": "profile",
        -                "type": "string"
        -              },
        -              "platform": {
        -                "const": "linkedin",
        -                "type": "string"
        -              },
        -              "url": {
        -                "type": "string"
        -              },
        -              "urn": {
        -                "minLength": 1,
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "platform",
        -              "kind",
        -              "urn"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "groupId": {
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "kind": {
        -                "const": "group",
        -                "type": "string"
        -              },
        -              "platform": {
        -                "const": "linkedin",
        -                "type": "string"
        -              },
        -              "url": {
        -                "minLength": 1,
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "platform",
        -              "kind",
        -              "url",
        -              "groupId"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "activityId": {
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "kind": {
        -                "const": "post",
        -                "type": "string"
        -              },
        -              "platform": {
        -                "const": "linkedin",
        -                "type": "string"
        -              },
        -              "url": {
        -                "minLength": 1,
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "platform",
        -              "kind",
        -              "url",
        -              "activityId"
        -            ],
        -            "type": "object"
        -          }
        -        ]
        -      },
        -      "targetName": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "profile_feed",
        -          "company_feed",
        -          "group_watch",
        -          "post_engagement"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "name",
        -      "type",
        -      "target",
        -      "targetName",
        -      "responseMode",
        -      "accountIds",
        -      "actAccountIds"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "accountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "actAccountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "agentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "agentScript": {
        -        "type": "string"
        -      },
        -      "mode": {
        -        "const": "update",
        -        "type": "string"
        -      },
        -      "name": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "publicReplyConfig": {
        -        "additionalProperties": {
        -          "type": "boolean"
        -        },
        -        "type": "object"
        -      },
        -      "responseMode": {
        -        "enum": [
        -          "auto_send",
        -          "review_first"
        -        ],
        -        "type": "string"
        -      },
        -      "silenceHours": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "agentId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "agentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "confirmed": {
        -        "description": "Required (must be true) when status is 'archived': archiving here runs the same permanent removal as campaignstack_delete_signal_agent. 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.",
        -        "type": "boolean"
        -      },
        -      "mode": {
        -        "const": "set_status",
        -        "type": "string"
        -      },
        -      "status": {
        -        "enum": [
        -          "active",
        -          "paused",
        -          "archived"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "agentId",
        -      "status"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "agentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "exclusions": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "config": {},
        -            "enabled": {
        -              "default": true,
        -              "type": "boolean"
        -            },
        -            "id": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "state": {},
        -            "type": {
        -              "minLength": 1,
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "type"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 100,
        -        "type": "array"
        -      },
        -      "mode": {
        -        "const": "set_exclusions",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "agentId",
        -      "exclusions"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "mode": {
        -        "const": "restore_guidance",
        -        "type": "string"
        -      },
        -      "versionId": {
        -        "description": "versionId of a previous agentScript version to restore.",
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "versionId"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "accountIds": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "actAccountIds": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "approvalMode": {
        +        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed.",
        +        "enum": [
        +          "manual_review",
        +          "auto_when_confident",
        +          "automatic"
        +        ],
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "create",
        +        "type": "string"
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "publicReplyConfig": {
        +        "additionalProperties": {
        +          "type": "boolean"
        +        },
        +        "type": "object"
        +      },
        +      "silenceHours": {
        +        "type": "number"
        +      },
        +      "target": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "kind": {
        +                "const": "profile",
        +                "type": "string"
        +              },
        +              "platform": {
        +                "const": "linkedin",
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              },
        +              "urn": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "platform",
        +              "kind",
        +              "urn"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "groupId": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "kind": {
        +                "const": "group",
        +                "type": "string"
        +              },
        +              "platform": {
        +                "const": "linkedin",
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "platform",
        +              "kind",
        +              "url",
        +              "groupId"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "activityId": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "kind": {
        +                "const": "post",
        +                "type": "string"
        +              },
        +              "platform": {
        +                "const": "linkedin",
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "platform",
        +              "kind",
        +              "url",
        +              "activityId"
        +            ],
        +            "type": "object"
        +          }
        +        ]
        +      },
        +      "targetName": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "profile_feed",
        +          "company_feed",
        +          "group_watch",
        +          "post_engagement"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "name",
        +      "type",
        +      "target",
        +      "targetName",
        +      "accountIds",
        +      "actAccountIds"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "accountIds": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "actAccountIds": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "agentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "agentScript": {
        +        "type": "string"
        +      },
        +      "approvalMode": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/approvalMode",
        +        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed."
        +      },
        +      "mode": {
        +        "const": "update",
        +        "type": "string"
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "publicReplyConfig": {
        +        "additionalProperties": {
        +          "type": "boolean"
        +        },
        +        "type": "object"
        +      },
        +      "silenceHours": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "agentId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "agentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "confirmed": {
        +        "description": "Required (must be true) when status is 'archived': archiving here runs the same permanent removal as campaignstack_delete_signal_agent. 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.",
        +        "type": "boolean"
        +      },
        +      "mode": {
        +        "const": "set_status",
        +        "type": "string"
        +      },
        +      "status": {
        +        "enum": [
        +          "active",
        +          "paused",
        +          "archived"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "agentId",
        +      "status"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "agentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "exclusions": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "config": {},
        +            "enabled": {
        +              "default": true,
        +              "type": "boolean"
        +            },
        +            "id": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "state": {},
        +            "type": {
        +              "minLength": 1,
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "type"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 100,
        +        "type": "array"
        +      },
        +      "mode": {
        +        "const": "set_exclusions",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "agentId",
        +      "exclusions"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "mode": {
        +        "const": "restore_guidance",
        +        "type": "string"
        +      },
        +      "versionId": {
        +        "description": "versionId of a previous agentScript version to restore.",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "versionId"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcampaignstack_edit_workflow1 field changed
      • changedInput schema / properties / operations / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "campaignId": {
        -        "type": "string"
        -      },
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "description": {
        -        "type": "string"
        -      },
        -      "graph": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "anchorEdges": {
        -            "items": {
        -              "additionalProperties": false,
        -              "properties": {
        -                "label": {
        -                  "minLength": 1,
        -                  "type": "string"
        -                },
        -                "targetIndex": {
        -                  "minimum": 0,
        -                  "type": "integer"
        -                }
        -              },
        -              "required": [
        -                "targetIndex",
        -                "label"
        -              ],
        -              "type": "object"
        -            },
        -            "maxItems": 200,
        -            "type": "array"
        -          },
        -          "edges": {
        -            "items": {
        -              "additionalProperties": false,
        -              "properties": {
        -                "condition": {},
        -                "label": {
        -                  "type": "string"
        -                },
        -                "sourceIndex": {
        -                  "minimum": 0,
        -                  "type": "integer"
        -                },
        -                "targetIndex": {
        -                  "minimum": 0,
        -                  "type": "integer"
        -                }
        -              },
        -              "required": [
        -                "sourceIndex",
        -                "targetIndex"
        -              ],
        -              "type": "object"
        -            },
        -            "maxItems": 200,
        -            "type": "array"
        -          },
        -          "nodes": {
        -            "items": {
        -              "additionalProperties": false,
        -              "properties": {
        -                "config": {
        -                  "default": {}
        -                },
        -                "existingNodeId": {
        -                  "minLength": 1,
        -                  "type": "string"
        -                },
        -                "label": {
        -                  "minLength": 1,
        -                  "type": "string"
        -                },
        -                "nodeType": {
        -                  "minLength": 1,
        -                  "type": "string"
        -                },
        -                "position": {
        -                  "additionalProperties": false,
        -                  "properties": {
        -                    "x": {
        -                      "type": "number"
        -                    },
        -                    "y": {
        -                      "type": "number"
        -                    }
        -                  },
        -                  "required": [
        -                    "x",
        -                    "y"
        -                  ],
        -                  "type": "object"
        -                }
        -              },
        -              "required": [
        -                "nodeType",
        -                "label"
        -              ],
        -              "type": "object"
        -            },
        -            "maxItems": 100,
        -            "type": "array"
        -          }
        -        },
        -        "required": [
        -          "nodes",
        -          "edges"
        -        ],
        -        "type": "object"
        -      },
        -      "name": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "create",
        -        "type": "string"
        -      },
        -      "sourceConfig": {
        -        "additionalProperties": {},
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "name",
        -      "sourceConfig",
        -      "graph"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "description": {
        -        "type": "string"
        -      },
        -      "emailGoogleAccountId": {
        -        "anyOf": [
        -          {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          {
        -            "type": "null"
        -          }
        -        ]
        -      },
        -      "name": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "set_meta",
        -        "type": "string"
        -      },
        -      "outreachIntents": {
        -        "items": {
        -          "additionalProperties": {},
        -          "type": "object"
        -        },
        -        "maxItems": 20,
        -        "type": "array"
        -      },
        -      "workflowId": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "workflowId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "enabled": {
        -        "type": "boolean"
        -      },
        -      "op": {
        -        "const": "set_enabled",
        -        "type": "string"
        -      },
        -      "workflowId": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "workflowId",
        -      "enabled"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "accountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "set_linkedin_accounts",
        -        "type": "string"
        -      },
        -      "workflowId": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "workflowId",
        -      "accountIds"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "restore_guidance",
        -        "type": "string"
        -      },
        -      "versionId": {
        -        "description": "versionId of a previous node instructions version to restore.",
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "versionId"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "approvalMode": {
        +        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed.",
        +        "enum": [
        +          "manual_review",
        +          "auto_when_confident",
        +          "automatic"
        +        ],
        +        "type": "string"
        +      },
        +      "campaignId": {
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "graph": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "anchorEdges": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "label": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "targetIndex": {
        +                  "minimum": 0,
        +                  "type": "integer"
        +                }
        +              },
        +              "required": [
        +                "targetIndex",
        +                "label"
        +              ],
        +              "type": "object"
        +            },
        +            "maxItems": 200,
        +            "type": "array"
        +          },
        +          "edges": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "condition": {},
        +                "label": {
        +                  "type": "string"
        +                },
        +                "sourceIndex": {
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "targetIndex": {
        +                  "minimum": 0,
        +                  "type": "integer"
        +                }
        +              },
        +              "required": [
        +                "sourceIndex",
        +                "targetIndex"
        +              ],
        +              "type": "object"
        +            },
        +            "maxItems": 200,
        +            "type": "array"
        +          },
        +          "nodes": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "config": {
        +                  "default": {}
        +                },
        +                "existingNodeId": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "label": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "nodeType": {
        +                  "minLength": 1,
        +                  "type": "string"
        +                },
        +                "position": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "x": {
        +                      "type": "number"
        +                    },
        +                    "y": {
        +                      "type": "number"
        +                    }
        +                  },
        +                  "required": [
        +                    "x",
        +                    "y"
        +                  ],
        +                  "type": "object"
        +                }
        +              },
        +              "required": [
        +                "nodeType",
        +                "label"
        +              ],
        +              "type": "object"
        +            },
        +            "maxItems": 100,
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "nodes",
        +          "edges"
        +        ],
        +        "type": "object"
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "create",
        +        "type": "string"
        +      },
        +      "sourceConfig": {
        +        "additionalProperties": {},
        +        "type": "object"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "name",
        +      "sourceConfig",
        +      "graph"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "approvalMode": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/approvalMode",
        +        "description": "Whether what this workflow drafts waits for a person. manual_review: every message waits in the review queue. auto_when_confident: messages still wait, and the ones the confidence check rates as safe to send unchanged go out on their own once the workspace's calibration allows it (a daily cap applies, and booking confirmations, files, conversation turns and flagged drafts always wait). automatic: no review step at all. On a signal agent this also removes its review steps; on any other workflow, review steps already in the graph keep waiting, so remove them with campaignstack_edit_workflow_graph. Omit to keep the current mode; on create, omit to start from the owner's onboarding answer. Only a workspace owner or admin can set it. Set automatic only when the user asked for messages to go out unreviewed."
        +      },
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "emailGoogleAccountId": {
        +        "anyOf": [
        +          {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "set_meta",
        +        "type": "string"
        +      },
        +      "outreachIntents": {
        +        "items": {
        +          "additionalProperties": {},
        +          "type": "object"
        +        },
        +        "maxItems": 20,
        +        "type": "array"
        +      },
        +      "workflowId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "workflowId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "enabled": {
        +        "type": "boolean"
        +      },
        +      "op": {
        +        "const": "set_enabled",
        +        "type": "string"
        +      },
        +      "workflowId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "workflowId",
        +      "enabled"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "accountIds": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "set_linkedin_accounts",
        +        "type": "string"
        +      },
        +      "workflowId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "workflowId",
        +      "accountIds"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "restore_guidance",
        +        "type": "string"
        +      },
        +      "versionId": {
        +        "description": "versionId of a previous node instructions version to restore.",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "versionId"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcampaignstack_get_lead_lists3 fields changed
      • addedInput schema / properties / accountId
        Added value: +{
        +  "description": "Only the lists this LinkedIn account owns in the workspace (its connections, invited and post engagers lists).",
        +  "type": "string"
        +}
      • changedInput schema / properties / campaignId / description
        Previous value: -"List lead lists in this campaign when ids are omitted."New value: +"List lead lists in this campaign when ids are omitted. Without it, the workspace's lists are listed."
      • addedInput schema / properties / source
        Added value: +{
        +  "description": "Only lists of this origin. linkedin_connections, linkedin_invited (people the account's workflows sent a connection request to) and linkedin_post_engagers (people who reacted to, commented on or reposted the account's posts) are the lists a LinkedIn account owns; the last two are kept up to date by CampaignStack and their members cannot be edited.",
        +  "enum": [
        +    "manual",
        +    "import",
        +    "event",
        +    "group",
        +    "scheduled_sync",
        +    "linkedin_connections",
        +    "linkedin_invited",
        +    "linkedin_post_engagers"
        +  ],
        +  "type": "string"
        +}
    • Changedcampaignstack_trigger_workflow1 field changed
      • changedInput schema / properties / confirmed / description
        Previous value: -"Confirms this starts or reruns workflow execution for real leads."New value: +"Confirms this starts workflow execution for real leads."
  10. 1 tool update
    • Changedcampaignstack_get_campaigns1 field changed
      • changedInput schema / properties / include / properties / metrics / description
        Previous value: -"Campaign metric rows."New value: +"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."
  11. 2 tool updates
    • Changedcampaignstack_get_companies1 field changed
      • addedInput schema / properties / query
        Added value: +{
        +  "description": "Search by name prefix, domain or LinkedIn company URL across this workspace's companies and the shared company database. Returns up to 10, each marked inWorkspace.",
        +  "maxLength": 120,
        +  "minLength": 2,
        +  "type": "string"
        +}
    • Addedcampaignstack_lookup_company
  12. 6 tool updates
    • Changedcampaignstack_add_leads_to_external_destination2 fields changed
      • removedInput schema / properties / leads / items / properties / leadSource / default
        Removed value: -"global"
      • addedInput schema / properties / leads / items / properties / leadSource / description
        Added value: +"Optional. Leave it out: the server reads it from the leadId and refuses a value that disagrees."
    • Changedcampaignstack_edit_lead_list2 fields changed
      • removedInput schema / properties / members / items / properties / leadSource / default
        Removed value: -"global"
      • addedInput schema / properties / members / items / properties / leadSource / description
        Added value: +"Optional. Leave it out: the server reads it from the leadId and refuses a value that disagrees."
    • Changedcampaignstack_edit_leads2 fields changed
      • removedInput schema / properties / leads / items / properties / leadSource / default
        Removed value: -"global"
      • addedInput schema / properties / leads / items / properties / leadSource / description
        Added value: +"Optional. Leave it out: the server reads it from the leadId and refuses a value that disagrees."
    • Changedcampaignstack_enrich_leads2 fields changed
      • removedInput schema / properties / leads / items / properties / leadSource / default
        Removed value: -"global"
      • addedInput schema / properties / leads / items / properties / leadSource / description
        Added value: +"Optional. Leave it out: the server reads it from the leadId and refuses a value that disagrees."
    • Changedcampaignstack_export_leads_to_crm2 fields changed
      • removedInput schema / properties / leads / items / properties / leadSource / default
        Removed value: -"global"
      • addedInput schema / properties / leads / items / properties / leadSource / description
        Added value: +"Optional. Leave it out: the server reads it from the leadId and refuses a value that disagrees."
    • Changedcampaignstack_preview_craft_prompt1 field changed
      • changedInput schema / properties / leadSource / description
        Previous value: -"Which lead table the id is in. Default: global."New value: +"Optional. Leave it out: the server reads it from the leadId and refuses a value that disagrees."
  13. 4 tool updates
    • Changedcampaignstack_edit_conversations3 fields changed
      • removedInput schema / properties / conversations / minItems
        Removed value: -1
      • addedInput schema / properties / scheduledMessages
        Added value: +{
        +  "items": {
        +    "anyOf": [
        +      {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "op": {
        +            "const": "cancel",
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "op",
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "op": {
        +            "const": "edit",
        +            "type": "string"
        +          },
        +          "sendAt": {
        +            "format": "date-time",
        +            "type": "string"
        +          },
        +          "text": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "op",
        +          "id"
        +        ],
        +        "type": "object"
        +      }
        +    ]
        +  },
        +  "maxItems": 25,
        +  "type": "array"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "conversations"
        -]
    • Changedcampaignstack_edit_workspace1 field changed
      • addedInput schema / properties / settings / properties / jevFeatures / properties / callbackTiming
        Added value: +{
        +  "$ref": "#/properties/settings/properties/jevFeatures/properties/confidenceGate"
        +}
    • Changedcampaignstack_get_conversations1 field changed
      • addedInput schema / properties / include / properties / scheduledMessages
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
    • Changedcampaignstack_send_message3 fields changed
      • addedInput schema / properties / sendAt
        Added value: +{
        +  "description": "ISO 8601 with a UTC offset. Omit to send now. With it, the message is held and sent at that time instead (1 minute to 180 days out) - cancelled automatically if the other person replies first. Read the wording and the time back to the user and wait for a yes before calling this with sendAt set.",
        +  "format": "date-time",
        +  "type": "string"
        +}
      • addedOutput schema / properties / scheduledMessageId
        Added value: +{
        +  "anyOf": [
        +    {
        +      "anyOf": [
        +        {
        +          "not": {}
        +        },
        +        {
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
      • addedOutput schema / properties / sendAt
        Added value: +{
        +  "anyOf": [
        +    {
        +      "anyOf": [
        +        {
        +          "not": {}
        +        },
        +        {
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ]
        +}
  14. 1 tool update
    • Changedcampaignstack_craft_message1 field changed
      • changedInput schema / properties / accountId / description
        Previous value: -"LinkedIn account for follow-up thread context."New value: +"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."
  15. 1 tool update
    • Changedcampaignstack_decide_review1 field changed
      • addedInput schema / properties / priority
        Added value: +{
        +  "description": "Send in priority: approve AND send this one message within seconds, instead of waiting its turn in the queue. It skips the queue's own limits for this message (business hours, the daily budget, pacing, the weekly connection cap) but never what the account itself says (a paused, expired or risk-paused account refuses it with an error). Set it only when the user asked for this specific message to go out now. Workflow drafts on LinkedIn only; not with reject or job applications.",
        +  "type": "boolean"
        +}
  16. 14 tool updates
    • Removedcampaignstack_delete_campaign
    • Changedcampaignstack_delete_company_employee_watch3 fields changed
      • removedInput schema / properties / confirmDelete
        Removed value: -{
        -  "const": true,
        -  "description": "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.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "const": true,
        +  "description": "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.",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "watchIds",
        -  "confirmDelete"
        -]New value: +[
        +  "watchIds",
        +  "confirmed"
        +]
    • Changedcampaignstack_delete_competitor_watch3 fields changed
      • removedInput schema / properties / confirmDelete
        Removed value: -{
        -  "const": true,
        -  "description": "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.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "const": true,
        +  "description": "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.",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "watchIds",
        -  "confirmDelete"
        -]New value: +[
        +  "watchIds",
        +  "confirmed"
        +]
    • Changedcampaignstack_delete_content1 field changed
      • changedInput schema / required
        Previous value: -[
        -  "contentIds"
        -]New value: +[
        +  "contentIds",
        +  "confirmed"
        +]
    • Changedcampaignstack_delete_lead_list3 fields changed
      • removedInput schema / properties / confirmDelete
        Removed value: -{
        -  "const": true,
        -  "description": "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.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "const": true,
        +  "description": "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.",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "leadListIds",
        -  "confirmDelete"
        -]New value: +[
        +  "leadListIds",
        +  "confirmed"
        +]
    • Changedcampaignstack_delete_signal_agent3 fields changed
      • removedInput schema / properties / confirmDelete
        Removed value: -{
        -  "const": true,
        -  "description": "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.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "const": true,
        +  "description": "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.",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "agentIds",
        -  "confirmDelete"
        -]New value: +[
        +  "agentIds",
        +  "confirmed"
        +]
    • Changedcampaignstack_delete_signal_watch3 fields changed
      • removedInput schema / properties / confirmDelete
        Removed value: -{
        -  "const": true,
        -  "description": "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.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "const": true,
        +  "description": "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.",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "watchIds",
        -  "confirmDelete"
        -]New value: +[
        +  "watchIds",
        +  "confirmed"
        +]
    • Changedcampaignstack_delete_workflow3 fields changed
      • removedInput schema / properties / confirmDelete
        Removed value: -{
        -  "const": true,
        -  "description": "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.",
        -  "type": "boolean"
        -}
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "const": true,
        +  "description": "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.",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "workflowId",
        -  "confirmDelete"
        -]New value: +[
        +  "workflowId",
        +  "confirmed"
        +]
    • Changedcampaignstack_delete_workspace_memory2 fields changed
      • addedInput schema / properties / confirmed
        Added value: +{
        +  "const": true,
        +  "description": "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.",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "memoryId"
        -]New value: +[
        +  "memoryId",
        +  "confirmed"
        +]
    • Changedcampaignstack_edit_account1 field changed
      • changedInput schema / properties / operation / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "op": {
        -        "const": "set_owner_workspace",
        -        "type": "string"
        -      },
        -      "ownerWorkspaceId": {
        -        "description": "Workspace that pays for account maintenance watchers and inbox sends.",
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "ownerWorkspaceId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "enabled": {
        -        "type": "boolean"
        -      },
        -      "kind": {
        -        "description": "connection_watcher welcomes new connections, message answers inbound DMs, own_posts_watcher follows up with people engaging with the account's posts, invitation_hygiene withdraws the account's oldest pending invitations.",
        -        "enum": [
        -          "connection_watcher",
        -          "message",
        -          "own_posts_watcher",
        -          "invitation_hygiene"
        -        ],
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "set_watcher",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "kind",
        -      "enabled"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "confirm": {
        -        "description": "Required acknowledgement that the named account should be deleted from CampaignStack.",
        -        "type": "boolean"
        -      },
        -      "op": {
        -        "const": "delete",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "confirm"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "op": {
        +        "const": "set_owner_workspace",
        +        "type": "string"
        +      },
        +      "ownerWorkspaceId": {
        +        "description": "Workspace that pays for account maintenance watchers and inbox sends.",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "ownerWorkspaceId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "enabled": {
        +        "type": "boolean"
        +      },
        +      "kind": {
        +        "description": "connection_watcher welcomes new connections, message answers inbound DMs, own_posts_watcher follows up with people engaging with the account's posts, invitation_hygiene withdraws the account's oldest pending invitations.",
        +        "enum": [
        +          "connection_watcher",
        +          "message",
        +          "own_posts_watcher",
        +          "invitation_hygiene"
        +        ],
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "set_watcher",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "kind",
        +      "enabled"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "confirmed": {
        +        "const": true,
        +        "description": "Required acknowledgement that the named account should be deleted from CampaignStack.",
        +        "type": "boolean"
        +      },
        +      "op": {
        +        "const": "delete",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "confirmed"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcampaignstack_edit_campaign1 field changed
      • changedInput schema / properties / operations / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "connectionDegreeMode": {
        -        "enum": [
        -          "discovery",
        -          "relationship"
        -        ],
        -        "type": "string"
        -      },
        -      "description": {
        -        "type": "string"
        -      },
        -      "goal": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "offerAddendum": {
        -        "maxLength": 1500,
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "create",
        -        "type": "string"
        -      },
        -      "outreachIntents": {
        -        "description": "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.",
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "detail": {
        -              "description": "The workspace's own words for this outcome, e.g. '15 minutes on how you price retainers'. Required for kind='other', which has no default ask.",
        -              "type": "string"
        -            },
        -            "kind": {
        -              "enum": [
        -                "customer",
        -                "advice",
        -                "intro",
        -                "partner",
        -                "candidate",
        -                "collaboration",
        -                "investor",
        -                "other"
        -              ],
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "kind"
        -          ],
        -          "type": "object"
        -        },
        -        "type": "array"
        -      },
        -      "title": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "title",
        -      "goal"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "campaignGuidance": {
        -        "maxLength": 2000,
        -        "type": "string"
        -      },
        -      "campaignId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "clientOperationId": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        -      },
        -      "connectionDegreeMode": {
        -        "enum": [
        -          "discovery",
        -          "relationship"
        -        ],
        -        "type": "string"
        -      },
        -      "description": {
        -        "type": "string"
        -      },
        -      "offerAddendum": {
        -        "maxLength": 1500,
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "update",
        -        "type": "string"
        -      },
        -      "outreachIntents": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/outreachIntents",
        -        "description": "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."
        -      },
        -      "title": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "campaignId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "campaignId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "clientOperationId": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        -      },
        -      "confirmed": {
        -        "const": true,
        -        "type": "boolean"
        -      },
        -      "op": {
        -        "const": "archive",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "campaignId",
        -      "confirmed"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "campaignId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "clientOperationId": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        -      },
        -      "op": {
        -        "const": "unarchive",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "campaignId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "campaignId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "clientOperationId": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        -      },
        -      "data": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "companySizes": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "fitStatement": {
        -            "type": "string"
        -          },
        -          "icpId": {
        -            "type": "string"
        -          },
        -          "industries": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "keywords": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "locations": {
        -            "items": {
        -              "additionalProperties": false,
        -              "properties": {
        -                "city": {
        -                  "type": "string"
        -                },
        -                "country": {
        -                  "type": "string"
        -                },
        -                "raw": {
        -                  "type": "string"
        -                },
        -                "region": {
        -                  "type": "string"
        -                }
        -              },
        -              "type": "object"
        -            },
        -            "type": "array"
        -          },
        -          "requirePersonaCoverage": {
        -            "enum": [
        -              "covered",
        -              "covered_or_hiring"
        -            ],
        -            "type": "string"
        -          },
        -          "seniorities": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "titles": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "op": {
        -        "const": "icp",
        -        "type": "string"
        -      },
        -      "rescore": {
        -        "type": "boolean"
        -      },
        -      "rescoreLeadIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 100,
        -        "type": "array"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "campaignId",
        -      "data"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "campaignId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "clientOperationId": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        -      },
        -      "data": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "description": {
        -            "type": "string"
        -          },
        -          "fitStatement": {
        -            "type": "string"
        -          },
        -          "goals": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "icpId": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "objectionResponses": {
        -            "items": {
        -              "additionalProperties": false,
        -              "properties": {
        -                "objection": {
        -                  "type": "string"
        -                },
        -                "response": {
        -                  "type": "string"
        -                }
        -              },
        -              "required": [
        -                "objection",
        -                "response"
        -              ],
        -              "type": "object"
        -            },
        -            "type": "array"
        -          },
        -          "objections": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "painPoints": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "personaId": {
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "op": {
        -        "const": "persona",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "campaignId",
        -      "data"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "campaignId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "clientOperationId": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        -      },
        -      "data": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "description": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "objectives": {
        -            "items": {
        -              "type": "string"
        -            },
        -            "type": "array"
        -          },
        -          "order": {
        -            "type": "integer"
        -          },
        -          "phaseId": {
        -            "type": "string"
        -          },
        -          "phaseType": {
        -            "type": "string"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "op": {
        -        "const": "roadmap",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "campaignId",
        -      "data"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "campaignId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "clientOperationId": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        -      },
        -      "data": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "name": {
        -            "description": "Or the exact taxonomy name, instead of topicId.",
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "remove": {
        -            "description": "true takes the topic off the campaign.",
        -            "type": "boolean"
        -          },
        -          "topicId": {
        -            "description": "A topicId from include.topicVocabulary of campaignstack_get_campaigns.",
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "weight": {
        -            "description": "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).",
        -            "maximum": 1,
        -            "minimum": 0,
        -            "type": "number"
        -          }
        -        },
        -        "type": "object"
        -      },
        -      "op": {
        -        "const": "topic",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "campaignId",
        -      "data"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "campaignId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "clientOperationId": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        -      },
        -      "data": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "scoreImpact": {
        -            "maximum": 100,
        -            "minimum": -100,
        -            "type": "number"
        -          },
        -          "signalType": {
        -            "minLength": 1,
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "signalType",
        -          "scoreImpact"
        -        ],
        -        "type": "object"
        -      },
        -      "op": {
        -        "const": "weight",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "campaignId",
        -      "data"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        -      },
        -      "data": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "automationId": {
        -            "minLength": 1,
        -            "type": "string"
        -          },
        -          "enabled": {
        -            "type": "boolean"
        -          }
        -        },
        -        "required": [
        -          "automationId",
        -          "enabled"
        -        ],
        -        "type": "object"
        -      },
        -      "op": {
        -        "const": "automation",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "data"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        -      },
        -      "confirmed": {
        -        "const": true,
        -        "type": "boolean"
        -      },
        -      "icpId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "op": {
        -        "const": "delete_icp",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "icpId",
        -      "confirmed"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        -      },
        -      "confirmed": {
        -        "const": true,
        -        "type": "boolean"
        -      },
        -      "op": {
        -        "const": "delete_persona",
        -        "type": "string"
        -      },
        -      "personaId": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "personaId",
        -      "confirmed"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "clientOperationId": {
        -        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        -      },
        -      "confirmed": {
        -        "const": true,
        -        "type": "boolean"
        -      },
        -      "op": {
        -        "const": "delete_phase",
        -        "type": "string"
        -      },
        -      "phaseId": {
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "op",
        -      "phaseId",
        -      "confirmed"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "connectionDegreeMode": {
        +        "enum": [
        +          "discovery",
        +          "relationship"
        +        ],
        +        "type": "string"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "goal": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "offerAddendum": {
        +        "maxLength": 1500,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "create",
        +        "type": "string"
        +      },
        +      "outreachIntents": {
        +        "description": "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.",
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "detail": {
        +              "description": "The workspace's own words for this outcome, e.g. '15 minutes on how you price retainers'. Required for kind='other', which has no default ask.",
        +              "type": "string"
        +            },
        +            "kind": {
        +              "enum": [
        +                "customer",
        +                "advice",
        +                "intro",
        +                "partner",
        +                "candidate",
        +                "collaboration",
        +                "investor",
        +                "other"
        +              ],
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "kind"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      },
        +      "title": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "title",
        +      "goal"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "campaignGuidance": {
        +        "maxLength": 2000,
        +        "type": "string"
        +      },
        +      "campaignId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "connectionDegreeMode": {
        +        "enum": [
        +          "discovery",
        +          "relationship"
        +        ],
        +        "type": "string"
        +      },
        +      "description": {
        +        "type": "string"
        +      },
        +      "offerAddendum": {
        +        "maxLength": 1500,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "update",
        +        "type": "string"
        +      },
        +      "outreachIntents": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/outreachIntents",
        +        "description": "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."
        +      },
        +      "title": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "campaignId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "campaignId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "confirmed": {
        +        "const": true,
        +        "type": "boolean"
        +      },
        +      "op": {
        +        "const": "archive",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "campaignId",
        +      "confirmed"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "campaignId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "op": {
        +        "const": "unarchive",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "campaignId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "campaignId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "confirmed": {
        +        "const": true,
        +        "type": "boolean"
        +      },
        +      "op": {
        +        "const": "delete",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "campaignId",
        +      "confirmed"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "campaignId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "data": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "companySizes": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "fitStatement": {
        +            "type": "string"
        +          },
        +          "icpId": {
        +            "type": "string"
        +          },
        +          "industries": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "keywords": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "locations": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "city": {
        +                  "type": "string"
        +                },
        +                "country": {
        +                  "type": "string"
        +                },
        +                "raw": {
        +                  "type": "string"
        +                },
        +                "region": {
        +                  "type": "string"
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "requirePersonaCoverage": {
        +            "enum": [
        +              "covered",
        +              "covered_or_hiring"
        +            ],
        +            "type": "string"
        +          },
        +          "seniorities": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "titles": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "op": {
        +        "const": "icp",
        +        "type": "string"
        +      },
        +      "rescore": {
        +        "type": "boolean"
        +      },
        +      "rescoreLeadIds": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 100,
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "campaignId",
        +      "data"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "campaignId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "data": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "description": {
        +            "type": "string"
        +          },
        +          "fitStatement": {
        +            "type": "string"
        +          },
        +          "goals": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "icpId": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "objectionResponses": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "objection": {
        +                  "type": "string"
        +                },
        +                "response": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "objection",
        +                "response"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          },
        +          "objections": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "painPoints": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "personaId": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "op": {
        +        "const": "persona",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "campaignId",
        +      "data"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "campaignId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "data": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "description": {
        +            "type": "string"
        +          },
        +          "name": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "objectives": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "order": {
        +            "type": "integer"
        +          },
        +          "phaseId": {
        +            "type": "string"
        +          },
        +          "phaseType": {
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "op": {
        +        "const": "roadmap",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "campaignId",
        +      "data"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "campaignId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "data": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "name": {
        +            "description": "Or the exact taxonomy name, instead of topicId.",
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "remove": {
        +            "description": "true takes the topic off the campaign.",
        +            "type": "boolean"
        +          },
        +          "topicId": {
        +            "description": "A topicId from include.topicVocabulary of campaignstack_get_campaigns.",
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "weight": {
        +            "description": "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).",
        +            "maximum": 1,
        +            "minimum": 0,
        +            "type": "number"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "op": {
        +        "const": "topic",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "campaignId",
        +      "data"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "campaignId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "data": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "accountIds": {
        +            "description": "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.",
        +            "items": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "maxItems": 25,
        +            "type": "array"
        +          },
        +          "enabled": {
        +            "description": "Default true: start the watch, or resume a stopped one. false stops it.",
        +            "type": "boolean"
        +          },
        +          "name": {
        +            "description": "Or the exact taxonomy name, instead of topicId.",
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "topicId": {
        +            "description": "A topicId from include.topicVocabulary of campaignstack_get_campaigns. Any taxonomy topic works, including one the campaign does not carry.",
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "op": {
        +        "const": "search_watch",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "campaignId",
        +      "data"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "campaignId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "data": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "scoreImpact": {
        +            "maximum": 100,
        +            "minimum": -100,
        +            "type": "number"
        +          },
        +          "signalType": {
        +            "minLength": 1,
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "signalType",
        +          "scoreImpact"
        +        ],
        +        "type": "object"
        +      },
        +      "op": {
        +        "const": "weight",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "campaignId",
        +      "data"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "data": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "automationId": {
        +            "minLength": 1,
        +            "type": "string"
        +          },
        +          "enabled": {
        +            "type": "boolean"
        +          }
        +        },
        +        "required": [
        +          "automationId",
        +          "enabled"
        +        ],
        +        "type": "object"
        +      },
        +      "op": {
        +        "const": "automation",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "data"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "confirmed": {
        +        "const": true,
        +        "type": "boolean"
        +      },
        +      "icpId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "op": {
        +        "const": "delete_icp",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "icpId",
        +      "confirmed"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "confirmed": {
        +        "const": true,
        +        "type": "boolean"
        +      },
        +      "op": {
        +        "const": "delete_persona",
        +        "type": "string"
        +      },
        +      "personaId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "personaId",
        +      "confirmed"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "clientOperationId": {
        +        "$ref": "#/properties/operations/items/anyOf/0/properties/clientOperationId"
        +      },
        +      "confirmed": {
        +        "const": true,
        +        "type": "boolean"
        +      },
        +      "op": {
        +        "const": "delete_phase",
        +        "type": "string"
        +      },
        +      "phaseId": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "op",
        +      "phaseId",
        +      "confirmed"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcampaignstack_edit_signal_agent1 field changed
      • changedInput schema / properties / operations / items / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "accountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "actAccountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "mode": {
        -        "const": "create",
        -        "type": "string"
        -      },
        -      "name": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "publicReplyConfig": {
        -        "additionalProperties": {
        -          "type": "boolean"
        -        },
        -        "type": "object"
        -      },
        -      "responseMode": {
        -        "enum": [
        -          "auto_send",
        -          "review_first"
        -        ],
        -        "type": "string"
        -      },
        -      "silenceHours": {
        -        "type": "number"
        -      },
        -      "target": {
        -        "anyOf": [
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "kind": {
        -                "const": "profile",
        -                "type": "string"
        -              },
        -              "platform": {
        -                "const": "linkedin",
        -                "type": "string"
        -              },
        -              "url": {
        -                "type": "string"
        -              },
        -              "urn": {
        -                "minLength": 1,
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "platform",
        -              "kind",
        -              "urn"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "groupId": {
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "kind": {
        -                "const": "group",
        -                "type": "string"
        -              },
        -              "platform": {
        -                "const": "linkedin",
        -                "type": "string"
        -              },
        -              "url": {
        -                "minLength": 1,
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "platform",
        -              "kind",
        -              "url",
        -              "groupId"
        -            ],
        -            "type": "object"
        -          },
        -          {
        -            "additionalProperties": false,
        -            "properties": {
        -              "activityId": {
        -                "minLength": 1,
        -                "type": "string"
        -              },
        -              "kind": {
        -                "const": "post",
        -                "type": "string"
        -              },
        -              "platform": {
        -                "const": "linkedin",
        -                "type": "string"
        -              },
        -              "url": {
        -                "minLength": 1,
        -                "type": "string"
        -              }
        -            },
        -            "required": [
        -              "platform",
        -              "kind",
        -              "url",
        -              "activityId"
        -            ],
        -            "type": "object"
        -          }
        -        ]
        -      },
        -      "targetName": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "type": {
        -        "enum": [
        -          "profile_feed",
        -          "company_feed",
        -          "group_watch",
        -          "post_engagement"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "name",
        -      "type",
        -      "target",
        -      "targetName",
        -      "responseMode",
        -      "accountIds",
        -      "actAccountIds"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "accountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "actAccountIds": {
        -        "items": {
        -          "minLength": 1,
        -          "type": "string"
        -        },
        -        "maxItems": 25,
        -        "type": "array"
        -      },
        -      "agentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "agentScript": {
        -        "type": "string"
        -      },
        -      "mode": {
        -        "const": "update",
        -        "type": "string"
        -      },
        -      "name": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "publicReplyConfig": {
        -        "additionalProperties": {
        -          "type": "boolean"
        -        },
        -        "type": "object"
        -      },
        -      "responseMode": {
        -        "enum": [
        -          "auto_send",
        -          "review_first"
        -        ],
        -        "type": "string"
        -      },
        -      "silenceHours": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "agentId"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "agentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "confirmDelete": {
        -        "description": "Required (must be true) when status is 'archived': archiving here runs the same permanent removal as campaignstack_delete_signal_agent. 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.",
        -        "type": "boolean"
        -      },
        -      "mode": {
        -        "const": "set_status",
        -        "type": "string"
        -      },
        -      "status": {
        -        "enum": [
        -          "active",
        -          "paused",
        -          "archived"
        -        ],
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "agentId",
        -      "status"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "agentId": {
        -        "minLength": 1,
        -        "type": "string"
        -      },
        -      "exclusions": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "config": {},
        -            "enabled": {
        -              "default": true,
        -              "type": "boolean"
        -            },
        -            "id": {
        -              "minLength": 1,
        -              "type": "string"
        -            },
        -            "state": {},
        -            "type": {
        -              "minLength": 1,
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "type"
        -          ],
        -          "type": "object"
        -        },
        -        "maxItems": 100,
        -        "type": "array"
        -      },
        -      "mode": {
        -        "const": "set_exclusions",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "agentId",
        -      "exclusions"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "additionalProperties": false,
        -    "properties": {
        -      "mode": {
        -        "const": "restore_guidance",
        -        "type": "string"
        -      },
        -      "versionId": {
        -        "description": "versionId of a previous agentScript version to restore.",
        -        "minLength": 1,
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "mode",
        -      "versionId"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "accountIds": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "actAccountIds": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "mode": {
        +        "const": "create",
        +        "type": "string"
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "publicReplyConfig": {
        +        "additionalProperties": {
        +          "type": "boolean"
        +        },
        +        "type": "object"
        +      },
        +      "responseMode": {
        +        "enum": [
        +          "auto_send",
        +          "review_first"
        +        ],
        +        "type": "string"
        +      },
        +      "silenceHours": {
        +        "type": "number"
        +      },
        +      "target": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "kind": {
        +                "const": "profile",
        +                "type": "string"
        +              },
        +              "platform": {
        +                "const": "linkedin",
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              },
        +              "urn": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "platform",
        +              "kind",
        +              "urn"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "groupId": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "kind": {
        +                "const": "group",
        +                "type": "string"
        +              },
        +              "platform": {
        +                "const": "linkedin",
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "platform",
        +              "kind",
        +              "url",
        +              "groupId"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "activityId": {
        +                "minLength": 1,
        +                "type": "string"
        +              },
        +              "kind": {
        +                "const": "post",
        +                "type": "string"
        +              },
        +              "platform": {
        +                "const": "linkedin",
        +                "type": "string"
        +              },
        +              "url": {
        +                "minLength": 1,
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "platform",
        +              "kind",
        +              "url",
        +              "activityId"
        +            ],
        +            "type": "object"
        +          }
        +        ]
        +      },
        +      "targetName": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "type": {
        +        "enum": [
        +          "profile_feed",
        +          "company_feed",
        +          "group_watch",
        +          "post_engagement"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "name",
        +      "type",
        +      "target",
        +      "targetName",
        +      "responseMode",
        +      "accountIds",
        +      "actAccountIds"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "accountIds": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "actAccountIds": {
        +        "items": {
        +          "minLength": 1,
        +          "type": "string"
        +        },
        +        "maxItems": 25,
        +        "type": "array"
        +      },
        +      "agentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "agentScript": {
        +        "type": "string"
        +      },
        +      "mode": {
        +        "const": "update",
        +        "type": "string"
        +      },
        +      "name": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "publicReplyConfig": {
        +        "additionalProperties": {
        +          "type": "boolean"
        +        },
        +        "type": "object"
        +      },
        +      "responseMode": {
        +        "enum": [
        +          "auto_send",
        +          "review_first"
        +        ],
        +        "type": "string"
        +      },
        +      "silenceHours": {
        +        "type": "number"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "agentId"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "agentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "confirmed": {
        +        "description": "Required (must be true) when status is 'archived': archiving here runs the same permanent removal as campaignstack_delete_signal_agent. 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.",
        +        "type": "boolean"
        +      },
        +      "mode": {
        +        "const": "set_status",
        +        "type": "string"
        +      },
        +      "status": {
        +        "enum": [
        +          "active",
        +          "paused",
        +          "archived"
        +        ],
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "agentId",
        +      "status"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "agentId": {
        +        "minLength": 1,
        +        "type": "string"
        +      },
        +      "exclusions": {
        +        "items": {
        +          "additionalProperties": false,
        +          "properties": {
        +            "config": {},
        +            "enabled": {
        +              "default": true,
        +              "type": "boolean"
        +            },
        +            "id": {
        +              "minLength": 1,
        +              "type": "string"
        +            },
        +            "state": {},
        +            "type": {
        +              "minLength": 1,
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "id",
        +            "type"
        +          ],
        +          "type": "object"
        +        },
        +        "maxItems": 100,
        +        "type": "array"
        +      },
        +      "mode": {
        +        "const": "set_exclusions",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "agentId",
        +      "exclusions"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "additionalProperties": false,
        +    "properties": {
        +      "mode": {
        +        "const": "restore_guidance",
        +        "type": "string"
        +      },
        +      "versionId": {
        +        "description": "versionId of a previous agentScript version to restore.",
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "mode",
        +      "versionId"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Changedcampaignstack_edit_workspace12 fields changed
      • changedInput schema / properties / settings / properties / jevFeatures / properties / agentGuard / $ref
        Previous value: -"#/properties/settings/properties/jevFeatures/properties/replyIntent"New value: +"#/properties/settings/properties/jevFeatures/properties/confidenceGate"
      • addedInput schema / properties / settings / properties / jevFeatures / properties / applicationPrefill
        Added value: +{
        +  "$ref": "#/properties/settings/properties/jevFeatures/properties/confidenceGate"
        +}
      • changedInput schema / properties / settings / properties / jevFeatures / properties / briefIntent / $ref
        Previous value: -"#/properties/settings/properties/jevFeatures/properties/replyIntent"New value: +"#/properties/settings/properties/jevFeatures/properties/confidenceGate"
      • removedInput schema / properties / settings / properties / jevFeatures / properties / confidenceGate / $ref
        Removed value: -"#/properties/settings/properties/jevFeatures/properties/replyIntent"
      • addedInput schema / properties / settings / properties / jevFeatures / properties / confidenceGate / enum
        Added value: +[
        +  "off",
        +  "shadow",
        +  "live"
        +]
      • addedInput schema / properties / settings / properties / jevFeatures / properties / confidenceGate / type
        Added value: +"string"
      • removedInput schema / properties / settings / properties / jevFeatures / properties / critic
        Removed value: -{
        -  "$ref": "#/properties/settings/properties/jevFeatures/properties/replyIntent"
        -}
      • changedInput schema / properties / settings / properties / jevFeatures / properties / draftLabels / $ref
        Previous value: -"#/properties/settings/properties/jevFeatures/properties/replyIntent"New value: +"#/properties/settings/properties/jevFeatures/properties/confidenceGate"
      • addedInput schema / properties / settings / properties / jevFeatures / properties / memoryMatch
        Added value: +{
        +  "$ref": "#/properties/settings/properties/jevFeatures/properties/confidenceGate"
        +}
      • addedInput schema / properties / settings / properties / jevFeatures / properties / profileMatch
        Added value: +{
        +  "$ref": "#/properties/settings/properties/jevFeatures/properties/confidenceGate"
        +}
      • removedInput schema / properties / settings / properties / jevFeatures / properties / replyIntent
        Removed value: -{
        -  "enum": [
        -    "off",
        -    "shadow",
        -    "live"
        -  ],
        -  "type": "string"
        -}
      • addedInput schema / properties / settings / properties / jevFeatures / properties / replyRank
        Added value: +{
        +  "$ref": "#/properties/settings/properties/jevFeatures/properties/confidenceGate"
        +}
    • Changedcampaignstack_get_workspace_memories3 fields changed
      • addedInput schema / properties / cursor
        Added value: +{
        +  "description": "pagination.nextCursor from the previous page.",
        +  "type": "string"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Page size, default 50, at most 100.",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / data / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "additionalProperties": true,
        -      "properties": {
        -        "category": {
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        },
        -        "content": {
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        },
        -        "createdAt": {
        -          "type": [
        -            "number",
        -            "null"
        -          ]
        -        },
        -        "id": {
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        },
        -        "leadId": {
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        },
        -        "source": {
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        },
        -        "status": {
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        },
        -        "title": {
        -          "type": [
        -            "string",
        -            "null"
        -          ]
        -        }
        -      },
        -      "type": "object"
        -    },
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "properties": {
        +        "category": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "content": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "createdAt": {
        +          "type": [
        +            "number",
        +            "null"
        +          ]
        +        },
        +        "direction": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "id": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "leadId": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "observations": {
        +          "type": [
        +            "number",
        +            "null"
        +          ]
        +        },
        +        "source": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "status": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        },
        +        "title": {
        +          "type": [
        +            "string",
        +            "null"
        +          ]
        +        }
        +      },
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to find intent-signaling buyers and run LinkedIn, email, and X outreach from connected accounts while respecting platform limits. Every reply is handed back to a human for approval or decision.
    3
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to build, preview, launch, and monitor LinkedIn outbound campaigns, draft replies for approval, manage campaign settings, and upgrade profiles.
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to connect to a hosted multichannel B2B outbound engine for LinkedIn messaging, cold email sequencing, and pipeline management, including campaign reads and prospect research. Write actions that send, launch, enroll, or spend credits require chat confirmation before completing.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources