campaignstack
Server Details
Run B2B outreach from your AI agent: 250+ tools for campaigns, leads, LinkedIn and email workflows.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 243 tools
With 243 tools, multiple families overlap heavily: six ways to create watches (signal agent, signal watch, company employee watch, search watch, competitor watch, account watcher) and four list tools for watchers alone. Even with detailed cross-references, an agent can easily grab the wrong tool for a monitoring task.
The vast majority follow a consistent campaignstack_verb_noun pattern (list_x, get_x, create_x, update_x, delete_x, pause_x, resume_x). Minor outliers like campaignstack_whoami and campaignstack_explain_capabilities break the convention, but they are isolated exceptions.
243 tools is an extreme count, far beyond any well-scoped server; even the rubric's 25+ heavy category is far exceeded. This surface would be far more navigable split into several domain-specific servers.
Coverage is exhaustive: full CRUD lifecycles for campaigns, workflows, ICPs, lead lists, content posts, personas, and phases, plus billing, compliance, branding, notifications, voice, exclusions, audit trails, and even feedback submission. No obvious dead ends or missing lifecycle operations are apparent.
Available Tools
243 toolscampaignstack_accept_draft_checkupAInspect
Accept the pending draft checkup: applies the proposed text to its target (intent detail, playbook section, or offer context) through the same caps and version snapshots as a manual edit. Call this only when the user has read the proposal from campaignstack_get_draft_checkup and approved it. Fails when the targeted text changed since the checkup ran; run a new checkup in that case.
| Name | Required | Description | Default |
|---|---|---|---|
| checkupId | Yes | Pending checkup id from campaignstack_get_draft_checkup | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| decision | No | |
| checkupId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate it is a mutation (readOnlyHint false) and not idempotent (idempotentHint false). The description adds meaningful behavior: it applies the same caps and version snapshots as a manual edit, and it fails if the targeted text changed since the checkup, which implies concurrency sensitivity. It does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence states the core action and target, the second gives the precondition and failure handling. Information is front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the action, preconditions, failure behavior, and references the sibling tool for obtaining the checkup. An output schema exists to describe the return value. It lacks nothing essential for correct invocation, though it could mention explicit side effects like creating a version snapshot (already implied by 'version snapshots').
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters have descriptive text. The description itself does not add extra parameter semantics beyond what the schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (accept a pending draft checkup) and the result (applies proposed text to a target, listing the three target types). It distinguishes itself from the sibling get_draft_checkup by requiring prior reading and approval, and from reject_draft_checkup by being the acceptance action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call: only after the user has read and approved the proposal from campaignstack_get_draft_checkup. It also provides a failure condition and instructs to run a new checkup. It does not name alternative rejection tools, but the when-to-call condition is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_add_leads_to_listAIdempotentInspect
Add leads to an existing lead list. Idempotent -- leads already in the list are skipped. Each leadRef needs leadSource (default 'global') and leadId. Returns counts added and already-present. Call this to add named people to a list that already exists: campaignstack_create_lead_list makes a new one. Use campaignstack_list_lead_lists to find lead list IDs and campaignstack_search_leads to find lead IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| leadRefs | Yes | ||
| leadListId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| added | No | |
| alreadyInList | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint=true, readOnlyHint=false, and destructiveHint=false, so the bar for the description is lower. The description adds concrete behavioral context beyond the hints: what idempotency means in practice ('leads already in the list are skipped') and the return shape ('counts added and already-present'). No auth or rate-limit context, but the description meaningfully supplements 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with each earning its place: purpose, idempotency semantics, parameter structure/returns, and usage routing to siblings. Front-loaded with the core action and zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values, annotations cover the safety profile, and the description covers purpose, idempotent behavior, parameter composition, and lookup strategy for IDs. The only untold details (array max, enum values) are already in the input schema, so this is highly complete for a moderate-complexity tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden. It explains the leadRef structure (each needs leadId and leadSource with default 'global') and clarifies the leadListId referent ('existing lead list'). It doesn't explicitly narrate the 100-item cap or enum values, but it compensates well for the schema's lack of descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Add leads to an existing lead list" states a specific verb, resource, and scope. It explicitly differentiates from the sibling campaignstack_create_lead_list by noting that tool makes a new list, and the idempotency note sharpens the behavioral purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to call it ('add named people to a list that already exists') and names the exact alternatives: campaignstack_create_lead_list for new lists, campaignstack_list_lead_lists for finding list IDs, and campaignstack_search_leads for finding lead IDs. 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_add_lead_to_external_listADestructiveIdempotentInspect
Add one lead to an external provider's lead list (provider-parameterized: instantly, hubspot or clay). Call this after campaignstack_list_external_lead_lists has given you a real list id and the user confirms sending this lead there. For clay the target is a registered Clay table: the push goes to the table's webhook source fire-and-forget (no provider lead id comes back, a campaignstack_dedupe_key field rides along for table-side dedup) and leads with only a LinkedIn URL qualify. Otherwise the lead is created by email on the provider side. Neither starts any outreach, unlike campaignstack_add_lead_to_sequence: the contact just becomes available in the provider (e.g. to attach to a campaign later). Duplicate adds to the same list are idempotent successes (status already_present). Set skipIfInWorkspace to skip leads that already exist anywhere in the provider workspace. Free: no CampaignStack credits. Returns status: added, already_present, skipped_no_email (lead has no email), or error (e.g. INTEGRATION_NOT_CONNECTED, LEAD_NOT_FOUND). Use campaignstack_list_external_lead_lists for list ids. For CampaignStack's OWN lead lists use campaignstack_add_leads_to_list instead (inside a workflow, the integration:add_to_list node also accepts provider campaignstack).
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| listId | Yes | Provider-side lead list id (from campaignstack_list_external_lead_lists). | |
| provider | Yes | Integration provider that owns the lead list. | |
| leadSource | No | Lead source table (default: global). Private leads are workspace-scoped CSV imports. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| skipIfInWorkspace | No | Skip the lead if its email already exists anywhere in the provider workspace, in any campaign or list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| provider | No | |
| providerLeadId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state read-only false, open-world true, idempotent true, destructive true. The description enriches these with concrete behavioral details: clay's fire-and-forget webhook push with no provider lead id and a dedupe key, email-based creation for other providers, idempotent already_present status, skipIfInWorkspace semantics, zero credit cost, and specific error codes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the core action, but it repeats the external-list-id source twice and packs many clauses into one long paragraph. Every sentence earns its place, though light restructuring and removal of the repeated mention would tighten it further.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity—provider parameterization, idempotency, prerequisites, return statuses, and integration differences—the description covers all invocation-critical context: required prior call, user confirmation, clay vs. email behavior, statuses, error examples, and an explicit alternative for internal lists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, but the description goes well beyond the schema by explaining list id provenance, workspaceId key-type behavior (csu_ vs cs_), leadSource default and private CSV scope, clay-specific lead qualification (LinkedIn only), and the meaning of skipIfInWorkspace. It resolves ambiguity the schema leaves open.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource: 'Add one lead to an external provider's lead list' and names the three providers. It actively differentiates itself from siblings by stating it does not start outreach (unlike campaignstack_add_lead_to_sequence) and is not for CampaignStack's own lists (use campaignstack_add_leads_to_list).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is present: call only after campaignstack_list_external_lead_lists has supplied a real list id and the user confirms. It also names the alternative for internal lead lists and explains the workflow node equivalence. No ambiguity remains about when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_add_lead_to_sequenceADestructiveIdempotentInspect
Add one lead to an external provider's sequence (provider-parameterized: apollo sequences, instantly campaigns). Call this after campaignstack_list_external_sequences gives a real sequence id. Starts outreach on the PROVIDER's side: for a CampaignStack workflow, use campaignstack_trigger_workflow instead. The lead is resolved by email on the provider side (Apollo creates the contact in the tenant's account if it does not exist yet). Apollo also requires emailAccountId (a sending mailbox id). Duplicate adds are idempotent successes (status already_present). Set activateSequence to start an Apollo sequence after adding (best-effort: a sequence that is already active is left as is). Instantly handoffs are recorded so reply/bounce/unsubscribe state syncs back automatically. Free: no CampaignStack credits. Returns status: added, already_present, skipped_no_email (lead has no email), or error (e.g. INTEGRATION_NOT_CONNECTED, INTEGRATION_KEY_INSUFFICIENT_SCOPE when an Apollo key is not a master API key, LEAD_NOT_FOUND). Use campaignstack_list_external_sequences for sequence ids and campaignstack_list_external_email_accounts for Apollo mailbox ids.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| provider | Yes | Integration provider that owns the sequence. | |
| campaignId | Yes | Provider-side sequence id (from campaignstack_list_external_sequences). | |
| leadSource | No | Lead source table (default: global). Private leads are workspace-scoped CSV imports. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| emailAccountId | No | Provider-side sending mailbox id. REQUIRED for apollo (from campaignstack_list_external_email_accounts); unused by instantly. | |
| activateSequence | No | Start the sequence after adding if it is not running yet (best-effort). Apollo only. | |
| skipIfInWorkspace | No | Skip the lead if its email already exists anywhere in the provider workspace, not just this sequence. Instantly only. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| provider | No | |
| providerContactId | No | |
| sequenceActivated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with annotations covering idempotency and side effects, the description adds substantial provider-side behavioral context: lead resolution by email, Apollo auto-creating contacts, emailAccountId requirements, idempotent duplicate statuses, best-effort activation, Instantly handoff sync, zero credit usage, and exact return statuses. This goes well beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds operational value: prerequisites, provider distinctions, idempotency, activation behavior, sync behavior, cost, and return vocabulary. The most important action and routing guidance are front-loaded, with supporting details following logically.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description covers preconditions, provider-specific parameter needs, idempotency semantics, free usage, and return/error values. An output schema exists, so return-value documentation is not necessary. The agent has everything needed to invoke and interpret the call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 88%, so the baseline is 3, but the description enriches key parameters: it explains provider-specific emailAccountId requirements, activateSequence best-effort semantics, skipIfInWorkspace being Instantly-only, and how campaignId is obtained. It does not add much for leadSource or workspaceId, which are already well described in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Add one lead to an external provider's sequence,' and immediately clarifies provider-parameterized behavior (apollo sequences, instantly campaigns). It explicitly distinguishes itself from campaignstack_trigger_workflow, which is the closest conceptual alternative, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit sequencing guidance: call after campaignstack_list_external_sequences returns a real sequence id, and use campaignstack_list_external_email_accounts for Apollo mailbox ids. It also states the exclusion condition clearly: for a CampaignStack workflow, use campaignstack_trigger_workflow instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_add_manual_exclusion_urlsAInspect
Add LinkedIn profile URLs to a manual exclusion entry, so CampaignStack never contacts them. Each URL is validated and normalized. Duplicate URLs within the same exclusion are skipped and reported. Returns per-URL results indicating success or error. Call this when the user names specific people to block workspace-wide. To take a URL back off the list, use campaignstack_remove_manual_exclusion_url. Use campaignstack_get_exclusions to find exclusionId values for manual exclusion entries. Use campaignstack_list_signal_agents to find signal agents.
| Name | Required | Description | Default |
|---|---|---|---|
| exclusionId | Yes | ||
| profileUrls | Yes | LinkedIn profile URLs to add to the exclusion list | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | No | |
| exclusionId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
All annotation hints are false, so the description carries the transparency burden. It discloses validation/normalization, duplicate handling (skipped and reported), per-URL success/error results, and the workspace-wide blocking effect. This is strong behavioral detail for a mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, behavior, and trigger, then provides routing guidance. The final sentence about listing signal agents is somewhat tangential and does not fully earn its place, so it is not a perfect 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition covers the trigger, prerequisite lookup for exclusionId, duplicate behavior, return behavior, and the inverse operation, while the output schema covers return structure. The only notable gap is the unclear relationship between manual exclusion entries and signal agents.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
profileUrls and workspaceId are already documented in the schema, and the description adds meaningful normalization/deduplication context. exclusionId lacks schema-level description, but the description compensates by directing the agent to campaignstack_get_exclusions to find it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names the exact operation ('Add'), the object ('manual exclusion entry'), and the outcome ('CampaignStack never contacts them'). It also distinguishes itself from the closest sibling by explicitly mentioning the removal counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger: 'Call this when the user names specific people to block workspace-wide.' It also names the inverse tool for removal and tells the agent where to find exclusionId values, making selection and prerequisites clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_analyze_websiteARead-onlyIdempotentInspect
Read a company's own public website and extract structured company intelligence: name, description, services, market, industry, team size, tech stack and positioning. Call this when the user asks to research a company from its site before a campaign or a draft. Cached 7 days per domain; a repeat call reads the cache. Charges website_intel credits per call; campaignstack_estimate_cost gives the number before you commit.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| industry | No | |
| services | No | |
| teamSize | No | |
| techStack | No | |
| companyName | No | |
| description | No | |
| positioning | No | |
| targetMarket | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false. The description adds meaningful behavioral context beyond those: 'Cached 7 days per domain; a repeat call reads the cache' and 'Charges website_intel credits per call.' It also points to campaignstack_estimate_cost for cost pre-checking, which is valuable operational guidance.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: what the tool does, when to call it, cache behavior, and cost implications. The trigger context is front-loaded, and the operational caveats are compactly appended without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with an output schema present and annotations covering safety and idempotency, the description is complete. It covers the input domain, purpose, trigger conditions, caching, and cost, so an agent has everything needed to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines `url` with format `uri` and no description, and schema coverage is 0%. The description compensates by clarifying that the URL should be a company's own public website and by referencing 'per domain' caching, which informs how the URL parameter is treated. It could add more explicit URL requirements, but with only one simple parameter this is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Read a company's own public website and extract structured company intelligence.' It enumerates exactly what is extracted (name, description, services, market, industry, team size, tech stack, positioning), making the tool's function unmistakable. The phrase 'company's own public website' and the campaign/draft context help distinguish it from sibling enrichment tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger: 'Call this when the user asks to research a company from its site before a campaign or a draft.' This clearly states when to use the tool. It does not explicitly name alternatives or conditions where they would be preferable, 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_apply_agent_memoryAIdempotentInspect
Apply a pending agent memory note now, instead of waiting for a second independent observation to confirm it. Once applied it is used in prompts exactly like an asserted note. Call this after the user reviews a note from campaignstack_list_agent_memories and confirms it is correct. A no-op on a note that is already active.
| Name | Required | Description | Default |
|---|---|---|---|
| memoryId | Yes | Memory id from campaignstack_list_agent_memories | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| status | No | |
| changed | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already communicate mutability, non-destructiveness, and idempotency. The description adds valuable context by explaining the state transition from pending to applied, the consequence for prompt construction, and the concrete no-op behavior on active notes. It does not contradict the annotations and provides meaningful behavior beyond their generic hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no wasted words. It front-loads the primary action, then explains when to use it, and ends with the idempotency caveat. Every sentence adds distinct value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool does, when to call it, what effect it has, and how it behaves on already-active notes. The input schema fully documents both parameters, and an output schema exists, so return-value documentation is not required. The tool is simple enough that nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the input schema. The description reinforces that memoryId comes from campaignstack_list_agent_memories, but it does not add new parameter-level detail beyond what the schema already states. This meets the baseline for full schema coverage without exceeding it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Apply a pending agent memory note now.' It clearly distinguishes the action from the default behavior of waiting for a second independent observation, and it explains the outcome (the note is used in prompts like an asserted note). This makes the tool's purpose immediately identifiable and distinct from sibling memory tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to call the tool: after the user reviews a note from campaignstack_list_agent_memories and confirms it is correct. It also frames the tool as an alternative to waiting for a second observation, and notes that applying an already-active note is a no-op. This gives the agent clear conditional guidance for invoking it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_approve_content_postAInspect
Approves a pending_approval content post and schedules it for publishing. Call this when the user asks to approve a submitted post, after reading its wording back to them. Pass scheduledAt for an exact time, or autoSchedule:true (default) for the next slot. Use campaignstack_reject_content_post to send it back to draft instead.
| Name | Required | Description | Default |
|---|---|---|---|
| scheduledAt | No | Exact publish time. Omit (or set autoSchedule) for the next valid slot. | |
| autoSchedule | No | Auto-place into the next valid posting slot instead of an exact time. Default when scheduledAt is omitted. | |
| contentPostId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| scheduledAt | No | |
| contentPostId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark the tool as non-read-only, non-idempotent, and non-destructive. The description adds the meaningful state transition from pending_approval to approved and scheduled, plus the scheduling default and alternative path. It stops short of describing broader side effects, but the key behavioral effect is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly scoped sentences: action, when-to-use with a workflow step, parameter choice, and rejection alternative. No filler, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema and a clear parameter schema, the description covers what an agent needs: the trigger, the pre-call confirmation behavior, scheduling options/defaults, and the sibling to use for rejection. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents scheduledAt and autoSchedule, so the description's value is in clarifying the 'or' relationship between them and the default ('next slot'). It also reiterates the exact-time vs auto-schedule decision. contentPostId is left to its name/schema, which is sufficient for an identifier.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Approves a pending_approval content post and schedules it for publishing.' It clearly distinguishes from the related reject tool by naming campaignstack_reject_content_post, and the workflow state makes it clear this is not a generic create/schedule action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger ('when the user asks to approve a submitted post'), a prerequisite/confirmation step ('after reading its wording back to them'), and a concrete alternative ('Use campaignstack_reject_content_post to send it back to draft instead'). It also explains how to choose scheduling behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_approve_reviewADestructiveInspect
Approve a pending review entry as-is, no wording change. For a draft parked at a review node, the lead advances via the 'approved' edge. For an escalated entry parked at the acting node (critic-flagged auto-send, agent escalation), approval RESUMES the withheld action, re-dispatched or released through the delivery exit. Call this only after the user has read the draft and says to send it unchanged; for different wording, use campaignstack_edit_and_approve_review instead. Use campaignstack_list_pending_reviews to find entry IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| entryId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| entryId | No | |
| success | No | |
| decision | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry destructiveHint=true and readOnlyHint=false, and the description enriches rather than contradicts them. It explains the mechanism and consequence of the destructive action: drafts advance via the 'approved' edge, and escalated entries get their withheld action RESUMED and re-dispatched/released through the delivery exit. This tells the agent that approving has real irreversible side effects (dispatching messages), which is precisely the behavioral 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence and every subsequent sentence earns its place: draft behavior, escalation behavior, call condition + alternative, and ID sourcing. The only cost is the middle sentence on escalated entries, which is dense with parentheticals ('critic-flagged auto-send, agent escalation') and could be split for readability, but there is zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with high complexity (two conditional behaviors, destructive dispatch side effects, a required user-confirmation precondition), the description is complete: both parked-node scenarios are covered, the mutating consequences are spelled out, the alternative tool is routed, and ID sourcing is provided. An output schema exists, so return-value explanation is unnecessary, and the idempotentHint=false annotation covers repeat-call risk.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%; workspaceId's rich semantics live in the schema, and entryId has none. The description compensates by telling the agent where to obtain entryId values ('Use campaignstack_list_pending_reviews to find entry IDs'), which is actionable beyond the schema. The meaning of entryId as the review-entry identifier is clear from context, though it is never explicitly defined — a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+qualifier: 'Approve a pending review entry as-is, no wording change.' It then distinguishes itself from campaignstack_edit_and_approve_review by naming the exact condition that selects the sibling, and explains the two distinct approval semantics (draft advancing via the 'approved' edge vs. escalated entries resuming a withheld action). Unambiguous even among 300+ siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit call conditions: 'Call this only after the user has read the draft and says to send it unchanged.' It also states the exclusion ('for different wording, use campaignstack_edit_and_approve_review instead') and provides the ID-lookup path ('Use campaignstack_list_pending_reviews to find entry IDs'). All three routing questions — when, when-not, alternative — are answered directly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_archive_campaignADestructiveInspect
Archive a campaign. WARNING: this STOPS the campaign's work, and the stop is one-way. Every workflow in the campaign is paused and every automation is disabled, including search watches. Unarchiving brings the campaign back but does NOT restart any of them - you have to re-enable each one deliberately. Call this only when the user names the campaign and confirms they want its outreach stopped, not just hidden. No data is deleted: leads already in flight stay parked rather than cancelled, and the campaign keeps its history. To remove it and its data entirely, use campaignstack_delete_campaign instead. Use campaignstack_unarchive_campaign to bring it back, and campaignstack_list_campaigns with includeArchived to find archived campaigns. If the campaign is not found, use campaignstack_list_campaigns to find valid IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| archived | No | |
| campaignId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructiveHint=true崗, but the description goes far beyond: it details that the stop is one-way, all workflows and automations pause, unarchiving does NOT restart them, leads stay parked, and no data is deleted. This is exactly the kind of behavioral context annotations cannot capture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but for a destructive, irreversible action every sentence earns its place. The critical warning is front-loaded ('WARNING: this STOPS the campaign's work'), followed by consequences, data safety reassurance, and alternatives. No redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the action's complexity and irreversible side effects, the description covers all essential context: what stops, what does not restart, data preservation, error handling, and sibling routes. An output schema exists, so return-value details are not needed. Nothing an agent needs to call correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has a single campaignId with no description (0% coverage). The description does not explain campaignId's format, but it does say 'If the campaign is not found, use campaignstack_list_campaigns to find valid IDs,' which indirectly guides the agent on where to obtain the value. This is minimal but sufficient for a self-explanatory ID parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with 'Archive a campaign' – a specific verb and resource. It immediately distinguishes itself from sibling tools like campaignstack_delete_campaign, campaignstack_unarchive_campaign, and campaignstack_list_campaigns, making its purpose unmistakable even among a huge sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call: 'only when the user names the campaign and confirms they want its outreach stopped, not just hidden.' It also names alternatives for deletion, unarchiving, and finding valid campaign IDs, giving the agent clear routing logic.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_archive_signal_agentADestructiveInspect
Archive a signal agent. Stops polling, pauses the linked workflow, disables all watched posts, and clears competitor watch linkage. Call this when the user asks to shut a watcher down for good rather than pause it for a while. Recoverable: nothing is deleted, the signals, leads and posts it gathered stay, and campaignstack_list_signal_agents with includeArchived shows it. To stop it temporarily instead, use campaignstack_pause_signal_agent. Use campaignstack_list_signal_agents to find agent IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| agentId | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already flag destructiveHint=true, the description adds detailed behavioral context: stops polling, pauses linked workflow, disables watched posts, clears competitor watch linkage, and is recoverable with data retained and visible via includeArchived. This goes well beyond the annotations and paints a complete picture of side effects and reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three efficient sentences: first states the action and effects, second explains when to use it and the recoverability, third names the alternative and the ID-lookup tool. Every sentence earns its place, and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one parameter, an output schema, and annotations covering safety, the description is complete. It explains the operational consequences, the difference from pausing/deleting, the recovery behavior, and how to obtain the agent ID. An agent can correctly select and invoke this tool without further research.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter (agentId) and the schema provides no description, so the description must compensate at 0% coverage. It does not explicitly define agentId, but the tool name and opening sentence make the semantic clear, and it provides a concrete way to obtain valid values ('Use campaignstack_list_signal_agents to find agent IDs'). This is sufficient for a single obvious parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('Archive a signal agent') and enumerates exactly what archiving does (stops polling, pauses workflow, disables watched posts, clears competitor watch linkage). It explicitly distinguishes itself from pausing and deleting, leaving no ambiguity about the tool's purpose relative to siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit when-to-use condition ('when the user asks to shut a watcher down for good rather than pause it for a while') and names the alternative tool for temporary stops (campaignstack_pause_signal_agent). It also directs the agent to campaignstack_list_signal_agents for finding agent IDs, so the invocation path is fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_build_search_urlARead-onlyIdempotentInspect
Build a LinkedIn People search URL from ICP (Ideal Customer Profile) criteria: titles, industries, locations, seniorities, company sizes, and keywords. Call this when the user wants a LinkedIn search link built from an ICP's criteria, for example to open themselves or hand to a browsing step. It does not run the search or return any leads itself: pass whatever it finds through campaignstack_queue_leads to bring results in. Use campaignstack_list_icps to get ICP criteria for a campaign, then pass them here.
| Name | Required | Description | Default |
|---|---|---|---|
| titles | No | ||
| keywords | No | ||
| locations | No | ||
| industries | No | ||
| seniorities | No | ||
| companySizes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| searchUrl | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds the crucial behavioral detail that the tool does not run the search or return leads itself, which is not explicitly covered by the annotations. It also clarifies the output is a URL to be passed elsewhere, providing useful context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the purpose in the first sentence. Each sentence adds distinct value: what it does, when to use it (and what it doesn't do), and the recommended workflow. There is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (building a URL) and the presence of an output schema (likely defining the URL return), the description covers the essential aspects: purpose, non-search behavior, and chaining with list_icps and queue_leads. It could mention that all parameters are optional, but that is implied by the schema having no required fields. Overall, it is complete for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It enumerates all six parameter names (titles, industries, locations, seniorities, company sizes, keywords), which helps map user intent to parameters. However, it does not explain the structure of locations (object with raw, city, region, country) or the array nature of the fields, leaving the agent to rely on the schema for that detail. The description adds some meaning but does not fully compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool builds a LinkedIn People search URL from ICP criteria, listing the specific criteria fields. It distinguishes itself from search tools by explicitly noting it does not run the search or return leads, setting it apart from siblings like campaignstack_search_leads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit usage context: 'Call this when the user wants a LinkedIn search link built from an ICP's criteria.' It also gives a workflow, instructing to use campaignstack_list_icps first and then pass criteria here, and mentions passing results to campaignstack_queue_leads, effectively routing the agent to the correct sequence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_cancel_node_leadsADestructiveInspect
Cancel the drainable leads at a workflow node (WAITING, WAITING_FOR_EVENT, PENDING_REVIEW entries are marked cancelled). PROCESSING leads have a live runner job and are left to finish on their own; the response reports how many remain. Call this after campaignstack_update_workflow or a node deletion is rejected with NODE_HAS_ACTIVE_LEADS, to drain the node, then retry the graph change. It cancels queued work only, never a message already sent: there is no way to recall one. Use campaignstack_get_workflow to find node IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodeId | No | |
| cancelled | No | |
| stillProcessing | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=true, but the description adds depth by explaining that PROCESSING leads are left to finish (due to live runner jobs), that the response reports how many remain, and that only queued work is cancelled—never already-sent messages. This goes beyond the annotation and provides critical behavioral context without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet information-dense. It front-loads the primary action and scope, then provides contextual trigger conditions, exclusionary notes, and a reference to a sibling tool. Every sentence serves a purpose; no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive operation on workflow nodes, the description covers what leads are affected, what happens to PROCESSING leads, how the response reports remaining leads, when to call the tool, and where to obtain node IDs. It also clarifies the irreversible nature of sent messages. Since an output schema exists, return-value details are not required. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: workspaceId has a thorough description, but nodeId has none. The tool description does not directly explain nodeId, though it advises using campaignstack_get_workflow to find node IDs, which gives a hint. This partially compensates but does not fully define the parameter's purpose or format. The description adds little beyond what the schema already provides for workspaceId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (cancel) and the specific resource (drainable leads at a workflow node), enumerates which lead statuses are affected (WAITING, WAITING_FOR_EVENT, PENDING_REVIEW) and which are not (PROCESSING). It distinguishes itself from siblings by specifying the exact scope of cancellation and the outcome reporting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool: after campaignstack_update_workflow or when a node deletion is rejected with NODE_HAS_ACTIVE_LEADS, to drain the node before retrying the graph change. It also provides a pointer to campaignstack_get_workflow for finding node IDs, and warns against expecting recall of already-sent messages. This is exemplary when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_comment_on_postADestructiveInspect
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_comment, 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_list_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: put the leads in a lead list with campaignstack_add_leads_to_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Sending is paced by CampaignStack's own daily and weekly limits and business hours, which are set by a human in the app and are not writable from here; see overrideOwnLimits before asking for an exception.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | No | ||
| platform | Yes | ||
| accountId | No | ||
| profileUrl | No | ||
| commentText | Yes | ||
| overrideOwnLimits | No | 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. | |
| dangerouslyBypassSafetySystem | No | Deprecated name for overrideOwnLimits. Use overrideOwnLimits. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | No | |
| status | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true, and the description builds on this by detailing the consequences: 'A comment is public and stays under the owner's name. This reaches a real person. ... goes out as soon as this call succeeds: there is no draft state and nothing to recall.' It also covers non-writable limits (daily/weekly limits, business hours) set by humans, and the overrideOwnLimits semantics. No contradiction; the description enriches beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded with the core purpose and usage conditions. It packs crucial safety and approval steps into dense prose. It is arguably verbose, with multiple clauses that could be trimmed, but every sentence adds necessary guidance. Efficient given the complexity and risk.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high complexity and destructive nature, the description covers all critical aspects: when to call, pre-call approvals, public consequence, lack of draft, no bulk form, pacing, and override limits. It also mentions the audit log for overrides. The output schema exists, so return format is covered. No significant gaps for an agent to misuse.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low (29%), but the description explains several parameters: 'platform is required (currently "linkedin")', 'leadId' vs 'profileUrl', 'commentText must be the owner's own words', and 'accountId' is optional. However, it does not cover all parameters (e.g., overrideOwnLimits has a detailed schema description but description only references 'overrideOwnLimits' without full semantics, though that's in schema). Baseline 3 is appropriate because the description compensates partially for low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'post a comment on a lead's most recent post from a connected LinkedIn account.' It clearly distinguishes the target (most recent post) and platform, and names sibling tools (campaignstack_craft_comment, campaignstack_submit_comment_for_review) for alternatives. This differentiates it from the large sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to call: 'when the user has approved specific comment wording for a specific lead's post.' It also says when NOT to use it: if comment is not approved, use craft or submit for review instead. It provides clear alternatives for bulk sending (lead list + workflow) and mentions pacing and override limits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_connect_apolloAInspect
Connect an Apollo.io account by providing an API key. Call this when the user gives you an Apollo API key and asks to connect it. Validates the key and stores the integration. Returns success: true when valid, success: false (integrationId still created) when the key fails validation. Refused over a connected-app (chat) connection: point the user at CampaignStack Settings, Integrations instead; an API key can still call this directly. Use campaignstack_list_external_lead_lists with provider "apollo" to browse contact lists after.
| Name | Required | Description | Default |
|---|---|---|---|
| apiKey | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| integrationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the sparse annotations by disclosing that the key is validated, the integration is stored, and that success: false still creates an integrationId when validation fails. Also explains refusal behavior over connected-app connections. These are non-obvious side effects an agent needs to know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose, trigger, validation behavior, failure behavior, connection-channel refusal, and a post-connection next step. Dense but well-organized and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition is complete for an agent to select and call the tool correctly: it covers the trigger, the key input, failure semantics, an alternative path, and follow-up usage. The output schema exists, so return values do not need to be re-explained, and the workspaceId nuances are documented in the input schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning to the undocumented apiKey parameter by identifying it as an Apollo API key. The workspaceId parameter is fully explained in the schema, including the csu_ vs cs_ key distinction and how campaignstack_whoami helps determine which applies. The description does not repeat schema details but covers the one parameter lacking schema-level documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('Connect an Apollo.io account') and the required input ('API key'). Clearly distinguishes it from sibling connection tools like campaignstack_connect_hubspot and campaignstack_connect_instantly by naming the provider and the exact trigger condition.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call: 'Call this when the user gives you an Apollo API key and asks to connect it.' Also gives an exclusion case (connected-app chat connections) and directs the user to Settings, Integrations instead, while noting an API key can still call this directly. It even suggests the next step with campaignstack_list_external_lead_lists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_connect_hubspotAInspect
Connect a HubSpot portal by providing a Private App access token (pat-na1- or pat-eu1- prefix). Call this when the user gives you that token and asks to connect it. Validates the token against the HubSpot CRM API (read ping + write-scope probe) and stores the integration. The private app must have crm.objects.contacts.read and crm.objects.contacts.write scopes; crm.objects.companies.read/write and crm.schemas.contacts.write are optional (company association + source tag). Returns success: true when the token is valid. On failure, errorCode is one of invalid_format, invalid_token, missing_scopes (errorDetail names the scopes), rate_limited, validation, unreachable. Note on missing_scopes: HubSpot reports subscription-tier gating with the same error, naming a scope the portal can never be granted (the Leads object needs Sales Hub Professional/Enterprise). If a scope is ticked in the private app UI but still reported missing, the portal tier is the cause, not the scope set. The token is never echoed back. Refused over a connected-app (chat) connection: point the user at CampaignStack Settings, Integrations instead; an API key can still call this. HubSpot is in beta: not every path is verified against a live portal yet.
| Name | Required | Description | Default |
|---|---|---|---|
| apiKey | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| errorCode | No | |
| errorDetail | No | |
| integrationId | No | |
| sourceProperty | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (only booleans), so the description carries the full burden. It discloses that the tool validates the token via a 'read ping + write-scope probe,' stores the integration, never echoes the token back, and returns specific error codes with details. It even explains the nuanced missing_scopes behavior around subscription-tier gating and notes the beta status. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense with necessary information and front-loads the core action and token format. Every subsequent sentence adds practical value: validation method, scopes, error codes, edge cases, and restrictions. The flow is logical and avoids redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex connection tool, it covers the action, input requirements, validation, error handling, scope prerequisites, channel restrictions, and beta caveat. The output schema exists and the description mentions the success/error shape (success true, errorCode), so an agent has enough to invoke and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: apiKey has only a minLength, while workspaceId has a detailed schema description. The description compensates for apiKey by specifying the required prefix (pat-na1- or pat-eu1-), the scopes needed, and the validation logic. It doesn't need to repeat workspaceId because the schema already covers it comprehensively.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Connect a HubSpot portal by providing a Private App access token.' It immediately distinguishes this from sibling connect tools (Apollo, Instantly) by naming HubSpot and the token prefix format. The trigger condition is explicit: 'Call this when the user gives you that token and asks to connect it.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear when-to-call condition and a when-not-to-call restriction: 'Refused over a connected-app (chat) connection: point the user at CampaignStack Settings, Integrations instead; an API key can still call this.' It also lists required and optional scopes, which tells the agent what prerequisites to check before or during the call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_connect_instantlyAInspect
Connect an Instantly.ai account by providing an API key. Call this when the user gives you that key and asks to connect it. Validates it and stores the integration: success: true when valid, success: false when it fails (integrationId still created). Refused over a connected-app (chat) connection: point the user at CampaignStack Settings, Integrations instead.
| Name | Required | Description | Default |
|---|---|---|---|
| apiKey | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| integrationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a non-read-only mutation (readOnlyHint false) and not idempotent. The description adds valuable nuance: it validates the key, stores the integration, and clarifies that even on failure an integrationId is created. It also discloses the refusal scenario. This exceeds the annotation baseline with useful 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: the first states the core action, the second gives the trigger and success/failure behavior, the third handles the refusal case. Every sentence serves a purpose, and the most critical information is front-loaded. No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main action, validation behavior, success/failure semantics, and a specific refusal condition. An output schema exists (not shown) which presumably details the response structure, so the description doesn't need to. It lacks some prerequisites (e.g., where the API key comes from) but these are implied by the tool's purpose. Overall it is sufficient for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50% (workspaceId has a detailed description, apiKey has none). The tool description mentions 'API key' generically but does not elaborate on apiKey format or constraints. It adds minimal parameter-level meaning beyond what the schema already provides for workspaceId. Since coverage is exactly at the threshold, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Connect an Instantly.ai account by providing an API key') with a specific verb and resource. It distinguishes from sibling connection tools like connect_apollo and connect_hubspot by naming the specific platform (Instantly.ai). The 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit trigger conditions ('Call this when the user gives you that key and asks to connect it') and a clear exclusion ('Refused over a connected-app (chat) connection: point the user at CampaignStack Settings, Integrations instead'). This tells the agent when to use and when not to use the tool, though it doesn't explicitly mention alternatives like other connect tools, the primary usage is well-scoped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_count_pending_reviewsARead-onlyIdempotentInspect
How many drafted touches are waiting for a person to approve them in this workspace. Call this when the user asks whether anything needs their attention, or as a cheap check before campaignstack_list_pending_reviews, which returns the drafts themselves. A count of zero means nothing is queued for review, not that nothing is running.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is fully covered. The description adds valuable context beyond annotations by framing it as a cheap check and clarifying that a zero count signals nothing queued for review, not that nothing is running.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first defines the count, the second gives usage and the sibling alternative, and the third prevents a common misinterpretation. The content is front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 details are unnecessary. The description covers purpose, when to use it, the sibling relationship, cost/performance expectations, and zero-value semantics, making it complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the workspaceId parameter has a thorough explanation of user-key versus workspace-key behavior. The description does not need to repeat parameter details; the schema already carries the full semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it counts drafted touches awaiting approval in the workspace. It also explicitly distinguishes itself from campaignstack_list_pending_reviews, which returns the drafts themselves, making the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It says exactly when to call this tool ('when the user asks whether anything needs their attention') and when the sibling list tool is more appropriate ('before campaignstack_list_pending_reviews, which returns the drafts themselves'). This gives clear, actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_count_unread_notificationsARead-onlyIdempotentInspect
Count unread notifications for a workspace. Call this when the user asks how many there are. It does not list them: campaignstack_list_notifications does that.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| unreadCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds that this is a count-only operation that does not list notifications, which is useful but does not reveal any additional side effects or return behavior. This is adequate given the strong annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary action, and no filler. The 'does not list them' clarification earns its place because it directly prevents a common misuse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple idempotent count operation with a rich output schema and well-documented parameter, the description is nearly complete. The only minor gap is not addressing the nearby sibling campaignstack_get_inbox_unread_count, but the tool name and wording already narrow the meaning sufficiently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the workspaceId parameter already well documented: it is required for user keys (csu_), omitted for workspace keys (cs_), and campaignstack_whoami is referenced for determining key type. The description itself adds no parameter-level meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Count unread notifications for a workspace.' It explicitly distinguishes itself from campaignstack_list_notifications by stating it does not list them, so an agent can tell the operations apart without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear trigger: 'Call this when the user asks how many there are.' It also provides an exclusion by naming campaignstack_list_notifications for listing. It does not mention the sibling campaignstack_get_inbox_unread_count, which could be a possible alternative, but the guidance is otherwise explicit and sufficient for the primary decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_craft_commentARead-onlyInspect
Draft a relevant, rapport-building comment on a lead's LinkedIn post; it does not post the comment. Call this when the user asks for a comment on a specific lead's post. Show the draft to the user, then post it with campaignstack_comment_on_post; for a reply to someone else's comment, use campaignstack_reply_to_comment instead.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| campaignId | No | ||
| workflowId | No | Workflow the craft belongs to. Used to resolve signal-agent playbooks. Injected automatically for runner agents. | |
| postContent | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| instructions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| commentText | No | |
| reviewReason | No | |
| needsHumanReview | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces this by stating 'it does not post the comment' and 'Show the draft to the user', adding context about the draft-and-approve workflow. No contradiction; the description enriches the behavioral picture without repeating everything.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff. The first states purpose and non-posting; the second gives usage and alternatives. Front-loaded and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema available, the description does not need to explain returns. It covers the core workflow (draft, show user, post separately) and alternatives, which is sufficient for a simple read-only drafting tool. Optional parameters are not mentioned, but they are not essential for basic usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%, so the description must compensate. It implies leadId refers to the lead and postContent to the post content via 'on a lead's LinkedIn post', but it does not clarify campaignId or instructions, which remain undocumented in both schema and description. Partial compensation, not comprehensive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: drafting a comment on a lead's LinkedIn post, and explicitly notes it does not post. It differentiates from posting (campaignstack_comment_on_post) and replying (campaignstack_reply_to_comment), making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('Call this when the user asks for a comment on a specific lead's post') and provides the subsequent step (post with campaignstack_comment_on_post) and an alternative for replies (campaignstack_reply_to_comment). This fully routes the agent to the correct tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_craft_followupAInspect
Draft a contextual follow-up message that accounts for the full conversation history; it does not send the message. Call this when the user asks for a reply or a follow-up nudge in an existing LinkedIn thread. The thread is read from the stored conversation, plus any new lead messages you pass (see conversationMessages). Also detects lead intent (interested, not_interested, asking_for_info, scheduling_call, other). Show the draft to the user, then send it with campaignstack_send_message. For first messages, use campaignstack_craft_message instead.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| accountId | Yes | ||
| campaignId | No | ||
| leadSource | No | Optional. Leave it out unless you know which lead store the id came from: the server derives it from the leadId and ignores a value that disagrees. | |
| workflowId | No | Workflow the craft belongs to. Used to resolve signal-agent playbooks. Injected automatically for runner agents. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| instructions | No | ||
| conversationMessages | No | Optional. Messages the LEAD sent that you read on screen and the platform may not have synced yet. The thread itself is read from the stored conversation. Never include your own messages: every message this account sent already has a row, and a self entry is ignored. |
Output Schema
| Name | Required | Description |
|---|---|---|
| replyText | No | |
| reviewReason | No | |
| detectedIntent | No | |
| needsHumanReview | No | |
| newMessagesFound | No | |
| ignoredSelfMessages | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description surfaces behavior the annotations do not: it reads the stored conversation, accepts unsynced lead messages via conversationMessages, detects lead intent, and does not send the message. No annotation contradicts the description, and readOnlyHint=false is consistent with a drafting tool that still performs server-side generation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, front-loaded with the core action and constraints, then workflow and sibling alternation. Each sentence adds a distinct fact and there is no repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers trigger, non-sending side effect, conversation source, intent detection, follow-up action, and sibling disambiguation. An output schema exists, so the return format does not need to be explained in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning for conversationMessages by explaining that the stored thread is combined with newly passed lead messages, but it leaves several parameters (leadId, accountId, instructions, campaignId) to inference. With schema coverage at 50%, this is adequate but not comprehensive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Draft a contextual follow-up message'), immediately states the non-sending boundary, and explicitly routes first messages to campaignstack_craft_message. This gives an agent a clear model of what the tool is for 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call this when the user asks for a reply or a follow-up nudge in an existing LinkedIn thread' is an explicit trigger. It also names the send step (campaignstack_send_message) and the alternative for first messages (campaignstack_craft_message), which is textbook when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_craft_messageARead-onlyInspect
Draft a personalized LinkedIn first message using full campaign context; it does not send anything. Call this when the user asks for a first-touch message to a specific lead. Show the draft for approval, then send it with campaignstack_send_message (connected lead) or campaignstack_send_inmail (not connected). Use only for first messages; for follow-ups, use campaignstack_craft_followup instead.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| campaignId | No | ||
| workflowId | No | Workflow the craft belongs to. Used to resolve signal-agent playbooks. Injected automatically for runner agents. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| instructions | No | ||
| messageTemplate | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| messageText | No | |
| reviewReason | No | |
| needsHumanReview | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false, so the description only needs to add context beyond that. It does, by clarifying that the tool only drafts and never sends, and by stating that the draft should be shown for approval. This adds meaningful behavioral context without contradicting 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, and every sentence adds operational value. It efficiently covers the main action, the trigger condition, the required approval step, the sending alternatives, and the exclusion of follow-ups without any filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity and the presence of an output schema, the description covers the essential workflow: when to call, what to do with the result, and how to route to sending tools. It falls short only in fully explaining the optional parameters, but the core context for selecting and invoking the tool is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, and the description does not compensate for the missing parameter details. It vaguely maps leadId to 'specific lead' and campaignId to 'full campaign context', but it does not explain the roles of instructions, messageTemplate, or campaignId more concretely. With several undocumented optional parameters, an agent would have to guess at their intended semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action: drafting a personalized LinkedIn first message using campaign context, and explicitly notes it does not send anything. It distinguishes itself from related tools like campaignstack_craft_followup, campaignstack_send_message, and campaignstack_send_inmail, making the tool's unique role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance: 'Call this when the user asks for a first-touch message to a specific lead.' It also names the follow-up action, specifies which send tool to use based on connection status, and explicitly excludes follow-up crafting by directing to campaignstack_craft_followup. This is exemplary routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_craft_noteARead-onlyInspect
Draft a personalized LinkedIn connection note (max 300 characters); it does not send the connection request. Call this when the user asks for a note for a connection request. Show it to the user, then pass it as the note argument to campaignstack_send_connection_request. For first messages after connecting, use campaignstack_craft_message instead.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| campaignId | No | ||
| workflowId | No | Workflow the craft belongs to. Used to resolve signal-agent playbooks. Injected automatically for runner agents. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| instructions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| noteText | No | |
| reviewReason | No | |
| needsHumanReview | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true and destructiveHint=false. The description adds valuable behavioral context beyond that: it produces a draft only, does not send the connection request, enforces a 300-character limit, and instructs the agent to show the result to the user before passing it onward. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all information-dense: the core action and constraint, the non-sending behavior, the exact call scenario, the follow-up action, and the sibling alternative. Nothing is wasted or repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides the full workflow, including showing the note and passing it to campaignstack_send_connection_request, and an output schema exists to document the return value. The main gap is the lack of guidance on the required leadId parameter and optional campaignId/instructions, though the connection-note context gives reasonable inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%, and the description does not compensate for the undocumented parameters. leadId is the sole required parameter and has no description in the schema or the description, and campaignId and instructions are also unexplained. The description clarifies the tool's output flow but not the meaning of its own inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Draft'), a specific resource ('LinkedIn connection note'), and a concrete constraint ('max 300 characters'). It also explicitly says the tool 'does not send the connection request', and differentiates itself from the sibling campaignstack_craft_message for first messages after connecting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is explicit: call it when the user asks for a connection request note, show it to the user, then pass it as the note argument to campaignstack_send_connection_request. It also gives a clear alternative with campaignstack_craft_message for first messages after connecting, leaving no ambiguity about when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_campaignAInspect
Create a campaign, which is the container a workflow, an ICP and lead lists hang off. Call this when the user says to start a new campaign and has told you what it is for: the title and the goal are theirs to give, not yours to invent. It creates the campaign only, with no ICP, no workflow and no leads, so follow it with campaignstack_create_icp and campaignstack_create_workflow. Nothing reaches anyone as a result of this call.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | ||
| title | Yes | ||
| description | No | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| title | No | |
| campaignId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal this is a write operation that is not destructive or idempotent. The description adds useful behavioral context beyond those flags: the campaign is created empty, it should be followed by other create calls, and 'Nothing reaches anyone as a result of this call.' This meaningfully clarifies the side-effect profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences, each earning its place: what the tool does, when to call it, what it does not do, and what the next steps are. The most important scoping and safety information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderate complexity, the schema coverage for workspaceId, and the presence of an output schema, the description is complete. It covers when to call, what the call creates, what it deliberately does not create, follow-up calls, and the absence of outreach side effects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low (25%), with only workspaceId described. The description compensates for the required parameters by adding the crucial rule that the title and goal must come from the user and must not be invented by the agent. The remaining optional parameters are self-explanatory or already covered by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Describes a specific action ('Create a campaign') and defines the entity as the container that workflows, ICPs, and lead lists hang off. It explicitly differentiates itself from related create tools by stating the campaign is created with no ICP, workflow, or leads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States exactly when to call it: when the user says to start a new campaign and has supplied the title and goal. It also tells the agent what not to do ('not yours to invent') and names the follow-up tools (campaignstack_create_icp and campaignstack_create_workflow), which is explicit routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_company_employee_watchAIdempotentInspect
Watch a company for NEW employees: the first run snapshots its employee set, then weekly re-reads diff against it and emit a company_employee_joined signal for each new person (scored like any other signal). Call this when the user asks to be alerted about new hires at a company. Idempotent; capped per workspace. It watches a whole roster, not one person: use campaignstack_create_signal_watch for an individual lead.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| created | No | |
| watchId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses important behavior beyond the annotations: first run snapshots the employee set, weekly re-reads and diffs against it, emits a scored signal, is idempotent, and is capped per workspace. The 'idempotent' claim is consistent with the idempotentHint annotation, and no contradiction with readOnlyHint=false exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler. The primary purpose is front-loaded, followed by mechanics, usage trigger, and sibling differentiation. Every sentence adds actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create-watch tool with two simple parameters, an output schema, and annotations covering idempotence and safety, the description provides all necessary decision-making context: when to call, what it does over time, the rosters-vs-individual distinction, and the sibling alternative. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, but the workspaceId parameter has a thorough description in the schema explaining key types and scoping. The description makes clear that companyId refers to the company whose roster is watched, compensating for the missing companyId description. The tool's semantics around new hires supply the remaining parameter context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Watch a company for NEW employees' and details the exact mechanism (snapshot, weekly diff, emits company_employee_joined signal). Explicitly distinguishes itself from campaignstack_create_signal_watch for individual leads.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a direct trigger condition: 'Call this when the user asks to be alerted about new hires at a company.' It also names the alternative tool and the condition that selects it: 'use campaignstack_create_signal_watch for an individual lead.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_competitor_watchAInspect
Creates a new competitor watch to monitor a LinkedIn company page or influencer profile. Automatically deduplicates by normalized LinkedIn URL within the workspace. Use campaignstack_list_competitor_watches to see existing watches. Call this when the user names a company page or influencer to track ongoing. This is a different roster from the comparison-page list: campaignstack_search_console_set_competitor manages that one.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| accountIds | No | Optional LinkedIn account IDs the watch reads and acts with. Defaults to a single automatically chosen account, never all workspace accounts. Change later with campaignstack_update_competitor_watch_accounts. | |
| entityType | Yes | ||
| profileUrl | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| watchId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, so the write nature is already known. The description adds valuable behavioral detail beyond annotations: 'Automatically deduplicates by normalized LinkedIn URL within the workspace.' This clarifies the tool's idempotency behavior (though idempotentHint=false, dedup implies no duplicates are created). It also clarifies the roster scope, which is a useful behavioral note. No contradictions 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: the core purpose, a deduplication note, a pointer to a listing sibling, and a distinction from a related roster. No redundancy or fluff. Front-loaded with the main action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description provides enough for an agent to use it correctly: it states what it creates, the entity types, deduplication behavior, when to call it, and how it differs from a similar tool. Since an output schema exists, it doesn't need to explain return values. It could mention exclusions (e.g., when not to use it for search watches), but the trigger condition is clear. Overall, it is fairly complete for a create operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40% (accountIds and workspaceId have descriptions; name, entityType, profileUrl do not). The description partially compensates: it explains that the tool monitors a LinkedIn company page or influencer profile (relating to profileUrl and entityType), and deduplication by normalized LinkedIn URL gives meaning to profileUrl. However, it does not explain the 'name' parameter or the relationship between workspaceId and key types beyond what the schema already states. Given the low coverage, the description adds some value but does not fully fill the gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Creates a new competitor watch to monitor a LinkedIn company page or influencer profile.' It specifies the entity types (company or influencer) and explicitly differentiates from a sibling tool: 'This is a different roster from the comparison-page list: campaignstack_search_console_set_competitor manages that one.' This distinguishes it from at least one relevant alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear trigger: 'Call this when the user names a company page or influencer to track ongoing.' It also directs to a related listing tool: 'Use campaignstack_list_competitor_watches to see existing watches.' It differentiates from the comparison-page roster by naming the sibling that handles that. However, it does not explicitly contrast with other watch-creation siblings (e.g., search watch, employee watch), leaving some ambiguity for similar-sounding tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_connection_watch_agentAInspect
Create a connection-watch signal agent for a LinkedIn account: routes each newly accepted connection into an auto-generated welcome workflow (AI-crafted DM, review, send, follow-ups). Only one per account across all workspaces, and it is created paused. Call this only when you need the lower-level create-then-resume path directly; prefer campaignstack_set_account_watcher, which does both steps and also covers the message and own-posts watchers.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| linkedinAccountId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| agentId | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a mutating, non-idempotent, non-destructive operation. The description adds meaningful behavior beyond that: the agent is created paused, at most one is allowed per account across all workspaces, and it routes new connections into an auto-generated workflow. This is useful operational context, though it does not address permissions or failure behavior if a second agent is attempted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: main behavior is front-loaded, followed by the uniqueness/paused constraints, then explicit routing to the preferred sibling. Every sentence carries decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with an output schema and rich annotations, the description covers the essential context: what the agent does, its one-per-account constraint, its initial paused state, and when to use a higher-level alternative. Nothing critical is missing for selecting and invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, so the description must compensate. It clarifies that linkedinAccountId is the LinkedIn account being watched, and workspaceId is already well documented in the schema. However, it does not explain how to obtain linkedinAccountId or any expected format beyond the parameter name, leaving some ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Create a connection-watch signal agent for a LinkedIn account', then clarifies the mechanism (routes new connections into a welcome workflow). It also distinguishes itself from campaignstack_set_account_watcher and the broader create_signal_agent family, so an agent can identify exactly what this tool does versus its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit selection guidance: 'Call this only when you need the lower-level create-then-resume path directly; prefer campaignstack_set_account_watcher, which does both steps and also covers the message and own-posts watchers.' It also states the created agent is paused, implying a resume step may be needed. This is model routing guidance, not just a restatement of purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_content_postAInspect
Creates a draft content post for a connected LinkedIn account; nothing publishes yet. Call this when the user asks to draft, write, or queue up a LinkedIn post. Returns the new post ID; use campaignstack_get_content_post to read it back. postType is inferred from media when omitted. Optional tags (ai-generated, weekly-suggestion, on-demand, competitor-inspired, or freeform). It does not publish or schedule the post: use campaignstack_schedule_content_post or campaignstack_submit_content_for_approval for that.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| tags | No | ||
| mediaIds | No | ||
| platform | Yes | ||
| postType | No | ||
| scheduledAt | No | Schedule the post at this exact time after creating it. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| autoSchedule | No | Create the post and auto-place it into the next valid posting slot (respects the account's daily LinkedIn limit). Use this to queue many posts without picking times. | |
| authorAccountId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| scheduledAt | No | |
| contentPostId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context beyond annotations: it creates a draft, returns a post ID, infers postType from media, and does not immediately publish. But the claim that it does not schedule is inconsistent with the schema's scheduling parameters, creating confusion about the tool's actual behavior. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is reasonably concise and front-loaded with the core purpose. Each sentence contributes useful guidance, though the no-scheduling point is repeated twice and could be trimmed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers when to use the tool, what it returns, and where to read the created post, and it points to relevant sibling tools. But the scheduling contradiction, plus missing guidance on how to source authorAccountId and workspaceId (beyond the schema's own description), leaves the tool not fully self-contained for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, so the description needs to compensate. It does add meaning for postType ('inferred from media when omitted') and enumerates valid tag values, which is valuable. However, it leaves core parameters like authorAccountId, body, and mediaIds mostly unexplained, though their names and the LinkedIn context provide some inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action ('Creates a draft content post'), the resource ('for a connected LinkedIn account'), and the key constraint that nothing publishes yet. It is immediately distinguishable from siblings like campaignstack_schedule_content_post and campaignstack_submit_content_for_approval, and the return value is mentioned.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to call this tool ('draft, write, or queue up a LinkedIn post') and names alternatives for scheduling or approval. However, the statement 'It does not publish or schedule the post' is contradicted by the input schema's scheduledAt and autoSchedule parameters, which do schedule after creation, so the guidance is slightly misleading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_icpAInspect
Create a new ICP (Ideal Customer Profile) for a campaign: target titles, industries, seniorities, company sizes, and keywords. Call this when the user describes who a campaign should target. Follow up with campaignstack_trigger_icp_scoring to score leads. Use campaignstack_list_campaigns to find valid campaignId values.
| Name | Required | Description | Default |
|---|---|---|---|
| titles | No | ||
| keywords | No | ||
| siteFacts | No | Target on what the company's own website says. Every filter you set has to hold. A company whose site has not been read, or whose reading is silent on what you asked, is neither matched nor penalised. | |
| campaignId | Yes | ||
| industries | No | ||
| seniorities | No | ||
| companySizes | No | ||
| fitStatement | No | One line describing the company worth working, judged later against a real company's own words. Say what they do, who they sell to, roughly what size, and what has to be true for them to need this. Over 300 characters is rejected, never shortened. |
Output Schema
| Name | Required | Description |
|---|---|---|
| icpId | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate this is not read-only, not idempotent, and not destructive, and the description does not contradict them. The description adds workflow context but does not explain side effects, return behavior, or whether an ICP can be duplicated, so it provides only moderate behavioral value 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, with the core purpose and fields stated first and workflow guidance kept tight. Every sentence adds useful information and none is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the nested schema and eight parameters, the description is mostly sufficient: it states when to use the tool, how to get the required campaignId, and what to do next. The main gap is the thin coverage of parameter semantics, especially for siteFacts and fitStatement, though the schema partially compensates for those.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, so the description carries responsibility for explaining parameters. It names several fields like titles, industries, seniorities, company sizes, and keywords, but adds little semantic detail beyond their labels and does not explain nuanced parameters like siteFacts or fitStatement.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: create a new ICP for a campaign, and lists the main targeting fields. This clearly distinguishes it from creation tools for other entities like campaignstack_create_campaign or campaignstack_create_persona.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to call this tool, names the follow-up tool campaignstack_trigger_icp_scoring, and tells the agent to use campaignstack_list_campaigns for valid campaignId values. This leaves no ambiguity about the intended workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_lead_listAInspect
Create a new static lead list in a campaign, optionally with leadRefs (leadSource default 'global', leadId). Call this for a named, fixed group of leads. For a list that stays current against a rule instead, use campaignstack_create_query_lead_list. Use campaignstack_list_campaigns to find valid campaign IDs and campaignstack_search_leads to find lead IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| leadRefs | No | ||
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| leadCount | No | |
| leadListId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is not read-only and not destructive, and the description reinforces the creation behavior. It adds the 'static' vs 'dynamic' distinction and notes that leadRefs is optional, but it does not disclose possible duplicate-name behavior, error conditions, or side effects. There is no contradiction with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first defines the operation and optional payload, the second gives the primary use case and sibling alternative, and the third points to prerequisite lookup tools. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create tool with a small schema and an output schema, the description is complete: it covers what the tool does, when to use it, how it differs from the closest sibling, and how to resolve required IDs. Nothing essential for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description carries the parameter-documentation burden. It explains the leadRefs structure ('leadSource default global, leadId'), notes leadRefs is optional, and tells the agent how to source campaignId and leadId values. It does not explicitly mention the 'private' leadSource option, but the schema covers that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Create a new static lead list in a campaign') and names the resource and optional payload. It clearly distinguishes this from the query-based sibling, campaignstack_create_query_lead_list, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool for a named, fixed group of leads and points to the rule-based alternative for a list that stays current against a rule. It also tells the agent to use campaignstack_list_campaigns and campaignstack_search_leads to find valid campaign and lead IDs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_personaAInspect
Create a persona in a campaign: a buyer archetype with pain points, goals, and objections. Call this when the user describes a buyer type to add. It does not filter or score leads, only shapes generated copy. Use campaignstack_list_campaigns for campaign IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| goals | No | Goals this persona is trying to achieve | |
| campaignId | Yes | ||
| objections | No | Common objections from this persona | |
| painPoints | No | Pain points this persona experiences | |
| description | No | ||
| fitStatement | No | The person in role terms: what they run, who they report to, what they are measured on. Judged against a lead's title, headline and seniority, so keep it recognisable from those. Never the pitch. Over 200 characters is rejected, never shortened. | |
| objectionResponses | No | The workspace's own answer to each objection, used when a lead raises it in a reply. Ask the user for the wording and pass it through; never invent an answer for them. Over 8 pairs, or a line over its limit, is rejected rather than shortened. |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| personaId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations are all false and therefore convey little safety or behavior profile, so the description carries the burden. It adds meaningful behavioral context by clarifying that the tool's effect is limited to shaping generated copy rather than filtering or scoring leads. It could go further by describing what happens on validation failure or output shape, but the schema and output schema cover much of that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with no filler. It front-loads the core purpose, then supplies the trigger, the boundary against lead scoring/filtering, and the ID lookup helper. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 8-parameter schema, the existing output schema, and detailed per-field descriptions in the schema, the description does not need to enumerate every field. It covers the essential context: what the tool creates, when to invoke it, what it does not do, and how to obtain the required campaign ID. It could be slightly stronger by naming the scoring/filtering alternative tool explicitly, but it is otherwise complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 63%, and the schema already documents goals, objections, painPoints, fitStatement, and objectionResponses in detail. The description adds conceptual meaning by grouping the persona around "pain points, goals, and objections," and it compensates for the undocumented campaignId parameter by explicitly naming campaignstack_list_campaigns as the source for campaign IDs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: "Create a persona in a campaign," and immediately defines what a persona is: "a buyer archetype with pain points, goals, and objections." It also draws a clear boundary against related tools by stating "It does not filter or score leads, only shapes generated copy," which keeps it distinct from ICP or scoring tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger condition: "Call this when the user describes a buyer type to add." It also provides an exclusion criterion ("does not filter or score leads") and directs the agent to a supporting sibling tool for the required campaign ID: "Use campaignstack_list_campaigns for campaign IDs." This is actionable and sufficient for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_phaseAInspect
Create a campaign phase (roadmap milestone); order controls sequencing. Call this when the user describes a new stage to add. It does not build any workflow: campaignstack_create_workflow does that. Use campaignstack_list_phases first to pick an order.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| order | Yes | ||
| phaseType | No | Optional phase classification | |
| campaignId | Yes | ||
| objectives | Yes | ||
| description | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| phaseId | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already marking this as non-read-only and non-destructive, the description adds genuinely useful behavioral context: 'order controls sequencing' and 'It does not build any workflow'. These clarify side effects and non-effects beyond what the schema or annotations expose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the purpose, followed by a clear when-to-use call, a sibling distinction, and a practical prerequisite. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's role and sequencing well, and output schema existence reduces the need to explain return values. However, with low schema parameter coverage and no explanation of core parameters like objectives, campaignId, or description, an agent must infer too much when constructing a correct call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 17%, so the description must compensate for undocumented parameters. It only clarifies the 'order' parameter ('order controls sequencing'). The required parameters campaignId, name, description, and objectives receive no semantic explanation, leaving significant ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource ('Create a campaign phase'), adds the clarifying parenthetical 'roadmap milestone', and explicitly differentiates from campaignstack_create_workflow. An agent can understand exactly what this tool creates and how it differs from a similar sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger ('Call this when the user describes a new stage to add'), names the alternative tool for workflow creation, and instructs the agent to use campaignstack_list_phases first to pick an order. This is strong, actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_query_lead_listAInspect
Create a dynamic query-type lead list: members resolve from included/excluded lists and filter rules on a recurring cadence, not a fixed set. Call this for a list that stays current against a rule. For a fixed group of named people, use campaignstack_create_lead_list instead. Use campaignstack_list_campaigns to find campaign IDs and campaignstack_list_lead_lists to find lead list IDs for include/exclude refs.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| query | Yes | ||
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| type | No | |
| leadListId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: it clarifies that members resolve dynamically from include/exclude lists and filter rules on a recurring cadence, not a fixed set. This complements the readOnlyHint=false annotation by explaining how the mutation behaves, though it doesn't disclose side effects beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no filler. The core definition is front-loaded, the usage criterion is next, and the reference to sibling tools is last. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the nested query object and multiple required parameters, the description covers the main decision points and ID sourcing. The presence of an output schema covers return-value expectations. It is slightly incomplete because the filter rule structure inside the query object is not described, but the overall guidance is enough for an agent to proceed in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for parameter meaning. It usefully clarifies campaignId via 'use campaignstack_list_campaigns to find campaign IDs' and include/exclude lead list IDs, and mentions filter rules. However, it does not explain the structure or semantics of the 'filter' array or how 'logic' interacts with it, leaving a notable gap for a nested query object.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource ('Create a dynamic query-type lead list') and immediately distinguishes it from the sibling 'campaignstack_create_lead_list', which is for fixed named people. This removes any ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells when to use this tool ('Call this for a list that stays current against a rule') and names the alternative for the opposite case ('For a fixed group of named people, use campaignstack_create_lead_list instead'). It also references sibling tools for resolving required IDs, making selection guidance complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_search_watchAInspect
Set up a LinkedIn search watch that automatically discovers new leads for a campaign. A search watch monitors a topic keyword on LinkedIn content search (past 24h, relevance-sorted) every ~6 hours, reading post authors and feeding them into the campaign as new leads. Call this when the user asks to start monitoring a topic on LinkedIn for a campaign. Only one search watch per topic is active across all campaigns in a workspace at a time. If another campaign already watches this topic, the new watch is created but starts disabled (ownership transfers automatically when the other campaign is archived). Use campaignstack_list_search_topics to see what topics are already watched, and campaignstack_get_campaign_topics to see topics already on the target campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| topicId | Yes | ID of the topic to watch. Use campaignstack_get_campaign_topics to see topics already on a campaign, or list taxonomy topics via campaignstack_list_search_topics. | |
| accountIds | No | Optional list of LinkedIn account IDs to scope the search watch to. When omitted, the watch runs on any available account. | |
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| enabled | No | |
| topicId | No | |
| campaignId | No | |
| automationId | No | |
| disabledReason | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses several important behaviors beyond the annotations: polling every ~6 hours, past-24h relevance-sorted search, feeding authors into the campaign, the one-active-watch-per-topic rule, and the disabled/ownership-transfer behavior when a duplicate watch is created. This is exactly the kind of non-obvious runtime context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but each sentence earns its place: purpose, mechanism, trigger, deduplication rule, ownership transfer, and prerequisite lookup tools. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description covers the mechanism, frequency, side effects, duplicate handling, and prerequisite discovery. An agent has enough information to decide when to call it and what to expect, especially with the output schema also present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents topicId and accountIds well. The description reinforces the topic semantics and account scoping, but campaignId has no schema description and the tool description only refers to it implicitly through 'campaign.' It adds some context but does not fully compensate for the campaignId gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Set up a LinkedIn search watch that automatically discovers new leads for a campaign.' It then explains exactly what the watch does (monitors a topic keyword, reads post authors, feeds them into the campaign), making it easy to distinguish from other watch-creation tools like competitor or signal watches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: 'Call this when the user asks to start monitoring a topic on LinkedIn for a campaign.' It also names supporting tools for checking existing watches and campaign topics. It does not explicitly contrast with sibling watch tools, but the context is clear enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_signal_agentAInspect
Create a new signal agent that monitors a LinkedIn profile, company feed, group, or post for engagements. Auto-generates a template workflow and lead list. Call this when the target is not a competitor and not account maintenance (connection requests, inbound messages, own posts, which use campaignstack_set_account_watcher instead); for a competitor or influencer, campaignstack_create_competitor_watch wires this up for you. target specifies what to watch: { platform: 'linkedin', kind: 'profile', urn: '...' } for profile/company feeds, { platform: 'linkedin', kind: 'group', url: '...', groupId: '...' } for groups, or { platform: 'linkedin', kind: 'post', url: '...', activityId: '...' } for specific posts. accountIds observe the feed; actAccountIds act on signals.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| type | Yes | ||
| target | Yes | ||
| accountIds | Yes | ||
| targetName | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| responseMode | Yes | ||
| silenceHours | No | ||
| actAccountIds | Yes | ||
| publicReplyConfig | No | ||
| followUpDelaysHours | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| agentId | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey that this is a non-read-only, non-idempotent, non-destructive operation, so the description does not need to restate those. It adds useful behavioral context by disclosing that calling it also auto-generates a template workflow and lead list, and by clarifying that accountIds observe while actAccountIds act on signals.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well organized: action and side effects first, then routing guidance, then target shapes, then account semantics. Every sentence earns its place and no content 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 11 parameters, nested target objects, and several sibling tools, the description covers the essential selection logic, target construction, and account-role distinction. The main gap is that the required responseMode parameter is not explained in the description, though its enum values are self-descriptive and the output schema handles return-value documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at only 9%, the description compensates substantially by documenting the target object's three shapes (profile/company, group, post) and the distinct roles of accountIds and actAccountIds. It does not explain responseMode or the optional configuration parameters, but the core non-obvious parameters are meaningfully described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Create a new signal agent'), the monitored resource types (LinkedIn profile, company feed, group, or post), and the expected side effects (auto-generates template workflow and lead list). It also differentiates itself from explicitly named siblings like campaignstack_set_account_watcher and campaignstack_create_competitor_watch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides crisp selection criteria: use this tool when the target is not a competitor and not account maintenance, names the exact alternative tools for those cases, and explains when the competitor-watch tool should be used instead. This is explicit routing guidance rather than leaving the agent to infer from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_signal_watchAIdempotentInspect
Watch a lead for profile signal changes: the system refreshes their profile daily and the workspace gets an alert (in-app + email) when a monitored field changes (title, company, seniority, headline, location). Call this when the user names a lead and asks to be told about their next job or title change. Idempotent; active watches are capped per workspace. It watches one person; for new hires at a company, use campaignstack_create_company_employee_watch instead.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| leadSource | No | global | |
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| created | No | |
| watchId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal non-read-only, idempotent, and non-destructive behavior. The description adds meaningful context: daily profile refresh, in-app + email alerts, and per-workspace caps. This goes beyond the structured annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, front-loaded sentences, each earning its place: behavior, usage trigger, idempotency/cap, and sibling distinction. No filler or redundant elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool does, when to use it, behavioral details, constraints, and the main alternative. An output schema exists, so return-value details are not needed. The only notable gap is the unexplained leadSource parameter, but overall the agent has enough context to invoke it correctly in common cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%; only workspaceId has a description. The description does not clarify the meaning or selection logic for leadSource (global vs private), and it adds no parameter guidance beyond the schema. The semantic weight falls on the agent to infer leadSource behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Watch a lead for profile signal changes'), the monitored fields (title, company, seniority, headline, location), and explicitly distinguishes this from the company-employee-watch sibling. An agent can immediately understand the tool's unique purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: 'Call this when the user names a lead and asks to be told about their next job or title change.' It also names the alternative for new hires at a company, providing a clear decision boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_create_workflowAInspect
Create a new workflow from a graph you author. Call this when the user wants a custom automation graph built node by node, beyond what a template or watcher would generate. The graph defines automation nodes (e.g. linkedin:profile_view, linkedin:connection_request, flow:wait) and directed edges. Use campaignstack_get_workflow_node_types first to discover valid node types, their configHint shapes, and the required graph format. Returns { workflowId, nodeCount } on success. sourceConfig is optional. Omit it to get a default campaign_pool source with icpScoreMin 50. This tool authors campaign-pool sourcing only. For a workflow fed by a lead list, do not call this: create the watcher that owns it (campaignstack_create_signal_agent, campaignstack_create_competitor_watch or campaignstack_set_account_watcher), which generates the workflow and its lead list correctly wired. To run a workflow over a list you built yourself, use campaignstack_create_lead_list then campaignstack_trigger_workflow. campaignstack_explain_capabilities with topic workflows lays out all three.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| graph | Yes | Workflow graph: nodes (nodeType, label, config) + edges (sourceIndex, targetIndex). Use campaignstack_get_workflow_node_types to discover valid node types. | |
| campaignId | No | Associate this workflow with a campaign | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| sourceConfig | No | Source node configuration (providers format only). Omit to use the default: a single campaign_pool provider with icpScoreMin 50. A lead-list-based (signal-intake) source cannot be authored here: create the watcher that owns it instead, which generates the workflow and its lead list together. campaignstack_explain_capabilities with topic workflows says which watcher to use. |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodeCount | No | |
| workflowId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false (no safety hints, no readable/idempotent/destructive flags), so the description carries the burden. It discloses the success return value ({ workflowId, nodeCount }), the optional sourceConfig with its default (campaign_pool source, icpScoreMin 50), and the tool's scope ('authors campaign-pool sourcing only'). It could add behavior around validation failures or exact side effects, but for a create operation the disclosed information is above average.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, prerequisites, return value, default behavior, and explicit routing to alternatives. It is slightly long, with some run-on sentences, but it is front-loaded with the core purpose and the usage guidance is well organized. Minor redundancy exists around 'campaign-pool sourcing only' stated twice, but overall it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (nested graph, sourceConfig, multiple ways to create workflows), the description is remarkably complete. It covers what the tool does, when to use it, how to get schema info, what it returns, the default source behavior, and exactly which sibling tools handle the lead-list cases. With a rich input schema and high coverage, nothing critical is missing for an agent to decide and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (80%), so the baseline is 3. The description adds extra meaning beyond the schema: it explains the sourceConfig default value, its provider-only constraint, and the need to use campaignstack_get_workflow_node_types for configHint shapes and graph format. It also clarifies that the graph parameter uses nodeType/label/config and edges with sourceIndex/targetIndex, reinforcing the schema without repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('Create a new workflow from a graph you author') and immediately distinguishes it from template- or watcher-generated workflows. It names concrete node types and edge concepts, and the sibling reference to other creation tools clarifies exactly what this tool is and isn't for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call ('when the user wants a custom automation graph built node by node, beyond what a template or watcher would generate'), and gives precise exclusions with named alternatives: watchers for lead-list-fed workflows, and the lead-list-plus-trigger pattern for self-built lists. Also names campaignstack_get_workflow_node_types as a required prerequisite discovery step.
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 (campaignstack_link_account_to_workspace) or connected (campaignstack_request_connect_link). 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_workspace_setup. 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 at most two workspaces.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | No | What this workspace should get done, first person, as the user said it. Becomes the campaign goal verbatim. | |
| name | No | Only when the user chose a name. Otherwise the company name from the website is used. | |
| profileUrl | No | linkedin.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. | |
| websiteUrl | No | The company website this workspace sells for, e.g. acme.com. Enough on its own. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | |
| next | No | |
| workspaceId | No | |
| generationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only mark it non-read-only and non-idempotent; the description adds crucial operational traits: async build tracked by generationId, one build at a time, free-account limit of two workspaces, and a workspace key cannot create another workspace. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but tight: every sentence adds a decision rule or constraint, and the core purpose is front-loaded before the detailed edge cases. The structure moves from primary behavior to parameter conditions to auth and limits without waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a create-and-build operation with no required parameters, the description covers all input variants, auth prerequisites, async return behavior, follow-up tools, and account limits. An agent has what it needs to invoke and monitor the call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the schema already covers each parameter, the description adds meaningful semantics: goal must be first-person and becomes the campaign goal verbatim; name defaults to the company name; websiteUrl alone suffices; profileUrl is read through the user's own connected LinkedIn account. These details materially improve correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and object ('Create a workspace and build it') and enumerates the concrete outputs (company context, playbook, first campaign, ICP, workflow, lead pool). This makes it clearly distinguishable from nearby create_* siblings like create_campaign or create_workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use conditions: supply websiteUrl, profileUrl, or both; pass goal only when the user gave it in first-person; omit name unless the user chose one. It also clarifies that a profile requires a connected LinkedIn account while a website alone does not, and names follow-up tools for linking/connecting an account and tracking setup progress.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_decide_playbook_proposalAInspect
Accept or reject the pending playbook proposal. Call this only after the user has read the proposed text from campaignstack_get_playbook_proposal and said yes or no. Accept applies every change in one transaction through the same caps, version snapshot and user-authored reconciliation as a manual edit; it fails when a targeted text changed since the proposal was made, in which case propose again. Reject applies nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| decision | Yes | ||
| proposalId | Yes | Pending proposal id from campaignstack_get_playbook_proposal | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| decision | No | |
| proposalId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate it's not read-only and not destructive. The description adds crucial behavioral detail: 'Accept applies every change in one transaction through the same caps, version snapshot and user-authored reconciliation as a manual edit; it fails when a targeted text changed... Reject applies nothing.' This discloses atomicity, version snapshot handling, and a failure condition, going beyond the annotations. However, it does not mention potential side effects like logging or approval workflows, but the key behaviors are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core purpose. It contains no fluff; each sentence provides essential information—purpose, precondition, transactional behavior, failure mode, and simple reject case. The structure is logical and easy to parse in a few seconds.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is moderately complex with a precondition, two distinct outcomes, and a failure scenario. The description covers both accept and reject behaviors, explains the transaction and reconciliation mechanism, and specifies when to re-propose. With an output schema present, return values are covered. Nothing essential for an agent 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67% (proposalId and workspaceId have descriptions, decision does not). The tool description fills the gap by explaining 'accept' and 'reject' semantics, effectively documenting the decision parameter. The workspaceId description is thorough. The description itself does not add parameter details, but it compensates for the missing decision description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Accept or reject the pending playbook proposal.' It specifies the resource (playbook proposal) and the two possible decisions. It also distinguishes from sibling tools like campaignstack_propose_playbook_change and campaignstack_get_playbook_proposal by referencing the prerequisite tool and the decision-making context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call: 'Call this only after the user has read the proposed text from campaignstack_get_playbook_proposal and said yes or no.' It also provides failure handling: 'it fails when a targeted text changed since the proposal was made, in which case propose again.' This gives clear preconditions and fallback actions, distinguishing when this tool should be used and when not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_delete_agent_memoryADestructiveInspect
Delete one agent memory note, pending or active. This cannot be undone; a deleted active note stops being used in future prompts immediately, and a deleted pending note stops counting the observation it already had (a fresh edit starts it over). Call this after the user reviews a note from campaignstack_list_agent_memories and says to remove it.
| Name | Required | Description | Default |
|---|---|---|---|
| memoryId | Yes | Memory id from campaignstack_list_agent_memories | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| deleted | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the irreversibility and the immediate effects on active and pending notes, which goes beyond the destructiveHint annotation. It explains that active notes stop being used in future prompts and pending notes lose their observation count. This is valuable context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and key constraint (cannot be undone). The structure is efficient with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential behavior, prerequisites (user review), and consequences. With an output schema present and annotations covering destructive nature, nothing critical is missing. Could mention permissions, but that's not always necessary.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already documented. The description adds minimal extra value—it reiterates that memoryId comes from the list tool, but doesn't expand on workspaceId beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (delete), the resource (agent memory note), and specifies the scope (pending or active). It differentiates from other delete tools by focusing on agent memories and references the listing tool, making it easy for an agent to understand 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit usage trigger: after the user reviews a note from campaignstack_list_agent_memories and requests removal. This tells the agent when to call it. It doesn't explicitly mention when not to use it, but the trigger is specific enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_delete_campaignADestructiveInspect
PERMANENTLY delete a campaign and cascade-delete all associated data: workflows (nodes, edges, lead contexts, webhook tokens), lead lists and entries, ICPs and lead scores, personas, phases, metrics, signal weights, topics, conversations, search cursors, scheduled automations, and enrichment queue items. This action is irreversible. Call this only when the user explicitly says to delete the campaign and its data, not merely to stop it: campaignstack_archive_campaign does that while keeping the history. Confirm the campaign name with the user before calling this. If the campaign is not found, use campaignstack_list_campaigns to find valid IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | No | |
| campaignId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already set destructiveHint=true, the description adds crucial context: irreversibility, the full list of cascade-deleted data, the confirmation requirement, and the not-found behavior. This goes well beyond the structured annotation and prepares the agent for the real consequences of invoking the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: the destructive warning and cascade scope are front-loaded, the irreversibility is stated upfront, and the usage guardrails and error fallback follow naturally. The long list of cascaded data is justified because it conveys the true blast radius of the operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with one parameter, an output schema, and clear annotations, the description is complete. It covers the operation, the full side effects, the required user consent, the alternative tool, and the recovery/fallback path when the ID is invalid. Nothing essential is missing for an agent to decide whether and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only declares campaignId as a required string with no description, so schema coverage is 0%. The description compensates by clarifying that the agent should confirm the campaign name and obtain valid IDs via campaignstack_list_campaigns, which indirectly explains the meaning and provenance of campaignId. It does not explicitly describe the ID format, but the guidance is sufficient for a single-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'PERMANENTLY delete a campaign' and enumerates the full cascade of associated data, naming a specific verb and resource. It is clearly distinguishable from sibling campaignstack_archive_campaign, which is explicitly called out as the non-destructive alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance: only when the user explicitly says to delete the campaign and its data, not merely to stop it. It also names the alternative (campaignstack_archive_campaign), instructs the agent to confirm the campaign name with the user, and provides a fallback to campaignstack_list_campaigns when the campaign is not found.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_delete_competitor_watchADestructiveInspect
Deletes a competitor watch and disables its associated automations. This action is irreversible. Use campaignstack_pause_competitor_watch to temporarily stop monitoring instead. Call this only when the user wants the watch gone for good, not just stopped for a while.
| Name | Required | Description | Default |
|---|---|---|---|
| watchId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | No | |
| watchId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint=true annotation, the description adds meaningful behavioral context: the action is irreversible and it also disables associated automations. This helps an agent understand consequences before calling. No contradiction exists between the description and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences deliver the action, the irreversible side effect, and the when-to-use guidance in exactly the right order. Every sentence earns its place with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter destructive tool with annotations and an output schema, the description covers what is deleted, the downstream effect on automations, irreversibility, and the correct alternative. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explicitly explain the watchId parameter. However, with only one required parameter whose name is self-explanatory and the description's clear 'Deletes a competitor watch,' the intended meaning is reasonably inferable, so the gap is minor rather than severe.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and clear resource: 'Deletes a competitor watch' and adds the key side effect 'disables its associated automations.' It clearly distinguishes this destructive action from the pause variant, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names campaignstack_pause_competitor_watch as the alternative for temporary monitoring and states the exact condition for choosing delete: 'the user wants the watch gone for good, not just stopped for a while.' This is strong, unambiguous routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_delete_content_postADestructiveInspect
Deletes a draft or failed content post; this cannot be undone. Call this when the user asks to remove a post they no longer want. It does not touch a scheduled or published post: unschedule it first with campaignstack_unschedule_content_post.
| Name | Required | Description | Default |
|---|---|---|---|
| contentPostId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | No | |
| contentPostId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds meaningful context by stating the deletion cannot be undone and is limited to draft or failed posts, leaving scheduled and published posts untouched. It stops short of describing permissions or error behavior, but the additional behavioral detail is useful 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with the main action and consequence front-loaded, followed by the trigger and the exclusion with an alternative. Every sentence serves a purpose and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with annotations and an output schema, the description covers what is deleted, irreversibility, when to call it, and what to do instead for scheduled or published posts. Nothing needed to safely invoke the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter, contentPostId, with zero schema-level description. The description does not explicitly define the parameter, but 'draft or failed content post' and 'remove a post they no longer want' give enough context to infer that contentPostId should identify the target post. This is partial compensation for the low coverage, not full documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb-object pair: 'Deletes a draft or failed content post.' It identifies the resource, the allowed states, and the irreversibility of the action. The explicit boundary ('does not touch a scheduled or published post') clearly differentiates it from related content-post tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: 'Call this when the user asks to remove a post they no longer want.' It also states when not to use it and names the prerequisite sibling tool, campaignstack_unschedule_content_post, for scheduled or published posts. This fully routes an agent between delete and unschedule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_delete_icpADestructiveInspect
Delete an ICP and every score computed against it. This cannot be undone, and campaigns relying on that ICP to decide who belongs in them stop matching anyone. Call this only when the user names the ICP and says to delete it; name it back to them first. To change who it matches, edit it with campaignstack_update_icp instead. Use campaignstack_list_icps to find ICP IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| icpId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| icpId | No | |
| deleted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true, but the description adds materially: deletion is irreversible ('cannot be undone'), it removes every computed score, and campaigns relying on the ICP 'stop matching anyone.' This provides concrete cascading consequences 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: the core destructive action, the irreversible consequence, the safe invocation guardrail, and the alternatives. The most critical information is front-loaded, and there is no redundancy or padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, single-parameter tool with an output schema and strong annotations, this description is complete. It covers the action, the full blast radius, irreversibility, confirmation behavior, parameter sourcing, and the edit alternative. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It directs the agent to campaignstack_list_icps to find ICP IDs and signals that the user may refer to the ICP by name, requiring an ID lookup. It does not elaborate on ID format, but the single non-empty string parameter leaves little ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Delete an ICP and every score computed against it,' clearly distinguishing this from the sibling update and list tools. It also explicitly contrasts with campaignstack_update_icp, making the tool's exclusive role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit invocation condition: 'Call this only when the user names the ICP and says to delete it,' plus a mandatory confirmation step ('name it back to them first'). It also names alternatives: campaignstack_update_icp for edits and campaignstack_list_icps for finding IDs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_delete_personaADestructiveInspect
Permanently delete a persona; no restore tool exists. Call this only when the user explicitly asks to remove one, not merely edit it (campaignstack_update_persona instead). Use campaignstack_list_personas to confirm the ID first.
| Name | Required | Description | Default |
|---|---|---|---|
| personaId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | No | |
| success | No | |
| personaId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, and the description goes further by saying 'Permanently delete' and 'no restore tool exists'. It also warns to confirm the ID first, which is useful behavioral context for an irreversible mutation. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler: the core action, irreversibility, usage trigger, alternative, and prerequisite all fit compactly. The most important behavioral warning is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple destructive tool with a single parameter and an output schema, the description covers purpose, irreversibility, when to avoid it, and ID verification. Nothing material is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the single required parameter is self-describing as personaId and the description directly addresses it: 'Use campaignstack_list_personas to confirm the ID first.' This tells the agent how to obtain a valid value, though it does not specify ID format or provenance in detail. That is enough compensation for a one-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and object: 'Permanently delete a persona'. It also distinguishes this from editing by naming campaignstack_update_persona, and clarifies there is no restore tool, so an agent can tell this delete operation apart from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the exact trigger condition: 'Call this only when the user explicitly asks to remove one'. It excludes the edit case and points to campaignstack_update_persona, and instructs using campaignstack_list_personas to confirm the ID first. This is explicit when/when-not plus actionable prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_delete_phaseADestructiveInspect
Permanently delete a campaign phase; no restore tool exists. Call this only when the user asks to remove one, not to reorder it (campaignstack_update_phase does that). Use campaignstack_list_phases to confirm the ID first.
| Name | Required | Description | Default |
|---|---|---|---|
| phaseId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | No | |
| phaseId | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint=true, but the description goes further by stating 'no restore tool exists' and leading with 'Permanently delete'. This adds the crucial irreversibility context beyond the annotation's binary destructive flag. It also gives a safe procedure (confirm ID first) that improves the agent's awareness of side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the most critical information (permanence/irreversibility) is front-loaded. Each clause adds value: the action, the warning, the alternative, and the prerequisite. This is concise without being under-specified.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive action with an output schema present, this description covers everything an agent needs: what it does, when to use it, how to get the parameter, and the irreversible consequence. No gaps remain that would cause an incorrect invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for the parameter phaseId. It does that by saying to use campaignstack_list_phases to confirm the ID first – telling the agent where to obtain a valid value. While it doesn't describe format or constraints beyond the schema's type/minLength, it gives practical sourcing guidance that the schema omits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Permanently delete a campaign phase' – a specific verb and resource with the important qualifier 'permanently'. It explicitly distinguishes itself from campaignstack_update_phase ('not to reorder it'), so an agent can immediately tell which tool is which among the many phase-related siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger condition ('only when the user asks to remove one'), a clear exclusion ('not to reorder it'), names the alternative tool for that case, and even provides a prerequisite step (confirm the ID via campaignstack_list_phases). This is textbook usage guidance – nothing 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_delete_signal_agentADestructiveInspect
Deprecated name for campaignstack_archive_signal_agent, which is what this does: it archives rather than deletes. Use campaignstack_archive_signal_agent.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| agentId | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states the operation archives (non-destructive) but the annotations declare destructiveHint: true. This is a direct contradiction. The description does clarify the behavior, but the mismatch with structured data is serious and confusing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with deprecation status and the correct alternative. Every word earns its place, and the structure is ideal for a deprecated alias.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deprecated alias, the description fully covers what it does, what to use instead, and the semantic difference. The output schema exists, so return format is not needed. Complete for its purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description provides no parameter information. While agentId is trivial and self-explanatory, the low coverage requires the description to compensate, which it does not. At most a minimal score for an obvious parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states this is a deprecated name for campaignstack_archive_signal_agent and clarifies that it archives rather than deletes. This makes the tool's actual purpose unambiguous and distinguishes it from the delete-named sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use campaignstack_archive_signal_agent', providing clear direction to the correct sibling. It also explains the semantic difference (archives vs deletes), so an agent knows when to prefer the alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_delete_workflowADestructiveInspect
Permanently delete a workflow and all associated data. Call this only after the user has named the workflow and explicitly confirmed deletion, not merely disabling it. This action is irreversible and cascades to: workflow nodes, edges, lead-list source providers, node lead-list entries (lead progress), per-lead workflow contexts, and webhook tokens tied to this workflow. Use campaignstack_list_workflows to find workflow IDs. If you want to stop a workflow without deleting it, use campaignstack_update_workflow_status instead.
| Name | Required | Description | Default |
|---|---|---|---|
| workflowId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| workflowId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description details irreversibility and enumerates the exact cascading deletions: workflow nodes, edges, lead-list source providers, node lead-list entries, per-lead workflow contexts, and webhook tokens. This gives the agent essential risk information not present in the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Each sentence earns its place: the destructive action is front-loaded, usage guardrails come next, the cascading impact is enumerated compactly, and the alternative is named last. The length is justified by the irreversibility and breadth of affected data.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive single-parameter tool, the description covers preconditions, how to find the parameter value, what gets destroyed, and the non-destructive alternative. Since an output schema exists, omitting return-value details is acceptable, and nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines workflowId as a required string with no description, so schema coverage is 0%. The description compensates by directing the agent to campaignstack_list_workflows to obtain the correct workflow ID, which gives practical parameter sourcing even though it does not restate the obvious semantics of workflowId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Permanently delete a workflow and all associated data,' giving a specific verb, resource, and scope. It clearly distinguishes this from merely disabling a workflow by naming the alternative campaignstack_update_workflow_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit preconditions: call only after the user has named the workflow and explicitly confirmed deletion. It also tells the agent to use campaignstack_list_workflows to find workflow IDs and points to campaignstack_update_workflow_status as the non-destructive alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_diagnose_lead_sourcingARead-onlyIdempotentInspect
Diagnose why a specific lead was or wasn't sourced into a workflow. Accepts a workflowId plus either a leadId or profileUrl (LinkedIn URL). Returns a diagnostic report covering: lead existence, ICP score, score threshold checks, dedup status (same-workflow and cross-workflow), exclusion list matches, per-provider filter evaluation, and a human-readable verdict explaining the sourcing outcome. Call this when the user asks why a lead never showed up in a workflow. It only explains the decision: campaignstack_update_filter_exclusion_rules and campaignstack_toggle_exclusion change filters. Use campaignstack_list_workflows or campaignstack_search_leads to find valid IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | No | ||
| profileUrl | No | ||
| workflowId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| score | No | |
| verdict | No | |
| leadFound | No | |
| excludedBy | No | |
| scorePassesThreshold | No | |
| alreadyInThisWorkflow | No | |
| alreadyInOtherWorkflow | No | |
| matchesProviderFilters | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true. The description adds that the tool 'only explains the decision' and lists the diagnostic components, reinforcing a non-mutating behavior without contradicting annotations. It doesn't go deeper into authentication or rate limits, but the annotations cover the safety profile well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than necessary but every sentence adds value: purpose, parameters, report contents, usage trigger, exclusions, and ID-finding guidance. It is front-loaded with the diagnostic purpose and uses a structured list for the report contents. Only minor redundancy exists (e.g., 'only explains the decision' overlaps with read-only annotations).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 doesn't need to explain return values, yet it still summarizes the report content. It covers when to use, what it does not do, and how to source valid IDs. The main gap is that the necessity of leadId/profileUrl relative to workflowId is implicit rather than explicit, which could cause an agent to call it with only workflowId and get a degraded result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains that workflowId is required and that either a leadId or a profileUrl (LinkedIn URL) is accepted. It also guides the agent to find valid IDs. However, it doesn't clarify whether at least one of leadId/profileUrl is mandatory beyond the required workflowId, leaving slight ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Diagnose why a specific lead was or wasn't sourced into a workflow.' It enumerates the exact diagnostic report contents and explicitly names sibling tools that change filters, making the purpose distinct from campaignstack_update_filter_exclusion_rules and campaignstack_toggle_exclusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit trigger: 'Call this when the user asks why a lead never showed up in a workflow.' It also explains what the tool does not do ('It only explains the decision'), names alternatives for changing filters, and instructs the agent to use campaignstack_list_workflows or campaignstack_search_leads to find valid IDs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_disconnect_integrationADestructiveInspect
Disconnect (remove) an integration by provider. Permanently deletes the integration record and its stored credentials. Call this when the user asks to remove or disconnect a provider. It does not undo anything the provider already did with data already sent to it, a lead already added to a sequence or list stays there; it only removes CampaignStack's stored connection. Valid providers: apollo, instantly, clay, hubspot. Use campaignstack_list_integrations to see which integrations are connected.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | Integration provider to disconnect | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| message | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true; description adds crucial context that it permanently deletes stored credentials and clarifies that data already sent to providers remains unaffected. This goes beyond the annotation and gives the agent a clear mental model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose, consequences, trigger, non-effects, provider list, and pointer to sibling. Front-loaded with the core action, no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive tool with output schema and annotations, the description fully covers scope, limitations, and validation path. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters, so the baseline is 3. The description repeats the valid providers (matching the enum) but adds no extra meaning beyond the schema descriptions, which already explain the key distinction for workspaceId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Disconnect (remove) an integration by provider') and clarifies the permanent nature. It distinguishes from siblings like connect_* and list_integrations by naming the alternative to use for checking connected integrations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Call this when the user asks to remove or disconnect a provider' and clarifies what it does NOT do (doesn't undo provider actions), which prevents misuse. Points to campaignstack_list_integrations for verification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_duplicate_content_postAInspect
Duplicates a content post as a new draft, copying body, media, and tags with all lifecycle fields cleared. Call this when the user asks to reuse or repost something close to an earlier post. Returns the new post ID. It does not schedule the copy: use campaignstack_schedule_content_post once the wording is right.
| Name | Required | Description | Default |
|---|---|---|---|
| contentPostId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| contentPostId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false and destructiveHint=false, so the description complements by stating it copies content and clears lifecycle fields, implying a write operation without destruction. It also notes the copy is a draft and returns the new ID, adding useful behavior 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each delivering distinct information: what it does, when to use it, return value, and what it doesn't do. No filler; the key points are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single parameter and no nested objects, the description covers all essential aspects: the operation, the input, the output, and the follow-up step. The output schema exists but isn't detailed; the description sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Description references 'contentPostId' implicitly by talking about 'an earlier post', which aligns with the single required parameter. Though schema coverage is 0%, the description clarifies the parameter's purpose by connecting it to the source post to duplicate, effectively compensating for the schema's lack of documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb ('duplicates') and resource ('content post'), specifies what is copied (body, media, tags) and that lifecycle fields are cleared. Distinguishes from related creation/scheduling tools by naming the alternative schedule flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use ('when the user asks to reuse or repost something close to an earlier post') and what not to do (does not schedule; directs to campaignstack_schedule_content_post afterward).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_edit_and_approve_reviewADestructiveInspect
Edit the AI-generated content and approve the review entry in one call. The original content is preserved for audit trail. Draft parked at a review node: the lead advances via the 'approved' edge. Escalated entry parked at the acting node: the withheld action resumes with your edited text. Call this to send a changed version of a pending draft; unchanged wording is campaignstack_approve_review, no send at all is campaignstack_reject_review.
| Name | Required | Description | Default |
|---|---|---|---|
| entryId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| updatedContent | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| entryId | No | |
| success | No | |
| decision | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already mark the tool as destructive and non-idempotent, the description adds meaningful behavioral detail: original content is preserved for audit trail, the lead advances via the 'approved' edge, and a withheld action resumes with the edited text. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: main purpose first, then workflow behavior, then routing to alternatives. Every sentence adds distinct information, and there is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers both workflow contexts, the audit-trail behavior, and sibling-tool alternatives, which is strong for a review-action tool. The main remaining gap is a precise definition of what updatedContent should contain, though the output schema and the phrase 'edited text' partially mitigate that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, with only workspaceId described. The description partially compensates by indicating that updatedContent carries the edited text, but it does not clarify entryId or the expected shape of the updatedContent object. It adds some meaning beyond the schema, but not enough to fully resolve the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description leads with a specific verb and resource: 'Edit the AI-generated content and approve the review entry in one call.' It clearly identifies what the tool does and distinguishes it from adjacent siblings by framing it as the 'changed version' action. An agent can immediately tell this is not approve_review or reject_review.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing guidance: use this when sending a changed version of a pending draft, use approve_review when wording is unchanged, and use reject_review when no send is intended. It also explains two distinct workflow states—draft parked at a review node and escalated entry parked at the acting node—making the applicability clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_edit_scheduled_messageAInspect
Change the text of an already-approved message that is still waiting at its send node, keeping its scheduled slot. Pass the same content shape as campaignstack_edit_and_approve_review (e.g. { messageText }). Call this when the user wants to reword a send that has already been approved but has not gone out yet; for a draft still pending review, use campaignstack_edit_and_approve_review instead. Refuses with DRAFT_ALREADY_DISPATCHING once the send is in flight and with DRAFT_NOT_SCHEDULED for an entry that is not waiting to send. Scheduled entries come from the inbox scheduled mode or campaignstack_list_leads_at_node.
| Name | Required | Description | Default |
|---|---|---|---|
| entryId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| updatedContent | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| entryId | No | |
| success | No | |
| decision | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate this is a mutating operation (readOnlyHint=false) but not destructive. The description adds failure modes ('Refuses with DRAFT_ALREADY_DISPATCHING...' and 'DRAFT_NOT_SCHEDULED...'), which are not in annotations. It also implies state changes (text of an approved message), but doesn't detail side effects on other fields. The disclosure of refusal reasons is valuable beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet information-dense. It front-loads the core purpose, then covers usage, alternatives, failure modes, and data sources in a logical order. Each 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, return values are already documented. The description covers the essential aspects: what it does, when to use it, when not to, failure scenarios, and where scheduled entries originate. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (workspaceId has a description). The description compensates for updatedContent by referencing the shape from campaignstack_edit_and_approve_review and giving an example ({ messageText }). This helps agents construct the parameter correctly. entryId is left generic, but its purpose is inferable from the tool's context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Change'), resource ('an already-approved message that is still waiting at its send node'), and action ('keeping its scheduled slot'). It also explicitly differentiates from the sibling campaignstack_edit_and_approve_review by noting it applies to approved sends vs. drafts, making selection unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('Call this when the user wants to reword a send that has already been approved but has not gone out yet') and when-not-to-use ('for a draft still pending review, use campaignstack_edit_and_approve_review instead'), naming the alternative. Also notes where scheduled entries come from, guiding the agent to the right data source.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_enrich_company_infoAInspect
Enrich a company's firmographics (industry, employee count, founding year, description, website, phone, location) through a connected enrichment provider (provider-parameterized, default apollo; clay runs the routine named by clayRoutineId and polls for the result). Single company. Call this when the user asks to fill in a company's firmographics. It does not touch the leads at that company: campaignstack_enrich_lead_contact_info resolves a person's email or phone instead. Company data is shared across the platform, so the lookup fills only the fields that are still empty and never overwrites first-party data. Free: the tenant pays the provider directly, so no CampaignStack credits are charged. Returns status: enriched (with fieldsWritten), not_found (no provider match), or error (e.g. INTEGRATION_NOT_CONNECTED, INTEGRATION_KEY_INVALID, INTEGRATION_RATE_LIMITED, COMPANY_NOT_FOUND). Requires a connected integration for the provider, so use campaignstack_connect_apollo first.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | No | Enrichment provider (default: apollo). clay runs the routine given in clayRoutineId and polls for the result. | |
| companyId | Yes | Company ID to enrich (from campaignstack_get_lead or campaignstack_list_companies). | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| clayRoutineId | No | Clay only, required with provider clay: the Clay routine id to run. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| provider | No | |
| fieldsWritten | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behavioral traits well beyond the annotations: it fills only empty fields, never overwrites first-party data, is free (no CampaignStack credits), returns specific status values (enriched, not_found, error) with example error codes, and requires a connected integration. This is rich contextual behavior that the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false) do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries essential information. It is front-loaded with the core purpose and scope, then covers exclusions, data-sharing behavior, cost, return statuses, and prerequisites in a logical order. No redundant sentences; it earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 does not need to explain return fields, but it covers all practical aspects: provider selection, clay routine specifics, workspace key semantics, prerequisite integration, error conditions, and the free cost. An agent has everything needed to call this tool correctly without ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the schema already provides full descriptions for all four parameters (100% coverage), the description adds substantial extra meaning: the default provider, the clay routine polling behavior, the workspaceId nuance (required for user keys, ignored for workspace keys), and the pointer to campaignstack_whoami for key type detection. This goes far beyond the schema's raw definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Enrich') and resource ('company's firmographics'), enumerates the exact fields covered, and explicitly distinguishes itself from the sibling tool campaignstack_enrich_lead_contact_info. An agent can immediately tell what this tool does and what it does not do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit call trigger ('Call this when the user asks to fill in a company's firmographics'), states what it does NOT do (does not touch leads), and names the alternative tool for that case. It also mentions the prerequisite of connecting an integration first and suggests campaignstack_connect_apollo, giving clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_enrich_lead_contact_infoAInspect
Resolve a lead's work email through the CampaignStack Contact Finder (the default) or a connected enrichment provider (provider-parameterized: bettercontact, apollo, instantly or clay). Single lead. Call this when the user asks to find or verify one lead's email or phone. Not firmographics: campaignstack_enrich_company_info fills those on the company instead. Writes the email onto the lead following the enrichment write-back rules (fill-empty; a guessed email never overwrites an existing one; upgrade-to-verified allowed) and charges CampaignStack enrichment credits only on success. bettercontact is the CampaignStack Contact Finder: no integration needed, it charges 10 credits per email found and 50 per phone found (revealPhone: true), nothing when not found; credits are reserved at request time and refunded for anything not found. It is asynchronous: the tool returns status pending with a requestId and creditsReserved, then poll campaignstack_get_contact_finder_request (or campaignstack_list_contact_finder_requests) until the request is completed or failed; a lead that already has the requested data returns enriched with alreadyPresent: true. instantly runs SuperSearch enrichment (billed in the tenant's Instantly credits; pick types via instantlyEnrichments - work_email and/or profile, where profile fills headline/summary/title/company from the lead's LinkedIn URL) and may return status pending when still running (re-run in a minute). clay runs the routine named by clayRoutineId (required with provider clay; Clay's API cannot list routines, the user copies the id from their Clay workspace) and may also return status pending. Returns status: enriched (email and/or profileWritten), pending (bettercontact, instantly, clay), not_found (no provider match, free), or error (e.g. INTEGRATION_NOT_CONNECTED, INTEGRATION_KEY_INVALID, INTEGRATION_RATE_LIMITED, CREDITS_EXHAUSTED, WORKSPACE_LOCKED). Masked/placeholder emails are never returned as data. apollo, instantly and clay require a connected integration for the provider (campaignstack_connect_apollo / campaignstack_connect_instantly first); bettercontact never does.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| provider | No | Enrichment provider (default: bettercontact). bettercontact is the CampaignStack Contact Finder: no integration to connect, 10 CampaignStack credits per email found and 50 per phone found, nothing when not found; it returns status pending with a requestId to poll via campaignstack_get_contact_finder_request. apollo uses the workspace's own connected Apollo key (no CampaignStack credits). instantly runs SuperSearch enrichment billed in the tenant's Instantly credits and may return status pending (re-run in a minute). clay runs the routine given in clayRoutineId (billed in the tenant's Clay credits) and may also return status pending. | |
| leadSource | No | Lead source table (default: global). Private leads are workspace-scoped CSV imports. | |
| revealPhone | No | bettercontact only: also look up the lead's phone number. 50 CampaignStack credits per phone found (reserved at request time, refunded when not found). Ignored for other providers. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| clayRoutineId | No | Clay only, required with provider clay: the Clay routine id to run. Clay's API cannot list routines; the user copies the id from their Clay workspace. | |
| instantlyEnrichments | No | Instantly only (default ["work_email"]): "work_email" finds the work email (1.5 Instantly credits); "profile" fills headline/summary/title/company details from the lead's LinkedIn URL (0.5 credits; requires the lead to have a LinkedIn URL). |
Output Schema
| Name | Required | Description |
|---|---|---|
| No | ||
| status | No | |
| message | No | |
| provider | No | |
| requestId | No | |
| emailStatus | No | |
| emailWritten | No | |
| alreadyPresent | No | |
| profileWritten | No | |
| creditsReserved | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already mark the operation as non-read-only, the description adds substantial behavioral detail: write-back rules (fill-empty, no overwrite of existing emails, upgrade-to-verified), credit reservation and refund behavior, asynchronous pending states with polling instructions, and status values. It also states that masked/placeholder emails are never returned. This goes far beyond annotation hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the tool is genuinely complex with seven parameters, four providers, async behavior, and credit model differences. Most sentences earn their place. Minor redundancy exists between the main description and the provider parameter description, so it is not perfectly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-provider enrichment tool with async behavior, the description is exceptionally complete: it covers when to use it, provider differences, integration prerequisites, credit implications, write-back semantics, polling routes, and all possible statuses. The presence of an output schema means return-value detail is not required, yet the description still provides high-level status context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 86%, but the description adds operational meaning to nearly every parameter: credit costs for revealPhone, leadSource workspace-scoping, workspaceId user-key vs workspace-key semantics, clayRoutineId sourcing and requirement, and instantlyEnrichments credit and LinkedIn-URL requirements. It meaningfully enriches what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('resolve'), identifies the resource ('a lead's work email' with optional phone), and names the default provider plus four concrete alternatives. It explicitly contrasts itself with campaignstack_enrich_company_info, so an agent can distinguish it from its closest sibling 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to call the tool: 'Call this when the user asks to find or verify one lead's email or phone.' It also gives a direct exclusion ('Not firmographics') and names the alternative tool for that case, plus provider-specific prerequisites like needing campaignstack_connect_apollo or campaignstack_connect_instantly first. The single-lead scope is also made explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_estimate_costARead-onlyIdempotentInspect
What a costed 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. Call this when the user is about to run a costed tool at volume and wants the exposure first; it only calculates, never reserves or spends. A paid workspace overflows to overage and reports a null balance rather than a refusal. The price comes from the same table the charge is made from, so it can never drift from what you are billed. Call it before a batch: the unit for a tool is a call, a result found or a page read, and the difference is a month of credits.
| Name | Required | Description | Default |
|---|---|---|---|
| tool | Yes | A costed tool name, e.g. campaignstack_craft_message. Known costed tools: campaignstack_analyze_website, campaignstack_check_company_news, campaignstack_comment_on_post, campaignstack_craft_comment, campaignstack_craft_followup, campaignstack_craft_message, campaignstack_craft_note, campaignstack_discover_lead_magnets, campaignstack_draft_meeting_message, campaignstack_enrich_lead_contact_info, campaignstack_explain_draft, campaignstack_extract_conversation_voice, campaignstack_extract_recent_comments, campaignstack_follow_profile, campaignstack_like_post, campaignstack_refresh_company, campaignstack_regenerate_playbook, campaignstack_reply_to_comment, campaignstack_request_meeting_brief, campaignstack_reread_review_link, campaignstack_send_connection_request, campaignstack_send_gmail, campaignstack_send_inmail, campaignstack_send_message, campaignstack_seo_run_audit. | |
| count | No | How many units you are about to spend. What a unit IS depends on the tool (a call, a result found, a page read); the response repeats it as `per`. Default 1. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| per | No | |
| note | No | |
| tool | No | |
| count | No | |
| total | No | |
| isPaid | No | |
| allowed | No | |
| balance | No | |
| actionType | No | |
| creditsPerUnit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses that the tool only calculates and never reserves or spends, that paid workspaces overflow to overage with a null balance instead of a refusal, and that pricing comes from the same table as billing. These traits materially affect interpretation of results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and return values are front-loaded, with later sentences adding useful edge-case and pricing context. The closing clause 'the difference is a month of credits' is unclear, but the overall structure is tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema, annotations, and parameter schema, the description supplies the missing behavioral and edge-case context needed to invoke and interpret the tool. Nothing essential for correct selection or calling appears absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already has 100% parameter coverage, including what a unit means and workspaceId behavior, so the baseline applies. The description reinforces the unit concept but does not add meaningful parameter information beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action and object: it estimates what a costed tool would spend before invocation, and enumerates the returned fields. This is distinct from execution or balance-lookup siblings, so an agent can tell when this pre-call estimator is relevant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to call this before running a costed tool at volume or before a batch, to expose spend risk first. It does not name an alternative tool or say when not to use it, but the conditions are specific enough to route usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_explain_capabilitiesARead-onlyIdempotentInspect
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 seven 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_list_signal_agents, campaignstack_list_workflows, and so on). Costs nothing and reads no workspace data.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Which map to return. Defaults to overview. |
Output Schema
| Name | Required | Description |
|---|---|---|
| topic | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=true, idempotent=true, and destructive=false, so the safety profile is covered. The description adds valuable behavior beyond that: it is 'a static reference,' it 'returns no live counts,' it 'costs nothing,' and it 'reads no workspace data.' These contextual constraints are genuinely useful for an agent deciding whether to invoke it in a given situation. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
At roughly 110 words, every sentence earns its place: purpose, call conditions, topic semantics, and behavioral caveats. The topic enumeration is compact but runs together in one dense block, and a bulleted list would improve scannability. Minor structural nit against otherwise tight prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 details need not be spelled out. The sole parameter is fully documented in both schema and description, annotations cover the operational profile, and the description covers purpose, usage triggers, topic content, cost, and data-access behavior. For a tool whose job is to resolve the complexity of hundreds of siblings, 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but the schema's param description ('Which map to return. Defaults to overview.') is thin. The description goes substantially beyond it by explaining what each enum value actually contains in practical terms: watchers ('how to choose between the seven ways to monitor something'), workflows ('which tool creates which kind'), platforms ('what can be acted on and what is tracking-only'), and outreach_and_safety ('who sends, what the limits are'). This converts bare enum names into actionable selection guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Explain how the pieces of this workspace fit together, so you can pick the right tool.' This clearly positions the tool as an orientation/reference utility and distinguishes it from the hundreds of operational sibling tools, which it names as the objects of its guidance. It also enumerates five concrete topic areas, leaving no ambiguity about what it covers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives three explicit call conditions: 'choosing between similar tools,' 'a request does not obviously map to one tool,' and 'an error tells you to consult it.' It also routes away from itself by stating it 'returns no live counts' and pointing to the specific list tools (campaignstack_list_signal_agents, campaignstack_list_workflows) that should be used instead. This is explicit when/when-not guidance with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_explain_draftARead-onlyInspect
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, the lead's own facts), plus the tool and field that changes each one. Every citation is re-checked against the prompt section it names, so an unverifiable one comes back as unattributed rather than as a plausible guess. Call this when a draft reads wrong and you need to know WHICH setting to edit; campaignstack_preview_craft_prompt shows the same prompt for a draft that has not been written yet. Charges mcp_craft credits per call; campaignstack_estimate_cost gives the number before you commit. One model call over a stored draft and its prompt; writes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| entryId | No | A workflow entry id, e.g. from campaignstack_list_pending_reviews. Resolves to the newest accepted draft for that entry's lead. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| craftAuditLogId | No | A row id from campaignstack_export_craft_audit. |
Output Schema
| Name | Required | Description |
|---|---|---|
| draft | No | |
| fixes | No | |
| caller | No | |
| verdict | No | |
| createdAt | No | |
| sentences | No | |
| craftAuditLogId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/destructive annotations, it discloses that citations are re-verified against the named prompt section and degrade to 'unattributed' when unverifiable rather than guessing. It also states the cost model (mcp_craft credits per call) and that the operation performs one model call and writes nothing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Each sentence carries a distinct piece of information: purpose, verification guarantee, when to use it, cost, and side-effect profile. The description is dense but every sentence earns its place, and the opening immediately communicates what the tool returns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 100% parameter schema coverage and an output schema present, the description covers the remaining agent-relevant context: use case, behavior, cost, alternative route, and no-write guarantee. Nothing an agent needs to invoke it correctly appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema itself already explains entryId resolution, workspace/key behavior, and craftAuditLogId origin. The description adds no parameter-level detail, so it stays at the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact operation: attributing each sentence of a draft to the configuration that produced it and to the tool or field that would change it. It also distinguishes itself from campaignstack_preview_craft_prompt, which serves the pre-write preview use case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger ('when a draft reads wrong and you need to know WHICH setting to edit') and names the alternative tool with the contrasting condition (draft not yet written). It also adds cost-awareness guidance by pointing to campaignstack_estimate_cost before committing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_export_craft_auditARead-onlyIdempotentInspect
Export craft audit log rows for a workspace: one row per accepted AI craft (messages, notes, comments, replies, critic passes) with the final text, attempt count, prompt sizes, and refs (workflow, node, lead, aiUsage cost row). Newest first, paginated via cursor. The exact system prompt, user prompt and raw model output are omitted unless you pass include; they are large enough that a page of them is mostly unread context. Call this when the user asks to review recent AI drafts or audit quality over a window. Use it to spot a bad draft, then re-read that row with include: ["prompts"]. It does not say WHY a draft reads that way: campaignstack_explain_draft does.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Inclusive createdAt upper bound (Unix ms). | |
| from | No | Inclusive createdAt lower bound (Unix ms). | |
| limit | No | Rows per page (default 50). | |
| cursor | No | Continuation cursor from a previous call. | |
| include | No | Heavy fields to include verbatim. Default: neither. A single row's prompts run to tens of thousands of characters, so ask for them only when you are going to read them, which usually means one row you already identified. systemPromptChars, userPromptChars and rawOutputChars are always returned. | |
| workspaceId | No | Workspace to export from. Workspace ID (required for user keys; workspace keys are bound). |
Output Schema
| Name | Required | Description |
|---|---|---|
| rows | No | |
| isDone | No | |
| nextCursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations already declare readOnlyHint=true and idempotentHint=true, the description adds meaningful behavioral context: rows are ordered newest-first with cursor-based pagination, heavy fields are omitted by default because they would bloat the page, and it clarifies it does not provide causal explanations. This goes well beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact but information-dense. It leads with the core purpose, then pagination, then the heavy-field caveat, and ends with usage guidance and the sibling reference. Each sentence earns its place; the only minor inefficiency is the length, but it remains well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has an output schema (so return format is covered there), the description fully addresses purpose, usage, behavior, and parameter selection. It also accounts for the tool's read-only nature via annotations and adds the crucial context about heavy fields and pagination. Nothing an agent needs to decide when and how to call this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so each parameter has a description. The description enhances the 'include' parameter semantics by explaining why to avoid requesting heavy fields ('large enough that a page of them is mostly unread context') and advising to fetch them only for one identified row. This guidance helps the agent decide when to set the parameter, adding value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Export') and resource ('craft audit log rows') and enumerates exactly what each row contains (final text, attempt count, prompt sizes, refs). It explicitly differentiates from sibling campaignstack_explain_draft, which addresses why a draft reads a certain way, making the tool's role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit invocation criteria ('Call this when the user asks to review recent AI drafts or audit quality over a window') and a concrete workflow ('spot a bad draft, then re-read that row with include: ["prompts"]'). It also names the alternative for 'why' explanations, leaving no ambiguity about when to use this tool versus campaignstack_explain_draft.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_extract_company_employeesAInspect
Read a company's LinkedIn People page on one of the workspace's connected accounts (up to 1000 profiles, LinkedIn's own display ceiling; optionally filtered by job titles). Call this when the user asks who works at a company, or wants a company's people turned into leads. Employees land as shared leads tied to the company - re-running updates them, never duplicates. They are NOT added to any lead list; read them with campaignstack_list_company_employees and act with campaignstack_add_leads_to_list. The job runs in the background; one extraction per company at a time. Use campaignstack_list_companies to find company IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | Yes | ||
| maxResults | No | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| positionFilter | No | Job-title keywords separated by " OR ", at most 6 terms |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | No | |
| runId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses several key behaviors beyond the annotations: employees land as shared leads tied to the company, re-running updates them without duplicates, the job runs in the background, and only one extraction per company at a time is allowed. These side effects and concurrency constraints are not captured by the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false) and are critical for the agent to set expectations and avoid misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense with no filler. Each sentence serves a purpose: the first establishes what the tool reads, the second gives usage triggers, the third explains side effects and dedup behavior, the fourth clarifies the lead-list interaction, and the last covers background execution and company ID discovery. The most important action and scope are front-loaded, and the length is justified by the tool's non-trivial behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (background job, side effects, related tools) and the presence of an output schema, the description is thorough. It explains the full workflow: extraction, lead creation/updating, absence from lists, how to read results, how to act on them, and how to find prerequisite IDs. An agent has enough context to invoke the tool correctly and chain it with the right siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, with workspaceId and positionFilter already described. The description adds meaning for the undocumented params: it mentions the 1000-profile ceiling (maxResults) and job-title filtering (positionFilter), and directs users to campaignstack_list_companies for companyId. While not every parameter is explicitly mapped, the description provides enough behavioral context to fill most of the gap, though it could be more explicit about maxResults' minimum and default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 a company's LinkedIn People page on one of the workspace's connected accounts', with clear scope (company, up to 1000 profiles, optional job-title filter). It explicitly states when to call it ('when the user asks who works at a company') and distinguishes itself from siblings by naming campaignstack_list_company_employees for reading results and campaignstack_add_leads_to_list for acting on them. This leaves no ambiguity about the tool's role relative to its many siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides direct usage triggers ('Call this when...') and explicitly routes to alternatives: it clarifies that employees are NOT added to a lead list and that users should read them with campaignstack_list_company_employees and act with campaignstack_add_leads_to_list. It also instructs using campaignstack_list_companies to find company IDs. This is clear when-to-use and when-not-to-use guidance that prevents misrouting among the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_extract_conversation_voiceAInspect
Run voice extraction for the human behind a LinkedIn account from their stored writing (every account of theirs, messages and posts). Needs at least 50 messages and 1,000 words the owner wrote themselves; messages that look automated or AI-written are excluded first (backfill runs when the account connects). The profile activates on its own when those floors clear. Call this when the user asks to build or refresh an account's voice profile, or after campaignstack_get_conversation_voice shows an empty profiles list. Charges voice_extraction credits, refunded on failure.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| linkedinAccountId | Yes | LinkedIn account id | |
| analysisMessageCount | No | How many stored messages the extraction analyzes per language (default 200) |
Output Schema
| Name | Required | Description |
|---|---|---|
| version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description richly discloses behavior beyond the annotations: minimum data thresholds, exclusion of automated/AI-written messages, backfill timing on account connection, automatic profile activation, and credit charges with refunds on failure. The annotations only contain generic false hints, so this context is essential and not duplicated elsewhere.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is five dense sentences with no filler. It front-loads the primary purpose, then covers requirements, automatic behavior, invocation signals, and cost/refund terms. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with this complexity and uninformative annotations, the description covers prerequisites, background behavior, auto-activation, billing consequences, and call timing. An output schema exists, so return-value documentation is not required in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% parameter coverage, including linkedinAccountId, the workspaceId distinction between user and workspace keys, and analysisMessageCount's range and default. The description does not meaningfully add parameter-specific semantics, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Run voice extraction') on a specific resource ('the human behind a LinkedIn account' from stored messages and posts). It clearly frames the output as building or refreshing a voice profile and distinguishes itself from the related read-only sibling by naming campaignstack_get_conversation_voice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to call it: when the user asks to build or refresh a voice profile, or after campaignstack_get_conversation_voice shows an empty profiles list. It also provides prerequisites (50 messages, 1,000 words) and notes auto-activation. However, it does not give when-not conditions or name alternative tools such as update_conversation_voice for handling an already-existing profile.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_extract_recent_commentsARead-onlyInspect
Read the comments a LinkedIn profile has written, back to a date you name, with the posts they were written on, on one of the workspace's connected accounts. Call this when the user asks what a lead has been commenting on, before drafting outreach that references it. Returns each post's author, body and engagement counts, each comment's text and time, how many replies it drew, and the comment it answered when LinkedIn says so. Reactions are not read. Nothing is written to the other platform and nothing is stored from this read. Reading a LinkedIn account connected to this workspace is free. Any other profile costs 5 credits per LinkedIn call the read makes, and the number of calls cannot be known before the read, because it depends on how densely that person comments: a month of an active commenter is usually 7 to 10 calls. Use maxRequests to cap it. The response reports requestsUsed, stopReason and creditsCharged.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | No | Read with a specific connected account. Defaults to the least-loaded one. | |
| untilDate | Yes | ISO date to read back to, e.g. 2026-08-10. The walk stops at the first page older than this; comments older than it that share a page are still returned. | |
| profileUrl | Yes | LinkedIn profile URL, e.g. https://www.linkedin.com/in/some-slug | |
| maxRequests | No | Ceiling on LinkedIn calls, and therefore on the cost. Defaults to 10. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | |
| error | No | |
| posts | No | |
| message | No | |
| success | No | |
| ownAccount | No | |
| profileUrl | No | |
| profileUrn | No | |
| stopReason | No | |
| requestsUsed | No | |
| creditsCharged | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and destructiveHint annotations, the description discloses that nothing is written or stored, that connected-account reads are free while other profiles cost 5 credits per LinkedIn call, and that the call count is unknowable in advance with maxRequests as a cap. It also surfaces requestsUsed, stopReason and creditsCharged, giving full side-effect and cost transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: behavior is front-loaded, then return contents, then cost and stopping behavior. It contains no filler and does not merely restate schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a costly paginated read, the description covers what is returned, the cost model, the cap, side effects, account selection, and the output schema is present. Nothing an agent needs to invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 meaningful context: accountId defaults to the least-loaded account, untilDate stops at the first page older than the date, and maxRequests is framed as the cost ceiling. This helps an agent pick and set parameters more intelligently than the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names the exact operation: read comments a LinkedIn profile has written, back to a date, with the posts they were written on, scoped to a connected account. It also explicitly disclaims reading reactions, which distinguishes it from write siblings like campaignstack_comment_on_post and campaignstack_reply_to_comment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger: call this when the user asks what a lead has been commenting on, before drafting outreach that references it. It does not name a specific alternative tool or enumerate when-not-to-use conditions, but the context is clear enough to route an agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_fetch_mutual_connectionsAInspect
Read the connections a lead shares with one of the workspace's own LinkedIn accounts, as that account already sees them, and record them as person-to-person edges. This is what turns the relationship graph from a set of spokes around your own accounts into a network, so warm paths and introductions become answerable. Call this when a lead has no recorded edge yet. It writes new edges; read what exists with campaignstack_get_lead_connections or campaignstack_find_warm_paths, which cost nothing. Occasional use, a few times a day. Recurring extraction is not what this connector is for. It spends one LinkedIn search from the account's own daily allowance (10 a day on the free tier), so run it for a lead who matters rather than across a list. Requires the lead to have a LinkedIn member id: enrich the lead first if this returns skipped.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| leadSource | No | global | |
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | No | |
| skipped | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that this tool writes new edges, consumes one of the account's daily LinkedIn search allowance, can return a 'skipped' outcome, and is not meant for recurring extraction. These behavioral details go well beyond the annotations and are not contradicted by readOnlyHint, destructiveHint, or idempotentHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, and each subsequent sentence earns its place by providing usage, cost, alternatives, or prerequisites. It is information-dense without being padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with external side effects, the description covers quota usage, when to invoke it, when not to, what happens with missing prerequisites, and where to read results instead. The output schema handles return-value details, so nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds meaning to leadId by explaining that it must reference a lead with a LinkedIn member id and no recorded edge yet. However, leadSource is an enum with no description in the schema and no explanation in the description; its optional default softens the impact, but the global/private distinction is still unclear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation: read a lead's mutual connections from a workspace LinkedIn account and persist them as graph edges. It also explicitly contrasts itself with read-only siblings like campaignstack_get_lead_connections and campaignstack_find_warm_paths, so an agent can distinguish it without checking schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says exactly when to call it ('when a lead has no recorded edge yet'), when not to call it (recurring extraction), and names the free alternatives for reading existing edges. It also adds cost and prerequisite guidance: it spends one LinkedIn search, should be used rarely, and requires the lead to have a LinkedIn member id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_find_warm_pathsARead-onlyIdempotentInspect
Check which of a workspace's LinkedIn accounts can already reach a lead. A 1st-degree result means that account can message the person right now, with no connection request and no waiting. Call this before queueing outreach: sending from an account that already knows someone skips days of waiting and spends no connection budget, which is the scarcest budget in the system. It only reads the recorded graph and sends nothing itself; campaignstack_send_message or campaignstack_send_connection_request act on what it finds.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| leadSource | No | global | |
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| paths | No | |
| warmest | No | |
| accountsChecked | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the bar is lower. The description adds meaningful behavioral context with 'It only reads the recorded graph and sends nothing itself' and explains what a warm-path result means operationally: no waiting and no connection budget spent. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four tight sentences with the core purpose front-loaded, followed by consequence, usage timing, and side-effect clarification. Every sentence earns its place with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with supportive annotations and an output schema, the description sufficiently covers what the tool computes, when to call it, and what to do next. The main remaining gap is the undocumented leadSource parameter, so it is not maximally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%; workspaceId is fully documented in the schema, but leadId has no schema description and leadSource is only conveyed through an enum/default. The description gives rough context by mentioning 'a lead' and 'a workspace,' but it never explicitly defines leadId or leadSource or explains when to choose global versus private, so it does not compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Check which of a workspace's LinkedIn accounts can already reach a lead.' It defines what a 1st-degree result means and explicitly distinguishes itself from sending tools by saying it 'sends nothing itself,' making its purpose clear and distinct from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Call this before queueing outreach' and explains the benefit: skipping days of waiting and saving connection budget, 'the scarcest budget in the system.' It also names the follow-up tools campaignstack_send_message and campaignstack_send_connection_request. However, it does not enumerate exclusions versus similar lookup siblings such as get_lead_connections or fetch_mutual_connections.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_follow_profileADestructiveInspect
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_list_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: put the leads in a lead list with campaignstack_add_leads_to_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Sending is paced by CampaignStack's own daily and weekly limits and business hours, which are set by a human in the app and are not writable from here; see overrideOwnLimits before asking for an exception.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | No | ||
| platform | Yes | ||
| accountId | No | ||
| profileUrl | No | ||
| overrideOwnLimits | No | 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. | |
| dangerouslyBypassSafetySystem | No | Deprecated name for overrideOwnLimits. Use overrideOwnLimits. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | No | |
| status | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
This description goes well beyond the annotations: it discloses that the follow "reaches a real person," is visible to that person and notifies them, is paced by CampaignStack limits, and requires explicit user consent before calling. This is especially important given destructiveHint=true and readOnlyHint=false, and nothing in the description contradicts 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but it is dense and each section serves a purpose: identifying the target, clarifying the real-world effect, requiring consent, and steering away from bulk misuse. It is front-loaded with the core purpose and keeps the safety and workflow caveats in the second half, though a bit of trimming would make it crisper.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, real-person-affecting action with open-world implications, the description covers what is needed to invoke it safely: account selection, target identification, the distinction from connection requests, consent requirements, pacing/limits, and the correct bulk path. Since an output schema exists, the absence of return-value details is not a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at only 33%, the description compensates meaningfully: it explains that leadId is the supported identifier, profileUrl is accepted only for someone already in the workspace, that platform is currently limited to "linkedin", and that accountId defaults to the workspace's only connected LinkedIn account. It also flags overrideOwnLimits as a safety-relevant exception, though it doesn't enumerate every parameter's full semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: "follow a profile from a connected LinkedIn account." It also distinguishes itself from the related action by stating it "does not send a connection request" and directs to campaignstack_send_connection_request, so purpose and boundary are clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says "Call this when the user asks to follow a specific person" and provides clear selection guidance for when to use leadId versus profileUrl and when to pass accountId. It also gives strong negative guidance: one person per call, no bulk looping, and the correct alternative via add_leads_to_list plus trigger_workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_accountARead-onlyIdempotentInspect
Get detailed account health info including status, budget usage per action type, ramp-up state, and last activity timestamps. Requires platform ('linkedin' or 'google') and accountId. Use campaignstack_list_accounts to find valid accountId values. Call this after campaignstack_list_accounts, before dispatching outreach, to check today's budget. It does not split CampaignStack's sends from the rest: campaignstack_get_account_safety does.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Platform of the account to retrieve | |
| accountId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| name | No | |
| No | ||
| status | No | |
| headline | No | |
| pausedAt | No | |
| platform | No | |
| profileUrl | No | |
| accountTier | No | |
| rampUpState | No | |
| todayBudgets | No | |
| workspaceIds | No | |
| lastHeartbeatAt | No | |
| connectionsCount | No | |
| firstConnectedAt | No | |
| lastActionByType | No | |
| ownerWorkspaceId | No | |
| hasSalesNavigator | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is known. The description adds behavioral context by clarifying that it does not split CampaignStack's sends from the rest, which is a useful caveat. It also specifies the data scope (budget usage, ramp-up state) that goes beyond the generic annotations. This adds value without contradicting structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured block with multiple clauses, but every clause carries functional information: purpose, parameters, usage ordering, and a caveat. It is front-loaded with the main purpose and efficiently conveys necessary guidance without redundancy. It could be trimmed slightly, but it remains concise and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's purpose, required parameters, how to obtain them, the recommended call sequence, and a differentiation from a closely related sibling. With an output schema available, there is no need to describe return structures. This is complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% (platform has a description, accountId does not). The description compensates by explaining that accountId must be obtained from campaignstack_list_accounts and by tying the parameters to the tool's purpose (checking budget). It also confirms platform values ('linkedin' or 'google') which align with the enum. This provides enough semantic context for an agent to use the parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool retrieves detailed account health info, listing specific data points (status, budget usage per action type, ramp-up state, last activity timestamps). It also clearly distinguishes itself from sibling campaignstack_get_account_safety by noting the scope difference, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides precise guidance on when to call the tool ('after campaignstack_list_accounts, before dispatching outreach, to check today's budget'), how to obtain required parameters (use campaignstack_list_accounts for accountId), and points to an alternative tool (campaignstack_get_account_safety) for a different need. This is explicit and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_account_maintenanceARead-onlyIdempotentInspect
Per-account housekeeping state for a LinkedIn account: invitation hygiene, the connection, message and own-posts watchers (status, auto-pause reason, workflow id), and the owning workspace. Call this when the user asks what automation is running on an account, before turning a watcher on or off. Only these three account-bound kinds: campaignstack_list_signal_agents with includeAccountMaintenance covers ordinary watchers too. Use campaignstack_set_account_watcher to change one.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| linkedinAccountId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| owner | No | |
| accountUsable | No | |
| messageWatcher | No | |
| ownPostsWatcher | No | |
| connectionWatcher | No | |
| invitationHygiene | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is established. The description adds behavioral context beyond annotations by detailing what state is returned (watcher status, auto-pause reason, workflow id) and framing the call as a pre-check before toggling watchers. It doesn't cover auth or rate limits, but with annotations carrying the safety burden, this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences in a logical order: what the tool returns, when to call it, and which sibling to use instead. Every sentence earns its place; no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values are covered. The description supplies the semantic context: the scope (three account-bound kinds), the pre-mutation use case, and the alternative/setter tools. An agent has enough to invoke it correctly without further research.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description itself adds no parameter-level meaning; linkedinAccountId is left to its name and minLength, while workspaceId is thoroughly explained in the schema (user key vs workspace key, omission rules). With schema description coverage at 50%, the description does not compensate for the bare linkedinAccountId, but that parameter is self-evident from the tool's purpose. The schema's workspaceId detail is strong, so this sits at an adequate baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the tool provides per-account housekeeping state and enumerates exactly what it contains: invitation hygiene, connection/message/own-posts watchers with status/auto-pause reason/workflow id, and the owning workspace. It also explicitly differentiates itself from campaignstack_list_signal_agents, so an agent can distinguish it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-call guidance ('when the user asks what automation is running on an account, before turning a watcher on or off'), names the sibling that covers ordinary watchers (campaignstack_list_signal_agents with includeAccountMaintenance), and points to the mutation tool for changes (campaignstack_set_account_watcher). This leaves no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_account_safetyARead-onlyIdempotentInspect
Read the safety measurement of a LinkedIn account: what LinkedIn saw the account do on the previous complete day, split into what CampaignStack sent (ours) and what somebody else sent (foreign), per write type (connection_request, send_message, post_comment). Headroom is LinkedIn's daily ceiling minus the foreign volume, and it caps what CampaignStack dispatches today (actions[].dispatchable). The measured floor is the account's own trailing volume over the last 28 days, which the ramp-up never decays below (actions[].floor). A null foreign means the signal was not measured and nothing is subtracted. Also returns the last 28 measured days (days[]), the pending-invitation backlog by age, the weekly invitation cap fact, the weekly acceptance series, the unmeasured signals and the safety score with its parts. Carries no reply rate and no message detail: reply rate is shown only on the account page inside the CampaignStack app, never here or in any other tool. Use campaignstack_list_accounts to find account IDs. Call this when an account might be at risk, or before raising its volume: it separates CampaignStack's own sends from the rest.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| linkedinAccountId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | No | 28-day daily series of observed/ours/foreign per type |
| tier | No | |
| flags | No | |
| score | No | |
| status | No | |
| actions | No | Per write-type headroom, dispatchable and floor |
| backlog | No | Pending-invitation backlog by age |
| pending | No | |
| budgetDay | No | |
| weeklyCap | No | |
| acceptance | No | |
| measuredAt | No | |
| unmeasured | No | |
| commentsPerWeek | No | |
| connectionsCount | No | |
| linkedinAccountId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description aligns. It adds valuable behavioral context beyond annotations: explains what a null foreign means ('signal was not measured and nothing is subtracted'), defines headroom and floor, and lists the full return set (days[], pending backlog, weekly cap, etc.). It also explicitly states what is NOT returned, which is transparency beyond 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence serves a purpose: it defines core concepts, lists outputs, explains null semantics, and gives usage triggers. It front-loads the primary purpose and the most critical distinction (ours vs. foreign). While dense, it is efficiently organized and not redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex read tool with many output fields, the description is remarkably complete. It explains the meaning of key metrics (headroom, floor, dispatchable), the interpretation of nulls, the full set of returned data, and what is deliberately omitted. It also provides usage context and a sibling pointer. Nothing an agent needs to decide to call this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: workspaceId is thoroughly described in the schema, but linkedinAccountId has only a name. The description compensates by telling the agent to use campaignstack_list_accounts to find account IDs, giving practical guidance for the second parameter. It doesn't duplicate schema content but adds value for the undocumented parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Read the safety measurement of a LinkedIn account.' It then enumerates the exact breakdown (ours vs. foreign per write type) and key outputs (headroom, floor, days[]), making the tool's purpose unambiguous and distinct from siblings. It even states what it does NOT carry (reply rate, message detail), further differentiating it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Call this when an account might be at risk, or before raising its volume.' It also explains the key decision factor (separating own sends from foreign) and points to campaignstack_list_accounts for finding account IDs. It clarifies that reply rate is never available here or in any other tool, setting clear expectations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_automation_jobsARead-onlyIdempotentInspect
The last ten times one automation ran, with the outcome and timing of each. Call this when the user asks why an automation did or did not do something, or after a run they expected to see. It covers one automation: campaignstack_list_automations has the rest, and campaignstack_get_workflow_stats covers workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| automationId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful context: the scope (one automation) and the return content (outcome and timing). It does not contradict annotations and adds value beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The core purpose is front-loaded, and the alternative tools are mentioned efficiently. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return format is already defined. The description covers scope, usage, and alternatives, making it fully complete for a read-only tool. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter automationId has no description in the schema (0% coverage). The tool description does not explicitly explain the parameter's format or how to obtain it, though the name is self-explanatory. Since schema coverage is zero, the description should compensate but does not add meaningful semantics beyond what the parameter name implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool returns: the last ten times an automation ran, with outcome and timing. It distinguishes itself from siblings by specifying it covers one automation, while campaignstack_list_automations covers the rest and campaignstack_get_workflow_stats covers workflows. This is a specific verb+resource with clear differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call: when the user asks why an automation did or did not do something, or after a run they expected to see. It also names the alternatives and what they cover, providing clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_campaignARead-onlyIdempotentInspect
Read one campaign: its goal and guidance, how many lead lists and workflows it has, and a summary of its ICP. Call this when the user asks what a campaign is doing, or before editing it so the current state can be read back to them. It counts lead lists rather than listing who is in them (campaignstack_get_lead_list) and carries no results (campaignstack_get_campaign_metrics). Use campaignstack_list_campaigns to find campaign IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| goal | No | |
| title | No | |
| createdAt | No | |
| updatedAt | No | |
| archivedAt | No | |
| icpSummary | No | |
| description | No | |
| workspaceId | No | |
| leadListCount | No | |
| offerAddendum | No | |
| workflowCount | No | |
| campaignGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds valuable behavioral context beyond annotations by noting that it counts lead lists rather than listing members and that it carries no performance results, clarifying what the response will and will not contain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences, each earning its place: first states purpose and payload, second gives usage context, third differentiates from sibling tools and provides ID lookup advice. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with an output schema and annotations, the description fully covers what the tool does, when to call it, how to identify the target, and what it intentionally excludes. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for campaignId. It does not restate the obvious but does give actionable guidance to use campaignstack_list_campaigns to find campaign IDs. The single-parameter schema is simple, and the description's pointer adequately fills the gap, though it could have explicitly tied campaignId to the campaign being read.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: 'Read one campaign', then enumerates exactly what is returned (goal, guidance, lead list/workflow counts, ICP summary). It also explicitly distinguishes itself from campaignstack_get_lead_list and campaignstack_get_campaign_metrics, making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: when the user asks what a campaign is doing, or before editing it. It also names alternatives and points to campaignstack_list_campaigns for finding campaign IDs, leaving no guesswork about the right invocation context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_campaign_metricsARead-onlyIdempotentInspect
Get per-campaign metrics: latest snapshot plus a time-series for the requested date range. Includes leads contacted, responded, converted, failed, total leads, and average ICP match score. Call this when the user asks how one named campaign is performing. Use campaignstack_list_campaigns to find valid campaign IDs. The campaign must belong to your API key's workspace; metrics for campaigns in other workspaces are not returned. It does not summarize every campaign at once, use campaignstack_get_workspace_metrics for that.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of calendar days to include in the range (default 30, max 90) | |
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| range | No | |
| latest | No | |
| dateRange | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so safety is covered. The description adds a key behavioral constraint: metrics are only returned for campaigns in the API key's workspace, and other workspaces are excluded. It also clarifies the response includes both a latest snapshot and a time-series, going 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, with the core purpose stated first and usage guidance following. It packs necessary details (scope, alternatives) into a few sentences without redundancy. It earns its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only metrics tool with an output schema, the description covers the purpose, usage, and an important limitation (workspace scope). It does not need to describe the return format since an output schema exists. The only minor gap is no explicit mention of pagination or time-series granularity, but that is likely covered by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% (days has a description, campaignId does not). The description mentions using campaignstack_list_campaigns to find valid IDs, which indirectly clarifies campaignId, but it does not explicitly describe the parameter format or add much beyond the schema. The days parameter is already well-described in the schema, so the description adds marginal value here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it retrieves per-campaign metrics including a snapshot and time-series, with a specific verb and resource. It distinguishes itself from sibling tools like get_workspace_metrics and get_campaign by focusing on metrics for a single named campaign. This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs when to call it ('when the user asks how one named campaign is performing'), how to find valid campaign IDs via campaignstack_list_campaigns, and what not to use it for (summarizing every campaign, pointing to get_workspace_metrics). This is exemplary guidance for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_campaign_topicsARead-onlyIdempotentInspect
Get all topics assigned to a campaign along with their weight (0 to 1). Topics with weight > 0.8 have active LinkedIn search watch automations. Returns topic metadata (id, name, displayName, category) and weight for each entry. Call this when the user asks what topics a specific campaign is scored or watched on. If the campaign is not found, use campaignstack_list_campaigns to find valid campaign IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| topics | No | |
| campaignId | No | |
| totalCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only, idempotent, non-destructive nature, so the description adds value by explaining the weight threshold meaning (>0.8 indicates active LinkedIn search watch automations) and the not-found fallback. This goes beyond the structured annotations, though it could be more explicit about the exact error/empty response behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the core purpose, and every sentence carries useful information: scope, weight interpretation, return shape, intended usage, and fallback. There is no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, one-parameter, read-only tool with an output schema, the description is complete. It covers what the tool returns, what the weight threshold means, when to invoke it, and what to do if the campaign ID is invalid. An agent has enough context to select and call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for parameter meaning. It does so by clarifying that campaignId refers to a specific campaign and that valid IDs can be obtained via campaignstack_list_campaigns. This adds meaningful context beyond the raw schema, even though it does not specify ID format or source details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it retrieves all topics assigned to a campaign, including their weights. This clearly distinguishes it from related sibling tools like get_campaign_weights or list_search_topics by emphasizing the campaign-topic relationship and the returned metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to call this tool: when the user asks what topics a specific campaign is scored or watched on. It also provides a fallback instruction to use campaignstack_list_campaigns if the campaign is not found, which is clear contextual guidance, though it does not enumerate when-not-to-use alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_campaign_weightsARead-onlyIdempotentInspect
Get signal weight configuration for a campaign. Shows all signal types with their score impact, whether they're enabled, and whether the weight is custom or default. Call this before tuning scoring, so current weights can be read back to the user. It only reads the configuration; campaignstack_update_campaign_weight changes it.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and non-destructive; the description largely restates this with 'It only reads the configuration.' It adds a small amount of context by pointing to the sibling that changes weights, but it does not disclose additional behavioral aspects such as auth requirements, error conditions, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the first states the core action and outputs, the second gives the intended usage context, and the third clarifies read-only behavior and the mutating sibling. Information is front-loaded and each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with a robust readOnly/idempotent annotation set and an output schema, the description covers the returned content, the correct moment to call it, and the separation from the update operation. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description must carry more weight, but it only ties the parameter to 'a campaign' and does not explain where campaignId comes from or its expected format. The single parameter name is self-descriptive and required in the schema, so this is minimally adequate but not richly documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource ('signal weight configuration for a campaign') and a clear verb ('Get'), and enumerates the returned dimensions: signal types, score impact, enabled state, and custom/default status. This distinguishes it from generic get_campaign/get_campaign_metrics and from campaignstack_update_campaign_weight.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger ('Call this before tuning scoring') and explains why (read current weights back to the user). It also names the mutating alternative, campaignstack_update_campaign_weight, and contrasts it with this read-only action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_companyARead-onlyIdempotentInspect
Get a company by ID. Accepts a shared (global) company id or an imported workspace-scoped company id; the response's companySource field says which one matched. Returns industry, employee range, and contact info. Platform presence (LinkedIn URL, follower/staff counts, tagline) is under the profiles key (e.g. profiles.linkedin.url); top-level LinkedIn fields are legacy aliases. The watch key carries the workspace's intelligence post watch on this company (id, status, post count) when one exists. The siteFacts key carries what the company's own website says (who it sells to, whether pricing is public, product stage), read from the pages we track; a null field means we could not tell, not no. Call this when the user names one company and asks about it, or before editing it. It does not list which leads work there, campaignstack_search_leads does. If the company is not found, use campaignstack_list_companies to find valid company IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| companyId | Yes | ||
| workspaceId | No | Only needed for imported (workspace-scoped) companies. Workspace ID (required for user keys; workspace keys are bound) |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| tags | No | |
| notes | No | |
| watch | No | The workspace's intelligence post watch on this company, when one exists |
| domain | No | |
| industry | No | |
| profiles | No | Platform presence, keyed by platform, e.g. profiles.linkedin |
| leadCount | No | |
| siteFacts | No | What the company's own website says, read as typed answers: sellsToAgencies, selfServeSignup, hasPublicPricing, productStage, primaryBuyer. Each is null when the reading was not confident enough to state either way, which is not the same as a no. |
| watchCount | No | |
| companyName | No | |
| companySource | No | |
| employeeRange | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds substantial behavioral context: the companySource field distinguishes ID types, platform presence is under the 'profiles' key with legacy aliases, the 'watch' key carries post-watch info, and the 'siteFacts' key explains null semantics ('a null field means we could not tell, not no'). This goes far beyond the annotations and gives the agent accurate expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place. It starts with the core purpose, then methodically explains return structure and key meanings, then usage guidance. No filler or repetition. The organization makes it easy to scan for specific information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (two ID types, multiple response sections, legacy aliases, null semantics) and the presence of an output schema, the description covers everything an agent needs: what the tool returns, how to interpret the fields, when to use it, and what to do if not found. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50% (workspaceId has a description, companyId does not). The description compensates by explaining that companyId accepts both shared and imported IDs and that workspaceId is only needed for imported companies. It also clarifies the response's companySource field indicates which ID matched, giving the agent full parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a company by ID') and immediately distinguishes itself from sibling tools by noting it does not list leads (campaignstack_search_leads) and suggests campaignstack_list_companies for not-found cases. The description also outlines exactly what data is returned, making the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to call this tool ('when the user names one company and asks about it, or before editing it') and what it does not do ('It does not list which leads work there, campaignstack_search_leads does'). Also gives a fallback for not-found cases ('use campaignstack_list_companies to find valid company IDs'). This is exemplary routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_competitor_watchARead-onlyIdempotentInspect
Returns a competitor watch with post count and the 5 latest posts. Use campaignstack_list_competitor_watches to find valid watch IDs. Call this when the user asks what a tracked competitor has posted lately. It returns only the 5 most recent posts, never the full history.
| Name | Required | Description | Default |
|---|---|---|---|
| watchId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| name | No | |
| leadId | No | |
| status | No | |
| imageUrl | No | |
| companyId | No | |
| postCount | No | |
| targetKey | No | |
| entityType | No | |
| latestPosts | No | Up to 5 most recent posts, newest first |
| workspaceId | No | |
| resolvedName | No | |
| topicsSummary | No | |
| imageSourceUrl | No | |
| lastAnalyzedAt | No | |
| targetPlatform | No |
TDQS
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 behavioral context beyond the annotations by specifying the result includes post count and limits output to the 5 most recent posts, never the full history. This is useful and non-redundant.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the return value, then the ID source, then the usage trigger and limitation. The final sentence reinforces the '5 posts only' constraint without unnecessary elaboration; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only tool with an output schema and safety annotations, the description is complete. It covers what the tool returns, the post limit, how to source a valid watch ID, and when to invoke it. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only says watchId is a required string with minLength 1, and schema description coverage is 0%. The description compensates by telling the agent how to obtain a valid watch ID via campaignstack_list_competitor_watches, which gives practical meaning to the parameter beyond the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Returns a competitor watch with post count and the 5 latest posts.' It also differentiates itself from the sibling list tool by noting that campaignstack_list_competitor_watches should be used to find valid watch IDs, signaling this tool fetches a single watch by ID rather than listing watches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger: 'Call this when the user asks what a tracked competitor has posted lately.' It also names the exact sibling tool to use for discovering valid watch IDs, and clarifies that full history is never available through this tool, preventing misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_contact_finder_requestARead-onlyIdempotentInspect
Get one built-in Contact Finder request by id. Returns its status (queued, linked, submitted, completed, failed), what was wanted (wantEmail, wantPhone), creditsReserved at enqueue, creditsCharged once settled (reserved minus refunds, i.e. only data that was found), the result (emailFound, emailStatus, phoneFound, emailWritten, phoneWritten) and errorCode on failure. Call this after campaignstack_enrich_lead_contact_info returned status pending with provider bettercontact, to poll for the outcome; a request usually completes within minutes and never later than about an hour. Found data is already written on the lead (campaignstack_get_lead), this tool never returns the email or phone itself.
| Name | Required | Description | Default |
|---|---|---|---|
| requestId | Yes | Request id returned by campaignstack_enrich_lead_contact_info (provider bettercontact). | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| origin | No | |
| result | No | |
| status | No | |
| createdAt | No | |
| errorCode | No | |
| wantEmail | No | |
| wantPhone | No | |
| completedAt | No | |
| creditsCharged | No | |
| creditsReserved | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description adds substantial behavior beyond that: the exact status enum, the completion timing window, and the critical caveat that found data is already written on the lead and 'this tool never returns the email or phone itself' — preventing an agent from expecting sensitive data here. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph, front-loaded with the core purpose and return fields, then the usage trigger and the critical caveat. Every sentence carries information with no filler, though it is on the longer side — the field enumeration is partly redundant given the output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param polling tool with full schema coverage and an output schema, the description covers everything needed: the trigger condition, timing expectations, the returned statuses/fields, and the key caveat that the actual data is not returned here. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are richly documented in the schema: requestId points back to the enrich tool's return value, and workspaceId explains the user-key vs workspace-key distinction and references campaignstack_whoami. The description adds no new parameter-level detail, so the 100%-coverage baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get'), a precise resource ('one built-in Contact Finder request by id'), and enumerates the return payload (status, wantEmail/wantPhone, creditsReserved/Charged, result fields, errorCode). It is clearly distinguished from the sibling campaignstack_list_contact_finder_requests (plural list) and from the enrich tool it polls after.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs when to call: 'Call this after campaignstack_enrich_lead_contact_info returned status pending with provider bettercontact, to poll for the outcome,' and adds timing expectations (minutes to about an hour). The predecessor tool and triggering condition are named unambiguously, though it doesn't explicitly enumerate 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_get_content_analyticsARead-onlyIdempotentInspect
Get analytics for a workspace's own published LinkedIn content: engagement (reactions, comments, reposts), trend vs the previous period, and top-performing posts. Call this when the user asks how their content is performing. fromMs/toMs are Unix ms. It does not list the posts themselves: use campaignstack_list_content_posts for that.
| Name | Required | Description | Default |
|---|---|---|---|
| toMs | Yes | ||
| fromMs | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| totalPosts | No | |
| trendPercent | No | |
| avgEngagement | No | |
| prevPeriodPosts | No | |
| totalEngagement | No | |
| topPerformingPosts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish a safe read-only, idempotent profile. The description adds useful behavior beyond that: the response covers engagement, previous-period trend, and top-performing posts, and the tool intentionally does not return post listings. It doesn't reveal deeper edge-case behavior, but nothing contradicts 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences pack purpose, trigger conditions, parameter unit, and sibling differentiation with no filler. The key scope is front-loaded and the alternative-tool pointer is placed immediately after the non-goal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With read-only/idempotent annotations and an output schema present, the description only needs to define tool purpose, selection trigger, and parameter essentials. It does all three, so an agent has enough to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low (33%) and fromMs/toMs are only typed as integers. The description fills the key gap by stating they are Unix ms, which is essential for constructing the time range. workspaceId semantics are already documented in the schema, so the description does not need to repeat them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact action (get analytics), resource (workspace's own published LinkedIn content), and the included metrics (engagement, trend, top-performing posts). It also draws a clear boundary against campaignstack_list_content_posts, so an agent can distinguish the analytics call from post listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states a direct trigger: 'Call this when the user asks how their content is performing.' It also gives an explicit alternative for a neighboring need ('does not list the posts themselves: use campaignstack_list_content_posts for that').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_content_postARead-onlyIdempotentInspect
Returns a single content post with its LinkedIn extension data and media URLs. Call this when the user asks about one specific post, or before editing one. Use campaignstack_list_content_posts to find post IDs. It does not return engagement: use campaignstack_get_content_analytics for that.
| Name | Required | Description | Default |
|---|---|---|---|
| contentPostId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| body | No | |
| tags | No | |
| media | No | |
| author | No | |
| status | No | |
| mediaIds | No | |
| platform | No | |
| createdAt | No | |
| updatedAt | No | |
| publishedAt | No | |
| scheduledAt | No | |
| workspaceId | No | |
| contentPostId | No | |
| failureReason | No | |
| revisionCount | No | |
| rejectionReason | No | |
| linkedinExtension | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds value by clarifying what is not returned ('It does not return engagement') and how the tool fits into an editing workflow. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the first states the core return value, the second gives the primary use cases, and the third directs to the correct sibling for missing data. Everything is front-loaded and purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only tool with an output schema present, this description covers the essential behaviors: what it returns, when to call it, how to find the ID, and what it does not return. The annotations handle safety and idempotency, so no critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines contentPostId as a required string with no description (0% coverage). The description compensates by indicating the tool returns a single content post and telling the agent to use campaignstack_list_content_posts to find post IDs, which gives meaningful guidance for how to obtain the parameter value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Returns a single content post with its LinkedIn extension data and media URLs.' It clearly differentiates from siblings by noting it is for one specific post and explicitly pointing to campaignstack_list_content_posts for IDs and campaignstack_get_content_analytics for engagement.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage criteria: 'Call this when the user asks about one specific post, or before editing one.' It names the alternative for discovering IDs ('Use campaignstack_list_content_posts to find post IDs') and the alternative for engagement ('use campaignstack_get_content_analytics for that').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_conversationARead-onlyIdempotentInspect
Get a conversation with its full message history. Call this before drafting a reply or calling campaignstack_send_message. Takes a conversationRef { platform, id } from campaignstack_list_inbox_conversations. Returns all participants, messages (oldest first in the messages array - the last element is the most recent), read state, account info, and associated lead details. If needsFetch is true, messages have not been loaded yet. Use campaignstack_refresh_inbox to populate them. Use campaignstack_list_inbox_conversations to find conversation refs.
| Name | Required | Description | Default |
|---|---|---|---|
| conversationRef | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| lead | No | |
| read | No | |
| account | No | |
| leadRef | No | |
| messages | No | Oldest first; the last element is the most recent |
| platform | No | |
| createdAt | No | |
| sponsored | No | |
| updatedAt | No | |
| needsFetch | No | |
| displayName | No | |
| lastMessage | No | |
| unreadCount | No | |
| lastSyncedAt | No | |
| participants | No | |
| conversationRef | No | |
| conversationUrl | No | |
| conversationUrn | No | |
| hasOlderMessages | No | |
| messagesFetchedAt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds valuable behavioral context beyond annotations: it explains the message ordering (oldest first, last element is most recent), the needsFetch flag and its implication (messages not loaded yet), and what data is returned (participants, messages, read state, account info, lead details). This goes beyond what annotations provide, though it doesn't detail every edge case or 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: it states the core purpose first, then the workflow context, then the parameter source, then the return details, and finally the needsFetch handling. Every sentence adds value, and the length is appropriate for the complexity of the tool. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for an agent to use the tool correctly. It covers what the tool does, when to use it, how to get the required parameter, what the return contains, and how to handle the needsFetch edge case. The output schema exists, so return values don't need to be spelled out in the description. The presence of sibling tools and the clear routing to them makes this contextually complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does: it explains that the conversationRef parameter comes from campaignstack_list_inbox_conversations and specifies its shape { platform, id }. It also clarifies the meaning of the parameter in context. While the schema already defines the structure, the description adds the crucial provenance and usage context, which is valuable for an agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: retrieving a conversation with its full message history. It specifies the exact resource (conversation) and the verb (get), and distinguishes it from related tools by noting it should be called before drafting a reply or sending a message. It also references sibling tools like campaignstack_list_inbox_conversations and campaignstack_refresh_inbox, making its role in the workflow explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: call this before drafting a reply or sending a message, use campaignstack_list_inbox_conversations to find conversation refs, and use campaignstack_refresh_inbox if needsFetch is true. It clearly states when to use this tool versus alternatives, leaving no ambiguity about 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_conversation_voiceARead-onlyIdempotentInspect
Get the voice profile of the human behind a LinkedIn account: one profile per language, each with an active flag, version, the readable style summary, corpus stats (messages and words written by hand, how many were excluded as likely automated), the core (what survives a change of surface) and one overlay per situation (linkedin:dm:cold, linkedin:post, ...). Also returns the history backfill state. profiles is empty when nothing has been extracted yet, call campaignstack_extract_conversation_voice. Call this when the user asks what an account's voice looks like, or before editing it.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | ISO 639-1 language of the profile to read (a bilingual person has one profile per language); omit for all | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| linkedinAccountId | Yes | LinkedIn account id |
Output Schema
| Name | Required | Description |
|---|---|---|
| backfill | No | History backfill state, or null if never run |
| profiles | No | One entry per language: active, version, readableSummary, corpusStats, core, overlays |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: it describes the return payload (core, overlays, corpus stats), notes the empty state, and mentions the history backfill state, which goes beyond annotation coverage. No contradictions found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the purpose, then details the return structure and ends with usage and alternatives. It is appropriately sized for a complex return object; every sentence carries useful information without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool returns a complex nested structure, the description provides a solid overview of what to expect (core, overlays, stats, backfill) and the empty case. The presence of an output schema reduces the need to document every field. It is complete enough for an agent to understand the tool's role and when to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with each parameter documented. The description enriches the 'language' parameter by clarifying the per-language model and that omitting it returns all profiles, which is not stated in the schema. It also reinforces the workspaceId behavior indirectly by describing per-language profiles, but no major additional parameter details are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves the voice profile for a LinkedIn account, and enumerates its structure (per-language, active flag, version, style summary, corpus stats, core, overlays, backfill state). It differentiates from siblings like extract_conversation_voice and update_conversation_voice by explicitly naming when profiles are empty and pointing to extraction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Call this when the user asks what an account's voice looks like, or before editing it.' It also defines the alternative action when no profile exists: 'profiles is empty when nothing has been extracted yet, call campaignstack_extract_conversation_voice.' This leaves no ambiguity about when to invoke this tool.
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_treeARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| include | No | Subtrees to return. Default: all five. | |
| campaignId | No | Narrow campaigns and their workflows to this one campaign. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| resolveForWorkflowId | No | Also return what THIS workflow resolves to: which intent level wins, which sections its scope is sent, and the campaign guidance and offer addendum it carries. | |
| resolveForSignalAgentId | No | Same, for a signal agent. An agent resolves workflow then workspace and never sees a campaign's guidance or intents. |
Output Schema
| Name | Required | Description |
|---|---|---|
| voice | No | |
| warnings | No | |
| campaigns | No | |
| workflows | No | |
| workspace | No | |
| signalAgents | No | |
| resolvedForWorkflow | No | |
| resolvedForSignalAgent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, but the description adds substantial behavioral detail beyond that: it lists the types of warnings returned (tone language, self-referential sections, duplicate sentences, etc.), notes that each warning names the fixing tool and field, and explicitly states what is never returned (exemplars and message bodies). This adds rich context about side effects and return contents without contradicting 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though lengthy, every sentence earns its place. It front-loads the core content (what is returned), then details warnings, then usage guidance, then explicit exclusions. The structure is logical and scannable, with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (five subtrees, multiple resolution modes, warnings), the description is thorough: it covers what is included, what warnings are emitted, when to use it, and what it deliberately does not return. Since an output schema exists, return-value details are handled there. Nothing an agent needs to decide when to call and what to expect is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% – every parameter has a description that fully explains its purpose (include, campaignId, workspaceId, resolveForWorkflowId, resolveForSignalAgentId). The tool description adds no extra parameter-level semantics beyond what the schema already provides, but it does contextualize the overall read behavior. Since the schema carries the burden, baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'get_craft_config_tree' returns the entire craft configuration in one read, enumerating exactly which sections are included (workspace playbook, campaigns, workflows, signal agents, voice). It clearly distinguishes itself from the sibling preview_craft_prompt by stating what it does not return (rendered prompt, exemplars, message bodies). This leaves no ambiguity about the tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call: 'Call this before editing craft configuration, or when the user asks to change how CampaignStack writes messages.' It also states what it does not do and points to the alternative: 'It does not show one node's actual rendered prompt: campaignstack_preview_craft_prompt does that for a specific lead.' This gives clear when/when-not and alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_credit_balanceARead-onlyIdempotentInspect
Get the current AI credit balance for a workspace. Returns monthly usage, included credits, rolled-over credits, pack balance, overage used, total pool size, remaining credits, percent used, and plan type. Call this when the user asks how many credits are left or whether an action would run out. It never changes the balance; use campaignstack_get_workspace_billing for plan and subscription details.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| used | No | |
| month | No | |
| isPaid | No | |
| included | No | |
| remaining | No | |
| totalPool | No | |
| rolledOver | No | |
| overageUsed | No | |
| packBalance | No | |
| percentUsed | No | |
| frozenPackBalance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description's 'It never changes the balance' largely restates those annotations rather than adding new behavioral context. It adds a small amount of context by framing the tool as a safe pre-action check, but no auth, rate-limit, or other hidden behaviors 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences with no filler: what it does, what it returns, and when to use it versus the sibling. The list of returned fields is long but earns its place because the tool is a balance-inquiry lookup.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-parameter lookup with complete schema documentation and an output schema, the description covers the main use case, the alternative tool, and the safe no-mutation guarantee. Nothing needed for correct selection or invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the single workspaceId parameter at 100% coverage, including the user-key vs workspace-key distinction. The description does not add parameter-level meaning beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Get the current AI credit balance for a workspace.' It also names the key sibling, campaignstack_get_workspace_billing, and clearly distinguishes credit/balance lookup from plan/subscription details, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call: 'when the user asks how many credits are left or whether an action would run out.' It also provides a direct exclusion and routes plan/subscription questions to campaignstack_get_workspace_billing, leaving no ambiguity about the choice between the two tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_draft_checkupARead-onlyIdempotentInspect
Get the workspace's open draft checkup proposal, or null when none is pending. A checkup analyzes recent AI drafts plus review decisions (edits and rejections) and proposes ONE change to the workspace's craft data: an outreach-intent detail, a playbook section, or the offer context. The result carries the named findings with evidence, the current vs proposed text, and before/after replays of real drafts under the proposed text. Call this when the user asks whether a checkup is waiting. It does not run a new analysis, use campaignstack_run_draft_checkup for that; nothing applies until campaignstack_accept_draft_checkup.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| checkup | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds value beyond those: the null-when-none-pending return case, the explicit guarantee that it does not run a new analysis, and the composition of the result (findings with evidence, current vs proposed text, before/after replays). This is meaningful behavioral context with no contradiction to 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core purpose and null case, then domain context, result contents, and routing guidance. Every sentence earns its place—the draft-checkup concept is domain-specific and needs explanation for correct routing. The critical scope constraint ('does not run a new analysis') is stated early, and the sibling references are grouped at the end.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for a read-only getter: output schema covers the return structure, the param schema fully covers workspaceId, annotations cover safety, and the description covers when to call, what the result contains, what it does not do, and which siblings to use instead (run_ for analysis, accept_ for applying). There is no gap an agent would stumble on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the workspaceId schema text is already rich (key-type semantics, when to omit, pointer to campaignstack_whoami). The description reinforces the workspace scoping ('the workspace's open draft checkup') but adds no parameter-specific meaning beyond the schema. Baseline 3 applies because the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Get the workspace's open draft checkup proposal, or null when none is pending.' It goes further and defines what a checkup is (analyzes AI drafts plus review decisions, proposes ONE change) and differentiates from siblings: 'It does not run a new analysis, use campaignstack_run_draft_checkup for that.' An agent can distinguish this getter from the run/accept/reject checkup siblings without inspecting any schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit trigger condition: 'Call this when the user asks whether a checkup is waiting.' It names the precise alternative (campaignstack_run_draft_checkup) and the condition that selects it (a new analysis is needed), and states the boundary for when anything applies (until campaignstack_accept_draft_checkup). 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_get_enrichment_statusARead-onlyIdempotentInspect
Get the current enrichment queue status for a workspace. Shows counts of pending, processing, completed, and failed items, plus creditsExhausted (pending items deferred because the workspace is out of credits) and accountGates: the live dispatch verdict per account with pending work (allowed, immediateOnly, and the block reason such as outside_business_hours or budget_exhausted). Call this when the user asks how enrichment is progressing, or why queued leads have not shown up yet. Use accountGates to explain why pending items are not moving. Optionally filter by campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | ||
| campaignId | No | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| failed | No | |
| pending | No | |
| completed | No | |
| processing | No | |
| accountGates | No | |
| creditsExhausted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: it explains the semantics of creditsExhausted (pending items deferred due to out of credits) and accountGates (live dispatch verdict per account with block reasons), which helps the agent interpret the response. It doesn't describe pagination or rate limits, but for a status read with an output schema, the added context 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized: it front-loads the core purpose, then details the response fields, then gives usage triggers. Every sentence adds information. It could be slightly tighter, but the length is justified by the complexity of the accountGates and creditsExhausted concepts that the agent needs to interpret the response correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values don't need to be spelled out. The description covers what the tool returns, when to use it, and how to interpret the key fields. The only minor gap is that it doesn't explicitly mention the platform parameter or clarify whether campaignId is required for the accountGates section, but the optional filter statement covers the main usage. For a read-only status tool, this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33% (workspaceId is documented, platform and campaignId are not). The description compensates by explaining the optional campaign filter ('Optionally filter by campaign') and the workspaceId semantics are already richly documented in the schema. The platform parameter remains undocumented in both schema and description, but the const value 'linkedin' makes it self-explanatory. The description adds meaning about how campaignId affects the result, which is beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a specific resource ('enrichment queue status for a workspace'), and enumerates the exact data returned (counts by state, creditsExhausted, accountGates with verdicts and block reasons). It clearly distinguishes itself from sibling tools like campaignstack_get_credit_balance or campaignstack_get_automation_jobs by focusing on queue status and dispatch gates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call: 'when the user asks how enrichment is progressing, or why queued leads have not shown up yet.' It also tells the agent how to use the returned data ('Use accountGates to explain why pending items are not moving'), which is actionable guidance beyond a simple trigger condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_exclusionsARead-onlyIdempotentInspect
Get who a workspace may never contact. Exclusions have two levels and combine by union: level 0 is the workspace list every campaign and signal agent honours, level 1 is a per-consumer extra that can only add to it. level=workspace (default) returns the level-0 entries with their enabled status and config. level=effective, with signalAgentId or workflowId, returns level 0 merged with that consumer's own entries, which is the set the pipeline applies. Read that one to explain why a lead was skipped. Call this when the user asks who CampaignStack will never contact, or before changing an exclusion so the current rules can be read back to them. Use exclusionId values with campaignstack_list_manual_exclusion_urls, campaignstack_add_manual_exclusion_urls, campaignstack_remove_manual_exclusion_url, or campaignstack_toggle_exclusion. Use campaignstack_list_signal_agents to find signal agents for context.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | workspace (default) returns the level-0 list alone. effective returns level 0 merged with the level-1 extras of the consumer named by signalAgentId or workflowId, which is what the pipeline applies. | |
| workflowId | No | With level=effective, merge this workflow source node's own exclusions | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| signalAgentId | No | With level=effective, merge this signal agent's own exclusions |
Output Schema
| Name | Required | Description |
|---|---|---|
| level0 | No | |
| level1 | No | |
| effective | No | Enabled entries only, level 0 first |
| exclusions | No | Level-0 exclusion entries |
| workspaceId | No | |
| level1Source | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this read-only, idempotent, and non-destructive, and the description adds substantial behavioral detail beyond them: the level-0 workspace list, level-1 per-consumer extras, the union semantics, and the note that level=effective is the set the pipeline actually applies. This gives the agent a predictive model beyond merely knowing the operation is safe.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then layers level semantics, usage triggers, and related tools in a logical order. Every sentence contributes either a semantic distinction, a practical trigger, or a pointer to a sibling tool; there is no filler or tautology.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only query with four optional parameters and an output schema, the description fully covers the two meaningful modes, their defaults, the merge behavior, when to call, and related tooling. Combined with the 100% parameter documentation and output schema, an agent has everything needed to invoke and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 supplements the schema by clarifying how level=effective combines with signalAgentId/workflowId and by framing that result as 'the set the pipeline applies' for diagnosing skipped leads. It does not need to restate workspaceId because the schema already documents the user-key vs workspace-key nuance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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, 'Get who a workspace may never contact,' and immediately defines the two exclusion levels and how they combine by union. It clearly distinguishes this from the many sibling list/get tools and the manual_exclusion_urls tools by specifying the workspace vs effective scopes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call: 'Call this when the user asks who CampaignStack will never contact, or before changing an exclusion so the current rules can be read back to them.' It also provides alternatives and next steps by referencing campaignstack_list_signal_agents and the manual_exclusion_url/add/remove/toggle tools, giving an agent clear routing and follow-up context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_external_import_progressARead-onlyIdempotentInspect
Read the progress of a campaignstack_import_external_leads run: processed / imported counts, status (in_progress, completed, failed) and error message. Call this after starting an import, or when the user asks whether one finished. Returns null when no import was ever started for that provider source; it does not start one itself, use campaignstack_import_external_leads for that.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | Integration provider of the import. | |
| sourceId | Yes | Provider-side source id the import was started with. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| progress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, idempotent, and non-destructive. The description adds meaningful behavioral context beyond annotations: status values, null when no import was started, and that it never triggers an import. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: what it returns, when to call it, and the alternative/non-starting behavior. Front-loaded with the core purpose before edge cases.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is a simple read operation with strong annotations and an output schema. The description covers the key operational cases: after starting an import, when asked about completion, null for no import, and the sibling for starting. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 provider and sourceId. The description's mention of 'provider source' and 'for that provider source' reinforces the mapping but adds little beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('progress of a campaignstack_import_external_leads run') and enumerates the returned data points: processed/imported counts, status, and error message. It also distinguishes itself from the sibling starting tool by explicitly noting it does not start an import.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit call conditions: 'Call this after starting an import, or when the user asks whether one finished.' It also names the alternative tool, campaignstack_import_external_leads, for starting imports, and explains the null-return case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_icp_scoresARead-onlyIdempotentInspect
Get ICP match scores for leads. Filter by minimum score to find top matches. Returns paginated array of { leadId, leadName, icpMatchScore, matchedFields } sorted by score descending. Call this when the user asks who matches an ICP. Use campaignstack_list_icps to find ICP IDs; scores are stale until campaignstack_trigger_icp_scoring runs. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| icpId | Yes | ||
| limit | No | ||
| cursor | No | ||
| minScore | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive, but the description adds crucial behavioral context beyond that: return shape sorted by score descending, staleness of data until trigger_icp_scoring runs, and the presence of pagination with 'Results are one page' and explicit guidance to not present incomplete results as the full set. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence adds value. It front-loads the core purpose, then quickly covers filtering, return format, sorting, related tools, staleness, and pagination etiquette. No filler or redundant statements—excellent efficiency.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters, a pagination response, a sibling for ICP identification, and a staleness dependency, the description covers all the necessary context: when to call, how to get required IDs, what to expect in the response, and how to handle incomplete pages. Combined with the existing output schema and annotations, nothing is missing for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description carries full responsibility for explaining parameters. It covers all four: 'Filter by minimum score' explains minScore, 'Use campaignstack_list_icps to find ICP IDs' explains icpId, and 'Returns paginated array... Results are one page... page through' explains limit and cursor behavior. This fully compensates for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('ICP match scores for leads'), and immediately states the filtering option. It differentiates itself from sibling tools by referencing campaignstack_list_icps (for finding IDs) and campaignstack_trigger_icp_scoring (for score freshness), so an agent knows exactly what this tool does and what it doesn't.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Call this when the user asks who matches an ICP,' names the sibling tool for looking up ICP IDs, and warns that scores are stale until scoring is triggered. It also provides clear instructions on how to handle pagination (report more pages and page through before counting). This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_inbox_unread_countARead-onlyIdempotentInspect
Get the total number of unread conversations across all LinkedIn accounts in the workspace. Call this when the user asks how many unread messages there are. Returns { total, accountCount }. It does not list them: campaignstack_list_inbox_conversations with unreadOnly does.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| accountCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal read-only/idempotent/non-destructive. Description adds important context: scope across all accounts, return shape, and explicit contrast with the listing sibling. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: first states purpose, second gives the trigger condition, third provides the negative contrast and alternative. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists and annotations cover the safety profile, the description provides sufficient scope, trigger, and alternative routing. Nothing missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Parameter schema has 100% coverage with a detailed workspaceId description, so the baseline is 3. The tool description doesn't add per-parameter semantics beyond the schema, though it does clarify workspace scope in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: 'Get the total number of unread conversations across all LinkedIn accounts in the workspace.' Distinguishes from the sibling listing tool by explicitly noting it does not list conversations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger: 'Call this when the user asks how many unread messages there are.' Names the alternative and its condition: 'It does not list them: campaignstack_list_inbox_conversations with unreadOnly does.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_leadARead-onlyIdempotentInspect
Get a lead by ID with full details including company information and ICP scores. Accepts shared lead IDs and private (workspace-scoped, CSV-imported) lead IDs; the response's leadSource field says which one was found. Platform presence is under the profiles key (e.g. profiles.linkedin.url, followerCount, bio); top-level fields like linkedInUrl are legacy aliases. currentRoles lists every position the lead holds right now (a person can work at several companies at once), profile order, main role first; company is the one that role binds to. The watch key carries the workspace's intelligence post watch on this lead (id, status, post count) when one exists. Call this once you have a leadId, typically from campaignstack_search_leads, and need the full record. It does not search by name: campaignstack_search_leads does that.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| No | ||
| phone | No | |
| title | No | |
| watch | No | |
| leadId | No | |
| company | No | The primary employer, resolved for this workspace |
| archived | No | |
| fullName | No | |
| headline | No | |
| lastName | No | |
| location | No | |
| profiles | No | |
| firstName | No | |
| icpScores | No | |
| seniority | No | |
| department | No | |
| firstSeenAt | No | |
| linkedInUrl | No | |
| currentRoles | No | Every position held right now, not just the primary |
| lastUpdatedAt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds meaningful behavioral context beyond annotations: shared vs. private ID handling via leadSource, profiles key vs. legacy aliases, currentRoles ordering semantics, and the conditional watch key.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the core purpose and usage trigger. Each subsequent sentence adds useful operational detail about response interpretation. It could be trimmed slightly, but none of the content feels wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only tool with an output schema, the description provides all needed context: the ID source, the response layout, key field semantics, and when to use the tool vs. the sibling search tool. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines leadId as a string with minLength 1, so the description carries the burden. It adds that the parameter accepts both shared and private workspace-scoped IDs, and explains the distinction is surfaced in the response. It stops short of giving concrete ID format examples, but for a single parameter that is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action — 'Get a lead by ID with full details including company information and ICP scores' — and clearly identifies the target resource. It also differentiates itself from the likely sibling alternative, campaignstack_search_leads, by explicitly noting it does not search by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: 'Call this once you have a leadId, typically from campaignstack_search_leads, and need the full record.' It also states a clear exclusion and alternative: 'It does not search by name: campaignstack_search_leads does that.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_lead_connectionsARead-onlyIdempotentInspect
List the people a lead is known to be connected to on LinkedIn, with the degree of each relationship and how it was discovered. Call this when the user asks who a lead knows. Use it to find who could introduce you, or to see how embedded a lead is in a network you already reach. It only reads what is recorded; campaignstack_fetch_mutual_connections can read fresh shared connections from a workspace account. Absence of an edge means we have not observed one, not that the two are strangers.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| degree | No | ||
| leadId | Yes | ||
| leadSource | No | global |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| connections | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so safety is covered. The description adds value beyond this by clarifying that it reads only recorded data (reinforcing read-only) and, critically, explains the closed-world semantics: absence of an edge does not mean strangers, which is a behavioral nuance not implied by the openWorldHint flag alone. This helps the agent interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: three sentences that front-load the primary action, then add usage guidance, contrast, and a crucial interpretation nuance. Every sentence contributes meaning without redundancy. It is well-structured and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While the description covers purpose and usage well, it lacks explanation of key parameters (limit, degree, leadSource) that affect filtering and scope. It does not mention pagination or how to select between global vs private sources. Since the output schema exists, return format is known, but the input semantics are insufficiently described for an agent to call it optimally in all cases. It is adequate for basic invocation but incomplete for nuanced queries.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It mentions 'degree' as part of the output but does not explain it as an input filter. It does not explain leadSource (global/private) or limit, nor how they affect results. The description gives no parameter-specific guidance beyond the general purpose, leaving the agent to infer from enums and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), resource ('people a lead is known to be connected to on LinkedIn'), and adds detail about degree and discovery method. It clearly distinguishes from the sibling campaignstack_fetch_mutual_connections by noting it reads recorded data only, and explicitly states the intended use case ('when the user asks who a lead knows'). This fully differentiates it from other sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Call this when the user asks who a lead knows' and describes use cases for introductions and network analysis. It also contrasts with campaignstack_fetch_mutual_connections, explaining that this tool reads recorded connections while the sibling reads fresh ones, giving clear exclusion criteria. The note about absence of an edge is additional context that prevents misinterpretation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_lead_historyARead-onlyIdempotentInspect
Get everything this workspace has done to one lead, across every workflow and campaign, newest first. Each entry carries the workflow name, the node label, the status, and the payload, so crafted messages, connection notes and the comments an autonomous node published on the lead's posts are readable after the fact. Call this when the user asks what has been sent to a specific person or when reopening a past decision with campaignstack_reopen_review. Use this instead of campaignstack_get_node_activity when the question is about a person rather than about one node: node activity is scoped to a single node, so a lead waiting at a later step looks untouched there.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| leadId | Yes | ||
| leadSource | No | global | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), and the description does not contradict them. It adds value by disclosing return contents (workflow name, node label, status, payload), ordering (newest first), and what is readable after the fact (crafted messages, connection notes, comments). This complements the annotations without repeating them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the core purpose, with alternative routing saved for the end. Information-dense with no fluff, though the second sentence listing return contents is slightly long-winded and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, covering return values. The description thoroughly handles purpose, scope, ordering, and sibling selection. The workspaceId key-type nuance is well documented in the schema itself, referencing campaignstack_whoami. The main gap is parameter semantics for leadId, limit, and leadSource, which neither the description nor schema adequately covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% – only workspaceId carries a description. The tool description does not explain leadId, limit, or leadSource at all, and the schema itself lacks descriptions for those three. With coverage this low, the description should compensate but instead stays silent on parameters, leaving the agent to guess at the leadSource enum semantics and the limit default/maximum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Get everything this workspace has done to one lead, across every workflow and campaign, newest first') and explicitly differentiates itself from campaignstack_get_node_activity by scope (person vs node). The purpose is unmistakable even before reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-call conditions ('when the user asks what has been sent to a specific person or when reopening a past decision with campaignstack_reopen_review') and names the alternative with a concrete distinguishing rule ('Use this instead of campaignstack_get_node_activity when the question is about a person rather than about one node'). This is exemplary routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_lead_listARead-onlyIdempotentInspect
Get a lead list by ID, with paginated leads when includeLeads is true. Call this when the user asks who is in a list, or before adding or removing leads. Metadata and members only, not campaign performance: use campaignstack_get_campaign_metrics for that. If the lead list is not found, use campaignstack_list_lead_lists to find valid IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| leadListId | Yes | ||
| includeLeads | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| type | No | |
| leads | No | |
| source | No | |
| createdAt | No | |
| leadCount | No | |
| updatedAt | No | |
| campaignId | No | |
| leadListId | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context by explaining the conditional lead inclusion (when includeLeads is true), the scope boundary (metadata and members only, not campaign performance), and a recovery path on not-found. This goes beyond the annotation baseline, though it does not detail error formats or pagination mechanics, which is acceptable given 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero fluff. The core action is front-loaded, followed by concrete use cases, then an explicit alternative, then an error-recovery hint. Every sentence earns its place and no space is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with annotations carrying the safety profile and an output schema present, the description is largely complete. It covers use cases, alternatives, and not-found behavior. Minor gaps remain around pagination mechanics (e.g., how to request the next page) and what exactly 'members only' returns, but these are adequately addressed by the schema and the overall clarity of the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for parameter meaning. It gives purpose to includeLeads ('when includeLeads is true') and hints at paginated leads, implying limit/cursor usage. However, it does not explain what 'cursor' is, how 'limit' interacts with pagination, or what 'members' means in the response. It partially compensates but leaves substantive parameter semantics for the agent to infer from the output schema or examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource ('Get a lead list by ID') and specifies the key behavior ('with paginated leads when includeLeads is true'). It distinguishes itself from campaign metrics and list_lead_lists by name, so an agent can easily tell this tool apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('when the user asks who is in a list, or before adding or removing leads'), what it is NOT for ('not campaign performance: use campaignstack_get_campaign_metrics'), and how to recover from an unknown ID ('If the lead list is not found, use campaignstack_list_lead_lists'). This is textbook usage guidance with clear alternatives and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_lead_score_breakdownARead-onlyIdempotentInspect
Get a detailed breakdown of a lead's score in a campaign. Shows ICP score, individual signal contributions with all multipliers (time decay, recency bonus, intent, topic alignment, connection degree), and the total computed score. Call this when the user asks why a lead scored high or low. It does not list signal detail, use campaignstack_list_lead_signals for that, or change scoring, use campaignstack_update_campaign_weight for that.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| campaignId | Yes | ||
| leadSource | No | global |
Output Schema
| Name | Required | Description |
|---|---|---|
| icpScore | No | |
| totalScore | No | |
| signalScore | No | |
| matchedFields | No | |
| negativeScore | No | |
| positiveScore | No | |
| signalBreakdown | No | Per-signal contributions with decay, recency, intent and topic multipliers |
| connectionDegree | No | |
| companySignalScore | No | |
| companySignalBreakdown | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation read-only, idempotent, and non-destructive. The description adds value by clarifying that it only provides a score breakdown, does not list raw signal details, and includes multiplier composition, giving agents a clear behavioral boundary 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly structured: first sentence states the operation and resource, second explains the output contents, third gives usage guidance and exclusions. No filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 does not need to explain return values. It covers purpose, trigger, contents, and alternatives well. The only notable omission is leadSource parameter semantics, which prevents a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning. It indirectly maps 'lead' to leadId and 'campaign' to campaignId, but it provides no guidance on the leadSource parameter's 'global' vs 'private' semantics or when to set it. This leaves a meaningful gap for a required-adjacent optional parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the exact operation: getting a detailed lead score breakdown within a campaign. It enumerates what is shown (ICP score, signal contributions, multipliers, total score) and explicitly distinguishes itself from related tools like campaignstack_list_lead_signals and campaignstack_update_campaign_weight.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit trigger condition: 'Call this when the user asks why a lead scored high or low.' It also gives clear exclusions and alternatives, directing agents to campaignstack_list_lead_signals for signal details and campaignstack_update_campaign_weight for scoring changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_node_activityARead-onlyIdempotentInspect
Get recent activity for a specific workflow node. Returns entries sorted by most recent, with per-status counts. Call this when the user asks what happened at a node recently or why it is failing. 'cancelled' entries carry a cancelReason explaining why the lead router terminated them (e.g. superseded_by_reply = the lead replied before the queued touch was sent). It is scoped to one node: for one lead across every node, use campaignstack_get_lead_history.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| nodeId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| stats | No | |
| entries | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond that: entries are sorted by most recent, per-status counts are included, and 'cancelled' entries carry a cancelReason with a concrete example ('superseded_by_reply = the lead replied before the queued touch was sent'). This explains what the agent will see in the results and why entries may be cancelled, which is valuable context not present in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each earning its place: the first states what the tool returns, the second gives the usage trigger, and the third explains the cancelReason field and the sibling distinction. The most important information (what it does and when to use it) is front-loaded. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so the description doesn't need to explain return values in detail. It covers the key contextual points: scope (one node), sorting, per-status counts, the cancelReason semantics, and the sibling alternative. The only minor gap is that it doesn't mention the 'limit' parameter's effect on the result set, but the schema documents that. For a read-only, idempotent tool with an output schema, this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden of explaining parameters. It mentions 'nodeId' implicitly by saying 'specific workflow node' and 'scoped to one node', but it does not explain the 'limit' parameter at all. The schema itself documents limit's type, default, and range, so the schema covers that. The description adds the semantic meaning of nodeId (which node's activity to fetch) but not much more. Baseline 3 is appropriate because the description adds some meaning but doesn't fully compensate for the 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a specific resource ('recent activity for a specific workflow node'), and the return shape ('entries sorted by most recent, with per-status counts'). It also distinguishes itself from the sibling campaignstack_get_lead_history by explicitly stating the scoping difference ('scoped to one node' vs 'one lead across every node'). This is a clear, specific purpose that an agent can act on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool: 'Call this when the user asks what happened at a node recently or why it is failing.' It also names the alternative (campaignstack_get_lead_history) and the condition that selects it ('for one lead across every node'). This is exactly the kind of when/when-not guidance that helps an agent choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_notification_preferencesARead-onlyIdempotentInspect
Get the calling user's notification email preferences: the per-category email delivery matrix (global defaults + per-workspace overrides with inherited markers) and the weekly report opt-in. Call this when the user asks what emails they get from CampaignStack. Requires a USER API key (csu_); workspace keys have no user identity. Use campaignstack_update_notification_preferences to change values.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| categories | No | One entry per category: global value and what it resolves to |
| workspaces | No | Per-workspace overrides, each marked inherited when unset |
| weeklyReport | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds genuinely new behavioral context beyond annotations: the auth requirement (USER API key csu_; workspace keys have no user identity), which is critical for agent success. It could go further on what happens when called with an invalid key, but the annotations lower the burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with each earning its place: what is returned, when to call, and auth/alternative. The first sentence is dense but packs useful specificity. Slight room for improvement by front-loading the auth constraint, but there is no waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with a full output schema and complete safety annotations, everything an agent needs is present: return content, invocation trigger, auth requirements, and the sibling tool for changes. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the schema has nothing to document; the rubric sets a baseline of 4 for 0-param tools. The description sensibly devotes space to describing the return payload instead of parameters, which is the only useful semantic content an agent needs here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get the calling user's notification email preferences') and enumerates exactly what is returned (per-category email delivery matrix with global defaults + per-workspace overrides and inherited markers, weekly report opt-in). This clearly differentiates it from siblings like campaignstack_list_notifications (a list of notifications, not preferences) and campaignstack_update_notification_preferences (the mutation counterpart).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition: 'Call this when the user asks what emails they get from CampaignStack.' It names the alternative tool for the opposite intent ('Use campaignstack_update_notification_preferences to change values') and adds a prerequisite (USER API key requirement). 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_get_personaARead-onlyIdempotentInspect
Get a persona by ID: pain points, goals, and objections. Call this when you need its full detail before editing it. Not a list: campaignstack_list_personas finds the ID.
| Name | Required | Description | Default |
|---|---|---|---|
| personaId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| name | No | |
| goals | No | |
| createdAt | No | |
| updatedAt | No | |
| campaignId | No | |
| objections | No | |
| painPoints | No | |
| description | No | |
| fitStatement | No | |
| objectionResponses | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive; the description adds that the returned data is the 'full detail' of the persona, which is useful for edit workflows. It does not mention any side effects or auth requirements, but none are needed for this simple read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core action and content are front-loaded, and the usage note and alternative are given in the second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition is complete for a one-parameter read tool: it states what it does, when to use it, what it returns, and how to source the ID. The presence of an output schema covers any return-format details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has only personaId with type/minLength, but no semantic description. The description compensates by explaining how to obtain the ID: campaignstack_list_personas finds it, so the parameter's meaning and source are clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('persona by ID'), with the key content fields (pain points, goals, objections). It also differentiates itself from the sibling list tool, so the agent knows exactly which function to call.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use 'when you need its full detail before editing it', giving a concrete trigger condition. It also names the alternative for finding the ID (campaignstack_list_personas), making the choice unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_phaseARead-onlyIdempotentInspect
Get a campaign phase by ID: objectives, phase type, and order. Call this when you need its full detail before editing it. Not a list: campaignstack_list_phases finds the ID.
| Name | Required | Description | Default |
|---|---|---|---|
| phaseId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| name | No | |
| order | No | |
| createdAt | No | |
| phaseType | No | |
| updatedAt | No | |
| campaignId | No | |
| objectives | No | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds useful context about returning full phase detail but does not disclose additional behavioral traits such as response formatting, pagination, or any operational side effects beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler. The core action and returned content are front-loaded, and the sibling distinction is placed at the end where it serves as a useful caveat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter read operation with an output schema available, the description covers the action, the returned information, the use case, and the alternative tool. Nothing material an agent needs to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides only the parameter name, type, and minLength with 0% description coverage. The description compensates by clarifying that the parameter is a phase ID and by pointing to campaignstack_list_phases as the way to obtain that ID, which is sufficient guidance for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource ('Get a campaign phase by ID') and names the content returned: objectives, phase type, and order. It also explicitly distinguishes itself from campaignstack_list_phases, so an agent can select it correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to use the tool ('Call this when you need its full detail before editing it') and explicitly names the alternative for finding the ID (campaignstack_list_phases). This gives clear selection guidance and prevents misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_platform_capabilitiesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| actions | No | |
| platforms | No | |
| connectedPlatforms | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the readOnly/idempotent annotations: the semantics of the two return shapes, that a platform with no actions is intentionally tracking-only, and the legacy nature of connectedPlatforms. This prevents likely misinterpretations when an agent inspects results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: capability inventory, return-shape semantics, legacy-shape caveat, and invocation trigger. It is front-loaded with the core purpose and remains compact despite covering a fairly complex tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Combined with the rich schema, annotations, and existence of an output schema, the description fully covers what the tool returns, how to interpret edge cases, and when to invoke it. No critical selection or invocation information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents workspaceId thoroughly, including the csu_ vs cs_ key distinction and a pointer to campaignstack_whoami, so the description does not need to repeat parameter details. With 100% schema coverage, the baseline applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States exactly what it does: lists platform actions with per-platform supported fields and optional params, and even enumerates representative actions. The explicit trigger tied to action-tool errors distinguishes it as the capability lookup tool rather than an action-execution sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear, actionable when-to-use rule: call this when an action tool returns wrong_target_for_platform or unsupported_capability. It does not explicitly name what it is not for, so it stops just short of full when-not/alternatives guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_playbookARead-onlyIdempotentInspect
Get the workspace's playbook as playbookSections, one field per section: identity (sent on every message), voice (sent on every message), angles (sent on messages we send first), objections (sent on replies, after they have written back), boundaries (sent on every message). Call this when the user asks what the workspace's tone or talking points are set to. Also returns offerContext, the factual company/offer grounding injected into every AI craft regardless of playbook resolution, and capabilities, the description of what the system behind the workspace can detect and do that is injected into reply crafts only. All three are editable via campaignstack_update_workspace (the sections argument is named sections there). sectionMeta gives each section's current character count, its hard cap and the target to write to, plus which crafts it is injected on; offerContextMeta and capabilitiesMeta do the same for those two. Read those before editing: a write over the cap is REJECTED, not truncated. editableBy gives the minimum role for each field: workspace-wide grounding is admin, anything scoped to one campaign or agent is member, and a locked field is owner. Returns null if the workspace does not exist; an unwritten playbook comes back as an empty object. History is campaignstack_list_playbook_versions. Use campaignstack_regenerate_playbook to create or refresh it.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| managed | No | |
| editableBy | No | |
| sectionMeta | No | |
| workspaceId | No | |
| capabilities | No | |
| offerContext | No | |
| outreachIntents | No | |
| capabilitiesMeta | No | |
| offerContextMeta | No | |
| playbookSections | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a safe, idempotent read, but the description adds substantial behavior beyond that: it returns null for a nonexistent workspace, returns an empty object for an unwritten playbook, explains the editableBy role ladder, and discloses the cap-rejection behavior. There is no contradiction with the readOnlyHint, idempotentHint, or destructiveHint annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause earns its place: it front-loads the core return shape, then adds only high-value behavioral details, role constraints, edge-case returns, and related tools. It reads as a single block but is logically ordered and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% schema description coverage for the only parameter, the description still goes beyond the minimum by covering null behavior, empty-object behavior, editableBy roles, section caps, and related operations. An agent has everything it needs to decide when to call this tool, interpret its result, and act responsibly afterward.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter, workspaceId, is already documented fully in the input schema, including the distinction between user and workspace keys and how campaignstack_whoami resolves key type. The description adds no parameter-level details beyond what the schema provides, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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, 'Get the workspace's playbook as playbookSections,' and enumerates the exact sections and companion fields (offerContext, capabilities, sectionMeta). This clearly distinguishes it from related get/list tools such as campaignstack_list_playbook_versions, campaignstack_get_playbook_proposal, and campaignstack_regenerate_playbook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Call this when the user asks what the workspace's tone or talking points are set to,' which is concrete invocation guidance. It also names alternatives for related actions: history is campaignstack_list_playbook_versions, and creation/refresh goes through campaignstack_regenerate_playbook. It even warns to read sectionMeta before editing because a write over the cap is rejected, not truncated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_playbook_proposalARead-onlyIdempotentInspect
Get the workspace's pending playbook proposal, or null when none is waiting. Carries the request it answers, the assistant's message, and one to three changes, each with the target (playbook section, intent detail, or offer context), the current text and the proposed full replacement. Call this after campaignstack_propose_playbook_change returns a proposalId, so the change can be read back to the user before deciding. Nothing is applied until campaignstack_decide_playbook_proposal.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| proposal | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds meaningful behavior beyond those: it returns null when no proposal is pending, describes the exact payload shape (request, assistant message, 1-3 changes with target/current/proposed text), and stresses that nothing is applied until the decide step. This gives the agent an accurate model of what the call does and does 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The main purpose and null behavior are front-loaded, followed by payload details, then workflow placement. Every sentence adds distinct information that helps an agent use the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only tool with an output schema, the description is complete. It covers the null case, what the response contains, when to call the tool, and what does not happen until a later decision. An agent has everything needed to invoke it appropriately without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the workspaceId parameter is already richly documented in the input schema, including the difference between user and workspace keys. The description does not add parameter-specific information, which is acceptable because the schema carries the full burden; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Get the workspace's pending playbook proposal', and clarifies the null case. It clearly distinguishes this from sibling getters by focusing on 'pending proposal' and by explicitly referencing the proposal workflow, so an agent can tell it apart from campaignstack_get_playbook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear workflow context: call this after campaignstack_propose_playbook_change returns a proposalId and before deciding via campaignstack_decide_playbook_proposal. It does not explicitly state when not to use it or name alternatives like get_playbook, but the sequencing guidance is strong and unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_signal_agentARead-onlyIdempotentInspect
Get a single signal agent: status, target, account assignments, response mode, and counters. Call this when you need its full config before changing it. Not the leads it found: campaignstack_list_signal_agent_leads does that.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| name | No | |
| type | No | |
| status | No | |
| imageUrl | No | |
| targetUrn | No | |
| leadListId | No | |
| postsCount | No | |
| targetName | No | |
| workflowId | No | |
| eventsCount | No | |
| workspaceId | No | |
| responseMode | No | |
| readAccountUnavailable | No |
TDQS
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 reinforces this with 'Get' and 'before changing it,' but it does not add operational behavioral caveats such as staleness, permissions, or response behavior beyond what the annotations and output schema already imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first states what the tool returns, the second supplies the usage trigger and an explicit alternative. There is no filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-ID read tool, the description covers the scope, the pre-change use case, and the key sibling distinction. With annotations and an output schema present, this is enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry meaning for agentId. It does not explicitly explain agentId's source or format, but the phrase 'Get a single signal agent' and the parameter name make its role obvious; there are no enums, defaults, or nested constraints that need clarification.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource — 'Get a single signal agent' — and enumerates the returned config aspects (status, target, account assignments, response mode, counters). It also explicitly distinguishes itself from campaignstack_list_signal_agent_leads, so an agent can select it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete trigger: 'Call this when you need its full config before changing it.' It also states the negative case ('Not the leads it found') and names the exact sibling that handles that need, which is strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_signal_agent_statsARead-onlyIdempotentInspect
Get dashboard metrics for a signal agent: total signals, 24h signals, leads created, posts watched, priority breakdown. Message and connection watchers return a watcherActivity block instead (no signal events). Call this when the user asks how a watcher is performing. Not the leads behind the counts: campaignstack_list_signal_agent_leads does that.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| byPriority | No | |
| leadsCreated | No | |
| postsWatched | No | |
| signalsToday | No | |
| signalsTotal | No | |
| watcherActivity | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool read-only and idempotent, so the description correctly focuses on non-obvious behavior: message and connection watchers return a watcherActivity block instead of signal events. This is valuable behavioral detail that the structured metadata alone cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: metrics definition, watcher-specific behavior, and routing to the sibling tool. No filler, no repetition of the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 documentation is unnecessary. The description covers metrics scope, watcher behavior variation, and the key alternative tool. Combined with read-only/idempotent annotations, this is complete enough for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage for the single agentId parameter is 0%, so the description must compensate. It does so by clarifying that agentId can refer to a signal agent or to message/connection watchers, and by explaining that the response shape depends on that target. It doesn't restate format details, but agentId is self-descriptive and the usage context makes the parameter's meaning clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb ('Get') and resource ('dashboard metrics for a signal agent'), enumerates the exact metric categories, and differentiates itself from campaignstack_list_signal_agent_leads by stating what it does not return. An agent can clearly understand the tool's scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to invoke this tool ('Call this when the user asks how a watcher is performing') and provides an alternative for lead-level detail ('Not the leads behind the counts: campaignstack_list_signal_agent_leads does that'). This is direct, actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_workflowARead-onlyIdempotentInspect
Get a workflow by ID with all nodes (type, label, config, position, execution target) and edges, plus a sequence projection: lanes of the steps the user sees (Connect, First message, Follow-up N, Email N) with their knobs and memberNodeIds, computed from the graph. An ai:autonomous node's config carries declaredActions: the actions its brief was read as taking, which the agent tool gate holds a live tool call against. Call this when the user asks what a workflow does, or before editing it. Use it to describe the workflow the way the user reads it and to find which node ids a step owns; residualNodeIds lists nodes that belong to no known step. It does not report run counts or lead outcomes, use campaignstack_get_workflow_stats for that. If the workflow is not found, use campaignstack_list_workflows to find valid workflow IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| workflowId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| edges | No | sourceNodeId, targetNodeId, label, condition |
| nodes | No | Node id, type, label, config, position, execution target |
| status | No | |
| enabled | No | |
| sequence | No | Step-lane projection: memberNodeIds, knobs, residualNodeIds |
| createdAt | No | |
| updatedAt | No | |
| campaignId | No | |
| workflowId | No | |
| accountRefs | No | |
| description | No | |
| workspaceId | No | |
| defaultGoogleAccountId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals behavior beyond the readOnly/idempotent annotations: it returns computed sequence projections, declaredActions on ai:autonomous nodes, and residualNodeIds, and explicitly excludes run counts and lead outcomes. This adds meaningful behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but each sentence adds useful information: output shape, special node behavior, use cases, exclusions, and fallback. It is front-loaded with the main retrieval purpose and organized logically, though the declaredActions sentence is dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only workflow inspection tool with an output schema, the description covers what it returns, how to use it, when not to use it, and what to do if the ID is invalid. Nothing essential is missing for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate; it does by explaining the workflowId identifies the workflow to fetch and by pointing to campaignstack_list_workflows for discovering valid IDs. It doesn't detail ID formats or sources beyond that, but with a single string parameter the guidance is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action and resource: 'Get a workflow by ID' with all nodes and edges, plus a sequence projection. It clearly distinguishes itself from sibling tools like campaignstack_get_workflow_stats and campaignstack_list_workflows by describing its unique output and explicitly stating what it does not do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: 'Call this when the user asks what a workflow does, or before editing it.' It also names alternatives directly, directing stats questions to campaignstack_get_workflow_stats and invalid-ID cases to campaignstack_list_workflows.
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_typesARead-onlyIdempotentInspect
Returns the complete vocabulary of workflow node types available for building automation graphs. For each node type includes: nodeType key, label, description, configHint (exact TypeScript-style config shape), a concrete example node, exit handles for branching nodes, and credit cost per execution. Also returns graphShape documentation (how to structure nodes/edges) and a minimal end-to-end example graph. Call this before building a custom automation graph: it only describes the vocabulary, campaignstack_create_workflow is what actually builds the graph from it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| nodeTypes | No | |
| graphShape | No | |
| exampleGraph | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, and non-destructive behavior. The description adds contextual transparency by clarifying that the tool does not build or modify anything, only describes the vocabulary, and by enumerating the return payload contents. This goes beyond what annotations alone communicate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and well-structured: it opens with the core purpose, enumerates the returned information in a compact list, and closes with actionable usage guidance. Every sentence earns its place, and the key 'call before building' signal is placed at the end without burying the main purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter informational endpoint with an output schema, the description is fully complete. It explains what the response contains, why an agent would call it, and how it relates to the workflow-creation tool. Nothing needed 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the input schema confirms an empty object with additionalProperties false. With no parameters to document, the description reasonably focuses on return contents; the baseline of 4 is appropriate because there is nothing for parameter semantics to add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: it returns the complete vocabulary of workflow node types. It also details the exact contents (nodeType key, configHint, example node, exit handles, credit cost, graphShape) and explicitly contrasts itself with campaignstack_create_workflow, so an agent cannot confuse it with sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Call this before building a custom automation graph.' It also states the boundary of the tool ('it only describes the vocabulary') and names the alternative that actually builds the graph, which is strong behavioral routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_workflow_statsARead-onlyIdempotentInspect
Get real-time execution statistics for a workflow. Returns per-node lead counts (waiting, processing, completed, failed), edge traversal counts, and paused action types. Call this when the user asks how a workflow is doing or where leads are stuck. It counts leads only, not who they are: use campaignstack_list_leads_at_node for names. Use campaignstack_get_workflow to get the workflow structure first.
| Name | Required | Description | Default |
|---|---|---|---|
| workflowId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodeStats | No | Per-node lead counts, keyed by node id |
| edgeTraversals | No | Traversal counts, keyed by edge id |
| pausedActionTypes | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description doesn't need to restate safety. It adds useful behavioral context beyond annotations: the real-time nature of stats, the lead-only counting limitation, and the sequencing guidance to fetch workflow structure first. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: what it does, what it returns, when to use it, and the crucial limitation/alternative plus a prerequisite. No filler or redundancy. The most important info is front-loaded in the first sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return values need no explanation. A single parameter, strong annotations, and a description covering purpose, trigger, exclusions, alternatives, and prerequisite ordering make this definition complete for reliable selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% for the single workflowId parameter, so the description bears the burden here. It only implicitly implies that workflowId identifies the workflow and tells the agent to get the workflow structure first, but it never explicitly defines workflowId's role or format. However, for a single, well-named parameter, this indirect compensation is sufficient and clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('real-time execution statistics for a workflow'), then enumerates exact returned data: per-node lead counts, edge traversal counts, and paused action types. It explicitly differentiates from siblings by naming campaignstack_list_leads_at_node (names) and campaignstack_get_workflow (structure), so an agent can distinguish it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition: 'Call this when the user asks how a workflow is doing or where leads are stuck.' It also states when not to use it ('counts leads only, not who they are') and names the alternative for names, plus a prerequisite workflow structure call. This fully covers when/why/alternative usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_workspaceARead-onlyIdempotentInspect
Read one workspace: its name, the company behind it, industry, and the settings that shape outreach. Call this when the user asks what a workspace is set up to do, or before changing a setting so the current value can be read back to them. campaignstack_whoami returns the workspaceId. The playbook and the exclusion list are not here: they have their own tools, campaignstack_get_playbook and campaignstack_get_exclusions.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| icon | No | |
| name | No | |
| industry | No | |
| createdAt | No | |
| companyName | No | |
| companyWebsiteUrl | No | |
| linkedinAccountId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description doesn't need to restate safety. It adds context about the data scope (exclusions and playbook are elsewhere) but does not go into details like auth specifics or rate limits. Given output schema exists, return format is covered, so a 3 is appropriate—meets the bar but doesn't exceed it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no fluff: first states the core purpose, second gives usage triggers, third handles exclusions and alternatives. Front-loaded with the most important information and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with an output schema, this description is complete: it states what it returns, when to use it, how to get the id, and what it deliberately excludes. It even names the sibling tools for the excluded parts, leaving no gaps for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers workspaceId with 100% detail, including the distinction between user keys (csu_) and workspace keys (cs_) and how whoami reports them. The description adds a helpful pointer that campaignstack_whoami returns the workspaceId, but this is more about obtaining the value than adding parameter semantics. With full schema coverage, a baseline of 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb ('read'), identifies the resource ('workspace'), and enumerates the exact fields returned (name, company, industry, outreach settings). It actively differentiates itself from siblings by explicitly naming campaignstack_get_playbook and campaignstack_get_exclusions as separate tools, leaving no ambiguity about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Call this when the user asks what a workspace is set up to do, or before changing a setting so the current value can be read back to them.' It also instructs how to obtain the required parameter via campaignstack_whoami, and clearly states what is not covered, routing to the correct alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_workspace_billingARead-onlyIdempotentInspect
Get billing information for a workspace: plan (free/paid), billing cycle, workspace status, and Stripe subscription details (period start/end). Call this when the user asks what plan they are on, when it renews, or whether the workspace is locked. It does not show credit usage; use campaignstack_get_credit_balance for that.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| plan | No | |
| status | No | |
| billingCycle | No | |
| currentPeriodEnd | No | |
| currentPeriodStart | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the operation's safety profile is established. The description adds behavioral context by scoping exactly what information is included and what is intentionally excluded, helping the agent avoid incorrect assumptions. It does not go into permission requirements or side effects, but those are less critical given the strong annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no waste: the first defines the resource and data fields, the second states concrete invocation triggers, and the third delineates a non-goal with an alternative. The most important information is front-loaded, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description, combined with rich annotations, a fully documented optional parameter, and an output schema, gives an agent everything needed to select and invoke this tool correctly. The distinction from credit-balance lookup is made explicit, and no additional context is necessary for this simple read-only billing query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the workspaceId parameter is thoroughly documented, including its optionality under workspace keys and the hint to use campaignstack_whoami. The tool description does not add parameter-level detail, but it does not need to because the schema already carries the full burden. This is the appropriate baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Get billing information for a workspace') and enumerates the exact data fields returned: plan, billing cycle, workspace status, and Stripe subscription details. It also distinguishes itself from a sibling tool by explicitly noting it does not show credit usage. This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit call conditions: when the user asks what plan they are on, when it renews, or whether the workspace is locked. It also names the alternative tool (campaignstack_get_credit_balance) for the related but separate 'credit usage' question, providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_workspace_brandingARead-onlyIdempotentInspect
Get a workspace's branding (logo presence, brand name, accent color, powered-by toggle): both the stored values and the fully-resolved branding with CampaignStack defaults filled. Call this when the user asks what branding a shared report will carry, or before proposing a change. Branding is applied only to client-facing artifacts like shared reports, never product emails or the in-app dashboard. Use campaignstack_update_workspace_branding to change values.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| stored | No | |
| resolved | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the description doesn't need to restate safety. It adds valuable context about what the tool does NOT affect (product emails, dashboard) and highlights the dual return (stored + resolved), which is beyond the schema. Minor gap: no disclosure of auth or key-type requirements, but that is addressed in the parameter schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is three sentences: first states purpose and return format, second gives usage triggers, third clarifies scope and routes to sibling. Front-loaded with the core verb and resource. No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema being provided in the context, the description enumerates the exact fields returned and the dual-mode behavior. Combined with the detailed parameter schema and annotations, an agent has everything needed to call correctly. No missing prerequisites or ambiguous behaviors.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter description already covers workspaceId with key-type nuance. The tool description doesn't repeat parameter details but adds context on when the parameter is required vs omitted, reinforcing the schema. Since coverage is high, baseline 3 is exceeded by the parameter-language alignment in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Get' and resource 'workspace branding', enumerates the specific data returned (logo presence, brand name, accent color, powered-by toggle), and distinguishes two output modes (stored vs resolved). This clearly differentiates from sibling get_workspace* tools which address other workspace aspects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call: when user asks what branding a shared report will carry or before proposing a change. It also names the sibling campaignstack_update_workspace_branding for changes. Clear exclusions: branding applies only to client-facing artifacts, not emails or dashboard. This provides strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_workspace_complianceARead-onlyIdempotentInspect
Get a workspace's compliance settings: whether the GDPR Article 14 lawful-basis notice is appended to the first LinkedIn message or email each person receives, plus the fixed notice text. Call this when the user asks whether the notice is turned on, or before proposing to change it. Use campaignstack_update_workspace_compliance to change the toggle.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| notice | No | |
| stored | No | |
| resolved | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond the annotations: it specifies what the compliance settings contain (the GDPR Article 14 notice toggle and fixed text) and clarifies the read-only nature by contrasting with the update tool. It doesn't describe the output schema, but an output schema exists, so that burden is already carried.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste. The first sentence states the purpose and the exact data returned, the second gives the trigger condition, and the third routes to the sibling. Every sentence earns its place and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-parameter tool with a rich schema, detailed annotations, and an output schema, the description is complete. It tells the agent what the tool returns, when to call it, and which sibling to use for the write operation. Nothing an agent needs to select and invoke this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 the workspaceId parameter thoroughly, including the distinction between user keys (csu_) and workspace keys (cs_) and the role of campaignstack_whoami. The description adds the context that this tool reads compliance settings, which helps the agent understand why the parameter matters, but the schema does the heavy lifting. A 4 is appropriate because the schema is exceptionally detailed and the description reinforces the parameter's purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a specific resource ('a workspace's compliance settings'), and the exact content returned (whether the GDPR Article 14 lawful-basis notice is appended to the first LinkedIn message or email, plus the fixed notice text). It clearly distinguishes this from the sibling update tool by naming it explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Call this when the user asks whether the notice is turned on, or before proposing to change it.' It also names the alternative tool for changing the toggle: 'Use campaignstack_update_workspace_compliance to change the toggle.' This is exactly the kind of routing an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_workspace_metricsARead-onlyIdempotentInspect
Get workspace-level metrics: latest snapshot plus a time-series for the requested date range. Includes total campaigns, active campaigns, leads added/contacted/converted today, and the top campaign. Call this when the user asks how the workspace is doing overall, not one campaign in particular. It does not break results down by campaign; use campaignstack_get_campaign_metrics for that.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of calendar days to include in the range (default 30, max 90) | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| range | No | |
| latest | No | |
| dateRange | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so safety is covered. The description adds behavioral context beyond annotations by specifying the output structure (snapshot plus time-series) and the scope limitation (workspace-level, not campaign-level). It also implicitly communicates the workspaceId nuance via the schema, but the description itself does not repeat it. This adds value without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states what the tool does and what it returns; the second gives usage guidance and alternative routing. Every sentence earns its place, and the most critical information (purpose and differentiation) is front-loaded with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the read-only nature, a detailed schema (including workspaceId nuance), and an output schema, the description is nearly complete. It explains the return contents and when to use it. It does not explicitly mention the days parameter's effect on the time-series, but that is covered in the schema. The description is sufficient for an agent to decide when and how to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters (days and workspaceId), with detailed descriptions including the conditional requirement for workspaceId based on key type. The tool description does not add any additional parameter semantics beyond what the schema provides. Baseline of 3 is appropriate since the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and resource ('workspace-level metrics') and enumerates the exact contents: latest snapshot, time-series, total/active campaigns, leads added/contacted/converted today, and top campaign. It also explicitly differentiates from the sibling by saying it does not break results down by campaign and names campaignstack_get_campaign_metrics as the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance ('Call this when the user asks how the workspace is doing overall') and when-not-to-use ('not one campaign in particular'), and directly points to the correct sibling ('use campaignstack_get_campaign_metrics for that'). This is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_get_workspace_setupARead-onlyIdempotentInspect
How a workspace build is going, and what is still missing once it is done. Pass the generationId from campaignstack_create_workspace, or a workspaceId to read its latest build. Returns every step with its status (pending, running, completed, skipped, failed) and a one-line detail, the ids created so far (campaign, ICP, lead list, workflow) as each lands, the inputs the build ran from, and the setup checklist: the items a person still has to settle (a LinkedIn account, why they built the product, offer facts, what a reply should lead to, exclusions), each with the page where it is done. The workspaceId is usable from the first poll, so you can fill the playbook with campaignstack_onboard_workspace while later steps run. A skipped step is not a failure: lead search skips when no LinkedIn account is connected. Poll every 15 to 30 seconds; a build takes a few minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. Reads the workspace's latest build when no generationId is given. | |
| generationId | No | From campaignstack_create_workspace. |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| error | No | |
| steps | No | Each step: name, status, detail, startedAt, completedAt |
| inputs | No | websiteUrl, profileUrl, goal the build ran from |
| status | No | |
| created | No | Ids created so far: campaignId, icpId, leadListId, workflowId, etc. |
| checklist | No | |
| createdAt | No | |
| workspace | No | |
| totalSteps | No | |
| completedAt | No | |
| currentStep | No | |
| workspaceId | No | |
| generationId | No | |
| completedSteps | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context: the workspaceId is usable from the first poll, a skipped step is not a failure, and the build takes a few minutes. It also explains what the return payload contains (steps with statuses, ids created so far, inputs, checklist). This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-organized, front-loading the core purpose and then detailing the return payload and usage nuances. Every sentence adds information, though it is somewhat long. It earns a 4 because it is information-dense without being repetitive, but it could be slightly tighter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (build status, checklist, multiple IDs, polling), the description covers everything an agent needs: what to pass, what to expect back, how to handle skipped steps, and how often to poll. The output schema exists, so return values are further specified. The description is complete for correct invocation and interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 both parameters well. The description adds meaning by explaining the relationship between generationId and workspaceId, and by noting that workspaceId is usable from the first poll. It also clarifies the key-type behavior (user key vs workspace key) is in the schema, but the description reinforces the practical usage. This is above the baseline 3 because the description adds contextual value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: reading the status of a workspace build, what is still missing, and the setup checklist. It names the specific resource (workspace build) and the verb (get/read), and distinguishes itself from siblings like campaignstack_get_workspace and campaignstack_create_workspace by focusing on build progress and missing setup items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use this tool: pass the generationId from campaignstack_create_workspace, or a workspaceId to read the latest build. It also provides polling guidance (every 15 to 30 seconds) and clarifies that a skipped step is not a failure, with an example (lead search skips when no LinkedIn account is connected). This is strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_import_external_leadsAInspect
Import every lead of an external provider source into CampaignStack. Call this when the user asks to bring a whole provider list, campaign or portal in. Provenance differs by provider: apollo and instantly (data vendors) land in the shared lead pool; hubspot (the tenant's own CRM) lands in workspace-scoped private leads. sourceKind picks between a provider lead list (apollo, instantly, hubspot), a provider campaign (instantly only), or the whole portal (hubspot only, sourceId "portal"); ids come from campaignstack_list_external_lead_lists / campaignstack_list_external_sequences. Leads are deduplicated by email and LinkedIn URL, available fields (title, company, phone, location) are mapped, and an optional campaignId lands the leads in that campaign's default lead list. Long imports keep running server-side; poll campaignstack_get_external_import_progress for status. Not the reverse: campaignstack_add_lead_to_external_list pushes a lead OUT to a provider. Free: no CampaignStack credits.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | Integration provider to import from. | |
| sourceId | Yes | Provider-side source id (from campaignstack_list_external_lead_lists or campaignstack_list_external_sequences). Pass "portal" for sourceKind portal. | |
| campaignId | No | Optional CampaignStack campaign whose default lead list receives the imported leads. | |
| sourceKind | Yes | Whether sourceId is a provider lead list (apollo, instantly, hubspot), a provider campaign (instantly only), or the whole portal (hubspot only: every contact). | |
| sourceName | No | Display name for progress tracking. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | No | |
| errors | No | |
| leadIds | No | |
| skipped | No | |
| success | No | |
| imported | No | |
| errorCode | No | |
| addedToCampaign | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description provides substantial behavioral context: provenance differs by provider (shared vs workspace-scoped leads), deduplication by email and LinkedIn URL, field mapping, async server-side execution with progress polling, and the fact that no CampaignStack credits are consumed. This goes far beyond readOnlyHint, openWorldHint, idempotentHint, and destructiveHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause earns its place. It front-loads the core action and trigger, then packs provenance, sourceKind semantics, deduplication, mapping, async behavior, the reverse operation, and pricing into a compact paragraph. For a tool with this complexity, it is appropriately sized and well structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, provider-specific behavior, and asynchronous execution, this description is complete. It explains where IDs come from, how leads are stored, what happens on duplicate import, how progress is tracked, and what not to use it for. An agent has enough context to select and invoke it correctly without additional discovery.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds real semantic depth: it explains what sourceKind values mean per provider, that sourceId 'portal' is used for whole-portal hubspot imports, that campaignId routes to the campaign's default lead list, and how workspaceId interacts with user keys vs workspace keys. This meaningfully improves parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Import every lead of an external provider source into CampaignStack.' It clearly distinguishes this from the reverse operation, campaignstack_add_lead_to_external_list, which pushes leads out. The scope ('whole provider list, campaign or portal') is precise and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to call this tool: 'Call this when the user asks to bring a whole provider list, campaign or portal in.' It also names the alternative it is not, campaignstack_add_lead_to_external_list, and gives provider-specific sourceKind constraints that prevent misuse. This leaves 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_import_leads_csvAInspect
Import leads from CSV data. Provide raw CSV content and optional column mapping. If no mapping is provided, columns are auto-mapped based on header names. After import, use campaignstack_search_leads to verify imported leads, or campaignstack_add_leads_to_list to add them to a campaign. Call this when the user hands over a CSV of contacts. Rows land as workspace-private leads, not the shared pool. It does not enroll anyone in outreach on its own.
| Name | Required | Description | Default |
|---|---|---|---|
| csvData | Yes | ||
| mapping | No | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| errors | No | |
| created | No | |
| skipped | No | |
| updated | No | |
| totalRows | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses two meaningful behaviors: rows land as workspace-private leads rather than the shared pool, and the tool does not enroll anyone in outreach on its own. It also explains the auto-mapping fallback when no mapping is provided, giving the agent a clear model of side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core action comes first, followed by usage guidance, the trigger condition, and behavioral caveats. Every sentence adds information, and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 3 parameters and a detailed workspaceId schema description, the description covers the input format, mapping behavior, post-import verification workflow, visibility scope, and the fact that no outreach is triggered. The output schema exists, so not describing return values is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 csvData by specifying it is raw CSV content, and for mapping by clarifying it is optional and falls back to header-based auto-mapping. The workspaceId parameter is already thoroughly documented in the schema, so the description does not need to repeat it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Import leads from CSV data.' It then sharpens the scope with an explicit trigger ('Call this when the user hands over a CSV of contacts') and notes behavior that differentiates it from related tools, such as landing leads in the workspace-private pool rather than the shared pool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to call the tool and even names follow-up tools: campaignstack_search_leads to verify and campaignstack_add_leads_to_list to add to a campaign. It does not explicitly list when-not-to-use alternatives like campaignstack_import_external_leads, so it falls just 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_invite_memberADestructiveInspect
Invite someone to the workspace by email as a 'member' (admin requires the workspace settings UI). An invitation email sends automatically as soon as this call succeeds, so confirm the address with the user first. Expires after 7 days; cancel early with campaignstack_revoke_invitation.
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | Only "member" invitations can be created via MCP | |
| Yes | |||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| role | No | |
| No | ||
| invitationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true fact that this call has side effects)Skip the description adds crucial specifics: an invitation email sends automatically on success, the invitation expires after 7 days, and it can be cancelled early with a named sibling. This goes well beyond the annotation flags and gives the agent the information needed to warn the user and avoid mistakes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each packed with actionable information: the core action, a behavioral warning, and a lifecycle detail (expiry/cancellation). The first sentence states what the tool does, and the following sentences deliver the caveats without any fluff. Perfectly front-loaded and appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description doesn't need to explain return values. It covers the key side effect (automatic email), the precondition (confirm address), the role limitation (member only), and the cancellation path. The workspaceId key nuance is in the schema, so relying on that is acceptable. An agent has everything essential to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers two of three parameters with descriptions (role enum and workspaceId key behavior), giving ~67% coverage. The description confirms 'by email' and 'as a member' but adds no deeper parameter semantics beyond what the schema provides. It doesn't compensate for the undocumented email property, but the schema carries most weight, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Invite someone to the workspace by email as a member.' It immediately distinguishes the tool by restricting to the 'member' role, which differentiates it from role-management siblings like campaignstack_update_member_role and campaignstack_remove_member. The mention of the workspace settings UI for admin invites further clarifies the exact scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states a when-not: admin invitations require the workspace settings UI, so this tool should not be used for admin invites. It also gives a precondition (confirm the email address with the user) and points to a sibling alternative for early cancellation (campaignstack_revoke_invitation). This is direct guidance for agent decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_like_postADestructiveInspect
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_list_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: put the leads in a lead list with campaignstack_add_leads_to_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Sending is paced by CampaignStack's own daily and weekly limits and business hours, which are set by a human in the app and are not writable from here; see overrideOwnLimits before asking for an exception.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | No | ||
| platform | Yes | ||
| accountId | No | ||
| profileUrl | No | ||
| overrideOwnLimits | No | 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. | |
| dangerouslyBypassSafetySystem | No | Deprecated name for overrideOwnLimits. Use overrideOwnLimits. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | No | |
| status | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the annotations: the like is public, creates a notification under the owner's name, 'reaches a real person,' is paced by daily/weekly limits and business hours, and overrideOwnLimits 'voids the safety guarantee.' These real-world side effects align with destructiveHint=true and readOnlyHint=false and materially inform the agent's risk assessment.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but nearly every sentence earns its place given the tool's risk profile: it touches a real person, has a safety override, and interacts with list/workflow mechanics. It is front-loaded with the core purpose. Minor redundancy exists (the no-loop/no-bulk guidance restates the one-person-per-call rule), so it is not maximally tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-stakes, real-person-reaching mutation tool with six parameters and a destructive override, the description is remarkably complete. It covers when to call, which parameter form to use, account selection, public visibility, the comment alternative, bulk alternatives, pacing limits, and consent requirements. With an output schema present, return values need no explanation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at only 33%, the description carries the burden for leadId, accountId, and profileUrl. It does so effectively: leadId is 'the supported form,' profileUrl is 'accepted for someone already in the workspace,' accountId defaults to the workspace's only connected account with a pointer to campaignstack_list_accounts, and platform is declared required with current value 'linkedin.' The override flags are left to the schema, which already describes them thoroughly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific verb and resource: 'like a lead's most recent post from a connected LinkedIn account,' and adds the strategic purpose ('a light way to be seen before writing'). It explicitly differentiates from siblings ('It does not comment; use campaignstack_comment_on_post for that'), so an agent can distinguish it from the many outreach tools in the sibling list 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition ('Call this when the user asks to like or engage with a specific lead's post before an outreach step'), an explicit exclusion (commenting routes to campaignstack_comment_on_post), and a clear directive for the bulk case (use campaignstack_add_leads_to_list plus campaignstack_trigger_workflow rather than looping). It also mandates a consent gate: tell the user who it goes to, read wording back, and wait for an explicit yes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_link_account_to_workspaceAIdempotentInspect
Make a LinkedIn or Google account the user already connected available in another of their workspaces, so that workspace can send from it. Call this after campaignstack_create_workspace when the user wants the new workspace to run on an account they already use elsewhere; read the accountId from campaignstack_list_accounts on a workspace that has it. The first LinkedIn account linked becomes the workspace's default sender. Nothing is sent and nothing is re-authenticated. The account must be the user's own and they must belong to the target workspace. Free accounts have an identity cap per workspace; the error says so when it bites. To connect a NEW account use campaignstack_request_connect_link.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Which kind of account. | |
| accountId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. The workspace the account should become available in. |
Output Schema
| Name | Required | Description |
|---|---|---|
| No | ||
| linked | No | |
| platform | No | |
| accountId | No | |
| workspaceId | No | |
| alreadyLinked | No | |
| isWorkspaceDefault | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavior beyond annotations: 'Nothing is sent and nothing is re-authenticated', the first LinkedIn account becomes the default sender, and free accounts have an identity cap per workspace. These details are not present in the annotations and meaningfully shape agent expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but every sentence carries operational value: main action, when to call, where to get the ID, default sender behavior, side-effect guarantees, ownership prerequisites, failure mode, and alternative tool. It is front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a state-changing linking operation with three parameters, this description covers prerequisites, data provenance, side-effect boundaries, an ordering constraint, a failure mode, and the alternative path. An output schema exists, so return-value documentation is not required in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, leaving accountId undocumented, but the description compensates by saying to read accountId from campaignstack_list_accounts. It also reinforces the platform enum and clarifies that workspaceId is the target workspace, while the schema already covers user-key versus workspace-key behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: making an already-connected LinkedIn or Google account available in another workspace so that workspace can send from it. It clearly distinguishes itself from campaignstack_request_connect_link, which is for connecting a NEW account.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance: after campaignstack_create_workspace, when the user wants a new workspace to use an account already connected elsewhere. It also tells how to obtain the accountId via campaignstack_list_accounts and explicitly names the alternative for new accounts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_link_integrationAIdempotentInspect
Make an integration the user already connected (apollo, instantly, clay, hubspot) available in another of their workspaces, without asking for the API key again. Call this after campaignstack_create_workspace when campaignstack_list_integrations on the new workspace comes back empty and the user has the provider elsewhere. The key is copied server-side and never returned. No-op when the workspace already has that provider. Refuses when the user has no connected integration of that provider anywhere; connect one first with campaignstack_connect_apollo, campaignstack_connect_instantly or campaignstack_connect_hubspot.
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | Which integration to make available. | |
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. The workspace that should get the integration. | |
| fromWorkspaceId | No | Only when the user has this provider connected in several workspaces: which one to copy from. |
Output Schema
| Name | Required | Description |
|---|---|---|
| provider | No | |
| workspaceId | No | |
| alreadyLinked | No | |
| integrationId | No | |
| sourceWorkspaceId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavior beyond the idempotentHint annotation: the key is copied server-side and never returned, the operation is a no-op when the provider already exists in the target workspace, and it refuses when no connected integration exists anywhere. These are exactly the side effects and preconditions an agent needs to know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, trigger condition, behavioral guarantees, and failure handling. The most important purpose is front-loaded, and there is no fluff or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with this complexity, the description covers what it does, when to call it, prerequisites, no-op behavior, refusal behavior, and security-relevant detail about the API key. The output schema exists, so return-value documentation is not required from the description, and nothing important is left ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already explains provider, workspaceId, including the csu_/cs_ key distinction, and fromWorkspaceId. The description adds operational context like 'without asking for the API key again' but does not provide parameter-level details beyond what the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: making an already-connected integration available in another workspace without re-requesting the API key. It also names the supported providers and clearly distinguishes this from connecting a new integration or listing integrations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger condition: call after campaignstack_create_workspace when campaignstack_list_integrations on the new workspace is empty and the provider exists elsewhere. It also specifies no-op and refusal behavior, and routes the user to connect tools when no integration exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_link_lead_profileAInspect
Attach a platform profile (LinkedIn or X) to an existing PRIVATE lead so one person is recognised across sources. Provide at least one of url, externalId, or handle. Fails with PROFILE_ALREADY_LINKED if the profile is attached to a different lead. API-key callers may only link profiles on private (workspace-scoped) leads. Global leads are read-only for user-supplied data. An X profile is recognition only: there are no X accounts to send from and no X actions, so linking one never makes the person reachable on X. Only LinkedIn linking affects who can be contacted. See campaignstack_explain_capabilities with topic platforms. Call this when a private lead is the same person known under a different profile. It does not merge two leads: campaignstack_unlink_lead_profile is the reverse move.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Profile URL (e.g. https://linkedin.com/in/jane or https://x.com/jane) | |
| handle | No | X handle (with or without @) | |
| leadId | Yes | Private lead id (API-key callers may only link on private leads) | |
| platform | Yes | Platform of the profile being linked | |
| externalId | No | Platform-native external id | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| leadId | No | |
| linked | No | |
| platform | No | |
| leadSource | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing a concrete failure mode (PROFILE_ALREADY_LINKED), auth limitations (API-key callers may only link on private leads), and the semantic difference that X linking is recognition-only while LinkedIn linking affects contactability. It also clarifies global leads are read-only for this data, which is valuable behavioral context not present in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: main action, input requirement, error condition, authorization constraint, platform nuance, and usage guidance. It is front-loaded with the core purpose before constraints, and the pointer to campaignstack_explain_capabilities is a useful resource without adding clutter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with complex scoping and platform-specific behavior, the description covers the essential context: how to identify the profile, which leads are eligible, what failure to expect, what the operation does not do, and how to reverse it. The presence of an output schema means return-value details are not needed here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all 6 parameters at 100%, so the baseline is 3. The description adds meaningful combinatorial guidance by stating 'Provide at least one of url, externalId, or handle', which is not encoded in the schema's required list. It also reinforces the leadId must be private and clarifies the platform-specific consequences, adding value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair, 'Attach a platform profile to an existing PRIVATE lead', and clearly states the purpose: recognising one person across sources. It distinguishes itself from the reverse sibling campaignstack_unlink_lead_profile and from other linking tools by making the scope and target explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call: 'Call this when a private lead is the same person known under a different profile.' It also gives an explicit when-not: 'It does not merge two leads', and names the alternative/reverse operation. The API-key restriction and distinction between X and LinkedIn reachability further guide correct usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_accountsARead-onlyIdempotentInspect
List accounts connected to a workspace. Returns LinkedIn and Google accounts with a platform field. Optionally filter by platform ('linkedin' or 'google'). LinkedIn accounts include today's budget usage; Google accounts include email and status. Call this when the user asks which accounts are connected, or to find an accountId. It does not connect a new account: that happens in the CampaignStack app.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | No | Filter by platform. Omit to return all accounts. | |
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds value by clarifying the exact scope of the operation and explicitly stating that no account connection occurs here, which is a useful behavioral boundary 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: it front-loads the core action, then provides return details, filtering, usage trigger, and a negative boundary. Every sentence contributes useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with an output schema and complete parameter documentation, the description provides all necessary guidance: when to use it, what it returns, how to filter, and what it does not do. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully documents both parameters, including the platform enum and the detailed workspaceId explanation about user keys versus workspace keys. The description restates the optional platform filter but does not add new parameter-level meaning beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List accounts connected to a workspace' and specifies that it returns LinkedIn and Google accounts with a platform field. It also differentiates itself from account creation by explicitly saying it does not connect a new account, so an agent can distinguish it from related account/link tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use directive: 'Call this when the user asks which accounts are connected, or to find an accountId.' It also provides a clear when-not boundary: 'It does not connect a new account: that happens in the CampaignStack app.' This is sufficient to prevent misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_agent_memoriesARead-onlyIdempotentInspect
List everything the agent memory system holds for this workspace, including notes still awaiting confirmation. A note the system only inferred from one of your edits (status "candidate") is not yet used in any prompt; a note asserted by an agent or applied by a person (status "active") already is. Call this when the user asks what the AI has learned, what notes are pending, or wants to review its memory. Apply a pending note with campaignstack_apply_agent_memory, or remove any note (pending or active) with campaignstack_delete_agent_memory. There is no edit tool: editing a pending note would let it skip the confirmation it is waiting for, so replace it by deleting the old one and letting the correction show up again, or by asserting a new one directly.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavior beyond that: it defines candidate vs active statuses, explains that candidate notes are not used in prompts, and discloses the deliberate absence of an edit tool to preserve the confirmation flow. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the primary purpose and each subsequent sentence earns its place: status semantics, call triggers, sibling routing, and the no-edit rationale. It is long but not bloated; every sentence adds necessary decision-making context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (two optional parameters) and the presence of an output schema and annotations, the description is complete enough. It covers what the tool returns conceptually, when to use it, how statuses behave, and how it relates to apply/delete siblings, so an agent can call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 not mention either parameter (category or workspaceId). It adds no meaning beyond the schema and fails to compensate for the undocumented category parameter, leaving part of the parameter surface unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List everything the agent memory system holds') and a clear resource ('agent memory'), and it distinguishes the candidate vs active statuses. This makes it immediately clear what the tool does and separates it from the many other list_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to call this tool ('when the user asks what the AI has learned, what notes are pending, or wants to review its memory') and names the apply/delete sibling tools as alternatives. It also explains why there is no edit tool, giving the agent clear routing and replacement guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_ai_suggestionsARead-onlyIdempotentInspect
List up to 3 recent AI-generated content post drafts (tagged 'ai-generated') for a workspace. Call this when the user asks what content ideas are waiting for them. Edit one with campaignstack_update_content_post, then schedule or submit it for approval. It does not generate a new suggestion: there is no MCP tool for that yet.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| suggestions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral constraints: it lists only up to 3 recent drafts, filters by the 'ai-generated' tag, and explicitly states it does not generate new suggestions. These details go beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no wasted words. It front-loads the core purpose, immediately follows with the use case, and ends with an important limitation. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists (so return values are not needed in the description), the description covers the trigger, the workflow for post-listing actions, and the non-generation limitation. It also implicitly handles the workspace scope through the parameter schema. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema parameter description is exceptionally detailed, explaining the workspace key types and how to resolve them via campaignstack_whoami. The description does not add any additional parameter semantics beyond mentioning 'for a workspace,' so the baseline of 3 for full schema coverage is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource: 'List up to 3 recent AI-generated content post drafts (tagged "ai-generated") for a workspace.' It differentiates from the many list tools by specifying the unique content type and the tagging filter. It also explicitly notes that it does not generate new suggestions, distinguishing it from any potential generation tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit trigger: 'Call this when the user asks what content ideas are waiting for them.' It also outlines the next steps: 'Edit one with campaignstack_update_content_post, then schedule or submit it for approval.' The note that there is 'no MCP tool for that yet' for generation clarifies that this tool is the only listing option and should not be used when generation is expected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_automationsARead-onlyIdempotentInspect
List the recurring jobs a campaign runs on a schedule, with each one's name, when it runs, whether it is on, and how the last run went. Call this when the user asks what is running by itself, or to find the automationId that campaignstack_toggle_automation needs. Workflows are a different thing and are listed by campaignstack_list_workflows.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds value beyond that by specifying what the returned data represents (recurring scheduled jobs with enabled state and last-run outcome) and how it feeds toggle_automation. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero filler. The core purpose and return fields are front-loaded first, the when-to-call guidance second, and the sibling distinction last. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only listing tool, the description covers purpose, output content, invocation trigger, and sibling routing. An output schema exists to document return values, and annotations cover the safety profile. The only minor gap is the undocumented campaignId parameter, which is largely inferable from context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the sole parameter campaignId is undocumented in the schema, so the description must compensate. It partially does by establishing the campaign context ('the recurring jobs a campaign runs'), but it never explicitly maps campaignId to its meaning or format. For a single obvious string parameter the gap is minor, but the compensation is incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List the recurring jobs a campaign runs on a schedule', and enumerates the exact output fields (name, schedule, on/off state, last run result). It explicitly distinguishes itself from workflows, naming the sibling that handles the other concept, so an agent can disambiguate 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit invocation conditions: 'Call this when the user asks what is running by itself' and a concrete downstream use ('to find the automationId that campaignstack_toggle_automation needs'). It also states what it is NOT for, pointing to campaignstack_list_workflows as the alternative. This is complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_campaignsARead-onlyIdempotentInspect
List campaigns in a workspace. Archived campaigns are hidden unless includeArchived is true. Call this to find a campaignId for campaignstack_get_campaign or campaignstack_list_workflows. Titles and goals only, not performance: use campaignstack_get_campaign_metrics for results. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| includeArchived | No | Include archived campaigns. Off by default, so archived campaigns are hidden. Turn it on to find one you want to unarchive. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description discloses that archived campaigns are hidden unless includeArchived is true, that results are one page, and that pagination should be explicitly reported. It also notes the content limitation (titles and goals only). These behavioral traits add significant context beyond the annotations, which already mark it as safe and idempotent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each with a distinct purpose: the main action, the use case for finding IDs, and the pagination caution. It is front-loaded with the core function and avoids redundancy with the schema. Every sentence earns its place, making it efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists (as per context signals) and annotations cover safety, the description sufficiently covers all necessary operational aspects: what it returns (titles and goals), archived behavior, pagination handling, and when to use it versus alternatives. No critical information is missing for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes workspaceId and includeArchived in detail, but limit and cursor have no descriptions. The description adds context about pagination ('Results are one page. When pagination reports more...'), which implies cursor usage, but it does not explicitly explain limit or cursor parameters. With 50% schema coverage, the description partially compensates but leaves limit and cursor semantics largely implicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List campaigns in a workspace.' It also differentiates from related tools by specifying it's for finding a campaignId (for campaignstack_get_campaign or campaignstack_list_workflows) and that it returns only titles and goals, not performance (use campaignstack_get_campaign_metrics). This precisely defines the scope and distinguishes 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is given: when to use (to find a campaignId) and when not to (for performance metrics, use campaignstack_get_campaign_metrics). It also instructs on handling pagination, saying to mention when more pages exist rather than presenting a single page as the whole set, and to page through before counting. This is actionable and clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_companiesARead-onlyIdempotentInspect
List companies linked to a workspace. Returns company records with workspace metadata (tags, notes, addedAt). Supports cursor-based pagination. Call this when the user asks to see or search the companies in a workspace, or to find a company id before another call. Use the returned companyId values with campaignstack_get_company. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, but the description adds substantial behavioral detail: it returns workspace metadata (tags, notes, addedAt), supports cursor-based pagination, returns only one page per call, and instructs how to handle pagination results. This goes beyond the scalar annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the primary purpose, then return details, pagination behavior, and usage context. Every sentence adds necessary information for deciding when to call and how to interpret results; no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema and annotations, the description covers all needed context: what the tool does, when to use it, what is returned, pagination behavior, and how to use the returned companyIdvalues. The workspaceId key-type nuance is already detailed in the parameter description, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 33% (only workspaceId has a detailed description). The tool description mentions 'cursor-based pagination' which gives some meaning to the cursor parameteraine, but it does not explain limit or cursor types/formats, nor does it elaborate on how to pass them. The workspaceId semantics are well covered in the schema, so the description only partially compensates for the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the action ('List companies linked to a workspace') and the resource, and it further differentiates from siblings by noting that returned companyId values should be used with campaignstack_get_companyable. This makes the tool's purpose unambiguous and distinct from other list/get tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use conditions: 'Call this when the user asks to see or search the companies in a workspace, or to find a company id before another call.' It also provides pagination guidance ('When pagination reports more, say so... page through before counting anything') and names the related sibling (campaignstack_get_company) for follow-up.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_company_employeesARead-onlyIdempotentInspect
List the employees stored for a company (shared leads tied to it), paginated. Returns name, title, headline, email and LinkedIn URL per employee. Call this when the user asks who works at a company that has already been read, or to check an extraction's results. Populate or refresh the set with campaignstack_extract_company_employees. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| companyId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds valuable behavior beyond those: results are one page, pagination must be acknowledged rather than presented as the whole set, and paging is required before counting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three purposeful sentences with no filler. The purpose is front-loaded, the usage trigger is explicit, and the pagination caveat is placed where it matters most.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers what the tool returns, when to call it, the sibling to populate/refresh, and the pagination caveat. The output schema covers return shape and annotations cover safety, so nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies companyId via 'stored for a company' and implies pagination via limit/cursor, but it does not explain limit range/default or how cursor is used. This is adequate but leaves the optional parameters under-described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List'), resource ('employees stored for a company'), and scope ('shared leads tied to it'), and enumerates returned fields: name, title, headline, email, LinkedIn URL. It also names the sibling that populates the set, making the distinction clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit call conditions: 'when the user asks who works at a company that has already been read, or to check an extraction's results.' It also names the alternative for populating/refreshing the set, so the agent knows when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_company_employee_watchesARead-onlyIdempotentInspect
List the workspace's company employee watches with company name, state, why a paused watch is paused, and the last check. Call this when the user asks which companies are being watched for new hires. It lists COMPANY watches only: campaignstack_list_signal_watches covers person watches.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | all | |
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so safety is established. The description adds useful scoping context ('COMPANY watches only') and output details, but does not disclose additional behaviors such as pagination, permission requirements, or limits; this is adequate but not exceptional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the resource and scope are front-loaded, the invocation condition follows, and the sibling distinction closes the description. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list operation with annotations, a rich input schema, and an output schema present, the description covers what the tool lists, when to use it, and how it differs from the relevant sibling. Nothing an agent needs to select it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The workspaceId parameter is already thoroughly described in the schema, including user-key versus workspace-key behavior. The state parameter is left to its self-describing enum, and the description does not add new parameter meaning beyond reinforcing workspace scope, so it only meets the minimum viable bar.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and resource ('the workspace's company employee watches'), names the returned fields, and explicitly separates it from campaignstack_list_signal_watches, which covers person watches. This lets an agent distinguish it from sibling list tools without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the trigger: 'Call this when the user asks which companies are being watched for new hires.' It also gives an explicit alternative for person watches, so the agent knows when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_company_signalsARead-onlyIdempotentInspect
List a company's signals (funding events, headcount growth/decline, follower spikes), newest first. Company signals boost the score of every lead at the company. Call this when the user asks why a company is trending or what recently changed about it. It reads company- level events only; for one lead's own signals use campaignstack_list_lead_signals. Use campaignstack_get_company or campaignstack_list_companies to find company IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| companyId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive behavior. The description adds meaningful context beyond that: it reads 'company-level events only,' returns newest first, and explains that company signals 'boost the score of every lead at the company.' This is useful behavioral context, though it could have mentioned pagination or response details; the output schema mitigates that gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with no filler. The core action is front-loaded, followed by scope clarification, usage trigger, and sibling routing. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 covers purpose, trigger conditions, scope, sibling differentiation, and company ID lookup. Nothing essential to selecting or invoking this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies the central companyId parameter by explaining that the tool operates on a company and recommending tools to find company IDs. The limit parameter is not addressed in the description, though its name and schema min/max/default make it reasonably self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List a company's signals' with concrete signal examples ('funding events, headcount growth/decline, follower spikes') and the sort order 'newest first'. It also explicitly distinguishes itself from campaignstack_list_lead_signals, making sibling differentiation immediate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exact trigger conditions: 'Call this when the user asks why a company is trending or what recently changed about it.' It also provides an explicit alternative for lead-level signals and directs the agent to campaignstack_get_company or campaignstack_list_companies for finding company IDs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_competitor_watchesARead-onlyIdempotentInspect
Lists competitor watches for a workspace. Optionally filter by status (active/paused). Use campaignstack_get_competitor_watch to see post details for a specific watch. Call this when the user asks what is being tracked, or to find a watchId before pausing, resuming, or deleting one. It does not return the posts themselves.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by status. Omit to list all watches. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| watches | No | |
| totalCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds useful behavioral context beyond those annotations, such as the list being workspace-scoped and explicitly not returning posts. It does not mention pagination, but the output schema mitigates that gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four tight sentences with no filler. It front-loads the core action, then provides routing guidance, usage triggers, and a clear boundary in sequence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with a full output schema, complete parameter documentation, and safety annotations, the description covers all essential context: what it returns, what it does not return, and when to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already fully documented. The description only lightly restates the status filter and the workspace context, adding no meaningful new parameter semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Lists competitor watches for a workspace.' It further differentiates from the sibling campaignstack_get_competitor_watch by noting it does not return the posts themselves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to call it: 'when the user asks what is being tracked, or to find a watchId before pausing, resuming, or deleting one.' It also names the alternative for post details and states a key limitation: 'It does not return the posts themselves.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_contact_finder_requestsARead-onlyIdempotentInspect
List the workspace's built-in Contact Finder requests, newest first, optionally filtered by status (queued, linked, submitted, completed, failed). Each row carries origin (workflow, mcp, manual), wantEmail/wantPhone, creditsReserved, creditsCharged once settled, the result summary and errorCode. Call this when the user asks what contact lookups are running or what they cost. Use it to see what is in flight or to audit what the finder charged; use campaignstack_get_contact_finder_request for one id.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows to return, newest first (default 25, max 100). | |
| status | No | Only requests in this status (queued, linked, submitted, completed, failed). | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| requests | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds useful behavioral context beyond that: result ordering, status filtering, and the row-level data exposed (origin, wantEmail/wantPhone, creditsReserved, creditsCharged, result summary, errorCode). 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler; the core action, ordering, filtering, row contents, and usage guidance all appear early. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, the description does not need to detail return shape, but it still summarizes key row fields. It covers ordering, filtering, status values, credit/cost auditing, key-type behavior, and the single-item alternative, making it complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter already has a detailed description in the schema. The tool description mostly restates or mirrors that information (status values, newest-first ordering, workspace key behavior), adding little semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), resource ('the workspace's built-in Contact Finder requests'), and key behavior ('newest first, optionally filtered by status'). It also names the related single-item tool, campaignstack_get_contact_finder_request, making the distinction clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is given: 'Call this when the user asks what contact lookups are running or what they cost.' It further distinguishes use cases ('in flight' vs 'audit what the finder charged') and explicitly points to the alternative for a single ID.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_content_calendarARead-onlyIdempotentInspect
List content posts scheduled or published within a date range, for a calendar view. Call this when the user asks what is going out this week or over a range. Timestamps are Unix ms. It does not include unscheduled drafts: use campaignstack_list_content_posts with status draft for those.
| Name | Required | Description | Default |
|---|---|---|---|
| endMs | Yes | ||
| startMs | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| posts | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, and non-destructive, so the description needs to add context beyond that. It does by disclosing the inclusion criteria (scheduled or published), excluding unscheduled drafts, and noting timestamp units. That is useful behavioral 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: purpose, when to call, timestamp format, and the sibling alternative for drafts. The critical routing and exclusion details are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a filtered read-only list tool with an output schema and rich annotations, this description contains everything an agent needs to invoke it correctly: scope, date-range use case, timestamp units, and an explicit fallback for drafts. No meaningful gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is low at 33%, with only workspaceId described. The description compensates meaningfully by specifying 'Timestamps are Unix ms,' which directly clarifies the otherwise undocumented startMs and endMs parameters. It does not fully explain inclusivity or timezone behavior, but the essential unit semantics are covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and names the exact resource ('content posts scheduled or published within a date range') plus the intended presentation ('for a calendar view'). It clearly differentiates from the sibling campaignstack_list_content_posts by mentioning the missing draft scope and pointing to that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to call it: 'when the user asks what is going out this week or over a range.' It also states a hard exclusion ('does not include unscheduled drafts') and provides the exact alternative tool and status filter, leaving no ambiguity about routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_content_postsARead-onlyIdempotentInspect
Lists content posts, filterable by status, platform, and tags (OR logic), most recent first. Call this when the user asks what posts are drafted, scheduled, or published, or wants one to edit. Use campaignstack_get_content_post for full details including media URLs. It does not report engagement: use campaignstack_get_content_analytics for that. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| limit | No | ||
| cursor | No | Opaque pagination cursor from a previous response's nextCursor | |
| status | No | ||
| platform | No | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this read-only and idempotent, and the description adds valuable behavior beyond that: results are one page, pagination must be surfaced rather than hidden, and counting should follow paging through. It also explicitly states the tool does not report engagement, which prevents a likely misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core function, then flows naturally into when-to-use, alternatives, and pagination handling. Every sentence contributes a distinct operational fact, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given six parameters, a rich output schema, and many sibling tools, the description covers selection criteria, exclusions, sort order, pagination behavior, and counting pitfalls. It does not need to restate return values because an output schema exists, and it addresses the main failure modes an agent could encounter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. It does add meaning for tags by noting OR logic and for status/platform by listing them as filters, and it implies limit/cursor through the pagination guidance. However, it leaves limit, cursor, and workspaceId semantics mostly to the schema, and does not fully describe all parameter behaviors.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: "Lists content posts", then adds filtering dimensions and ordering. It also distinguishes itself from campaignstack_get_content_post and campaignstack_get_content_analytics, so an agent can select it among the many content-related siblings without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly prescribes when to use the tool: "Call this when the user asks what posts are drafted, scheduled, or published, or wants one to edit." It also names alternatives for the cases it does not cover, such as getting full details via campaignstack_get_content_post and engagement via campaignstack_get_content_analytics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_external_email_accountsARead-onlyInspect
List an external provider's sending mailboxes / email accounts (provider-parameterized; only apollo exposes mailboxes today, other providers return errorType unsupported_provider). Call this when an Apollo sequence enrollment needs a mailbox id. Not sequences: campaignstack_list_external_sequences does that. Returns each account's id, email address, and active status. Apollo's add-to-sequence endpoint requires one of these ids as emailAccountId. Apollo requires a MASTER API key for this endpoint: a non-master key returns errorType master_key_required. Requires a connected integration for the provider (e.g. campaignstack_connect_apollo).
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | Integration provider whose sending mailboxes to list. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| accounts | No | |
| provider | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and destructiveHint annotations, the description discloses error conditions (unsupported_provider, master_key_required), the MASTER API key requirement, the need for a connected integration, and the returned fields (id, email, active status). This goes well beyond annotations, giving the agent full visibility into preconditions and failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet information-dense. It front-loads the action, then covers when to use, returns, and prerequisites in a logical flow. No filler; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema, clear annotations, and a description covering purpose, usage, return fields, error conditions, and prerequisites, nothing essential is missing. An agent can confidently decide to call this tool and understand its constraints.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are well-described in the schema (provider enum with description, workspaceId with user vs workspace key distinction). The description adds provider behavior context but does not add new parameter-level meaning 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List), resource (external provider's sending mailboxes/email accounts), and explicitly differentiates from sibling campaignstack_list_external_sequences. The provider-parameterized nature and the note that only apollo exposes mailboxes today add precision, leaving no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use: 'Call this when an Apollo sequence enrollment needs a mailbox id.' It also names the alternative: 'Not sequences: campaignstack_list_external_sequences does that.' 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_list_external_lead_listsARead-onlyInspect
List an external provider's lead lists (provider-parameterized: apollo, instantly, hubspot or clay). Call this when the user needs a real list id, not a name. Not sequences: campaignstack_list_external_sequences covers those. Apollo lists are account labels with cached contact counts; clay lists are the Clay tables the user registered on the Integrations page (no webhook URLs returned). Use the id as sourceId with campaignstack_import_external_leads, or as listId with campaignstack_add_lead_to_external_list (instantly, hubspot and clay only).
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | Integration provider whose lead lists to list. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| lists | No | |
| provider | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly and non-destructive behavior, so the description adds value through provider-specific quirks: Apollo lists are account labels with cached counts, and Clay lists are registered tables with no webhook URLs returned. This is useful behavioral context beyond the structured metadata, though it doesn't address pagination or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: scope, call condition, sibling distinction, provider-specific behavior, and downstream usage. It is front-loaded and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the annotations cover the safety profile, the description is complete: it explains provider differences, clarifies what the ids are for, and warns about Clay's missing webhook URLs. An agent has enough context to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 provider and workspaceId thoroughly. The description restates the provider enum and adds downstream id-meaning context, but doesn't add meaningfully new parameter-level semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('List an external provider's lead lists') and immediately enumerates the valid providers. It distinguishes itself from campaignstack_list_external_sequences, so an agent can tell them apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to call this tool ('when the user needs a real list id, not a name') and names the sibling that covers sequences. It also gives downstream routing guidance for the returned id, linking to import_external_leads and add_lead_to_external_list with a provider restriction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_external_sequencesARead-onlyInspect
List an external provider's sequences (provider-parameterized: apollo sequences, instantly campaigns; more providers extend the enum). Call this when the user needs a real sequence id for campaignstack_add_lead_to_sequence, not a name. Returns each sequence's id, name, and active status. It does not list HubSpot or Clay lead lists: campaignstack_list_external_lead_lists covers those. Use the id as campaignId with campaignstack_add_lead_to_sequence or in an integration:add_to_sequence workflow node. Apollo also needs a sending mailbox: get one with campaignstack_list_external_email_accounts. Apollo requires a MASTER API key for sequence endpoints: a non-master key returns errorType master_key_required. Requires a connected integration for the provider (campaignstack_connect_apollo / campaignstack_connect_instantly).
| Name | Required | Description | Default |
|---|---|---|---|
| provider | Yes | Integration provider whose sequences to list. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| provider | No | |
| sequences | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and non-destructive; the description adds return fields, provider-specific behavior, Apollo key error type, and integration requirements. This goes well beyond what annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries operational value: purpose, when to use, return shape, exclusions, downstream usage, prerequisites, and error behavior. It is front-loaded and dense without wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers downstream usage, sibling-tool routing, provider-specific auth requirements, prerequisites, and return fields. With an output schema available, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds meaning by explaining provider semantics ('apollo sequences, instantly campaigns') and auth constraints, though workspaceId details remain with the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('external provider's sequences'), with provider-specific meaning. It explicitly distinguishes itself from campaignstack_list_external_lead_lists and connects to campaignstack_add_lead_to_sequence, so an agent can tell exactly what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call it: when the user needs a real sequence id, not a name. It also names exclusions, related tools for email accounts and connection, and prerequisites like the Apollo MASTER key and connected integration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_guidance_versionsARead-onlyIdempotentInspect
Version history for one authored craft text: a campaign's guidance or offer addendum, a signal agent's script, or a workflow node's instructions. Each row is what the field said BEFORE a write, newest first, capped at the last 20 per target. Call this when the user asks what guidance used to say, or before reverting one. Pass a versionId to campaignstack_revert_guidance to put that text back. NOT the workspace playbook: campaignstack_list_playbook_versions / campaignstack_revert_playbook.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | Which text: campaign_guidance and offer_addendum are keyed by campaignId, agent_script by signal agent id, node_instructions by workflow node id. | |
| targetId | Yes | The campaign, signal agent or workflow node id. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| versions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description adds meaningful behavioral context beyond annotations: rows represent the field's value BEFORE a write, results are ordered newest first, and history is capped at the last 20 per target — a retention limit the agent should know before relying on it for recovery.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each with a distinct job: scope definition, row behavior, invocation trigger, and sibling exclusion. The most important information is front-loaded and there is zero filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 parameters, 1 enum, clear target family), an output schema covers return shape, and annotations cover safety, nothing essential is missing. Purpose, scope, ordering, retention cap, when to use, and how to proceed to revert are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 and the description does not need to compensate. It reinforces the target enum in prose ('campaign's guidance or offer addendum, a signal agent's script, or a workflow node's instructions') but adds little parameter meaning the schema descriptions do not already provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Version history for one authored craft text') and enumerates the exact scope of targets: campaign guidance, offer addendum, signal agent script, or workflow node instructions. It also distinguishes itself from the playbook version tools by name, so an agent can disambiguate without inspecting siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to invoke this tool ('when the user asks what guidance used to say, or before reverting one') and names the sibling alternatives it is NOT ('campaignstack_list_playbook_versions / campaignstack_revert_playbook'). It also chains to the downstream revert action, leaving 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_list_icpsARead-onlyIdempotentInspect
List all ICP (Ideal Customer Profile) definitions for a campaign. Returns ICP IDs with criteria summary including target titles, industries, seniorities, and score threshold. Call this when the user asks which ICPs a campaign has. Use the icpId with campaignstack_get_icp_scores for match results or campaignstack_trigger_icp_scoring to run scoring.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description doesn't need to restate safety. It adds value by detailing the returned summary fields (titles, industries, seniorities, score threshold), which is beyond the annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no fluff. The purpose is front-loaded, the trigger condition is clear, and the routing to related tools is concise. Every sentence contributes to usability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation, the description covers the core purpose, return content, and when to use it. An output schema exists (has output schema: true), so return structure is covered by that. Minor omissions like pagination are not critical for an ICP list. Overall, complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter, campaignId, with 0% schema description coverage. The description implies its use by saying 'for a campaign' but does not explicitly explain it. However, the parameter name and schema (minLength 1) make it self-evident, so the description adds little beyond the schema, which is acceptable for a single, obvious parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action: 'List all ICP (Ideal Customer Profile) definitions for a campaign' and describes the return content (ICP IDs with criteria summary including target titles, industries, seniorities, and score threshold). This distinguishes it from sibling tools like get_icp_scores and trigger_icp_scoring.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Call this when the user asks which ICPs a campaign has.' It also routes the user to related tools (get_icp_scores, trigger_icp_scoring) for subsequent actions, providing clear usage context and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_inbox_conversationsARead-onlyIdempotentInspect
List inbox conversations across all LinkedIn accounts in the workspace. Call this when the user asks what is in the inbox or who has replied. Returns up to 50 conversations sorted by most recent activity, with participant details, last message preview, read/unread status, and associated lead info. Each conversation includes a conversationRef { platform, id } used as the identifier for other inbox tools. Use unreadOnly: true to filter to unread threads only. Use identityFilter to restrict to specific LinkedIn account IDs (use campaignstack_list_accounts to find them). Use search to find threads by a person's name or by words in the message text (2 to 200 characters); matches come back newest first with a match snippet when a message matched, and unreadOnly is ignored. It returns previews only, not the full thread: use campaignstack_get_conversation for that.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | ||
| unreadOnly | No | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| identityFilter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint=true and idempotentHint=true, the description adds concrete behavior: max 50 results, recency sort, previews only, conversationRef shape, search snippet behavior, and unreadOnly semantics. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries operational information; the primary purpose is front-loaded and caveats are attached to the parameters they qualify. It is dense but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description addresses scope, limits, sort order, returned fields, identifier reuse, filtering, search quirks, and the correct sibling for full threads. With an output schema present, no essential call-time information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only documents workspaceId, but the description meaningfully explains search's 2–200 character and match behavior, unreadOnly's filtering effect, and identityFilter's role including how to discover account IDs. This fully compensates for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with a specific verb and resource: 'List inbox conversations across all LinkedIn accounts in the workspace,' immediately distinguishing it from conversation-scoped tools like campaignstack_get_conversation. It also specifies the returned entity set: participant details, last message preview, read/unread status, and associated lead info.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call when the user asks what is in the inbox or who replied, and names the sibling tool to use when full thread content is needed. It also explains when search behavior applies and when unreadOnly is ignored, leaving little ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_integrationsARead-onlyIdempotentInspect
List connected integrations for a workspace (apollo, instantly, clay, hubspot). Returns provider, connection status, and last-tested timestamp. Call this when the user asks what is connected, or before calling a provider-parameterized tool to confirm the integration exists. API keys and webhook secrets are never returned; only a boolean indicating they are set. It does not test the connection right now, the status is from the last attempt. Use campaignstack_connect_apollo, campaignstack_connect_instantly or campaignstack_connect_hubspot to add one.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds important behavior beyond the annotations: it never returns API keys or webhook secrets, only a boolean, and it does not test the connection live. This sets accurate expectations for a read-only, idempotent tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and return values, followed by concise usage guidance and caveats. Every sentence adds value without unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the read-only annotations, fully documented single parameter, and the presence of an output schema, the description covers purpose, use cases, limitations, and security behavior. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% coverage of the workspaceId parameter, including the distinction between user keys and workspace keys. The description adds no direct parameter semantics, which is acceptable given the schema covers it fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List connected integrations for a workspace' and explicitly names the providers (apollo, instantly, clay, hubspot). It also states exactly what is returned, distinguishing it from any other list tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: when the user asks what is connected, or before calling a provider-parameterized tool to confirm the integration exists. It also names the alternative connect tools, making the selection decision clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_invitationsARead-onlyIdempotentInspect
List invitations that have been sent and not yet accepted, with the email, the role offered and when it was sent. Call this when the user asks who has been invited, or after campaignstack_invite_member to confirm one is pending. Accepted invitations are gone from this list and the person is in campaignstack_list_members instead.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds useful lifecycle behavior beyond the schema: only sent-but-unaccepted invitations appear, and accepted invitations move to the members list, which helps the agent set correct expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences lead with the core behavior, then give concrete usage triggers, then clarify the boundary with list_members. No filler or redundant restatement of the schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter read-only listing tool with a detailed input schema, an output schema, and comprehensive annotations. The description covers when to call it, what it returns, and how it relates to sibling tools, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter workspaceId is already documented thoroughly in the schema, including the distinction between user keys and workspace keys and the role of campaignstack_whoami. The tool description adds no parameter meaning beyond the input schema, but with 100% schema coverage, no compensation is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'List invitations that have been sent and not yet accepted,' and it also states the fields returned (email, role, sent time). This clearly distinguishes it from related tools like campaignstack_list_members and campaignstack_invite_member.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit triggers: call when the user asks who has been invited, or after campaignstack_invite_member to confirm a pending invitation. It also tells the agent that accepted invitations are not in this list and are instead found via campaignstack_list_members, providing a clear routing boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_lead_listsARead-onlyIdempotentInspect
List all lead lists in a campaign with lead count per list. Returns type (set or query) and source for each list. Call this when the user asks what lists a campaign has, or to find a leadListId before calling campaignstack_get_lead_list or campaignstack_add_leads_to_list. It reports counts only, not who is in a list: campaignstack_get_lead_list with includeLeads does that. Use campaignstack_list_campaigns to find valid campaign IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so safety is covered. The description adds valuable behavior: it reports counts only and not who is in a list, and points to get_lead_list for inclusion details. This goes beyond annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: purpose first, usage conditions and alternatives second, and a pointer for parameter sourcing third. No fluff, front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present (as indicated by context), the description need not enumerate return fields. It covers purpose, usage, limitations, and parameter sourcing, making it fully adequate for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema only defines campaignId as a string with minLength 1. The description compensates by directing the agent to campaignstack_list_campaigns to find valid IDs, which adds meaning about parameter provenance. It doesn't describe format or constraints, but the pointer is useful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List all lead lists in a campaign with lead count per list.' It also specifies return details (type, source, counts) and explicitly contrasts with siblings like campaignstack_get_lead_list and campaignstack_add_leads_to_list, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Call this when the user asks what lists a campaign has, or to find a leadListId before calling...' It also names alternatives and the exact condition (includeLeads) for the other tool, plus directs to campaignstack_list_campaigns for ID retrieval. No inference needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_leads_at_nodeARead-onlyIdempotentInspect
List leads currently at a specific workflow node. Returns up to 100 leads with their name, headline, company, status, and timestamps. Entries with status 'cancelled' were terminated by the lead router (cancelReason: superseded_by_reply, superseded_by_newer, meeting_booked, stale_expired, workflow_disabled). Call this when the user asks who is at a node or wants failed entries to retry. It does not show a single lead's full path across nodes: campaignstack_get_lead_history does that. Use campaignstack_get_workflow_stats to identify nodes of interest.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint, idempotentHint, and destructiveHint annotations, the description reveals a 100-lead return cap, the exact returned fields, and the semantics of the 'cancelled' status with its specific cancelReason values. This explains important router behavior that is not visible in annotations or the parameter schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then proceeds through return details, status semantics, usage triggers, and sibling distinctions. Every sentence contributes distinct information without repetition or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given one parameter, robust annotations, and an output schema that already exists, the description covers the purpose, use triggers, return bounds, cancellation semantics, and related tools. Nothing essential is missing for an agent to decide when and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but the description clarifies that nodeId identifies a specific workflow node and points the agent to campaignstack_get_workflow_stats to discover nodes of interest. For a single string parameter with minLength 1, this provides enough semantic context to select an appropriate value, though it does not specify an ID format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'List leads currently at a specific workflow node.' It also differentiates from campaignstack_get_lead_history by explicitly stating this tool does not show a single lead's full path across nodes, giving the agent a clear way to distinguish it from nearby siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states when to call the tool ('when the user asks who is at a node or wants failed entries to retry') and names alternatives, including campaignstack_get_lead_history for full-path lookups and campaignstack_get_workflow_stats for identifying nodes of interest. This is explicit routing guidance, not just an implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_lead_signalsARead-onlyIdempotentInspect
List recent signals detected for a lead: job changes, engagement activity, and similar events. Signals are profile changes or engagement events that affect scoring. Sorted by detection time, newest first. Call this when the user asks what changed about a lead or why it moved in score recently. It lists the events only; for the scoring math itself use campaignstack_get_lead_score_breakdown.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| leadId | Yes | ||
| leadSource | No | global |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | No | |
| signals | No | |
| nextCursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds behavioral context beyond annotations: signals are defined as 'profile changes or engagement events that affect scoring,' and results are 'sorted by detection time, newest first.' It also clarifies scope by stating 'It lists the events only,' which prevents the agent from expecting scoring calculations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The first sentence states the action and examples, the second explains what signals are and the ordering, and the third gives usage guidance and the alternative tool. Front-loaded with the core action, then context, then routing. Each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with annotations covering safety and an output schema present, the description covers purpose, sorting, event types, and the key alternative. The cursor and leadSource parameters are not explained, but those are optional and likely self-evident from the schema enum and context. The description is adequate for correct invocation in most scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for parameter meaning. It implies the leadId parameter by saying 'for a lead' but does not explain limit, cursor, or leadSource semantics. The description adds only minimal context about the main parameter, leaving the agent to infer from parameter names and schema defaults. This is insufficient for 0% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifically states the tool lists recent signals for a lead, gives examples (job changes, engagement activity), and notes sorting order (newest first). It explicitly differentiates from the scoring breakdown tool by saying 'It lists the events only; for the scoring math itself use campaignstack_get_lead_score_breakdown.' This makes the purpose unmistakable and distinguishes 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Directly provides usage context: 'Call this when the user asks what changed about a lead or why it moved in score recently.' It also names the alternative tool for scoring math, which serves as a clear when-not-to-use signal. This is explicit, actionable guidance beyond mere capability description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_manual_exclusion_urlsARead-onlyIdempotentInspect
List the LinkedIn profile URLs stored in one manual exclusion entry. Call this when the user asks who is on a blocklist. For other exclusion types (filter rules, imported lists), use campaignstack_get_exclusions. Returns importedLeadId values usable with campaignstack_remove_manual_exclusion_url.
| Name | Required | Description | Default |
|---|---|---|---|
| exclusionId | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| urls | No | |
| exclusionId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds value by revealing the return behavior: 'Returns importedLeadId values usable with campaignstack_remove_manual_exclusion_url,' which informs the agent about the output format and its downstream use. No contradictions exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, with four short sentences that each carry essential information: purpose, usage trigger, sibling differentiation, and return value. It is front-loaded with the primary purpose and contains no fluff or redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list operation with two parameters and an output schema, the description covers purpose, usage, sibling routing, and the return value's linkage to a removal tool. It omits details like pagination or error handling, but the output schema likely covers the response structure, and the annotations cover safety. Minor gaps remain, but the description is largely sufficient for an agent to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description provides no information about the parameters (exclusionId and workspaceId). Schema description coverage is 50%: workspaceId has a detailed description, but exclusionId is undocumented in both schema and description. Since coverage is moderate and the description does not compensate for the missing parameter context, the tool definition offers minimal semantic help for input construction.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List the LinkedIn profile URLs stored in one manual exclusion entry.' It clearly differentiates from the sibling tool campaignstack_get_exclusions by specifying that other exclusion types (filter rules, imported lists) are handled there. This directly addresses the purpose and distinguishes it from alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Call this when the user asks who is on a blocklist.' Also provides an exclusion criterion: 'For other exclusion types (filter rules, imported lists), use campaignstack_get_exclusions.' This gives clear when/when-not guidance and names the alternative, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_membersARead-onlyIdempotentInspect
List the people in a workspace with their role (owner, admin or member), name and email. Call this when the user asks who is on the team, or to find the memberId that campaignstack_update_member_role and campaignstack_remove_member need. People who were invited but have not accepted are not members yet: campaignstack_list_invitations has those.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds meaningful behavior beyond annotations: only accepted members are included, role values are enumerated, and invited users are explicitly excluded and routed to another tool. This is useful context that helps the agent set expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no wasted words. The core purpose is first, then usage triggers, then an exclusion with a pointer to the right sibling. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with one well-documented parameter, rich annotations, and an output schema, the description is complete. It covers what the tool returns, when to use it, and the key edge case (pending invitations). Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the workspaceId parameter is already richly documented, including the distinction between user keys and workspace keys and guidance to campaignstack_whoami. The tool description adds no new parameter-level detail, so the schema carries the load. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'List the people in a workspace' with role, name, and email. It clearly distinguishes itself from campaignstack_list_invitations by explaining that unaccepted invites are not members. This makes the tool's purpose unmistakable and separable from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit trigger conditions: call when the user asks who is on the team, or when the agent needs a memberId for campaignstack_update_member_role or campaignstack_remove_member. It also names the alternative for invited-but-not-accepted people (campaignstack_list_invitations), providing clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_notificationsARead-onlyIdempotentInspect
List notifications for a workspace. Call this when the user asks what needs their attention. Returns paginated notifications most-recent first. Filter by type to see only specific notifications (e.g. pending_review, credits_exhausted, account_risk, reply_received). Use campaignstack_count_unread_notifications to get the unread badge count. Use campaignstack_mark_notification_read or campaignstack_mark_all_notifications_read to mark as read. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | ||
| limit | No | ||
| cursor | No | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly, idempotent, and non-destructive, but the description adds substantial behavioral context: notifications are returned 'most-recent first', they are paginated, and results are only one page at a time. The instruction to not present a partial page as the whole set and to page through before counting is critical agent-facing behavior not visible from annotations, adding real value 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose, use-case trigger, ordering, filtering, sibling routing, and pagination handling are all packed into a compact, front-loaded description. There is no filler or repetition of schema-provided information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only listing tool with an output schema, the description covers the essential context: when to invoke, how to filter, pagination behavior, and how to handle multi-page results. The workspaceId nuance is covered in the schema itself, and the output schema handles return values. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 25% (just workspaceId), so the description must compensate. It does add meaning for the `type` parameter by providing concrete examples ('pending_review, credits_exhausted, account_risk, reply_received') and implies `cursor` through the pagination instructions. However, it does not explicitly explain that `cursor` should be taken from a response field for the next page, nor does it clarify the purpose/effect of `limit` beyond the schema's default/max/min. Partial compensation leaves a gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List notifications for a workspace' and immediately gives the primary use case ('Call this when the user asks what needs their attention'). It distinguishes itself from sibling tools by explicitly naming count_unread and mark-as-read tools as alternatives, preventing confusion about when this tool applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to invoke this tool ('when the user asks what needs their attention'), and which siblings to use instead for related tasks ('Use campaignstack_count_unread_notifications to get the unread badge count', 'Use campaignstack_mark_notification_read... to mark as read'). It also gives specific pagination usage rules: 'When pagination reports more, say so rather than presenting the page as the whole set, and page through before counting anything.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_pending_reviewsARead-onlyIdempotentInspect
List pending workflow review actions requiring human approval. Returns entries with lead details (including leadLinkedInUrl), crafted content, aiReasoning, aiSources (which provided context the draft drew on, e.g. post, signal, experience, web; null for older drafts), conversationHistory (the prior thread with the lead, sender self/lead, null for cold opens), campaign/workflow context, and a reviewContext discriminated union: type "post_comment" includes commentText, postContent, postUrl, postAuthorName, postUnavailable (true when the post was deleted on LinkedIn) (when triggered by a post comment signal); type "campaign" for regular campaign workflow reviews; null when context cannot be determined. bookedMeeting (non-null when the calendar booking chain already booked a meeting from a link the lead sent) means the draft under review is that meeting's confirmation: the booking is done, rejecting the draft stops the message but never cancels the meeting. reviewTags marks priority items (e.g. meeting_booked); tagged entries are pinned at the top of the first page ahead of the FIFO queue - review them first. Call this when the user asks what is waiting for approval; for entries already decided, use campaignstack_get_lead_history instead. Use campaignstack_approve_review, campaignstack_reject_review, or campaignstack_edit_and_approve_review to act on entries. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| cursor | No | ||
| accountId | No | Scope to drafts sent by one identity (linkedinAccounts id, from campaignstack_list_accounts). A filtered page may hold fewer than `limit` items; keep paging by cursor. | |
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation read-only and idempotent; the description adds important non-obvious behavior: bookedMeeting drafts are confirmation messages where rejection never cancels a booked meeting, reviewTags pin priority items ahead of FIFO, and a single page may not represent the whole set. These are exactly the behaviors an agent needs to avoid misleading the user.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but structured: purpose first, then return-value semantics, then routing to sibling tools, then pagination caveat. Nearly every sentence carries operational value, though the extensive enumeration of returned fields partly overlaps with the existing output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex list operation with a discriminated union, meeting-booking side effects, and pagination, the description is highly complete. It tells the agent what to report to the user, which sibling to use for already-decided entries, and which follow-up tools can act on results, so nothing critical is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description focuses on return values and gives no guidance on limit, cursor, accountId, or workspaceId beyond what the schema already documents. With schema coverage at only 50%, the two undocumented pagination parameters are left unexplained; 'page through' hints at cursor use but does not explain how or when to pass it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'List pending workflow review actions requiring human approval.' It distinguishes itself from decided-entry lookups by directing those to campaignstack_get_lead_history and from mutation tools by naming approve/reject/edit-and-approve as actions to take.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to call ('when the user asks what is waiting for approval'), names the alternative for already-decided entries, and names the three sibling tools to act on results. It also gives concrete pagination behavior: report when more pages exist and page through before counting.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_personasARead-onlyIdempotentInspect
List all personas for a campaign: buyer archetypes with pain points, goals, and objections. Call this when the user asks who a campaign targets. Not the roadmap: campaignstack_list_phases covers that. Use campaignstack_list_campaigns for campaign IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds useful behavioral context by stating the output includes pain points, goals, and objections, which goes beyond the schema. It does not mention pagination or the empty-list case, but given the strong annotation coverage, this is a minor gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with a distinct job: state the operation and content, specify when to call it, and point to sibling tools for adjacent use cases. No filler, front-loaded with purpose, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with one parameter and an output schema, the description covers what it does, when to use it, the content of the returned personas, and how to obtain the required campaignId. An agent has everything it needs to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description bears the burden of explaining campaignId. It partially compensates by saying 'for a campaign' and directing users to campaignstack_list_campaigns for valid campaign IDs, giving actionable semantics beyond the raw string schema. It could be more explicit about the ID format, but the cross-reference to a sibling tool is enough for correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb-resource pair: 'List all personas for a campaign', and elaborates that personas are buyer archetypes with pain points, goals, and objections. It explicitly names the sibling tool campaignstack_list_phases as covering the roadmap, making the distinction obvious 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a direct when-to-use trigger: 'Call this when the user asks who a campaign targets.' It also provides exclusions and alternatives: 'Not the roadmap: campaignstack_list_phases covers that' and 'Use campaignstack_list_campaigns for campaign IDs.' This leaves no ambiguity about when to select this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_phasesARead-onlyIdempotentInspect
List all phases for a campaign, sorted by order: roadmap milestones with objectives and a phase type. Call this when the user asks about a campaign's roadmap. Not personas: campaignstack_list_personas is the buyer side. Use campaignstack_list_campaigns for campaign IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so safety is covered. The description adds behavioral context about the output content (objectives and phase type) and sorting order, which goes beyond the annotations. No contradiction; a 4 is appropriate because it adds useful but not exhaustive behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero fluff. The first sentence states the core function, the second gives usage context, and the third provides sibling differentiation. Everything earns its place and is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 detail return fields. It explains when to call, what to expect, and how to obtain the required parameter. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It mentions 'for a campaign' but doesn't elaborate on campaignId beyond the obvious. Since it's a single, self-explanatory parameter and the description points to how to get it (via campaignstack_list_campaigns), a 3 is fair—adequate but not richly detailed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list), resource (phases for a campaign), and the content (roadmap milestones with objectives and phase type). It also distinguishes from siblings by explicitly naming campaignstack_list_personas and campaignstack_list_campaigns, making it unambiguous which tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition: 'Call this when the user asks about a campaign's roadmap.' It also specifies what not to use ('Not personas') and points to the correct alternatives for personas and campaign IDs, providing clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_playbook_versionsARead-onlyIdempotentInspect
List playbook version snapshots for the workspace, newest first. Call this when the user asks to see the playbook's edit history. A snapshot is taken automatically before every playbook write (regeneration, manual edit, or restore). Each row has _id, createdAt, replacedBy, and the full playbook text. It does not restore anything: campaignstack_revert_playbook does that.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| versions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior, so the description does not need to repeat those. It adds useful behavioral context beyond the annotations: snapshots are taken automatically before every playbook write, and each row contains the full playbook text plus metadata.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the primary behavior and ordering. The following sentences each add distinct value: the usage trigger, the snapshot creation rule, the row contents, and the boundary with the revert tool. No sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only listing tool with one well-documented parameter, an output schema, and full annotation coverage, the description covers all necessary context: what is listed, why it exists, what rows contain, and what it does not do. The agent has enough to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter workspaceId is already fully described in the schema, including the distinction between user keys and workspace keys, so the description need not duplicate that. The description adds no additional parameter-level meaning, but none is needed given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('list'), the resource ('playbook version snapshots'), the scope ('for the workspace'), and the ordering ('newest first'). It also distinguishes itself from the related restore operation by explicitly naming campaignstack_revert_playbook as the tool that restores.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete trigger: call this when the user asks to see the playbook's edit history. It also provides an explicit exclusion—'It does not restore anything'—and points to the correct alternative tool, making the selection decision unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_search_topicsARead-onlyIdempotentInspect
List all active LinkedIn search-watch topics across campaigns in a workspace. Returns each enabled topic search automation with the topic ID and the campaign it belongs to. Call this when the user asks what topics are already being watched workspace-wide, or before creating a new search watch, since only one watch per topic can be active at a time. To get topics assigned to a specific campaign, use campaignstack_get_campaign_topics.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| topics | No | |
| totalCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, and non-destructive behavior. The description adds meaningful context beyond that: it filters to active/enabled topics, scopes results workspace-wide, and reveals the one-watch-per-topic constraint. This gives the agent behavioral expectations without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: first sentence defines scope, second defines output, third gives usage context and the sibling alternative. Every sentence earns its place with no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with one optional parameter, an output schema, and rich annotation coverage, the description is complete. It covers scope, filtering, output contents, a uniqueness constraint, and when to choose a sibling tool. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the workspaceId parameter already has detailed semantics explaining user keys vs workspace keys and how campaignstack_whoami reports key type. The description does not need to add parameter details; the schema carries the burden, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List') on a specific resource ('all active LinkedIn search-watch topics across campaigns in a workspace') and clarifies what is returned ('topic ID and the campaign it belongs to'). It also distinguishes itself from the sibling campaignstack_get_campaign_topics, so an agent can tell the two apart without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: call when the user asks what topics are watched workspace-wide, or before creating a new search watch because only one watch per topic can be active. It also names the alternative for campaign-specific needs: campaignstack_get_campaign_topics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_signal_agent_leadsARead-onlyIdempotentInspect
List leads a signal agent has found, newest first, with entry status. Call this when the user asks who a watcher has found. Read-only: use campaignstack_trigger_workflow to act on them.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| agentId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the description adds useful extra behavior: newest-first ordering, inclusion of entry status, and the read-only redirect. This goes beyond the annotation baseline without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact, front-loaded sentences say exactly what the tool does and when to choose it. There is no filler, repetition of schema details, or unnecessary context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter list tool with a strong annotation set and an output schema, the description covers the essential behavior, the user-intent trigger, and the read-only boundary. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needed to compensate by explaining agentId and limit. It only implies that a signal agent identifies the lead source and does not explain how limit behaves or how it relates to ordering/pagination. The parameter names and schema constraints help, but the narrative gap remains.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List'), the resource ('leads a signal agent has found'), and the result details ('newest first, with entry status'). It also maps to user language ('who a watcher has found'), which distinguishes it from the many sibling listing tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent when to call it ('when the user asks who a watcher has found') and what to use instead for acting on the results ('use campaignstack_trigger_workflow to act on them'). This provides both an inclusion and an exclusion condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_signal_agentsARead-onlyIdempotentInspect
List the signal agents (audience intelligence watchers) of a workspace: profiles, company feeds, groups or posts, with status and counters. Call this when the user asks what is being watched. Connection and message watchers are account maintenance and hidden unless includeAccountMaintenance is true; campaignstack_get_account_maintenance is their home.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| includeArchived | No | ||
| includeAccountMaintenance | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive. The description adds genuinely useful behavior beyond that: account-maintenance watchers are hidden by default, includeAccountMaintenance reveals them, and such watchers have a separate home. This contextualizes the filtering behavior without repeating 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, followed by a usage trigger and a caveat. Every sentence earns its place and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema available, return values need no explanation, and annotations cover safety. The description covers purpose, usage trigger, hidden-by-default behavior, and the alternative for account-maintenance watchers; only includeArchived is left underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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. It does explain includeAccountMaintenance's conditional hiding behavior, but includeArchived receives no semantic explanation in either the schema or the description; workspaceId is already well documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: list signal agents (audience intelligence watchers) of a workspace, and enumerates what they watch (profiles, company feeds, groups or posts) plus status and counters. It differentiates signal agents from account-maintenance watchers, but it does not explicitly distinguish this from sibling list tools such as campaignstack_list_signal_watches.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to call it: 'when the user asks what is being watched.' It also gives a clear exclusion and alternative by saying connection/message watchers are account maintenance and belong in campaignstack_get_account_maintenance unless includeAccountMaintenance is true.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_signal_watchesARead-onlyIdempotentInspect
List the workspace's lead signal watches with lead name, state (active/paused), why a paused watch is paused (user vs lead unreachable), last check and next check. Call this when the user asks which leads are being watched. It lists PERSON watches only: campaignstack_list_company_employee_watches covers company-level ones.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | all | |
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive behavior, so the description doesn't need to restate safety. It adds valuable behavioral context beyond annotations: the distinction between user-paused vs lead-unreachable pauses, the last/next check fields, and the PERSON-only scope. It doesn't cover edge cases like pagination or rate limits, but those are less critical for a read-only list with an 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler. The primary action and output are front-loaded, the usage trigger is second, and the sibling distinction closes it. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema and safety annotations, the description provides everything needed: what it lists, what fields are returned, when to use it, and which sibling handles company-level watches. No critical calling information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The workspaceId parameter is thoroughly described in the schema, including key-type behavior. The state parameter is represented by an enum with a default, so its filtering purpose is inferable, though the description never explicitly explains 'state' as a filter. The description's mention of 'state (active/paused)' in the output hints at the concept but doesn't fully compensate for the schema's missing prose on that parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb ('List') and resource ('lead signal watches'), and enumerates returned fields (lead name, state, pause reason, last/next check). It explicitly states it lists PERSON watches only and names the sibling that covers company-level watches, making it easy to distinguish from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit trigger: 'Call this when the user asks which leads are being watched.' It also gives a clear exclusion and alternative: 'It lists PERSON watches only: campaignstack_list_company_employee_watches covers company-level ones.' This fully routes an agent to the correct tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_split_optimization_logsARead-onlyIdempotentInspect
List the audit trail of split-node auto-optimizations for a workflow node or a whole workflow (most recent first). Each entry has old/new branch weights, per-branch success stats (positive exits vs total leads), killed branches, and a human-readable reasoning string. Call this when the user asks why a split node's weights changed, or to confirm a manual optimization took effect. Provide nodeId or workflowId. Use campaignstack_optimize_split_node to trigger an optimization manually rather than waiting for the daily cron.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| nodeId | No | ||
| workflowId | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds useful behavioral context: results are most-recent-first, entries include old/new weights, per-branch stats, killed branches, and reasoning strings. It also reveals the daily cron behavior, which helps the agent understand how optimizations get triggered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: action first, then return-value details, then trigger conditions, then the sibling alternative. Every sentence contributes useful information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is largely complete given the read-only annotations and output schema. One minor gap: it says 'Provide nodeId or workflowId' while the schema marks both as optional, leaving unclear what happens if neither is supplied. Otherwise, an agent has enough to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It names nodeId and workflowId and explains that one is used to scope to a node or whole workflow. The limit parameter is not mentioned, but its schema already provides default, min, and max, so that gap is minor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List the audit trail of split-node auto-optimizations.' It clearly distinguishes the tool from siblings like campaignstack_optimize_split_node and campaignstack_get_campaign_weights by specifying what the log contains and when it applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call the tool ('when the user asks why a split node's weights changed, or to confirm a manual optimization took effect') and names the alternative for triggering an optimization manually. This leaves no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_voice_experiment_resultsARead-onlyIdempotentInspect
Reply-rate numbers for the voice vs generic experiment: sends, replies, acceptance counts, reply rate with a 95% confidence interval per arm, the relative lift, and whether the lift thesis is validated at volume. Sliceable by channel, craft kind, and profile version. Call this when the user asks whether the voice profile is actually helping reply rates. It reports aggregate experiment stats only, never a per-lead outcome or message content.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | No | Slice by channel, e.g. linkedin | |
| craftKind | No | Slice by craft kind: note, message, comment, reply | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| profileVersion | No | Slice by voice profile version |
Output Schema
| Name | Required | Description |
|---|---|---|
| voice | No | |
| generic | No | |
| channels | No | |
| collecting | No | |
| craftKinds | No | |
| relativeLift | No | |
| profileVersions | No | |
| thesisValidated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true and idempotentHint=true, the safety profile is already clear in annotations. The description adds valuable context beyond that: results are aggregate experiment statistics only, never per-lead data or message content, which meaningfully shapes how an agent should use the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences lead with the headline metrics, then sliceability, then the trigger condition, then the key scope boundary. There is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure does not need to be spelled out. The description still names the full metric set, the slicing dimensions, the trigger use case, and the aggregate-only privacy boundary, making it complete for a read-only reporting tool with zero required parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains each slicable parameter (channel, craftKind, profileVersion) and workspaceId key semantics. The description's 'Sliceable by...' line adds only lightweight context and does not materially augment the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource and action: reply-rate numbers for the voice vs generic experiment, including sends, replies, acceptance counts, CI, lift, and validation status. This is a precise, distinctive purpose that separates it from generic metrics tools like get_campaign_metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call the tool: 'when the user asks whether the voice profile is actually helping reply rates.' It also clarifies what it is not for by saying it never reports per-lead outcomes or message content, though it does not name a sibling alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_voice_versionsARead-onlyIdempotentInspect
Version history for one language of a voice profile, newest first (last 20). Each row says when it was written, what replaced it (regen, manual_edit, revert) and which situations it covered; the exemplars are not returned, since they are the owner's own messages. Call this when the user asks how a voice profile has changed over time, or before reverting one. Pass a versionId to campaignstack_revert_voice; it does not return the current live profile, use campaignstack_get_conversation_voice for that.
| Name | Required | Description | Default |
|---|---|---|---|
| language | Yes | ISO 639-1 language of the profile. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| linkedinAccountId | Yes | LinkedIn account of the person whose voice it is. |
Output Schema
| Name | Required | Description |
|---|---|---|
| versions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint, and idempotentHint, so safety is covered. The description adds substantial behavioral context: it lists what each row contains (when written, replacement type, situations covered), states that exemplars are omitted, notes the 20-entry limit, and clarifies that it does not return the live profile. This goes well 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence contributes: it states the purpose, the content of rows, the exclusions, the usage context, and routing to related tools. It is front-loaded with the core function and flows logically, with no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 is complete for an agent to invoke correctly. It covers what is returned, what is not returned, the limit, the usage scenario, and how to route to related tools. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter (language, workspaceId, linkedinAccountId) already has a meaningful description. The tool description does not add any parameter-specific details beyond what the schema provides; it only reiterates context like 'one language' which is already in the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb (list), resource (version history of a voice profile), scope (one language), and ordering (newest first, last 20). It also distinguishes itself from related tools by noting it does not return the current live profile and points to campaignstack_get_conversation_voice for that, so an agent can differentiate 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is given: 'Call this when the user asks how a voice profile has changed over time, or before reverting one.' It also names the alternative tools and when to use them (e.g., campaignstack_get_conversation_voice for the live profile, campaignstack_revert_voice for reverting). No ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_list_webhook_templatesARead-onlyIdempotentInspect
List available webhook templates for integration:webhook nodes. Each template pre-configures URL, method, headers, and body for a specific service (Slack, Instantly, etc.). Call this when the user wants a workflow step wired to an external service and needs to know what config fields it expects; it creates nothing itself. Put the returned templateId and templateFields in the node config when you author an integration:webhook node with campaignstack_create_workflow or campaignstack_update_workflow. Templates with secretFields require the corresponding integration to be connected in workspace settings.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| templates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context beyond the annotations: it explicitly says the call creates nothing itself, reinforcing the readOnlyHint and idempotentHint. It also discloses that templates with secretFields require the corresponding integration to be connected, which is a prerequisite the agent would not know from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: purpose, usage trigger, downstream consumption, and a caveat. Each sentence earns its place, and the most important information appears first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only list tool with an output schema present, the description is complete. It explains why the agent would call it, what it returns, how to apply the results when creating/updating workflows, and an important prerequisite about secretFields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
This tool has zero parameters, so the schema leaves nothing undocumented. The description still adds value by explaining what returned values mean (templateId, templateFields, secretFields), which helps the agent use the output. Baseline for zero params is 4, and the description meets it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'List available webhook templates for integration:webhook nodes.' It then clarifies each template pre-configures URL, method, headers, and body for a specific service, which clearly distinguishes this from other list tools in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to call it: 'Call this when the user wants a workflow step wired to an external service and needs to know what config fields it expects.' It also states it creates nothing itself. It does not name an alternative tool or offer a when-not-to-use condition, so it falls just 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_list_workflowsARead-onlyIdempotentInspect
List workflows: one campaign's with campaignId, or every workflow in the workspace without it. Returns workflow IDs, names, status, enabled flag and node count; the workspace-wide form also returns campaignId and signalAgentId per row (either may be null), which is the only way to reach a workflow whose campaign was archived or one a signal agent owns. Call this when the user asks what workflows exist, or to find a workflowId before another call. Use the returned workflowId with campaignstack_get_workflow to inspect it, or campaignstack_trigger_workflow to run it.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | No | List only this campaign's workflows. Omit to list EVERY workflow in the workspace, including ones whose campaign was archived and ones a signal agent owns. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| result | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so no contradiction. The description adds valuable behavior beyond the annotations: the workspace-wide form returns additional fields, and it is the only way to reach workflows whose campaign was archived or that a signal agent owns. This is meaningful context for an agent deciding whether the workspace-wide call is necessary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with no filler: the first defines scope, the second covers return fields and an important edge case, the third gives usage guidance and routes to sibling tools. Every sentence earns its place and the key scoping distinction is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no required parameters, an output schema present, and an already rich input schema, this description is complete. It covers the two invocation modes, what is returned, the non-obvious limitation around archived/signal-agent workflows, when to call it, and how to continue with the returned workflowId.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 campaignId and workspaceId thoroughly, including the omit-to-list-all behavior and key-type rules. The description reinforces the campaignId omission behavior but does not add substantially new parameter-level semantics beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List workflows') and immediately differentiates two modes: scoped by campaignId or workspace-wide. It also names the downstream sibling tools (get_workflow, trigger_workflow), which clarifies what this tool is for relative to them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to call this tool: when the user asks what workflows exist, or to find a workflowId before another call. It also tells the agent what to do with the result (use with campaignstack_get_workflow or campaignstack_trigger_workflow). It does not spell out a 'when not to use' exclusion beyond implying that single-workflow inspection belongs to get_workflow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_mark_all_notifications_readAInspect
Mark all unread notifications in a workspace as read. Call this only when the user asks to clear the whole list, not just one item. Large backlogs clear asynchronously; the badge drops immediately. For a single notification, use campaignstack_mark_notification_read instead.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation is expected. The description adds useful behavioral context beyond annotations: large backlogs clear asynchronously while the badge drops immediately. This is valuable but does not fully disclose all side effects, such as reversibility or 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each earning its place: purpose, usage condition, async behavior, and sibling alternative. The key scoping constraint is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity tool with one optional parameter, an output schema, and safety annotations, the description covers what it does, when to use it, how to distinguish it from the sibling, and the key async behavior. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage and thoroughly explains workspaceId, including the difference between user keys (csu_) and workspace keys (cs_) and how to resolve ambiguity via campaignstack_whoami. The description itself adds no parameter-level detail, so the high schema coverage earns the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Mark all unread notifications in a workspace as read.' It clearly distinguishes this from the single-notification sibling by stating 'not just one item,' so an agent can tell which tool applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to call this 'only when the user asks to clear the whole list' and directs the agent to campaignstack_mark_notification_read for a single notification. This is clear when-to-use and when-not-to-use guidance with 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_mark_conversation_readAInspect
Mark a conversation as read. Call this when the user says to dismiss a thread's unread state. Clears the unread flag and decrements the account's unread counter. No-ops if already read. It does not send anything: campaignstack_send_message does that.
| Name | Required | Description | Default |
|---|---|---|---|
| conversationRef | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses concrete side effects: clears the unread flag, decrements the account's unread counter, and no-ops if already read. It also clarifies a likely misconception by stating it does not send anything. This aligns with the annotations: readOnlyHint is false and destructiveHint is false, so mutation of unread state is consistent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core action, and each sentence is useful. It covers trigger, behavior, idempotent no-op, and non-send clarification without excess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with an output schema and clear annotations, the description is complete. It covers the trigger, effects, no-op behavior, and the key distinction from send_message, leaving no major operational gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for undocumented parameters. It does not explain how to construct conversationRef, where the id comes from, or how platform relates to the conversation. The word 'conversation' adds some semantic context, but not enough to make parameter usage clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Mark a conversation as read.' It also distinguishes itself from campaignstack_send_message by explicitly stating it does not send anything, which is important among the sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: 'Call this when the user says to dismiss a thread's unread state.' It also provides a when-not-to-use signal: 'It does not send anything: campaignstack_send_message does that.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_mark_notification_readAInspect
Mark a single notification as read. Call this when the user says to dismiss one specific notification. Use campaignstack_list_notifications to find notificationId values. To mark all at once, use campaignstack_mark_all_notifications_read instead.
| Name | Required | Description | Default |
|---|---|---|---|
| notificationId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already convey non-read-only, non-idempotent, non-destructive traits, so the description does not need to restate them. It adds useful scoping ('single notification') and the list_notifications prerequisite, but does not disclose any deeper side effects or permission requirements. This is acceptable for such a simple mutation but adds only modest 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: the action, the trigger context, the lookup method, and the alternative for bulk marking. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter mutation with an output schema and annotations already present, the description covers the action, when to invoke it, how to obtain the identifier, and how it differs from the sibling tool. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by explaining exactly where notificationId comes from: campaignstack_list_notifications. It does not need to explain the parameter name further since 'notificationId' is self-descriptive. This is sufficient for a single-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Mark a single notification as read.' It also explicitly distinguishes this tool from campaignstack_mark_all_notifications_read, making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit trigger condition ('when the user says to dismiss one specific notification'), names the sibling for bulk marking, and tells the agent how to find valid notificationId values via campaignstack_list_notifications. This is excellent routing guidance.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| voice | No | How this person writes: sentence length, formality, punctuation habits, phrases they reuse. Describe, never instruct. | |
| firstIcp | No | A first ideal customer profile. At least one list is required for it to be written. | |
| whatWeSell | No | What the company sells, in one or two plain sentences. Facts only. | |
| companyName | No | The company the user works for. | |
| workspaceId | No | Defaults to the workspace the extension set up for this key, or the key's workspace. | |
| whyWeBuiltIt | No | Why the company exists: the specific thing the founder saw that made it worth building. Omit unless it is concrete and checkable. |
Output Schema
| Name | Required | Description |
|---|---|---|
| next | No | |
| note | No | |
| state | No | |
| written | No |
TDQS
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.
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.
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.
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.
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.
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_optimize_split_nodeAInspect
Run split-node auto-optimization immediately for a flow:split workflow node, instead of waiting for the daily cron. Re-weights branches via Thompson Sampling on downstream positive exits (replies, acceptances, meetings) and may kill severe underperformers (weight 0). Call this to re-balance a split test now instead of waiting for the nightly run. Skips (with an explanatory status) when any branch is below the node's minimum lead volume or the weight change is insignificant. It only reweights existing branches: campaignstack_update_workflow_node changes the graph itself. Use campaignstack_get_workflow_stats to find split node IDs, and campaignstack_list_split_optimization_logs to inspect past optimizations.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodeId | No | |
| status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description reveals the algorithm (Thompson Sampling), success signals (replies, acceptances, meetings), the possible extreme action (killing underperformers with weight 0), and skip conditions (low volume or insignificant change). It also clarifies the tool only reweights existing branches, so an agent understands it won't alter graph structure. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Most sentences carry unique operational value, and the most important purpose/use-case is front-loaded. There is minor redundancy between 'instead of waiting for the daily cron' and 'instead of waiting for the nightly run', but the overall length is justified by the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter mutation tool, the description covers the action, mechanism, skip behavior, scope, related tools, and where to obtain the required ID. Since the tool has an output schema, not detailing return values is acceptable. No significant operational gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only defines nodeId as a non-empty string, so the description must compensate. It does by saying split node IDs come from campaignstack_get_workflow_stats and by repeatedly framing the parameter as identifying the split node to optimize. It doesn't give a full definition or format, but enough for an agent to source the value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a concrete verb ('Run'), a precise resource ('split-node auto-optimization for a flow:split workflow node'), and the timing benefit over the daily cron. It also contrasts with campaignstack_update_workflow_node, so an agent can tell exactly what this tool does vs. graph-editing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call ('to re-balance a split test now instead of waiting for the nightly run'), states when it skips, and names the sibling that does graph changes. It also points to campaignstack_get_workflow_stats for IDs and campaignstack_list_split_optimization_logs for history, leaving no ambiguity about prerequisites or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_pause_company_employee_watchAIdempotentInspect
Pause a company employee watch: weekly re-reads stop, the record stays. Call this when the user names the watched company and says to stop it for now. Resume with campaignstack_resume_company_employee_watch; to remove it entirely, use campaignstack_remove_company_employee_watch instead.
| Name | Required | Description | Default |
|---|---|---|---|
| watchId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| watchId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as idempotent and non-destructive, and the description adds useful behavioral context: weekly re-reads stop while the record remains, and removal is handled separately. This goes beyond the annotations by explaining the lifecycle effect of pausing, though it does not detail return behavior or authorization requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the first states the core behavior, the second gives the trigger condition, and the third routes to related operations. The most decision-relevant information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, non-destructive pause operation, the description provides the trigger, effect, persistence of the record, and explicit sibling routing. The output schema is already available, annotations cover idempotence and destructiveness, and workspaceId is documented in the schema, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers workspaceId well, explaining when it is required and when it is ignored based on key type. However, watchId has no schema description and the tool description does not explicitly explain that watchId identifies the watch being paused. The parameter is inferable from context and the tool name, but the description adds little direct parameter-level meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Pause a company employee watch' and immediately clarifies the operational effect ('weekly re-reads stop, the record stays'). It also distinguishes itself from the sibling operations by explicitly naming resume and remove variants, so an agent can tell them apart without inspecting other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete trigger condition: 'Call this when the user names the watched company and says to stop it for now.' It also states when to use the alternatives: resume for continuing, remove for deleting entirely. This is explicit, unambiguous usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_pause_competitor_watchAInspect
Pauses a competitor watch and disables its associated automations. Use campaignstack_resume_competitor_watch to resume monitoring. Call this when the user wants tracking stopped for now but kept for later. Use campaignstack_delete_competitor_watch instead when they want it removed for good.
| Name | Required | Description | Default |
|---|---|---|---|
| watchId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| watchId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say the operation is not read-only, not idempotent, and not destructive. The description adds meaningful behavioral context by disclosing that automations are disabled as part of the pause and that the watch can be resumed later. It does not detail every side effect, but the core state change is clearly communicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the operation, the resume counterpart, and the delete alternative. The action is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter operation with an output schema present, the description covers what the tool does, its side effect, when to use it, and how it relates to siblings. The only notable gap is the lack of explicit guidance on obtaining or formatting watchId, but the tool remains callable for a well-informed agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description does not explain the watchId parameter beyond the tool's general purpose. There is no mention of where the ID comes from, its format, or that it identifies the specific competitor watch to pause. A single self-named parameter lowers the risk, but the description still does not compensate for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('Pauses a competitor watch') and adds a key side effect ('disables its associated automations'). It also explicitly distinguishes itself from sibling tools resume_competitor_watch and delete_competitor_watch, so an agent can select it without confusion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit when-to-use condition ('when the user wants tracking stopped for now but kept for later') and names the exact alternatives for the other two cases: resume for later and delete for permanent removal. This is exemplary routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_pause_signal_agentAInspect
Pause a signal agent, stopping feed polling and workflow execution; data is preserved. Call this when the user names a watcher and says to pause it: it stops work the workspace expects. Freezes leads in the workflow rather than cancelling them. Not permanent: campaignstack_resume_signal_agent undoes it.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| agentId | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: it discloses that feed polling and workflow execution stop, data is preserved, leads are frozen rather than canceled, and the action is reversible via resume. Annotations only say non-read-only and non-destructive, so this description adds valuable 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences front-load the core action and effects, then cover reversibility. Every sentence adds useful information with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Simple single-parameter tool with an output schema; the description covers effect, side effects, data preservation, and reversibility. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has only agentId with no description, and schema description coverage is 0%. The description implies that agentId identifies the signal agent the user refers to, but it never explicitly maps 'the watcher' to the required agentId parameter or explains how to obtain it. Enough for a single obvious parameter, but not fully compensatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Pause a signal agent, stopping feed polling and workflow execution.' It also clarifies what is not happening ('data is preserved', 'Freezes leads... rather than cancelling them'), distinguishing it from delete/archive tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to call it: 'Call this when the user names a watcher and says to pause it.' It also mentions the inverse tool, campaignstack_resume_signal_agent, which gives the agent recovery context. However, it does not explicitly contrast with sibling pause_signal_watch / pause_competitor_watch / pause_company_employee_watch tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_pause_signal_watchAInspect
Pause a lead signal watch: the daily refresh stops, the record and its history stay. Call this when the user names a watched lead and says to stop watching them for now. Resume with campaignstack_resume_signal_watch; to remove it entirely, use campaignstack_remove_signal_watch.
| Name | Required | Description | Default |
|---|---|---|---|
| watchId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| watchId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal mutation (readOnlyHint=false) and non-destructiveness (destructiveHint=false). The description adds valuable specifics: the daily refresh stops, while the record and history are retained differences. It also implies reversibility by mentioning resume. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero fluff. The core action and effect are front-loaded, followed by usage guidance and explicit alternatives. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple pause operation, the description covers the key behavioral outcome news, usage context, and routes to the correct sibling tools. The presence of an output schema removes the need to describe return values. A slight gap is the lack of any note about required state (e.g., watch must be active), but this is minor given the clarity elsewhere.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides a thorough description for workspaceId, but watchId has no description beyond minLength. The tool description does not add meaning for watchId, and schema coverage is 50%, which is at the borderline where the description should compensate but does not. However, the parameter names and the tool's context make watchId's purpose fairly unambiguous, so a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Pause a lead signal watch', and immediately specifies the effect ('the daily refresh stops, the record and its history stay'). It also distinguishes itself from the siblings by naming resume and remove, so an agent can immediately understand what this tool does and what it does not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the trigger condition: 'Call this when the user names a watched lead and says to stop watching them for now.' It also names the alternatives (resume, remove) and the conditions that select them, leaving no ambiguity about when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_preview_craft_promptARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | The lead to render the prompt for. Different leads produce different prompts. | |
| nodeId | Yes | A craft node: ai:craft_note, ai:craft_message, ai:craft_comment, ai:reply_conversation, ai:craft_email, or a send node in its AI mode. | |
| include | No | What to return. Default: index and user. The system prompt runs to thousands of characters, so ask for it when you are going to read it. | |
| leadSource | No | Which lead table the id is in. Default: global. | |
| workflowId | Yes | The workflow the node belongs to. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| chars | No | |
| index | No | |
| caller | No | |
| nodeType | No | |
| userPrompt | No | |
| systemPrompt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial context beyond them: it runs the real craft path and stops before the model call ('same bytes the model would read'), and enumerates side-effect non-occurrences ('Writes no audit row, records no AI usage, assigns no voice experiment arm, fetches no web context, and costs nothing'). No contradiction with annotations; this is exemplary full-burden disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and when-to-use; dense but every sentence earns its place (behavioral guarantee, index semantics, side-effect clarity, sibling pointer). Slightly long with the multi-clause 'writes no... records no... assigns no... fetches no... costs nothing' enumeration, but that adds safety-relevant information rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (so return values need no description), rich annotations, and 100% parameter coverage, the description covers what's needed to call correctly: purpose, use cases, behavioral boundary, and default include behavior. The only minor gap is not spelling out the leadSource/workspaceId key nuance, but that's fully in the schema. Essentially complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds genuine value for the include parameter by explaining what 'index' returns — the named blocks with character offsets and sizes 'which is how you find out WHICH piece of configuration produces a phrase you do not want' — and why system is excluded by default (thousands of characters). This clarifies decision-making that the bare enum list does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+constraint: 'Render the exact prompt a craft node would send for one lead, without sending it.' This immediately distinguishes it from the craft_* siblings that actually send, and from explain_draft/preview-like alternatives. The 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use triggers: 'when the user asks to see what a draft would look like, or to debug why a node's wording keeps going wrong.' It names a complementary sibling (campaignstack_get_craft_config_tree) for tracing block provenance. It does not explicitly phrase a when-not-to-use, though 'without sending it' and preview framing imply the send case belongs to the craft_* tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_priority_enrichAInspect
Enrich up to 50 specific LinkedIn profile slugs immediately, ahead of the normal queue. Call this when you already have exact slugs and need them ready now, for example before scoring or drafting a small set of leads. For a page of search results with only partial data, use campaignstack_queue_leads instead. Use campaignstack_get_enrichment_status to monitor progress.
| Name | Required | Description | Default |
|---|---|---|---|
| slugs | Yes | ||
| platform | No | ||
| accountId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| queued | No | |
| upgraded | No | |
| alreadyProcessing | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all neutral-false (readOnly=false, destructive=false, idempotent=false), so the description carries the disclosure burden. It adds genuine behavioral context: prioritized execution ('ahead of the normal queue'), immediacy, and async completion implied by the instruction to monitor via campaignstack_get_enrichment_status. It does not mention credit/cost consumption or behavior on invalid slugs, but the disclosed traits go beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the core action with limits, the when-to-call condition with an example, and routing to two sibling tools. The main function is front-loaded in sentence one with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the full decision flow: what the tool does, when to invoke it, which sibling to use instead, and how to monitor progress. The output schema documents return values, so that burden is lifted. The only material gap is the undocumented required accountId parameter, which an agent would have to guess at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% (workspaceId only). The description partially compensates by clarifying that slugs are 'specific LinkedIn profile slugs' with a cap matching maxItems=50 and by confirming the LinkedIn platform. However, accountId—a required parameter—is left unexplained in both the description and the schema, so the compensation is incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (enrich), resource (LinkedIn profile slugs), and scope (up to 50, immediately, ahead of the normal queue). The description names sibling tools campaignstack_queue_leads and campaignstack_get_enrichment_status, giving an agent enough to distinguish this tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions ('already have exact slugs and need them ready now'), a concrete example scenario (before scoring or drafting leads), and an explicit exclusion with an alternative ('For a page of search results with only partial data, use campaignstack_queue_leads instead'). Also routes to a monitoring tool. 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_propose_playbook_changeAInspect
Ask the playbook assistant for a change to the workspace's craft data (playbook sections, outreach intent details, offer context) and get a proposal back. Call this when the user describes how they want the workspace's writing to change, e.g. 'sound less corporate' or 'stop mentioning pricing in openers'. This tool NEVER writes: it returns an assistant message and, when a change fits, a proposalId whose current/proposed text you read with campaignstack_get_playbook_proposal and apply with campaignstack_decide_playbook_proposal. A question gets an answer and no proposal. A new proposal replaces the workspace's pending one. Runs an LLM call.
| Name | Required | Description | Default |
|---|---|---|---|
| request | Yes | What should change about how the workspace writes, in plain words, e.g. 'stop mentioning pricing in openers' or 'sound less corporate' | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| proposalId | No | |
| assistantMessage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses several behavioral traits beyond the annotations: it never writes (despite readOnlyHint=false), it returns an assistant message and optionally a proposalId, a new proposal replaces the pending one, and it runs an LLM call. This is rich behavioral context that helps the agent set expectations and avoid assuming writes. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately long but every sentence carries information. It front-loads the main purpose and uses clear structure with the flow (get → decide). It could be slightly trimmed without losing meaning, but it is well-organized and not redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (a propose step in a multi-step workflow with get/decide), the description is complete: it explains the return value (assistant message and optional proposalId), the replacement behavior, and the never-writes guarantee. The output schema exists, so return details are not over-explained. An agent has all necessary context to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters, so the baseline is 3. The description adds valuable context beyond the schema: it explains when workspaceId is required (for user keys) vs ignored (for workspace keys) and points to whoami for key identification. This exceeds the schema's own descriptions, so a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: it asks the playbook assistant for a change to craft data and returns a proposal. It gives concrete examples ('sound less corporate', 'stop mentioning pricing in openers') and differentiates from siblings by naming get_playbook_proposal and decide_playbook_proposal, so an agent can immediately tell what this tool does and what it doesn't.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to call it ('when the user describes how they want the workspace's writing to change') and provides an example. It also explains the workflow: read with get, apply with decide, and notes that a question yields an answer without a proposal, which prevents misuse. It is clear about when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_queue_leadsAInspect
Add LinkedIn profiles read off a search results page to the enrichment pipeline at normal priority. Call this when a search step just returned a page of partial LinkedIn profiles to enrich. Each result is validated and deduped by profile slug; invalid URLs are skipped rather than failing the batch. It does not jump the queue: campaignstack_priority_enrich does that for slugs you already have. platform defaults to 'linkedin'.
| Name | Required | Description | Default |
|---|---|---|---|
| results | Yes | ||
| platform | No | ||
| accountId | Yes | ||
| campaignId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| errors | No | |
| failed | No | |
| succeeded | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses several behaviors beyond the annotations: 'Each result is validated and deduped by profile slug; invalid URLs are skipped rather than failing the batch.' It also notes the queue behavior and the platform default. This adds concrete behavioral context that annotations alone (readOnlyHint: false, etc.) do not convey. It explains what the tool does with inputs and what it does not do, making it highly transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each with a distinct purpose: first states the action and input, second gives the usage trigger, third explains the exclusion and default. There is zero redundancy, and the most critical information is front-loaded. It is appropriately concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has multiple required parameters and an output schema, so the description doesn't need to explain return values. It covers the main trigger condition, the distinction from a sibling, and key behaviors (validation, dedup, skipping). It doesn't mention the max 100 results, but that is in the schema. It could mention whether the tool requires prior search results, but that is implied. Overall it is complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20%, so the description must compensate. It does give some context: it implies the 'results' parameter contains LinkedIn profiles from a search page, and notes 'platform defaults to linkedin' (matching the schema const). However, it does not elaborate on accountId, campaignId, or workspaceId beyond the schema's minimal descriptions. While the description helps understand the 'results' parameter, it leaves the identifier parameters unexplained, which is a gap given the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Add LinkedIn profiles read off a search results page to the enrichment pipeline at normal priority.' It clearly states the action, the source, and the priority level, and distinguishes itself from campaignstack_priority_enrich by naming the alternative and its different purpose. This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to call: 'Call this when a search step just returned a page of partial LinkedIn profiles to enrich.' It also gives a clear exclusion: 'It does not jump the queue: campaignstack_priority_enrich does that for slugs you already have.' This tells the agent exactly when to use this tool versus the sibling, which is ideal usage guidance.
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_conversation for that.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| errors | No | |
| skipped | No | |
| refreshed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false, etc.), the description adds the 20-second freshness dedup window, the return object shape ({ refreshed, skipped, errors }), and clarifies it does not fetch older thread history. These are behavioral details not present in annotations and are valuable for the agent to anticipate side effects and results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each earning its place: purpose, usage trigger, dedup/return behavior, and exclusions with pointer. It is front-loaded with the primary action, and there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter, full schema coverage, an output schema, and relevant annotations, the description covers the purpose, trigger, dedup window, return format, and boundary of responsibility. It even routes to the correct sibling for related functionality. No critical information 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers workspaceId fully (when required, key types, and how omitted), so schema coverage is 100%. The description does not add any parameter-specific details, but the baseline is 3 when the schema already carries the semantic load. It neither adds nor detracts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('poll'), resource ('connected LinkedIn accounts'), and action ('for new messages now'). It clearly distinguishes itself from the sibling by stating it refreshes the inbox and explicitly naming what it does not do (fetch thread history) and which sibling to use instead. An agent can immediately understand the tool's unique role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger condition: 'Call this when the user wants the inbox brought up to date before you read it.' It also names the alternative (campaignstack_get_conversation) and states when not to use it ('does not fetch one thread's older history'). This is exactly the kind of when/when-not guidance expected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_regenerate_playbookAInspect
Trigger AI regeneration of the workspace playbook based on current campaigns, ICPs, personas, and company context. Call this when the user asks to refresh a stale playbook. An existing playbook is UPDATED, not discarded: user-authored passages are preserved verbatim and the previous version is snapshotted to history (campaignstack_list_playbook_versions / campaignstack_revert_playbook). An existing hand-edited offerContext is never overwritten. NOT idempotent, may take several seconds. It does not take new instructions: for a specific rewording, use campaignstack_update_workspace instead.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| regenerated | No | |
| workspaceId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate readOnly=false, idempotent=false, and destructive=false. The description adds critical behavioral context: user-authored passages are preserved verbatim, the previous version is snapshotted to history, hand-edited offerContext is never overwritten, and the operation is NOT idempotent and may take several seconds. This goes well beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: trigger, behavior, preservation guarantees, non-idempotence, duration, and sibling routing. It is front-loaded with the core action and then adds caveats.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with a single workspaceId and an output schema available, the description covers all necessary operational context: when to use it, what it updates vs preserves, that it is non-idempotent and slow, and which tool to use for rewordings. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents workspaceId, including the distinction between user keys and workspace keys and the pointer to campaignstack_whoami. Since schema coverage is 100%, the description does not need to add parameter detail, but it also provides no additional parameter-level semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource: 'Trigger AI regeneration of the workspace playbook' and grounds it in current campaigns, ICPs, personas, and company context. It also distinguishes itself from siblings by explicitly saying an existing playbook is UPDATED, not discarded.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call it: 'Call this when the user asks to refresh a stale playbook.' It also gives an exclusion and an alternative: 'It does not take new instructions: for a specific rewording, use campaignstack_update_workspace instead.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_reject_content_postAInspect
Rejects a pending_approval content post back to draft with a reason. Call this when the user asks to send a submitted post back for changes instead of approving it. Increments the revision count (max 10). Edit with campaignstack_update_content_post, then resubmit. It does not delete the post: use campaignstack_delete_content_post for that.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | Yes | ||
| contentPostId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| scheduledAt | No | |
| contentPostId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (all hints false), so the description carries the burden of behavioral disclosure. It adds valuable specifics: increments revision count (max 10), does not delete the post, and implies the workflow of edit/resubmit. It does not cover failure modes or authorization, but the revision cap and non-deletion are meaningful beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: action, usage trigger, side effect, and sibling differentiation. The most important information is front-loaded, with no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-string-parameter tool with an output schema, the description fully covers the state change, the key constraint (revision max 10), and the relationship to neighboring tools. It is complete enough for an agent to invoke it correctly without additional context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It mentions 'with a reason' which maps to the reason parameter, but does not explain the contentPostId parameter at all. The agent must infer contentPostId from context and the tool name, which is insufficient given no schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Rejects a pending_approval content post back to draft'), identifies the resource (content post), and the state transition (pending_approval to draft). It also distinguishes itself from siblings by explicitly saying it does not delete the post and naming the delete/update tools, making it unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Call this when the user asks to send a submitted post back for changes instead of approving it.' It also names alternatives with specific conditions: edit via campaignstack_update_content_post then resubmit, and use campaignstack_delete_content_post for deletion. This leaves no ambiguity about when to choose this tool over related ones.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_reject_draft_checkupAInspect
Reject the pending draft checkup without applying anything. Call this when the user has read the proposal and does not want the change. Two consecutive rejections pause automatic checkups for 30 days (manual runs via campaignstack_run_draft_checkup stay available).
| Name | Required | Description | Default |
|---|---|---|---|
| checkupId | Yes | Pending checkup id from campaignstack_get_draft_checkup | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| decision | No | |
| checkupId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a non-obvious side effect—two consecutive rejections pause automatic checkups for 30 days—which is not present in the annotations. It also clarifies that the tool performs no application of changes, adding behavioral context beyond the existing structured hints. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff. The main action is front-loaded first, followed by usage context and a key side effect. Every sentence earns its place, and the structure is optimal for quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple interface (one required parameter) and the existence of an output schema, the description covers the action, when to invoke it, and the behavioral consequence. It also points to a manual alternative, making the tool fully self-contained for an agent to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides full coverage (100%) with descriptive fields (checkupId references the source, workspaceId explains user vs. workspace keys). The tool description adds no additional parameter-specific meaning, but since schema coverage is high, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the action ('Reject the pending draft checkup') and explicitly states it does not apply changes. It is distinct from the sibling accept tool and the run tool. The verb and resource are specific, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit when-to-use condition ('Call this when the user has read the proposal and does not want the change') and contrasts with the manual-run alternative (campaignstack_run_draft_checkup), including a notable side effect (pause after two consecutive rejections). This is clear guidance that helps an agent decide between this and related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_reject_reviewAInspect
Reject a drafted touch so it is never sent. The lead takes the workflow's rejected path instead, which usually ends their journey, and the draft is kept for the record. Call this when the user has read the draft and says no to it. To keep the lead moving with different wording, use campaignstack_edit_and_approve_review or campaignstack_retry_review instead: rejecting is the decision not to contact this person here.
| Name | Required | Description | Default |
|---|---|---|---|
| entryId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| entryId | No | |
| success | No | |
| decision | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations do not describe effects, so the description carries the behavioral burden. It discloses that the touch is never sent, the lead takes the rejected path, that usually ends the journey, and the draft is kept for the record. It does not address reversibility, but the core behavioral profile is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: action and consequence first, then the call condition, then alternatives. Every sentence adds decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool does, its consequences, when to call it, and which siblings to prefer, and an output schema exists so return values need no explanation. The only meaningful gap is the unexplained entryId parameter, keeping it just short of fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: workspaceId is well explained, but entryId has no schema description and the tool description provides no parameter-level guidance. An agent must infer that entryId identifies the drafted touch, which is weak for a required parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action and resource: reject a drafted touch so it is never sent. It clearly distinguishes this tool from siblings like campaignstack_edit_and_approve_review and campaignstack_retry_review, so an agent can tell them apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: 'Call this when the user has read the draft and says no to it.' It also names the alternatives for the case where the user wants different wording, and explains that rejecting means the decision not to contact this person at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_remove_company_employee_watchADestructiveInspect
Remove a company employee watch (archives it, one-way; the company, its employees and their signals are untouched). Call this only when the user names the watched company and says to stop watching it for good. To stop temporarily, use campaignstack_pause_company_employee_watch instead.
| Name | Required | Description | Default |
|---|---|---|---|
| watchId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| removed | No | |
| watchId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructiveHint=true, but the description adds valuable context beyond that: the watch is archived, the operation is one-way/irreversible, and no other data is affected. This meaningfully explains what the destructive action 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences front-load the behavioral meaning, then give the usage condition and the alternative. Every clause earns its place with no wasted wording.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the destructive one-way nature and moderate complexity, the description covers when to use it, what it does, and the main alternative. The output schema covers return expectations, and the main remaining gap is the under-documented watchId, but the overall context is sufficient for a competent agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, and the description does not compensate for the undocumented watchId parameter. The workspaceId is well described in the schema, but watchId, the central resource reference, receives no semantic explanation in either place beyond its name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb-resource pair ('Remove a company employee watch') and immediately clarifies the precise semantics: it archives the watch one-way while leaving the company, employees, and signals untouched. This clearly distinguishes it from pause/resume siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States exactly when to call it ('only when the user names the watched company and says to stop watching it for good') and names the explicit alternative for temporary stops (campaignstack_pause_company_employee_watch). An agent can confidently route between the two.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_remove_lead_listADestructiveInspect
Delete a lead list. This cannot be undone, and a workflow drawing its leads from that list has nothing to draw from afterwards. The leads themselves are not deleted; they stay in the workspace and in any other list. Call this only when the user names the list and says to delete it. To take individual people out, use campaignstack_remove_leads_from_list. Use campaignstack_list_lead_lists to find lead list IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| leadListId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | No | |
| leadListId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so destruction is known. The description adds valuable context beyond annotations: the operation cannot be undone, workflows depending on the list will have nothing to draw from, and the leads themselves are preserved in the workspace and other lists. This meaningfully enriches the behavioral model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly packed with high-value information in five short sentences. It front-loads the core operation, then proceeds through irreversible consequences, non-destruction of leads, and explicit usage/alternative guidance. No sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive one-parameter tool, the description covers the essential context: what is deleted, what happens to related workflows, what is not deleted, when to call it, and how to obtain the required ID. The output schema fills in return-value details, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and leadListId has only type/minLength, no semantic explanation. The description compensates by telling the agent to use campaignstack_list_lead_lists to find lead list IDs, implying that leadListId is the ID obtained from that tool. It doesn't fully describe the parameter format, but for a single self-named parameter the pointer is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with the specific verb and resource: 'Delete a lead list.' It immediately differentiates from the sibling tool campaignstack_remove_leads_from_list by clarifying scope: it removes the list itself, not individual leads. This makes the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit condition: 'Call this only when the user names the list and says to delete it.' It also names two alternatives with clear routing: use campaignstack_remove_leads_from_list for individual leads, and use campaignstack_list_lead_lists to find lead list IDs. This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_remove_leads_from_listADestructiveInspect
Remove specific leads from a lead list. Each leadRef needs leadSource (default 'global') and leadId. Returns the count removed. Call this to take named people out of a list, not delete the list itself: campaignstack_remove_lead_list does that; the leads themselves are unaffected. Use campaignstack_get_lead_list with includeLeads=true to see current leads.
| Name | Required | Description | Default |
|---|---|---|---|
| leadRefs | Yes | ||
| leadListId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| removed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false. The description adds useful behavioral context beyond annotations: it returns the count removed, clarifies that the lead list itself is not deleted, and that the underlying leads are unaffected. It does not contradict the annotations and gives the agent a clearer model of the operation's side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The primary action is front-loaded, followed by essential parameter semantics, the return value, and explicit differentiation from the closest sibling. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the presence of an output schema, and annotations covering destructive behavior, the description covers the essential context: what it removes, how leadRefs are structured, what is returned, and which alternatives to consider. Nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It explains that each leadRef requires leadId and that leadSource defaults to 'global', which adds semantic value beyond raw schema names. The leadListId parameter is not explicitly described, but its purpose is strongly implied by the phrase 'from a lead list' and the sibling tool name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: 'Remove specific leads from a lead list.' It clearly distinguishes itself from campaignstack_remove_lead_list, stating that this tool does not delete the list and leaves the leads themselves unaffected. An agent can easily tell this apart from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call the tool ('Call this to take named people out of a list') and what not to use it for ('not delete the list itself'), naming campaignstack_remove_lead_list as the alternative. It also points to campaignstack_get_lead_list with includeLeads=true for verification, giving clear contextual routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_remove_manual_exclusion_urlADestructiveInspect
Remove a LinkedIn profile URL from a manual exclusion entry by its importedLeadId. Call this to take someone off a blocklist. A signal agent's own (level-1) exclusions can only add, so check campaignstack_get_exclusions with level=effective if still blocked. Use campaignstack_list_manual_exclusion_urls to find importedLeadId values. Use campaignstack_get_exclusions to find exclusionId values.
| Name | Required | Description | Default |
|---|---|---|---|
| exclusionId | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| importedLeadId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | No | |
| importedLeadId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive (destructiveHint=true), and the description reinforces that by stating it removes a URL from a blocklist. It adds useful behavioral context beyond the annotations, such as the limitation that a signal agent's own level-1 exclusions can only add, and advises checking effective exclusions if the block persists. It does not fully elaborate on side effects or reversibility, but the destructive hint and removal explanation cover the essential behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, front-loaded with the core action and then providing targeted, non-redundant guidance. Every sentence contributes either to defining the operation, clarifying a constraint, or pointing to the correct sibling tool for ID discovery. There is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the destructive annotation, output schema, and three-parameter schema, the description is complete for correct invocation. It identifies both required parameters, tells the agent where to find their values, and warns about the level-1 exclusion limitation. The optional workspaceId is already well documented in the schema, so no additional detail is required here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%, but the description compensates for the required parameters by explaining how to obtain them: 'Use campaignstack_list_manual_exclusion_urls to find importedLeadId values' and 'Use campaignstack_get_exclusions to find exclusionId values.' It also clarifies that importedLeadId identifies a LinkedIn profile URL and that exclusionId identifies the manual exclusion entry. The workspaceId nuance is left to the schema, which already describes it fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description specifies a clear verb and resource: 'Remove a LinkedIn profile URL from a manual exclusion entry by its importedLeadId' and explains the practical intent, 'take someone off a blocklist.' It distinguishes itself from related tools like campaignstack_list_manual_exclusion_urls and campaignstack_get_exclusions, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to call this tool and provides guidance for handling edge cases: it notes that a signal agent's own exclusions can only add, so the agent should check campaignstack_get_exclusions with level=effective if still blocked. It also names the sibling tools to use for finding required ID values, leaving no ambiguity about when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_remove_memberADestructiveInspect
Remove someone from a workspace. They lose access to everything in it at once, including any assistant they connected to it, and nothing they created is deleted. Call this only when the user names the person and says to remove them. Owners and admins cannot be removed here: that is done in CampaignStack under workspace settings. Use campaignstack_list_members to find the memberId.
| Name | Required | Description | Default |
|---|---|---|---|
| memberId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| removedMemberId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses concrete consequences: the member loses access to everything at once, including connected assistants, while their created content is preserved. It also warns about the owner/admin restriction, giving the agent a realistic model of the operation's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and every sentence carries necessary information: the action, the immediate consequence, the safety caveat about ownership, the exclusion rule, and the parameter lookup path. It is front-loaded with the core purpose and never repeats schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive action with an output schema and annotations, the description covers the essential context: when to invoke it, what happens to the member, what is not deleted, the owner/admin limitation, and where to find the memberId. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes workspaceId thoroughly, and the description adds meaning to memberId by directing the user to campaignstack_list_members. With 50% schema coverage, the description partially compensates by clarifying how to obtain memberId, though it does not explicitly define what memberId represents beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific action and resource: removing someone from a workspace. It clearly distinguishes this from related member operations like invite_member or update_member_role by defining the exact effect and the scope of access loss.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call the tool ('only when the user names the person and says to remove them') and provides an important exclusion: owners and admins cannot be removed here, pointing to where that is done. It also names campaignstack_list_members as the way to obtain the required memberId, giving clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_remove_signal_watchADestructiveInspect
Remove a lead signal watch (archives it - one-way, the watch disappears from lists and never refreshes again; the lead and its signals are untouched). Call this only when the user names the watched lead and says to stop watching them for good; name them back first. To stop temporarily, use campaignstack_pause_signal_watch instead.
| Name | Required | Description | Default |
|---|---|---|---|
| watchId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| removed | No | |
| watchId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint annotation by disclosing that the watch is archived one-way, disappears from lists, never refreshes again, and that the lead and its signals are untouched. This gives the agent a precise mental model of the side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler. The core action and permanence are front-loaded, followed by the usage condition and the alternative tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description does not need to explain return values. It covers the action, the permanence, the precondition, and the alternative for temporary pauses, making it complete for safe invocation of this destructive tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: workspaceId is documented in the schema, but watchId has no description. The description does not explain what watchId refers to or how to obtain it, so the agent is left without guidance for the key parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Remove') and resource ('lead signal watch'), and immediately clarifies the operation as an archive that makes the watch disappear permanently. It also distinguishes itself from the temporal pause concept, preventing confusion with the sibling pause tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to call this tool: only when the user names the watched lead and says they want to stop watching it for good. It also names the alternative (campaignstack_pause_signal_watch) for temporary stops, giving clear selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_reopen_reviewAInspect
Put an already decided review (approved, rejected or cancelled after approval) back in the pending queue with its stored draft, so it can be approved, rejected, edited or retried again. Works for entries parked at a review node and for critic-flagged drafts parked at their craft node. Downstream steps that never ran (waiting, failed or cancelled sends) are removed and re-created by the next approve. Call this when the user wants to revisit a decision already made on an entry, found via campaignstack_get_lead_history rather than campaignstack_list_pending_reviews, which only shows what is still open. Refuses with REVIEW_DOWNSTREAM_ALREADY_RAN when a later step already executed for the lead, since reopening would set up a second send.
| Name | Required | Description | Default |
|---|---|---|---|
| entryId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| entryId | No | |
| success | No | |
| decision | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already show this is not read-only and not idempotent, and the description adds the key behavioral consequence: downstream steps that never ran are removed and re-created by the next approve. It also discloses that the tool refuses with REVIEW_DOWNSTREAM_ALREADY_RAN when reopening would risk a second send. This is useful risk context beyond what annotations provide, and it does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: purpose, scope, downstream effects, when-to-call guidance, and failure mode. The primary action is front-loaded in the first sentence, so an agent scanning quickly gets the core semantics immediately. No filler or redundant restating of the tool name appears.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no idempotency guarantee, the description covers the essential decision context: what the tool does, where it applies, how to find eligible entries, what happens to downstream steps, and when it refuses. Since an output schema exists, the description does not need to explain return values. An agent has enough information to invoke it safely and correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not explicitly map the entryId parameter, but it implies it through 'an entry' and 'found via campaignstack_get_lead_history,' which is a practical way for an agent to obtain the right ID. The workspaceId parameter is already richly documented in the schema, including the distinction between user keys and workspace keys. This partially compensates for the 50% schema coverage, though explicit parameter-level naming would be stronger.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: putting an already decided review back into the pending queue with its stored draft. It also clarifies the two contexts it applies to (review-node entries and critic-flagged drafts at craft nodes), which distinguishes it from sibling mutation tools like approve_review, reject_review, and retry_review. No ambiguity remains about what this tool accomplishes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to call it: 'when the user wants to revisit a decision already made on an entry.' It also directs the agent to find such entries via campaignstack_get_lead_history rather than campaignstack_list_pending_reviews, which only shows open reviews. It even names the error condition that should stop usage when downstream steps already ran, giving the agent a concrete guardrail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_reply_to_commentARead-onlyInspect
Draft a contextual threaded reply to a comment on a LinkedIn post; it does not post the reply. Call this when the user asks for a reply to a specific comment. When addDmHint is true (a DM is also being sent), the reply includes a 'Sent you a DM!' nudge. Nothing is posted here: after showing the draft to the user, the runner agent types the returned replyText on the post via browser_* tools; there is no separate send tool for this one.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | ||
| addDmHint | No | ||
| campaignId | No | ||
| workflowId | No | Workflow the craft belongs to. Used to resolve signal-agent playbooks. Injected automatically for runner agents. | |
| commentText | Yes | ||
| postContent | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| instructions | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| replyText | No | |
| reviewReason | No | |
| needsHumanReview | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint=true and destructiveHint=false, and the description reinforces these with concrete details: it does not post, nothing is posted here, the runner agent types the returned replyText via browser_* tools, and there is no separate send tool. It also discloses the 'Sent you a DM!' nudge behavior triggered by addDmHint. This goes well beyond what annotations provide and is fully consistent with them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three information-dense sentences with the core purpose front-loaded. 'It does not post the reply' appears twice in slightly different forms, which is a minor redundancy, but each sentence contributes distinct value: purpose/trigger, addDmHint behavior, and the post-draft execution flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and annotations cover the safety profile, the description completes the picture by explaining the draft-only workflow, the execution mechanism (browser_* typing), and the addDmHint variant. The main gap is that several parameters (leadId, commentText, postContent, campaignId, instructions) lack semantic detail anywhere, though their names make them reasonably inferable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, so the description must compensate for low coverage. It does explain addDmHint's effect on the reply content and references the replyText return value, but it leaves the three required params (leadId, commentText, postContent) and instructions/campaignId semantically unexplained in prose. The parameter names are fairly self-evident, but the description adds meaning only for addDmHint and the output flow.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 a contextual threaded reply to a comment on a LinkedIn post') and immediately clarifies scope by saying 'it does not post the reply.' It further differentiates from siblings like campaignstack_comment_on_post by noting there is 'no separate send tool for this one,' so an agent can distinguish it without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Call this when the user asks for a reply to a specific comment' gives an explicit trigger condition. The description also explains the addDmHint special case and the two-step flow (draft shown to user, then runner types replyText via browser_* tools). It does not name alternatives or explicit when-not-to-use cases, but the trigger context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_request_connect_linkAInspect
A link the user clicks to connect a NEW LinkedIn or Google account. Connecting is a browser step by design: LinkedIn needs a session the extension captures, Google needs its consent screen, and neither a cookie nor a password should ever be pasted into a chat. For LinkedIn the link is the accounts page (with the extension the connect is one click; without it, an email and password or a session cookie entered on that page). For Google the link is a consent URL minted for this user, valid ten minutes. Send the link, then poll campaignstack_list_accounts until the account appears, and link it to the right workspace with campaignstack_link_account_to_workspace if it is not there already. Never ask the user for their credentials.
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Which kind of account to connect. | |
| workspaceId | No | Optional. Where the person lands after connecting; defaults to the accounts page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | No | |
| next | No | |
| platform | No | |
| expiresAt | No | |
| extensionUrl | No | |
| instructions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only sparse annotations, the description carries the behavioral burden and does so well: it discloses the browser-step design, Google's ten-minute consent URL expiry, LinkedIn's accounts-page fallback, and the rule that cookies and passwords never enter chat. It adds substantial context beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but every sentence carries new operational information: platform differences, expiry, follow-up polling, workspace linking, and credential safety. It is front-loaded with the core purpose and wastes no words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the input schema is small, the description fully covers what the agent needs: what the link is, how each platform behaves, how to validate completion, and how to finish the workflow. Nothing needed for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers both parameters at 100%, so the baseline is 3. The description adds value by explaining what each platform link actually is and clarifying that workspaceId controls where the person lands, which maps usefully onto the optional parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it produces a link the user clicks to connect a NEW LinkedIn or Google account. It distinguishes this from integration tools for other platforms by naming the exact platforms and the browser-step mechanism.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly explains when to use the tool, what to do afterwards (poll campaignstack_list_accounts, then link to workspace if needed), and what never to do (never ask for credentials). It also gives platform-specific expectations for the user flow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_reread_review_linkAInspect
Re-open the link the lead shared, then rewrite the pending draft with what the page actually says. Call this when the draft answers a message containing a link and reads like it never saw the page (campaignstack_list_pending_reviews reports sharedLinkUrl and sharedLinkGrounded per entry). Use it instead of campaignstack_retry_review, which reuses the stored page content and never re-fetches. Costs one link read (credits plus a LinkedIn read action on the receiving account). The entry returns to PROCESSING, then comes back to PENDING_REVIEW with the new draft.
| Name | Required | Description | Default |
|---|---|---|---|
| entryId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| entryId | No | |
| linkUrl | No | |
| decision | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false hints (readOnly, openWorld, idempotent, destructive), so they add little; the description carries the full burden. It discloses concrete side effects: costs 'one link read (credits plus a LinkedIn read action on the receiving account)' and the state cycle 'returns to PROCESSING, then comes back to PENDING_REVIEW with the new draft.' 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences with no redundancy: action first, then trigger, alternative, cost, and state effect. Every clause adds information and no sentence merely paraphrases the tool name or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists, the description needn't enumerate return values. It covers when to call, what it does, how it differs from the sibling, the cost, and the resulting state transitions, which is complete for an agent to decide and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents workspaceId richly (user key vs workspace key) but leaves entryId as a bare string with only minLength. The description compensates by telling the agent to discover the right entry from campaignstack_list_pending_reviews via sharedLinkUrl/sharedLinkGrounded, adding selection semantics beyond the schema. It does not restate workspaceId guidance, but the schema already carries that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb phrase 'Re-open the link the lead shared, then rewrite the pending draft' with clear resources (link, pending draft). Explicitly contrasts with campaignstack_retry_review, which 'reuses the stored page content and never re-fetches,' so an agent can distinguish it from the nearest sibling 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains an explicit trigger condition: 'Call this when the draft answers a message containing a link and reads like it never saw the page,' and references campaignstack_list_pending_reviews for the fields (sharedLinkUrl, sharedLinkGrounded) that identify such cases. It also names the alternative not to use (campaignstack_retry_review) and the reason, leaving no ambiguity about when to choose this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_restore_superseded_draftAInspect
Put back the draft a retry replaced. Retrying re-crafts the message and can produce a worse one than it replaced, so the previous draft is kept: this restores it and clears the stash. The pending review cards report it as supersededDraft, with the critic score of each side and retryScoredWorse when the replacement scored lower. Call this when the user reads both versions and prefers the one campaignstack_retry_review discarded. Returns restored: false when nothing was stashed, which is the normal answer for a draft that was never retried.
| Name | Required | Description | Default |
|---|---|---|---|
| entryId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| entryId | No | |
| restored | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate readOnly=false, openWorld=false, idempotent=false, destructive=false. The description adds meaningful behavioral detail: it restores the previous draft, clears the stash, surfaces supersededDraft and retryScoredWorse in review cards, and returns restored:false when no stash exists. This is exactly the kind of non-obvious state behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then adds the rationale, the exact trigger condition, and the return edge case. Each sentence contributes a distinct fact; there is no filler or repetition of schema/annotation information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is rich: it covers the action, rationale, when to call, related review-card terms, and the restored:false case. The only meaningful gap is the missing description of entryId, which prevents the agent from confidently knowing which identifier to pass.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: workspaceId has a thorough schema description, but entryId has only 'type: string'. The tool description never states what entryId identifies or how to obtain it, despite the tool being centered on a specific entry's draft. It does not compensate for the undocumented parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Put back the draft a retry replaced.' It clearly differentiates from the counterpart campaignstack_retry_review by describing the restore action and the stash-clearing behavior, so an agent can tell exactly which tool this is.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger condition: 'Call this when the user reads both versions and prefers the one campaignstack_retry_review discarded.' It names the sibling alternative and even explains the normal no-op case ('nothing was stashed... never retried'), which helps an agent decide when the tool is unnecessary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_resume_company_employee_watchAIdempotentInspect
Resume a paused company employee watch, including one paused as company-unreachable (resets the failure counter). Call this when the user says to start watching a company again. Counts against the workspace's active-watch cap.
| Name | Required | Description | Default |
|---|---|---|---|
| watchId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| watchId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds two behavioral facts beyond annotations: resetting the failure counter for company-unreachable watches and counting against the active-watch cap. These complement the idempotentHint and non-destructive annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, ~35 words, and the primary verb and object appear in the first three words. Each clause carries unique information: action, exception, trigger, and cap.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the action, the special case, the trigger, and the cap. An output schema exists, so return values need not be described. Minor omissions (what happens if already active, where to find watchId) are addressable via sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%; workspaceId has a description but watchId does not. The tool description provides no parameter-level guidance, forcing the agent to infer watchId from the tool name or lack of schema info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Resume a paused company employee watch', and adds a specific case (company-unreachable). It is clearly distinguishable from sibling pause, list, remove, and other resume tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: 'Call this when the user says to start watching a company again.' It does not explicitly state when not to use it or name alternative tools, but the 'paused' condition is implicit in 'resume'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_resume_competitor_watchAInspect
Resumes a paused competitor watch and re-enables its associated automations. Use campaignstack_pause_competitor_watch to pause monitoring. Call this when the user wants a paused watch tracking again. It does not create a new watch: campaignstack_create_competitor_watch does that.
| Name | Required | Description | Default |
|---|---|---|---|
| watchId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| watchId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=false and idempotentHint=false. The description adds useful behavioral context by stating that the operation re-enables associated automations and that it does not create a new watch. There is no contradiction with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with a distinct purpose: the action, the pause counterpart, and a clear non-goal. There is no filler or unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter resume operation with annotations and an output schema present, the description covers when to call it, what it does, what side effects it has, and what it does not do. An agent has enough information to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but there is only a single self-descriptive watchId parameter. The description implies that watchId refers to an existing paused competitor watch by saying it resumes a paused watch and does not create a new one, but it never explicitly defines watchId or explains where to obtain it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Resumes a paused competitor watch') and resource, and explicitly mentions re-enabling associated automations. It also names the create and pause sibling tools, making it easy to tell apart from similar watch-related operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names the inverse operation ('Use campaignstack_pause_competitor_watch to pause monitoring') and gives the exact condition for calling this tool ('when the user wants a paused watch tracking again'). It also clarifies that this tool does not create a new watch and points to campaignstack_create_competitor_watch for that purpose.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_resume_signal_agentAInspect
Resume a paused signal agent, re-enabling feed polling and workflow execution; leads frozen at the pause pick up where they were. Call this when the user asks to turn a paused watcher back on. Connection-watch and message agents cannot resume while their account is disconnected (AGENT_ACCOUNT_UNAVAILABLE). Not for creating one: campaignstack_create_signal_agent does that.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| agentId | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses meaningful behavior: resuming restarts feed polling, re-enables workflow execution, and preserves frozen leads at their pause point. It also surfaces a relevant failure condition, AGENT_ACCOUNT_UNAVAILABLE, for some agent types. This adds useful context without contradicting 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the core action and effect come first, the call trigger follows, and the exclusion and alternative are stated in the final sentences. Every sentence adds distinct value, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, an output schema exists, and the description covers the main scenario, the key limitation, and the alternative creation tool. It could be slightly more complete by explicitly noting that only already-paused signal agents are valid targets, but that is strongly implied by 'resume a paused signal agent'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has one required parameter, agentId, with no description and 0% schema coverage. The description does imply that the agentId identifies the paused signal agent, but it never explicitly states that agentId is the unique identifier of the agent to resume or provides any additional guidance about how to obtain or format it. The single self-explanatory parameter name prevents a lower score, but the description does not fully compensate for the absent schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: 'Resume a paused signal agent', and clearly states the effects ('re-enabling feed polling and workflow execution'). It also distinguishes itself from the creation tool by explicitly saying campaignstack_create_signal_agent handles that, so an agent can separate resuming from creating.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger: 'Call this when the user asks to turn a paused watcher back on.' It also provides an exclusion condition for connection-watch and message agents when the account is disconnected, and names the alternative for creating a signal agent. This is strong, actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_resume_signal_watchAInspect
Resume a paused lead signal watch, including one the system paused as lead-unreachable (resets the failure counter). Call this when the user says to start watching a lead again. Counts against the workspace's active-watch cap, so it can fail when the workspace is already at its limit.
| Name | Required | Description | Default |
|---|---|---|---|
| watchId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| watchId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the raw annotations, the description provides two meaningful behavioral details: it resets the failure counter for lead-unreachable pauses, and it counts against the workspace's active-watch cap, potentially failing when the cap is reached. These give the agent important operational expectations beyond the structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. It front-loads the action, then gives the trigger, then the failure condition. Each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers the core action, when to call, and a key failure mode. Since an output schema exists, not explaining return values is appropriate. It doesn't explicitly state prerequisites (like needing an existing paused watch), but that is implied by 'paused lead signal watch.'
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema provides a detailed description for workspaceId, but watchId only has minLength. The tool description mentions 'paused lead signal watch,' giving some context about what watchId refers to, but it does not explain how to obtain or format watchId. With 50% schema coverage and minimal description-based compensation, this is adequate but not fully helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Resume a paused lead signal watch,' stating a specific verb, resource, and scope. It also covers a distinct edge case (system-paused as lead-unreachable) and clearly differs from sibling tools like campaignstack_pause_signal_watch and campaignstack_create_signal_watch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: 'Call this when the user says to start watching a lead again.' This clearly indicates the circumstance for use. However, it does not explicitly name alternatives or when-not-to-use cases, such as when a watch was removed and needs recreation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_retry_content_postAInspect
Moves a failed content post back to draft, clearing the failure reason. Call this when the user asks to retry a post that failed to publish. Check campaignstack_get_content_post first for why it failed. After retrying, edit with campaignstack_update_content_post, then reschedule or resubmit for approval.
| Name | Required | Description | Default |
|---|---|---|---|
| contentPostId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| scheduledAt | No | |
| contentPostId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the state change (moving to draft and clearing failure reason) and outlines the surrounding workflow. Annotations are all false, so there are no contradictions, but the description doesn't cover potential side effects, permissions, or whether the operation is reversible. It provides moderate transparency beyond what annotations offer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences long and each sentence adds value: action, trigger condition, prerequisite check, and next steps. It's front-loaded with the core action and stays relevant throughout, with no unnecessary filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter and already has an output schema, so the description doesn't need to explain return values. It provides enough workflow context to use the tool correctly and covers the expected sequence. Minor gaps like authorization details are not critical for this single-parameter action.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description carries the burden for parameter meaning. It references 'content post' and the action implies contentPostId is the identifier of the failed post, but it never explicitly defines the parameter. This is adequate for a single obvious parameter, though a direct mention would be stronger.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Moves a failed content post back to draft, clearing the failure reason.' This is a specific verb and resource that distinguishes it from sibling tools like campaignstack_retry_failed_entry or campaignstack_retry_review, which operate on different objects.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells when to call it: 'when the user asks to retry a post that failed to publish.' It also provides a follow-up workflow (check with get_content_post, edit with update_content_post, then reschedule or resubmit). It doesn't explicitly mention when not to use it versus sibling retry tools, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_retry_failed_entries_at_nodeAInspect
Retry every failed entry at a workflow node in one call. Resets each one from FAILED to WAITING so the executor picks them up on the next tick. Call this after fixing the cause of a batch failure (expired session, unreachable runner) instead of retrying leads one by one with campaignstack_retry_failed_entry. Returns how many were requeued and how many failed entries remain: call again when 'remaining' is above zero.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| nodeId | No | |
| retried | No | |
| success | No | |
| remaining | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, so the description carries the burden of explaining behavior. It discloses the status transition (FAILED→WAITING), the timing ('picked up on the next tick'), and the return semantics (requeued count and remaining count). It does not mention permissions or re-failure behavior, but the core mutation is transparent and no annotation contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: main action, state transition, when-to-use/alternative, and return values plus repeat guidance. No filler or redundancy; the most important scoping phrase is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param mutation tool with an output schema, the description covers operation, timing, alternatives, and return semantics. Gaps remain around locating/validating nodeId and possible error cases, but the definition is largely complete for selecting and invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: workspaceId is thoroughly documented in the schema, but nodeId has only type/minLength. The description contextualizes nodeId as the workflow-node target but does not explain how to find or format it. It adds little semantic value beyond the schema, though the rich workspaceId schema compensates partially.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Retry every failed entry at a workflow node in one call.' It clearly differentiates from sibling campaignstack_retry_failed_entry by contrasting batched retry against one-by-one retry. The FAILED→WAITING state transition further locks down the exact operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly specifies when to use it: 'after fixing the cause of a batch failure (expired session, unreachable runner).' It names the alternative tool campaignstack_retry_failed_entry and says not to use that for one-by-one retries. It also gives follow-up guidance: call again when 'remaining' is above zero.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_retry_failed_entryAInspect
Retry one failed workflow entry. Resets the entry from FAILED to WAITING so the workflow executor picks it up on the next tick. Call this after fixing whatever caused the failure for a single lead; to clear a whole node's failures at once, use campaignstack_retry_failed_entries_at_node instead. Use campaignstack_list_leads_at_node to find failed entries.
| Name | Required | Description | Default |
|---|---|---|---|
| entryId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| entryId | No | |
| success | No | |
| newStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the precise state transition from FAILED to WAITING and the timing consequence ('picks it up on the next tick'). This goes well beyond the annotations, which only indicate that the operation is not read-only and not idempotent. No annotation contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first states the action and effect, the second gives the calling context and the preferred alternative, and the third tells how to find the necessary failed entries. Key information is front-loaded and there is no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with two required parameters, an output schema, and clear sibling relationships, this description covers the state change, the recovery workflow, and the routing guidance. Nothing essential for selecting or invoking the tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: workspaceId has a detailed schema description, but entryId has only a name and type. The tool description implies entryId identifies the failed workflow entry but does not add detail about how to obtain it. The workspaceId guidance is in the schema, not the description, so the description adds little parameter-level value beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Retry one failed workflow entry.' It also distinguishes the scope ('one failed entry') from the sibling bulk operation ('retry_failed_entries_at_node'), so an agent can immediately know what this tool does and does not do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call the tool ('after fixing whatever caused the failure for a single lead'), when not to use it ('to clear a whole node's failures at once'), and points to the exact sibling to use instead. It also references campaignstack_list_leads_at_node for finding failed entries, giving a full routing strategy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_retry_reviewAInspect
Ask CampaignStack to write the draft again from scratch. The entry goes back to processing and returns to the review queue with new wording a moment later, so read it again before approving. Call this when the user dislikes a draft but still wants to contact the person. It costs a fresh generation each time, and it does not re-read any link in the thread: campaignstack_reread_review_link does that.
| Name | Required | Description | Default |
|---|---|---|---|
| entryId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| entryId | No | |
| success | No | |
| decision | No |
TDQS
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 description doesn't need to restate those. The description adds valuable behavioral context beyond annotations: the entry goes back to processing, returns to the review queue with new wording, costs a fresh generation each time, and does not re-read links. It also warns the agent to read the new draft again before approving. This is rich, non-obvious 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: the action, the lifecycle/return-to-queue behavior, the when-to-use condition, and the cost/alternative-tool distinction. The most important information is front-loaded in the first sentence. No filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema (not shown in detail but signaled as present), so return-value documentation is not the description's job. The description covers the action, lifecycle, cost, when-to-use, and the key sibling distinction. It doesn't mention prerequisites like whether the entry must currently be in a review state, but the 'returns to the review queue' phrasing implies it. For a mutation tool with two parameters and a clear workflow, this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%: entryId has no description, while workspaceId has a detailed description about user keys vs workspace keys. The tool description does not add parameter-level meaning beyond the schema. However, the workspaceId schema description is unusually thorough, covering the csu_/cs_ key distinction and pointing to campaignstack_whoami. The description's mention of 'entry' and 'draft' contextually implies entryId refers to the review entry, but it doesn't add explicit parameter semantics. Baseline 3 is appropriate given partial schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Ask CampaignStack to write the draft again from scratch.' It clearly distinguishes this from the sibling campaignstack_reread_review_link by explicitly saying it does not re-read any link in the thread. The name 'retry_review' is somewhat opaque, but the description fully clarifies the action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Call this when the user dislikes a draft but still wants to contact the person.' It also names the alternative tool (campaignstack_reread_review_link) and states what that tool does instead, providing a clear exclusion condition. This is exactly the kind of routing guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_revert_guidanceAInspect
Put a previous version of a campaign's guidance or offer addendum, a signal agent's script, or a node's instructions back. Call this only when the user has picked a specific versionId from campaignstack_list_guidance_versions and confirmed the restore. The text being replaced is snapshotted first, so the revert itself can be reverted. Returns the target and the restored text.
| Name | Required | Description | Default |
|---|---|---|---|
| versionId | Yes | versionId from campaignstack_list_guidance_versions. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| text | No | |
| target | No | |
| targetId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnly=false, idempotent=false, and destructive=false, but the description adds valuable context: the replaced text is snapshotted first and the revert can itself be reverted. This clarifies the safety profile and goes beyond the annotation booleans.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences front-load the action, then state the precondition, then cover safety and return behavior. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool restores, when to call it, the confirmation requirement, the reversible snapshot behavior, and what is returned. With a complete input schema and an output schema present, nothing important is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with the versionId and workspaceId parameters already well explained. The description does not add new parameter-level meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Put ... back') and names the resource types: campaign guidance, offer addendum, signal agent script, or node instructions. It clearly distinguishes this revert operation from listing versions and from other revert tools like revert_playbook and revert_voice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit precondition: call only after the user has picked a versionId from campaignstack_list_guidance_versions and confirmed the restore. This tells the agent exactly when the tool should be used and what must happen beforehand.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_revert_playbookAInspect
Restore a playbook version snapshot as the live workspace playbook. Call this only when the user names a prior version, or a recent regeneration/edit, and says to undo it. The replaced text is itself snapshotted first, so a revert is always revertible. Find version ids with campaignstack_list_playbook_versions.
| Name | Required | Description | Default |
|---|---|---|---|
| versionId | Yes | Playbook version id from campaignstack_list_playbook_versions | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| reverted | No | |
| workspaceId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations include destructiveHint=false, but the description clarifies that the tool is destructive in effect (it replaces the live playbook) yet mitigates by stating 'the replaced text is itself snapshotted first, so a revert is always revertible.' This adds important safety context beyond the annotations. No contradiction. It also implies the mutation is not destructive in an irreversible sense, which 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the primary action and condition. It avoids redundancy and every sentence provides necessary guidance. It is well-structured for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the schema and annotations, the description covers the key context: when to use, how to find version ids, and the revertible nature. An output schema is present, so return format is handled. The only missing minor detail might be typical use cases with examples, but the description is sufficient for accurate invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. However, the description adds significant meaning to workspaceId: it explains the difference between user keys (csu_) and workspace keys (cs_) and when workspaceId is required, which is not in the schema. This improves parameter understanding substantially.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'restore a playbook version snapshot' as the live workspace playbook, and explicitly mentions it is for undoing prior versions or recent regeneration/edits. It is distinguished from sibling revert tools (revert_guidance, revert_voice) by specifying playbook-specific behavior. The purpose is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance: 'Call this only when the user names a prior version, or a recent regeneration/edit, and says to undo it.' It also hints at when not to use and names the sibling tool (campaignstack_list_playbook_versions) for finding version ids. This is excellent for agent decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_revert_voiceAInspect
Restore a previous version of a voice profile. Call this when the user picks a specific versionId from campaignstack_list_voice_versions, typically after a re-extraction made the voice worse and they want the earlier one back. The current state is snapshotted first and the profile's version number goes UP, because a version is a write counter rather than a pointer into the history.
| Name | Required | Description | Default |
|---|---|---|---|
| versionId | Yes | versionId from campaignstack_list_voice_versions. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| version | No | |
| language | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say the tool is not read-only and not idempotent. The description adds non-obvious behavior: the current state is snapshotted first and the profile's version number goes UP because a version is a write counter rather than a history pointer. This prevents a serious misinterpretation of what 'revert' means.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The action is front-loaded, the trigger condition is clearly stated, and the critical version-counter caveat earns its place in the final sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with one required parameter, the description explains the operation, the trigger context, and the non-obvious versioning semantics. With an output schema present and detailed parameter schemas, nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains versionId as coming from campaignstack_list_voice_versions and documents the workspaceId user-key/workspace-key nuance thoroughly. The description adds no parameter detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Restore a previous version of a voice profile.' It names the exact upstream tool (campaignstack_list_voice_versions) and clearly distinguishes itself from sibling revert tools like campaignstack_revert_guidance and campaignstack_revert_playbook.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description says explicitly when to call this tool: 'Call this when the user picks a specific versionId from campaignstack_list_voice_versions, typically after a re-extraction made the voice worse and they want the earlier one back.' This gives the agent a concrete trigger condition and the user intent that warrants invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_revoke_invitationADestructiveInspect
Cancel an invitation that has not been accepted. The link in the email stops working straight away and no message is sent to the person. Call this when the user asks to cancel or withdraw an invitation; use campaignstack_list_invitations to find the invitationId. It does nothing to someone who already joined, who is removed with campaignstack_remove_member.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| invitationId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| revoked | No | |
| invitationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint and idempotentHint annotations, the description adds concrete behavioral facts: the email link stops working immediately, no message is sent to the invitee, and the operation is a no-op for someone who already joined. This meaningfully helps an agent predict side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with no filler. The core action is front-loaded, followed by immediate effects, then usage guidance and alternatives; every sentence adds necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter destructive action, the description covers the target state, the effect on the invite link, the absence of notification, the prerequisite lookup, and the relevant edge case. With an output schema present and the workspaceId nuance already in the schema, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already gives a rich explanation of workspaceId, including the user-key vs workspace-key distinction. The description compensates for the undocumented invitationId by telling the agent to use campaignstack_list_invitations to find it, which is the most important semantic guidance for that parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Cancel an invitation that has not been accepted.' It clearly distinguishes this tool from campaignstack_remove_member by noting that joined members are removed elsewhere, and from campaignstack_list_invitations by framing it as the discovery step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to call it: 'Call this when the user asks to cancel or withdraw an invitation.' It also names the prerequisite tool campaignstack_list_invitations for finding invitationId and explicitly excludes the joined-member case, routing that to campaignstack_remove_member.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_run_draft_checkupAInspect
Run a draft checkup for the workspace now, skipping the automatic evidence thresholds (the daily sweep only runs when the clean-approval rate degrades). Call this when the user asks to check draft quality rather than waiting for the daily sweep. Fails when a proposal is already pending (decide it first) or when fewer than 3 recent drafts exist to analyze. NOT idempotent; runs LLM analysis plus up to 2 replay crafts and may take tens of seconds. It does not return findings; read them with campaignstack_get_draft_checkup.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| reason | No | |
| checkupId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it non-idempotent and non-read-only; the description adds crucial behavioral specifics: it runs LLM analysis, performs up to 2 replay crafts, may take tens of seconds, and does not return findings. This goes well beyond the structured hints and explains side effects and time cost.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence serves a purpose: action, trigger condition, failure modes, idempotence, runtime cost, and result location. The description is front-loaded with the core action and then delivers necessary caveats in a logical, compact structure with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one optional parameter and an output schema, the description covers the decision-relevant context: when to use it, side effects, preconditions, and how to obtain results. The schema covers the parameter and key semantics, and annotations cover safety flags, making this complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the workspaceId parameter is already fully documented in the schema, including the distinction between user and workspace keys and the whoami reference. The tool description adds no new parameter-level meaning, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the action ('Run a draft checkup for the workspace now') with a specific resource and intent. It distinguishes itself from sibling tools by naming campaignstack_get_draft_checkup for reading results and by framing the checkup as a manual trigger for draft-quality assessment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs when to call it ('when the user asks to check draft quality rather than waiting for the daily sweep') and when it will fail (pending proposal, fewer than 3 recent drafts). It also redirects to the companion read tool for results, providing clear routing among alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_schedule_content_postAInspect
Schedules a draft content post to publish, skipping approval. Call this when the user asks to schedule or queue a drafted post. Pass scheduledAt (Unix ms) for an exact time, or autoSchedule:true (the default) for the next slot within the account's daily posting limit; the response returns the resolved time. It does not route through review: use campaignstack_submit_content_for_approval when the workspace expects a person to approve first.
| Name | Required | Description | Default |
|---|---|---|---|
| scheduledAt | No | Exact publish time. Omit (or set autoSchedule) for the next valid slot. | |
| autoSchedule | No | Auto-place into the next valid posting slot instead of an exact time. Default when scheduledAt is omitted. | |
| contentPostId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| scheduledAt | No | |
| contentPostId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses meaningful behavior beyond the neutral annotations: it skips approval, autoSchedule defaults to the next slot within the daily posting limit, and the response returns the resolved time. It does not discuss edge cases like reversibility or invalid future times, but the annotations already frame this as a normal mutation, so the added context is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: purpose, trigger, parameter behavior, and alternative are each given one clear sentence. There is no filler or redundant restating of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter scheduling mutation, the description covers the trigger scenario, both scheduling modes, approval bypass, the response behavior, and the relevant sibling alternative. With an output schema present, no critical selection or invocation information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds value beyond the schema by specifying Unix ms units, the autoSchedule default, and daily-posting-limit semantics. The required contentPostId is not described in either the description or the schema, but the tool's purpose makes its meaning apparent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Schedules a draft content post to publish') and immediately adds the distinguishing approval-bypass behavior. This clearly separates it from approval-related siblings like campaignstack_submit_content_for_approval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call it ('when the user asks to schedule or queue a drafted post') and when not to, naming campaignstack_submit_content_for_approval as the alternative when human approval is expected. This is a clear when/when-not pairing with no reliance on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_search_leadsARead-onlyIdempotentInspect
Search leads in a workspace by name, email, LinkedIn URL or company. Returns paginated results; follow nextCursor for the next page. Omit query and companyId to page through every lead. Covers both shared leads and workspace-private (CSV-imported) ones. Platform presence (LinkedIn URL, follower counts, and so on) is under each lead's profiles key (e.g. profiles.linkedin.url); the top-level linkedInUrl is a legacy alias. Use returned leadId values with campaignstack_get_lead or campaignstack_add_leads_to_list. Call this when the user names a person, company, or LinkedIn URL to find. It does not return ICP fit or job positions: campaignstack_get_lead does, once you have a leadId. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | A person's name, an email address, or a LinkedIn profile URL. Job titles are not searchable here. | |
| cursor | No | ||
| companyId | No | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | No | |
| pagination | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint. The description adds valuable behavioral context: pagination via nextCursor, coverage of both shared and workspace-private leads, the `profiles` key structure with the legacy `linkedInUrl` alias, and the one-page-per-call behavior. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but front-loads the primary purpose and every sentence adds operational value. A small redundancy remains in restating one-page behavior ('Results are one page' plus the later pagination caution), which prevents a top score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 covers all essential operational aspects: when to invoke it, what it intentionally excludes, how pagination works, the response shape for platform presence, and downstream usage of leadId values. It is complete for a read-only search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%, and the description compensates well by mapping query to name/email/LinkedIn URL and companyId to company, plus explaining that omitting both pages through all leads. However, it does not explicitly describe limit or cursor beyond 'follow nextCursor', leaving some param-level semantics to the schema constraints.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('Search leads in a workspace') and lists the exact search keys (name, email, LinkedIn URL, company). It explicitly distinguishes itself from campaignstack_get_lead by noting that it does not return ICP fit or job positions, which separates it clearly from that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a direct trigger ('Call this when the user names a person, company, or LinkedIn URL to find') and names the alternative for detailed lead data ('campaignstack_get_lead does, once you have a leadId'). It also explains how to page through all leads by omitting query and companyId, and warns against presenting one page as the complete result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_send_connection_requestADestructiveInspect
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_list_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: put the leads in a lead list with campaignstack_add_leads_to_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Sending is paced by CampaignStack's own daily and weekly limits and business hours, which are set by a human in the app and are not writable from here; see overrideOwnLimits before asking for an exception.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| leadId | No | ||
| platform | Yes | ||
| accountId | No | ||
| profileUrl | No | ||
| overrideOwnLimits | No | 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. | |
| dangerouslyBypassSafetySystem | No | Deprecated name for overrideOwnLimits. Use overrideOwnLimits. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | No | |
| status | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, and the description goes well beyond them: it warns 'This reaches a real person,' states there is no draft state and nothing to recall, explains that sending is paced by daily/weekly limits and business hours, and discloses that overrideOwnLimits voids the safety guarantee. It also explains that a refusal from the safety system is the system working, not a fault to route around. This is rich behavioral context that the annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place: it covers purpose, alternatives, safety, pacing, and bulk behavior. It is front-loaded with the core action and confirmation requirement. It loses one point because the overrideOwnLimits explanation is somewhat redundant with the schema's own detailed parameter description, and the paragraph could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, non-idempotent, real-world side-effect tool with 7 parameters and an output schema, the description is remarkably complete. It covers when to call, what to confirm, how to identify the target, what happens on success, what cannot be undone, how pacing works, and how to handle bulk needs. The output schema exists, so return values need not be described. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 29%, so the description must compensate. It does: it explains platform is required and LinkedIn-only, leadId is the supported form, profileUrl is accepted for someone already in the workspace, note is capped at 300 characters, accountId defaults to the workspace's only connected account, and overrideOwnLimits is a safety override. The only parameter not explicitly covered is dangerouslyBypassSafetySystem, but the schema itself describes it as a deprecated alias, so the gap is minor.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'send one connection request from a LinkedIn account the workspace owner connected.' It clearly distinguishes this from the sibling campaignstack_follow_profile by noting that on other networks you follow instead. The scope is precise: one person, one call, LinkedIn only.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: call when the user has named one specific person and confirmed sending. It names alternatives (campaignstack_follow_profile for non-LinkedIn, campaignstack_add_leads_to_list + campaignstack_trigger_workflow for bulk) and explicitly says there is no bulk form and looping is not supported. It also instructs the agent to read the request back and wait for explicit yes before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_send_inmailADestructiveInspect
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_list_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: put the leads in a lead list with campaignstack_add_leads_to_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Sending is paced by CampaignStack's own daily and weekly limits and business hours, which are set by a human in the app and are not writable from here; see overrideOwnLimits before asking for an exception.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | No | ||
| subject | Yes | ||
| platform | Yes | ||
| accountId | No | ||
| profileUrl | No | ||
| messageText | Yes | ||
| overrideOwnLimits | No | 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. | |
| dangerouslyBypassSafetySystem | No | Deprecated name for overrideOwnLimits. Use overrideOwnLimits. |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | No | |
| status | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond annotations. While annotations indicate destructiveHint=true and readOnlyHint=false, the description adds critical context: it reaches a real person, goes out immediately with no draft or recall, is paced by daily/weekly limits and business hours (not writable), and requires explicit user confirmation before calling. It also explains the overrideOwnLimits parameter's safety implications and audit logging, which are essential for an agent to understand the irreversible and risky nature of this action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long and dense, covering many important points but could be more concise. It front-loads the core purpose and usage, but includes extensive safety and bulk-alternative guidance that might be condensed or moved to supplementary sections. Still, every sentence adds value, though the length may reduce readability for agents that skim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 params, destructive, irreversible, real-person impact), the description is thorough. It covers prerequisites, alternatives, safety mechanisms, error handling (override limits), and routing to bulk alternatives. The output schema exists, so return format need not be explained. Nothing an agent needs to call this correctly and safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, so the description must compensate. It does: it explains leadId vs profileUrl (leadId is preferred, profileUrl for existing workspace members), accountId (uses only connected account automatically, or pass one from campaignstack_list_accounts), and character limits for subject and messageText. However, it does not explicitly describe the platform parameter beyond being required and 'linkedin', though the description implies it. Overall, it adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the specific action: 'send one InMail to someone the owner is not connected to' from a connected LinkedIn account. It differentiates from sibling tool campaignstack_send_message by specifying the condition (not connected vs connected) and platform (linkedin only). The verb, resource, and scope are all explicit, making it easy for an agent to select this tool over alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use ('Call this when the user has confirmed subject and body for a named person the owner is not connected to'), when-not-to-use ('for a connected lead use campaignstack_send_message instead'), and routes to alternatives for bulk sending (campaignstack_add_leads_to_list and campaignstack_trigger_workflow). It also includes prerequisites like confirmed subject/body and explicit user confirmation, making usage boundaries crystal clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_send_messageADestructiveInspect
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_list_inbox_conversations. Read the thread with campaignstack_get_conversation 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_conversation reports delivery. 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: put the leads in a lead list with campaignstack_add_leads_to_list and run a workflow over it with campaignstack_trigger_workflow, which paces the sends and applies the review step the workspace configured. Sending is paced by CampaignStack's own daily and weekly limits and business hours, which are set by a human in the app and are not writable from here; see overrideOwnLimits before asking for an exception.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| attachments | No | Up to 5 files to attach (images or documents). Downloaded server-side and validated against the LinkedIn attachment policy. | |
| conversationRef | Yes | ||
| overrideOwnLimits | No | 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. | |
| dangerouslyBypassSafetySystem | No | Deprecated name for overrideOwnLimits. Use overrideOwnLimits. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| messageEntityUrn | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint:true, readOnlyHint:false, idempotentHint:false), the description discloses that it reaches a real person, that sends are dispatched asynchronously with a messageEntityUrn response and delivery reported via get_conversation, and that sending is paced by business hours and limits. It also details overrideOwnLimits' safety implications and audit logging. This goes well beyond annotation signals without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded with purpose and usage, then flows into behavioral caveats and alternatives. Every sentence carries functional weight, covering safety, async behavior, bulk-loop anti-patterns, and limit overrides. It is structured rather than rambling, though some phrasing could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity and sensitive nature, the description covers prerequisites, suppression rules, user confirmation requirements, async dispatch, delivery reporting, non-bulk constraints, and pacing details. An output schema exists, so return values need not be described, yet messageEntityUrn is mentioned anyway. 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, with attachments and overrideOwnLimits already described in the schema. The description enriches the conversationRef parameter by specifying it comes from list_inbox_conversations, clarifies attachments are public URLs, and expands on the overrideOwnLimits trade-offs. While not every parameter gets new meaning (e.g., text is left to the schema), it adds meaningful semantic guidance for the key parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'send one message into a LinkedIn conversation the owner's connected account is already part of, optionally with attachments given as public URLs.' It clearly differentiates from siblings like send_inmail, send_connection_request, and reply_to_comment by targeting existing conversations and mentioning the conversationRef source.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use instructions: take conversationRef from list_inbox_conversations, read the thread first, and do not send if the last message is the owner's and the other person hasn't responded. It also explicitly says there is no bulk form and directs users to campaignstack_add_leads_to_list and campaignstack_trigger_workflow for list outreach, naming concrete 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_set_account_owner_workspaceAInspect
Set the workspace that owns a LinkedIn account: the one that pays for its maintenance watchers (connection watcher, message watcher, invitation hygiene) and for messages written by hand in the inbox. The target must be one of the workspaces the account is linked to (ACCOUNT_OWNER_NOT_LINKED otherwise) and must not be locked. Read the current owner with campaignstack_get_account (ownerWorkspaceId). Call this when the user wants a different workspace billed for an account's watchers and hand-written sends. It does not link the account to a new workspace or connect one for the first time.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. This workspace will OWN the connected account. | |
| linkedinAccountId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| ownerWorkspaceId | No | |
| previousOwnerWorkspaceId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide generic hints (readOnly=false, idempotent=false, destructive=false), so the description carries the behavioral burden. It discloses the billing/ownership effect, the ACCOUNT_OWNER_NOT_LINKED error condition, the locked-workspace constraint, and what the tool does not do. Minor gaps remain, such as whether the change is immediately reversible, but the important behavior is covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all information-dense. The purpose is front-loaded, followed by constraints, the exact use case, and a clarifying non-goal. No sentence is wasted or redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with an output schema present, the description covers the effect, the prerequisite relationship, an error case, how to read the current owner, and the boundary with link/connect operations. Nothing essential is missing for an agent to decide and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%: workspaceId has a detailed description, while linkedinAccountId has none. The description adds context about ownership and constraints, but it never directly explains linkedinAccountId or how to obtain/validate it. The name and surrounding text make it recoverable, but the description does not fully compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Set the workspace that owns a LinkedIn account'. It defines the scope precisely by explaining the billing consequences, and explicitly differentiates itself from linking/connecting via 'It does not link the account to a new workspace or connect one for the first time.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger condition: 'Call this when the user wants a different workspace billed for an account's watchers and hand-written sends.' It also states prerequisites (target must be linked and not locked), points to campaignstack_get_account for reading the current owner, and names exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_set_account_watcherAInspect
Turn a LinkedIn account's connection watcher, message watcher or own-posts watcher on or off. The first enable creates the agent and its template workflow (welcome messages, reply drafts or engager follow-ups, review-first); later calls resume or pause it. The own-posts watcher finds the account's new posts on LinkedIn every hour, published through CampaignStack or not, and tracks who reacts and comments. Call this when the user names an account and kind to turn on or off; say both before calling, since enabling starts drafting outbound the workspace did not have before. One watcher per kind per account across all workspaces (DUPLICATE_*_EXTERNAL otherwise); needs a live session (AGENT_ACCOUNT_UNAVAILABLE otherwise). Not for other targets: campaignstack_create_signal_agent covers those.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| enabled | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| linkedinAccountId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| agentId | No | |
| created | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only provide basic hints (readOnly=false, openWorld=true, idempotent=false, destructive=false). The description adds substantial behavioral context: first enable creates an agent and template workflow, later calls resume or pause, the own-posts watcher scans hourly even for posts not published through CampaignStack, enabling starts drafting outbound messages, and duplicate watchers trigger DUPLICATE_*_EXTERNAL errors. This goes well 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: core function first, then creation behavior, watcher details, usage warning, uniqueness constraint, prerequisite, and sibling exclusion. No filler or repetition; the structure front-loads the most important information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, stateful mutation tool, the description covers side effects (creating workflows and drafting outbound), lifecycle semantics (first enable vs. later resume/pause), operational behavior (hourly scanning), constraints (one watcher per kind per account), error conditions (DUPLICATE_*_EXTERNAL, AGENT_ACCOUNT_UNAVAILABLE), and exclusions. An output schema exists, so return values do not need to be explained here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, with linkedinAccountId and enabled undocumented in the schema. The description compensates by explaining kind values ('connection watcher, message watcher or own-posts watcher'), the on/off behavior of enabled, and the account-level scope. It does not explicitly name the linkedinAccountId parameter, but 'LinkedIn account' and 'account and kind' make the mapping clear enough.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Turn a LinkedIn account's connection watcher, message watcher or own-posts watcher on or off.' It clearly names the three kinds of watchers and differentiates the tool from siblings by stating 'Not for other targets: campaignstack_create_signal_agent covers those.' This is precise enough for an agent to select it correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit call condition: 'Call this when the user names an account and kind to turn on or off.' It also warns the agent to confirm both before calling because enabling 'starts drafting outbound the workspace did not have before,' and it names the alternative for other targets. Prerequisites like the live-session requirement and the one-watcher-per-kind constraint are also stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_set_agent_exclusionsADestructiveInspect
Replace a signal agent's own (level-1) exclusion list. These ADD to the workspace list and cannot release anything set there: use campaignstack_remove_manual_exclusion_url or campaignstack_toggle_exclusion for that instead. Call this for one agent, and only that agent, to skip people or rules the rest of the workspace still contacts. Pass the complete list, not a delta - whatever you send replaces what is there, and [] clears it. Entry shape matches campaignstack_get_exclusions. Read campaignstack_get_exclusions with level=effective and this signalAgentId to see the merged result.
| Name | Required | Description | Default |
|---|---|---|---|
| exclusions | Yes | The agent's complete level-1 exclusion list, replacing whatever is there. Pass [] to clear. Same entry shape as campaignstack_get_exclusions returns. These ADD to the workspace list; they cannot release a workspace exclusion. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| signalAgentId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| signalAgentId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining that the operation replaces the entire list, that the supplied list is not a delta, that [] clears it, and that level-1 entries are additive to the workspace list and cannot override workspace exclusions. This is exactly the kind of destructive and merge behavior an agent needs to know before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, alternatives, when to use, replacement semantics, clearing behavior, entry shape, and verification path. It is front-loaded with the primary action and keeps critical caveats near to where they are relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation tool with merge semantics and multi-level exclusion behavior, the description is exceptionally complete. It explains what is replaced, what is not possible, when to use it, how parameters behave, and how to verify the result, all without needing to restate output schema details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 67%, the description adds essential parameter meaning: exclusions must be the complete list, [] clears, entry shape matches campaignstack_get_exclusions, and workspaceId behavior is already well documented in the schema. It also reinforces that signalAgentId must refer to one specific agent, which is central to correct invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Replace a signal agent's own (level-1) exclusion list,' clearly stating the verb, resource, and level. It also distinguishes this from workspace-level operations and names the tools that handle releasing workspace exclusions, making it easy to tell apart from sibling exclusion tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to call it for one specific agent when you want to skip people/rules that the rest of the workspace still contacts. It also names alternatives (campaignstack_remove_manual_exclusion_url, campaignstack_toggle_exclusion) for the case where the goal is to release a workspace-level exclusion, and even points to campaignstack_get_exclusions to verify the merged result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_set_workflow_accountsAInspect
Set (or clear) a workflow's act/rotation account pool for a platform. LinkedIn nodes dispatch only on pool accounts (multiple accounts rotate); an EMPTY pool means the workflow never dispatches LinkedIn actions at all, so binding at least one account is required before an enabled workflow can send. Call this when the user asks which LinkedIn account(s) a workflow sends from, or why it is not sending. Also syncs a linked signal agent's acting accounts. It does not enable the workflow, use campaignstack_update_workflow_status for that. Use campaignstack_list_accounts for account ids and campaignstack_get_workflow to inspect the current pool (accountRefs).
| Name | Required | Description | Default |
|---|---|---|---|
| platform | Yes | Platform of the account pool to set | |
| accountIds | Yes | Account ids for the workflow's act/rotation pool. Empty array clears the pool; a pool-less workflow never dispatches actions on this platform. | |
| workflowId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| workflowId | No | |
| accountCount | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important side effects and constraints beyond the annotations: empty pool means the workflow never dispatches LinkedIn actions, at least one account must be bound before an enabled workflow can send, and calling this also syncs a linked signal agent's acting accounts. It also explicitly states it does not enable the workflow. No annotation contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place, covering behavior, usage triggers, side effects, and related tools. It is slightly long and the usage-guidance sentence is a bit convoluted, but it remains well-structured and front-loaded with the core action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema present, the description covers the essential context: what setting vs clearing means, the consequence of an empty pool, the required precondition for dispatching, the side effect on signal agents, what this tool does not do, and where to get account ids and inspect the current pool. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers platform and accountIds well, and the description reinforces the accountIds semantics with 'EMPTY pool means the workflow never dispatches LinkedIn actions at all' and tells the agent to use campaignstack_list_accounts for valid ids. However, workflowId is left undocumented in both the schema and the description, so not every parameter gains additional semantic grounding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Set (or clear) a workflow's act/rotation account pool for a platform.' It also explicitly differentiates itself from related tools by noting it does not enable the workflow and by directing account-id retrieval and pool inspection to other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names alternatives: campaignstack_update_workflow_status, campaignstack_list_accounts, and campaignstack_get_workflow, and gives clear conditions such as 'Call this when the user asks which LinkedIn account(s) a workflow sends from, or why it is not sending.' This is strong guidance, though the phrasing about 'asks which... sends from' slightly blurs the line between inspecting the pool and setting it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_start_connections_exportAInspect
Start an async runner job that exports the 1st-degree LinkedIn connections for the given account as leads. The job runs in the background. Use campaignstack_get_automation_jobs to monitor progress. Each account has ONE connections list per workspace (source 'linkedin_connections'): the first export creates it, every later export refreshes it in place (connections are added, never removed). The job result carries leadListId. Pass keepUpToDate to subscribe the list to new connections. Use campaignstack_list_accounts to find valid accountId values (platform: 'linkedin'). Call this when the user wants an account's connections turned into a lead list. It does not send new connection requests: campaignstack_send_connection_request does that, one at a time.
| Name | Required | Description | Default |
|---|---|---|---|
| listName | No | Name for the connections list. Used only when the account has no connections list in this workspace yet; an existing list keeps its name. | |
| accountId | Yes | ||
| workspaceId | Yes | ||
| keepUpToDate | No | Keep the list current: new connections are added automatically from the account's daily connection read, at no extra LinkedIn activity. Default false (one-shot export). | |
| maxConnections | No | Maximum number of connections to export (default 2500) |
Output Schema
| Name | Required | Description |
|---|---|---|
| jobId | No | |
| status | No | |
| message | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description richly explains behavior beyond the annotations: it clarifies the async background execution, the one-list-per-workspace constraint, that exports are cumulative (connections added, never removed), that the result carries leadListId, and the purpose of keepUpToDate. This provides critical context that annotations alone (readOnlyHint false, destructiveHint false) cannot convey, and it does not contradict any annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but perfectly structured: it opens with the core action, then covers monitoring, list semantics, parameter hints, usage conditions, and exclusions—all in just a few sentences. No filler or redundancy; every sentence earns its place. It's long but front-loaded with the most critical information, making it efficient for an agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (async job, workspace-scoped list, refresh behavior) and the presence of an output schema (which handles return details), the description covers all essential aspects: what it does, how to monitor, how to find parameters, list lifecycle, subscription option, and what it does not do. No critical information for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60% (3 of 5 params have descriptions). The description compensates for the undocumented accountId by explicitly directing users to campaignstack_list_accounts to find valid values. It also clarifies listName behavior (only used when no list exists) which aligns with the schema, and mentions maxConnections default. However, it could add more detail on workspaceId discovery, though the pointers already cover the main ambiguity. Overall, it adds meaningful value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Start an async runner job that exports the 1st-degree LinkedIn connections') with a specific verb and resource, and explicitly distinguishes it from a sibling operation ('It does not send new connection requests: campaignstack_send_connection_request does that'). This gives an agent a precise understanding of what the tool does and how it differs from closely related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance ('Call this when the user wants an account's connections turned into a lead list'), points to the monitoring tool (campaignstack_get_automation_jobs) and the account lookup tool (campaignstack_list_accounts), and clearly states what it does NOT do (send connection requests), routing to the correct alternative. This leaves no ambiguity about when to invoke it versus other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_submit_content_for_approvalAInspect
Submits a draft content post for approval so a person reviews it before it publishes. Call this when the workspace wants a review step instead of scheduling directly. Continue with campaignstack_approve_content_post or campaignstack_reject_content_post. It does not schedule the post: use campaignstack_schedule_content_post to skip review entirely.
| Name | Required | Description | Default |
|---|---|---|---|
| contentPostId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| scheduledAt | No | |
| contentPostId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (all false), so the description carries the burden of behavioral disclosure. It does add that the tool does not schedule and that it initiates a review step, which is useful. However, it does not disclose whether calling it twice is idempotent, what happens if the post is already submitted, or any side effects like notifications. Given the sparse annotations, a 3 is appropriate – it adds some behavioral context but not a rich picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, no filler. The main purpose is front-loaded, usage guidance is immediately given, and the alternative is clearly stated. Every sentence earns its place, and the structure is logical and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with a single parameter and an output schema (which presumably describes the response), the description covers the main use case, when to use it, what it does not do, and next steps. It lacks explicit prerequisites (e.g., the post must be in draft status) and edge cases (e.g., already submitted posts), but these are minor given the simplicity. Overall it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate for the parameter contentPostId. The description only implies it refers to a draft content post, but does not explain how to obtain the ID, whether it must be in a specific state, or any format constraints. With a single parameter, one would expect at least a note that the ID must belong to a draft post. This is a clear gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('submits'), a clear resource ('draft content post'), and the purpose ('for approval so a person reviews it before it publishes'). It explicitly distinguishes itself from scheduling by saying it does not schedule and pointing to campaignstack_schedule_content_post. This is a clear, distinct purpose that an agent can easily act on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Call this when the workspace wants a review step instead of scheduling directly.' It also names the alternative, campaignstack_schedule_content_post, for skipping review, and provides follow-up steps (approve or reject). This is exactly the kind of decision guidance that helps an agent choose correctly.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| route | Yes | The app route or context where the feedback originates (e.g. '/dashboard/campaigns' or 'mcp-agent') | |
| message | Yes | The feedback body text | |
| category | Yes | Feedback category: bug (something broken), feature (new capability request), question (how-to), other | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| reportId | No | |
| submitted | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations show non-readonly and non-destructive side effects, but the description goes further: it reveals that feedback goes to the same store and triggers the same email notification as the in-app widget, and that it won't produce a support ticket or reply. This is valuable behavioral context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core action, then provides usage triggers, behavioral notes, and category details without redundancy. Each sentence contributes necessary information for correct invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a relatively simple tool with a complete input schema, clear annotations, and an output schema present, the description covers intent, trigger conditions, behavior, limitations, and categories. Nothing critical is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 route, message, category, and workspaceId thoroughly. The description reinforces the category names and route intent but does not add substantial new meaning beyond what the schema provides; this aligns with the baseline score for complete schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific action (submit feedback/bug report) and resource (CampaignStack team), and clearly distinguishes from content-creation and support-related siblings by defining the exact user intent it serves. It names the input categories and links them to the product context, so the agent can identify when this tool applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Call this when the user asks to report a bug, request a feature, or send feedback from this conversation.' It also clarifies that this tool does not open a support ticket or return a reply through the connection, which is essential for setting agent expectations and routing correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_sync_lead_to_hubspotADestructiveIdempotentInspect
Sync a single lead into the workspace's connected HubSpot portal (same behavior as the integration:crm_sync workflow node). Call this when the user asks to push one lead into HubSpot now. Many leads: wire the integration:crm_sync node into a workflow instead of looping this tool. Upserts the contact by email (idempotent), optionally associates the lead's company (when a real domain resolves), and optionally logs an outreach note on the contact's timeline. lifecycleStage is NEVER sent unless explicitly provided (downgrade risk on existing CRM contacts). Leads without an email cannot be synced (errorCode no_email). Requires a connected HubSpot integration, so use campaignstack_connect_hubspot first. On success returns the HubSpot contactId (plus companyId/noteId when those steps ran) and a degraded[] list for steps that fell back gracefully (e.g. company_upsert, source_property, note). This path is in beta: it is unit-tested but not yet confirmed inside a real portal's UI, so tell the user to spot-check the first synced contact in HubSpot.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Optional outreach note to log on the contact's HubSpot timeline | |
| leadId | Yes | ||
| leadSource | No | Lead source table (defaults to trying global, then private) | |
| syncCompany | No | Associate the lead's company when a real domain resolves (default true) | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| lifecycleStage | No | HubSpot lifecyclestage to set (e.g. 'lead'). NEVER sent unless provided: sending it can downgrade an existing customer contact |
Output Schema
| Name | Required | Description |
|---|---|---|
| noteId | No | |
| degraded | No | Steps that fell back gracefully |
| companyId | No | |
| contactId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already set idempotent and destructive hints, the description adds substantial operational context: upsert-by-email behavior, lifecycleStage downgrade risk, no_email failure mode, degraded[] fallbacks, and beta status with spot-check instruction. These details go well beyond the structured annotations and do not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries a distinct decision or behavior: when to use, when not to use, preconditions, semantics, return shape, and beta caveat. It is front-loaded and well-ordered, earning its length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with a complex integration, the description covers prerequisites, single-vs-batch routing, error modes, return values, and rollout risk. The output schema exists, and the description still summarizes the key return fields, leaving no obvious gap for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, so the schema already carries most parameter meaning. The description adds useful semantic context around the email-based upsert, optional company association/domain resolution, note timeline logging, and the lifecycleStage never-sent rule, enriching the schema without fully repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Sync a single lead into the workspace's connected HubSpot portal' and explicitly equates it to integration:crm_sync. This clearly differentiates the tool from workflow-node bulk sync, so an agent understands exactly what scope this tool covers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states 'Call this when the user asks to push one lead into HubSpot now' and explicitly tells agents to wire integration:crm_sync into a workflow instead of looping for many leads. It also names the prerequisite to connect HubSpot first, giving a clear decision rule and alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_toggle_automationAInspect
Turn one scheduled automation on or off and report the state it ended in. Call this when the user names an automation and says to pause or resume it; say which one and which direction before calling, because turning one off stops work the workspace expects to happen. It does not stop a run already in flight, and it changes nothing about any other automation.
| Name | Required | Description | Default |
|---|---|---|---|
| automationId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| enabled | No | |
| automationId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond the annotations: it warns that turning off an automation stops expected work, clarifies that an in-flight run is unaffected, and states that other automations are unchanged. The annotation destructiveHint=false is consistent since the action is reversible toggling, not deletion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: what it does, when to call, and what side effects to expect. The key action and direction requirement are front-loaded, and every sentence adds useful information without padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (one parameter) and the description covers the action, usage context, side effects, and outcome. The only missing piece is how to obtain the automationId, but the name itself is self-explanatory and an agent can likely discover it via listing tools. Given the low complexity grade, this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 0%, the description needed to explain the automationId parameter. It mentions 'say which one' but never clarifies that automationId is the required identifier or how to obtain it. The parameter remains poorly documented, leaving the agent to infer the mapping from a user-named automation to an ID.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise action: 'Turn one scheduled automation on or off' and even includes the outcome 'report the state it ended in'. This clearly differentiates it from other pause/resume tools for signal agents and watches, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly defines when to call: 'when the user names an automation and says to pause or resume it'. It also gives an important precondition: 'say which one and which direction before calling', and explains a key consequence (turning one off stops work). This is model guidance with 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_toggle_exclusionAInspect
Enable or disable a workspace exclusion entry without deleting its rules or URLs. Disabled means the people on it become reachable again. Call this to turn a blocklist off or back on temporarily, keeping its contents for later. Use campaignstack_get_exclusions to find exclusionId values. Use campaignstack_list_signal_agents to find signal agents for context.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | Yes | Whether the exclusion should be active | |
| exclusionId | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| enabled | No | |
| exclusionId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds significant behavioral context beyond annotations: it clarifies that toggling does not delete rules/URLs (non-destructive) and describes the side effect of disabling (people become reachable again). This directly compensates for the lack of detail in the annotations (destructiveHint=false is generic).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each serving a purpose: purpose/effect, usage intent, and prerequisite references. No filler, and the most important information (non-destructive toggle) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple toggle operation, the description covers the essential inputs and expected outcome. It mentions how to find exclusionId and the effect of toggling. It doesn't discuss edge cases like toggling an already-disabled entry, but that is a minor omission given the simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers enabled and workspaceId but not exclusionId; the description fills that gap by pointing to get_exclusions to find exclusionId values. It also reinforces the meaning of enabled. This adds value beyond the schema's existing descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (toggle enable/disable), the resource (workspace exclusion entry), and a key constraint (without deleting rules or URLs). It also explains the practical effect (disabled makes people reachable) and distinguishes from deletion operations, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear when-to-use guidance ('Call this to turn a blocklist off or back on temporarily') and directs to sibling tools for prerequisites (get_exclusions for IDs, list_signal_agents for context). It does not explicitly state when not to use it, but the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_trigger_icp_scoringAInspect
Score specific leads, or every lead in the campaign, against one ICP and persist the results. Call this when the user asks to (re)score leads, e.g. after campaignstack_update_icp changes criteria. Read results with campaignstack_get_icp_scores. Use campaignstack_list_icps to find ICP IDs first.
| Name | Required | Description | Default |
|---|---|---|---|
| icpId | Yes | ||
| leadIds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| icpId | No | |
| scheduled | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, so the write nature is known. The description adds that results are 'persist[ed]' and that scoring is against 'one ICP', which is useful behavioral context. It does not mention whether existing scores are overwritten or whether the operation is asynchronous, but it does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: the action, the trigger condition, the read-after tool, and the prerequisite list. No fluff or redundancy. Information is front-loaded with the core behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers prerequisites and follow-up steps well, and an output schema exists. However, it does not disclose whether scoring runs synchronously or asynchronously (suggested by 'trigger' in the name), nor does it explain the campaign context for 'every lead in the campaign'. For a tool of this complexity, these are notable but minor omissions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the parameter meaning. It does this effectively: 'specific leads' maps to the optional leadIds array, 'every lead in the campaign' implies the omitted leadIds behavior, and 'one ICP' maps to the required icpId. However, it does not clarify how the campaign is selected when leadIds is omitted, leaving a minor gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Score specific leads, or every lead in the campaign, against one ICP and persist the results.' It clearly distinguishes scoring from reading results via campaignstack_get_icp_scores, and the write/persist nature is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states exactly when to call the tool ('when the user asks to (re)score leads'), gives a concrete example (after campaignstack_update_icp changes criteria), and directs the agent to the correct alternatives for reading results (campaignstack_get_icp_scores) and prerequisites (campaignstack_list_icps). This leaves no ambiguity about when or how 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_trigger_workflowAInspect
Trigger workflow execution for specific leads or all leads in the workflow's lead list. Call this when the user asks to start or re-run a workflow over its leads (or a named subset). Leads are set to 'waiting' status at the workflow entry node and will be processed by the workflow executor, on the pacing and review steps that workflow's own graph and enabled state define. Use campaignstack_list_workflows to find workflow IDs, and campaignstack_get_lead_list to see available leads. To chain workflows FROM INSIDE a workflow, use the integration:add_to_sequence node with provider campaignstack instead; unlike this tool it never re-triggers a lead that already entered the target workflow (loop-safe once-ever semantics).
| Name | Required | Description | Default |
|---|---|---|---|
| leadIds | No | ||
| workflowId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| triggered | No | |
| workflowStatus | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that leads are set to 'waiting' status, that processing follows the workflow's graph/enabled state, and that unlike the add_to_sequence integration this tool can re-trigger leads already in the target workflow. This gives agents a clear model of the side effects. It stops short of describing scheduling details or failure behavior, but the annotations and output schema cover some of that ground.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but every sentence earns its place: primary action, trigger condition, scope options, supporting lookup tools, and an explicit alternative with its key semantic difference. Key information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a clear action, scope semantics, behavioral side effects, pointer to supporting tools, and an explicit alternative, the description fully equips an agent to decide when and how to call this tool. The output schema exists, so return-value details are not required here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so by explaining the two execution scopes ('specific leads or all leads') and the 'named subset' concept, which maps directly to the optional leadIds parameter. It also directs users to list_workflows and get_lead_list for finding valid values. It does not restate schema types, but adds meaningful semantic framing that the schema alone lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Trigger workflow execution for specific leads or all leads in the workflow's lead list.' It also clarifies the re-run use case and the named-subset option, making it clearly distinguishable from the many sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger condition ('Call this when the user asks to start or re-run a workflow over its leads'), points to companion tools for finding IDs and leads, and explicitly names the alternative for chaining workflows from inside a workflow, including why that alternative should be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_unarchive_campaignAInspect
Unarchive a campaign, bringing it back into active views. Re-evaluates search watches. Call this when the user asks to bring back an archived campaign. IMPORTANT: this does NOT restart the workflows and automations that archiving stopped - they stay paused and disabled, and each has to be re-enabled deliberately with campaignstack_update_workflow_status or campaignstack_toggle_automation. That is on purpose: silently resuming outbound work as a side effect of un-hiding a campaign would start messaging real people. Use campaignstack_list_campaigns with includeArchived to find archived campaigns. If the campaign is not found, use campaignstack_list_campaigns to find valid IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| archived | No | |
| campaignId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only sparse annotations (all false flags), the description fully compensates by disclosing key side effects: it re-evaluates search watches and, critically, does NOT resume paused workflows/automations. It even explains the rationale (avoiding silently messaging real people), which is valuable behavioral context beyond any structured field.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly five sentences, each earning its place. It front-loads the main action, then adds a clearly framed IMPORTANT caveat, then gives lookup and error-recovery guidance. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one simple parameter, the description covers purpose, scope, side effects, related tools, and error handling. It also references the output schema (not shown here) and gives enough context to call correctly. No significant gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the only parameter (campaignId) has no description in the schema. The description compensates by telling the agent to use campaignstack_list_campaigns to find valid IDs if the campaign isn't found, which helps with parameter values. However, it doesn't explicitly define what campaignId is (e.g., unique campaign identifier) beyond the name, so it's not a full semantic description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Unarchive a campaign, bringing it back into active views.' It clearly distinguishes this from archive_campaign and other campaign-related tools, and the sibling list includes both archive and update tools, so an agent can tell this apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call it: 'Call this when the user asks to bring back an archived campaign.' It also gives strong when-not guidance by warning that this tool does NOT restart workflows/automations and points to the correct alternatives (campaignstack_update_workflow_status, campaignstack_toggle_automation). It additionally directs the agent to campaignstack_list_campaigns for finding archived campaigns or valid IDs if not found.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_unlink_lead_profileAInspect
Detach a platform profile from a PRIVATE lead into a new standalone lead in the same workspace. Nothing collected about the person is deleted; the profile row is repointed at the new lead. Returns the new lead's id. API-key callers may only unlink on private leads. Call this when a linked profile actually belongs to a different person. It does not delete anything: campaignstack_link_lead_profile is the reverse move.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | Private lead id currently holding the profile | |
| platform | Yes | Platform of the profile being detached | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| newLeadId | No | The lead the unlinked profile now lives on |
| leadSource | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructiveHint=false, but the description adds meaningful behavioral context: nothing collected is deleted, the profile row is repointed, the new lead id is returned, and API-key callers are restricted to private leads. This is genuinely useful beyond the structured annotations and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying distinct value: the core action, the non-destructive behavior, the return value, and the usage trigger. The 'does not delete anything' sentence slightly reinforces the earlier non-deletion statement but serves as a useful safety emphasis.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema and fully covered parameters, the description explains the behavioral effect, the auth restriction, and the intended use case. 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.
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 leadId, platform, and workspaceId. The description reinforces that the lead must be private and that unlink operates within the same workspace, but it does not add new parameter-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Detach'), resource ('platform profile'), source ('PRIVATE lead'), and result ('new standalone lead in the same workspace'). It also explicitly distinguishes itself from the reverse move, campaignstack_link_lead_profile, so an agent can tell them apart immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear invocation trigger: 'Call this when a linked profile actually belongs to a different person.' It also names the reverse alternative and gives an important constraint ('API-key callers may only unlink on private leads'), so the agent knows both when and when-not to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_unschedule_content_postAInspect
Moves a scheduled content post back to draft, clearing the scheduled time so it will not publish. Call this when the user asks to pull a queued post before it goes out. Reschedule it later with campaignstack_schedule_content_post. It does not touch a post that already published: there is no way to unpublish that.
| Name | Required | Description | Default |
|---|---|---|---|
| contentPostId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| scheduledAt | No | |
| contentPostId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations only indicate the operation is not read-only, not destructive, and not idempotent. The description adds valuable behavioral context: the post transitions from scheduled to draft, the scheduled time is cleared, and published posts cannot be affected or unpublished. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences with no filler. The action and consequence are front-loaded, followed by the usage trigger, the rescheduling alternative, and the published-post limitation. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter mutation with an output schema and abundant sibling context, the description covers the state change, the trigger condition, the reverse action, and the key limitation. An agent has everything needed to decide whether to invoke this tool and what parameter to pass.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description has to compensate for the single required parameter, contentPostId. It implicitly identifies the object as the 'scheduled content post' being moved, but it never names or explains the parameter or how the ID is obtained. For a single self-describing parameter this is adequate but not strong.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: 'Moves a scheduled content post back to draft, clearing the scheduled time so it will not publish.' This clearly distinguishes it from sibling tools like campaignstack_schedule_content_post, campaignstack_approve_content_post, and campaignstack_edit_scheduled_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to call it: 'Call this when the user asks to pull a queued post before it goes out.' It also names the alternative for the reverse action, campaignstack_schedule_content_post, and states the boundary that this tool 'does not touch a post that already published.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_campaignAInspect
Update a campaign's title, description, outreach intents, campaignGuidance (tone and tactics, appended below the workspace playbook) or offerAddendum (what it offers beyond the workspace offer). Only provided fields change. Call this after reading current values with campaignstack_get_campaign. It does not touch the ICP or lead lists: use campaignstack_update_icp or campaignstack_update_lead_list for those.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | ||
| campaignId | Yes | ||
| description | No | ||
| offerAddendum | No | What this campaign can offer that the workspace offer does not, e.g. a free audit or a sample report. Rendered inside COMPANY CONTEXT as fact, so the craft may promise it; anything not stated in the offer or here is invented and the craft is told to drop it. Facts only, never tone (tone is campaignGuidance). Pass an empty string to clear it. | |
| outreachIntents | No | An UNRANKED menu of acceptable outcomes for this outreach. Answers 'why are we writing to these people': a message with no stated purpose reads as a compliment plus an open question. The craft picks the outcome this reader and this thread can plausibly give and says the reason in its own words, and it switches when the lead's own words open another door, so order carries no meaning and listing several is how a non-buyer still gets a relevant message. Resolution is workspace then campaign then workflow, and the narrowest non-empty list REPLACES the wider ones rather than merging, so setting it here overrides the level above. Pass an empty array to clear this level and fall back. | |
| campaignGuidance | No | Tone and tactics for this campaign only, APPENDED below the workspace playbook (it never stands alone). Read the workspace playbook first with campaignstack_get_playbook and write only what differs for this audience. Pass an empty string to clear it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| goal | No | |
| title | No | |
| createdAt | No | |
| updatedAt | No | |
| archivedAt | No | |
| icpSummary | No | |
| description | No | |
| workspaceId | No | |
| leadListCount | No | |
| offerAddendum | No | |
| workflowCount | No | |
| campaignGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide no safety hints (all false), so the description carries the burden. It discloses the partial-update behavior ('Only provided fields change') and boundaries (doesn't affect ICP/lead lists). It also adds context for campaignGuidance (appended below the workspace playbook) and offerAddendum (what it offers beyond workspace offer). No contradictions 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no fluff, front-loaded with the core function and fields. The boundary statement is placed at the end but is still concise. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 6 parameters and an output schema, the description is fairly complete. It covers prerequisites (read current values), what it updates, and what it doesn't. The schema provides detailed semantics for outreachIntents, and the description adds context for campaignGuidance and offerAddendum. It could explicitly mention reversibility or side effects, but those are not critical for selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50%, but the description adds meaning for the two most complex parameters: campaignGuidance (tone/tactics appended below playbook) and offerAddendum (beyond workspace offer). It also clarifies the partial-update semantics for all fields. This compensates for the lack of schema descriptions on title, description, and campaignId, which are self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'Update' and the resource 'campaign', enumerating the specific fields (title, description, outreach intents, campaignGuidance, offerAddendum). It distinguishes from siblings by explicitly naming what it does NOT touch (ICP, lead lists) and pointing to alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Call this after reading current values with campaignstack_get_campaign.' It also gives when-not-to-use and alternatives: 'It does not touch the ICP or lead lists: use campaignstack_update_icp or campaignstack_update_lead_list for those.' This leaves no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_campaign_weightAInspect
Update the weight (score impact) of a signal type for a campaign. Call this when the user names a signal type and a new score impact; read current weights first with campaignstack_get_campaign_weights. This changes future scoring only, not existing lead scores.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | ||
| signalType | Yes | ||
| scoreImpact | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| success | No | |
| signalType | No | |
| scoreImpact | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this is a write (readOnlyHint=false). The description adds meaningful context by clarifying that the change affects 'future scoring only, not existing lead scores,' and by requiring a pre-read step. This is useful behavioral nuance 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The purpose, trigger condition, prerequisite read, and side-effect scope are all packed efficiently, with the main operation stated first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a targeted update tool with an output schema and 3 required parameters, the description covers the core behavior, the prerequisite, and the side-effect boundary. The only notable gap is the absence of guidance on accepted signalType values, but that may be intentionally domain-specific.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for parameter meaning. It clarifies that scoreImpact is the 'score impact' weight and that signalType is a type of signal, but it does not explain valid signalType values or anything more specific about campaignId/scoreImpact semantics. The schema's numeric bounds are the only constraint info available.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Update') and a precise resource ('the weight (score impact) of a signal type for a campaign'). It also names the sibling tool for reading weights, distinguishing it from the many other update/get campaign tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to call: 'when the user names a signal type and a new score impact.' It also gives a clear precondition: 'read current weights first with campaignstack_get_campaign_weights.' This is actionable and leaves 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_update_company_metadataAInspect
Update workspace-level metadata (notes and tags) on a company. Only provided fields are updated. Works for shared companies and imported (workspace-scoped) companies; a company can be annotated even before any lead links it to the workspace. Call this when the user asks to tag or note a company; it does not touch industry, employee range or any other company fact, which are read-only here. Use campaignstack_get_company or campaignstack_list_companies to find company IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| notes | No | ||
| companyId | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| changed | No | |
| success | No | |
| companyId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate this is a write operation (readOnlyHint false) but the description adds crucial behavioral detail: 'Only provided fields are updated' clarifies partial-update semantics, and it explains that a company can be annotated before any lead links it. While it doesn't mention idempotency or explicit side effects, the annotations already cover the read-only/destructive hints, and the description adds value beyond them. A small gap is that it doesn't specify whether existing tags/notes are merged or replaced when both are provided, but 'only provided fields are updated' implies non-provided fields remain unchanged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise (four sentences) and front-loaded with the core purpose and scope. It efficiently covers usage, exclusions, and alternatives without extraneous detail. Every sentence earns its place, and the structure logically flows from action to scope to guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (has output schema: true) and annotations that cover safety hints, the description provides a complete picture for an agent to decide when and how to call the tool. It covers purpose, scope, exclusions, and ID lookup. It does not mention potential errors or permission requirements, but those are likely not critical for this mutation. It is slightly less complete than a 5 because it omits details about how tags and notes interact (e.g., whether tags replace or append), which could affect invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% (only workspaceId has a description), so the description must compensate. It mentions 'notes and tags' which maps to the tags and notes parameters, and indirectly references companyId via 'find company IDs'. However, it does not explain the array format of tags (e.g., whether they are replaced or merged) or the meaning of notes beyond the schema's type constraints. The partial-update note adds some semantic value, but not enough to fully compensate for the low schema coverage. It is adequate but not exceptional.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb (update), the resource (workspace-level metadata on a company), and the specific fields (notes and tags). It distinguishes itself from siblings by explicitly stating it does not touch industry, employee range, or other company facts, and by naming alternatives for reading company data. The phrase 'Call this when the user asks to tag or note a company' directly ties the tool to a user intent, leaving no ambiguity about 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('Call this when the user asks to tag or note a company'), what it does not do ('does not touch industry, employee range or any other company fact'), and how to find the required company IDs ('Use campaignstack_get_company or campaignstack_list_companies'). It also clarifies applicability to shared and imported companies, providing comprehensive routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_competitor_watch_accountsAInspect
Replaces the LinkedIn accounts a competitor watch reads and acts with. Updates the bound signal agent's read and act pools, its workflow, and the discovery pool. Requires at least one account. Use campaignstack_list_accounts to find valid account IDs. Call this when the user wants a watch to read from or act through different connected accounts. It does not connect a new LinkedIn account: that happens in the CampaignStack app.
| Name | Required | Description | Default |
|---|---|---|---|
| watchId | Yes | ||
| accountIds | Yes | LinkedIn account IDs the watch reads and acts with. Replaces the current selection. Use campaignstack_list_accounts to find valid IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| watchId | No | |
| accountIds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-read-only, non-idempotent, non-destructive operation. The description adds valuable context by detailing the side effects: it updates the bound signal agent's read and act pools, workflow, and discovery pool. It also clarifies what it does NOT do (connecting accounts). This goes beyond the annotations, though it doesn't address reversibility or concurrency, so a 4 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is five sentences, each with a distinct purpose: primary action, secondary effects, requirement, resource pointer, and usage trigger. It is front-loaded with the core replacement action and avoids redundancy or filler. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a moderately complex update tool, the description covers the action, prerequisites, how to obtain valid inputs, when to invoke it, and a key exclusion (no account connection). The presence of an output schema means return details need not be in the description. An agent has everything needed to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 50% (only accountIds is described). The tool description compensates by explaining that accountIds are the LinkedIn accounts replacing the current selection, and implies watchId is the target competitor watch. This provides meaning beyond the raw schema, though watchId semantics rely on context. Since coverage is not high (>80%), the description adds necessary value, warranting a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening phrase 'Replaces the LinkedIn accounts a competitor watch reads and acts with' is a specific verb+resource statement that clearly defines the operation. It differentiates from sibling tools like campaignstack_link_account_to_workspace by explicitly stating it does not connect a new LinkedIn account, and from get/update competitor watch tools by specifying the account replacement scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 wants a watch to read from or act through different connected accounts.' Also provides a prerequisite (requires at least one account) and a concrete pointer to campaignstack_list_accounts for valid IDs, plus a negative clarification (does not connect a new account). This fully covers when and how to use the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_content_postAInspect
Updates a draft or scheduled content post's wording, media, or tags; pass only the fields to change (tags replaces the whole array). Call this when the user asks to edit a post that has not published yet. It does not move the post between statuses: use campaignstack_schedule_content_post, campaignstack_submit_content_for_approval, or campaignstack_unschedule_content_post for that.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| tags | No | ||
| mediaIds | No | ||
| postType | No | ||
| contentPostId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | No | |
| contentPostId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish mutation and non-idempotency, and the description adds valuable behavioral context: partial updates, tags replacing the entire array, and the fact that the post's status is never changed. It also clarifies the draft/scheduled scope, which goes beyond what the schema or annotations reveal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three focused sentences front-load the action and update semantics, then provide the call condition, then list exclusions with alternatives. There is no filler and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a patch-style tool with an output schema present and a required ID visible in the schema, the description covers the usage boundary, partial-update behavior, and sibling routing. The postType omission is partially compensated by its enum in the schema, so an agent can still construct valid calls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds important semantics like partial updates and tags-replace-whole-array, which is helpful given 0% schema description coverage. However, it does not mention the postType parameter or explicitly state whether mediaIds also replaces the whole array, leaving a meaningful gap for parameter selection.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Updates a draft or scheduled content post's wording, media, or tags.' It also differentiates from siblings by explicitly listing what the tool does not do, avoiding confusion with schedule, submit, unschedule, or delete tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger: call this 'when the user asks to edit a post that has not published yet.' It also names the alternatives for status changes, so the agent knows exactly when not to use this tool and which sibling to route to instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_conversation_voiceAInspect
Edit one language of a voice profile: the core, the overlays map, the readable summary, or the active flag. Call this only after the user approves a specific change; send the FULL core or overlays object back (a partial object replaces the whole state). Use campaignstack_revert_voice to undo. The write is validator-enforced and versions the previous state. Removing an exemplar here is remembered across re-extractions. Every overlay field you change is recorded as authored and a later re-extraction leaves exactly those fields alone; origin and authoredFields are server-owned and ignored on input. greetings and signOffs hold short habits (one line, under 80 characters), not whole messages.
| Name | Required | Description | Default |
|---|---|---|---|
| core | No | The full core object; read it first, edit fields, send it back whole. | |
| active | No | Turn this language's voice on or off for every craft | |
| language | Yes | ISO 639-1 language of the profile to edit | |
| overlays | No | The full overlays map keyed by situation (e.g. linkedin:dm:cold); send it back whole. | |
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| readableSummary | No | ||
| linkedinAccountId | Yes | LinkedIn account id |
Output Schema
| Name | Required | Description |
|---|---|---|
| version | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only signal that this is a non-read, non-idempotent write, so the description carries the behavioral burden. It discloses whole-state replacement, validator enforcement, versioning of previous state, cross-re-extraction memory for removed exemplars, authored-field tracking, and server-owned fields that are ignored on input. No contradiction with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries operational weight. It is front-loaded with the core action and then covers the most important behavioral caveats without padding. The length is justified by the number of non-obvious rules an agent must respect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the nested input schema and presence of an output schema, the description covers the non-obvious operational risks: full replacement semantics, undo path, validation, versioning, server-owned fields, and field-level authored tracking. Nothing needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is high at 86%, the description adds critical meaning beyond the schema: a partial core or overlays object replaces the full state, greetings and signOffs are constrained to short one-line habits, and origin/authoredFields are server-owned and ignored on input. These semantics materially affect how an agent should construct the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (edit), a scoped resource (one language of a voice profile), and enumerates the editable components: core, overlays map, readable summary, and active flag. This clearly differentiates it from read-only siblings like campaignstack_get_conversation_voice and from the associated revert/undo tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly gates invocation on prior user approval, mandates full-object submission instead of partial updates, and names a concrete alternative for undoing the change: campaignstack_revert_voice. This is explicit when-to-use and undo guidance with no reliance on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_filter_exclusion_rulesAInspect
Replace the whole rule set of a filter-type signal exclusion. Filter exclusions skip leads matching attribute rules (e.g. companyName contains 'Acme') during signal agent processing and before outreach dispatch. Rules combine with the given logic; prefer 'or' for blocklists. 'and' across several values of the same field can never match. Call this to change what a rule matches; for named people by URL, use campaignstack_add_manual_exclusion_urls instead. Replaces the rules, not a delta. Use campaignstack_get_exclusions to find exclusionId values of filter-type entries.
| Name | Required | Description | Default |
|---|---|---|---|
| logic | No | How rules combine. Use 'or' for a blocklist of alternatives (exclude leads matching ANY rule). 'and' requires ALL rules to match one lead at once and is unsatisfiable for several values of the same field. | or |
| rules | Yes | Complete replacement rule set | |
| exclusionId | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| logic | No | |
| rules | No | |
| exclusionId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds key behavioral details beyond the sparse annotations (all false): it explicitly states that the operation replaces the entire rule set rather than applying a delta ('Replaces the rules, not a delta'), and explains the logical consequence of combining rules with 'and' (unsatisfiable for multiple values of the same field). It also clarifies the context of filter exclusions in the processing pipeline. It does not, however, describe side effects on active signal agents or any permission requirements, but given the mutation nature, the provided info 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise yet information-dense. It front-loads the core action, then provides context, logic guidance, alternative routing, replacement semantics, and ID lookup instruction—all in a tight, well-ordered sequence. Every sentence contributes value with no redundant content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that replaces a rule set, the description covers the essential aspects: purpose, usage, logic pitfalls, alternatives, and how to find the required ID. It leverages the schema for parameter details and the output schema for return values. It does not mention error handling or edge cases like empty rules, but those are minor given the completeness of the rest.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description adds meaning beyond the schema for the 'logic' and 'rules' parameters. It explains the semantics of 'or' as a blocklist and warns about the impossibility of 'and' for multiple values of the same field. It also clarifies the role of exclusionId by pointing to the lookup tool. The workspaceId parameter is covered by schema, but the description doesn't add to it; however, the overall parameter understanding is enhanced by the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Replace the whole rule set of a filter-type signal exclusion.' It specifies the exact resource (filter-type signal exclusion) and action (replace), and provides an example ('companyName contains Acme') to illustrate the rule semantics. It also distinguishes itself from sibling tools by explicitly naming campaignstack_add_manual_exclusion_urls as the alternative for named people by URL, making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: when to use this tool ('Call this to change what a rule matches') and when not to ('for named people by URL, use campaignstack_add_manual_exclusion_urls instead'). It also instructs how to obtain the required exclusionId ('Use campaignstack_get_exclusions to find exclusionId values') and provides logic best practices ('prefer 'or' for blocklists; 'and' across several values of the same field can never match'). This is thorough and prevents misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_icpAInspect
Update an existing ICP's criteria. Only supply the fields you want to change; omitted fields are left unchanged. Call this when the user asks to narrow, widen, or correct who an ICP targets. This invalidates cached scores; rescore with campaignstack_trigger_icp_scoring. Use campaignstack_list_icps to find ICP IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| icpId | Yes | ||
| titles | No | ||
| keywords | No | ||
| siteFacts | No | Target on what the company's own website says. Every filter you set has to hold. A company whose site has not been read, or whose reading is silent on what you asked, is neither matched nor penalised. | |
| industries | No | ||
| seniorities | No | ||
| companySizes | No | ||
| fitStatement | No | One line describing the company worth working, judged later against a real company's own words. Say what they do, who they sell to, roughly what size, and what has to be true for them to need this. Over 300 characters is rejected, never shortened. |
Output Schema
| Name | Required | Description |
|---|---|---|
| icpId | No | |
| success | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are present (readOnlyHint=false, destructiveHint=false), but the description adds critical behavioral context: 'This invalidates cached scores; rescore with campaignstack_trigger_icp_scoring.' It also discloses partial-update behavior. No contradiction with annotations. The description goes beyond the structured annotations by explaining consequences of the mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose. Each sentence earns its place: the action, the partial-update semantics, when to use it, the side effect and follow-up, and how to find IDs. Zero waste, highly readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values need not be described. The description covers the main usage, partial-update behavior, cache invalidation, and how to locate ICP IDs. It does not address edge cases like calling with only icpId (no changes) or behavior when no criteria are supplied, but these are minor given the presence of an output schema and clear guidance.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 25% (only siteFacts and fitStatement have descriptions). The description does not elaborate on individual parameters beyond 'criteria', relying on the schema for field semantics. It does add the crucial note about omitted fields being unchanged, but that is more behavioral than parameter-specific. Given the low schema coverage, the description could compensate by summarizing the criteria types, but it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: 'Update an existing ICP's criteria.' It clearly identifies the resource (ICP) and the operation (update). It distinguishes from siblings like create_icp, delete_icp, and list_icps by mentioning how to find IDs (use campaignstack_list_icps) and the follow-up action (trigger_icp_scoring). No ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use: 'Call this when the user asks to narrow, widen, or correct who an ICP targets.' Also explains the partial update semantics: 'Only supply the fields you want to change; omitted fields are left unchanged.' Points to alternatives for finding ICP IDs and for rescoring after the update. Clear context and exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_lead_contact_infoAInspect
Save extracted contact information (email, phone, website) to a lead. Called by the linkedin-contact-info agent after extracting data from LinkedIn's Contact Info overlay. Only provided fields are updated; omitted fields are left unchanged. Call this after that agent reads the overlay, or when the user supplies contact details by hand. It does not look the lead up by name: campaignstack_search_leads does that first.
| Name | Required | Description | Default |
|---|---|---|---|
| No | |||
| phone | No | ||
| leadId | Yes | ||
| website | No | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| leadId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate this is a mutation (readOnlyHint false, destructiveHint false) without further detail. The description adds meaningful behavioral context: 'Only provided fields are updated; omitted fields are left unchanged.' This clarifies partial-update semantics beyond what annotations convey. It could go further by stating whether existing values are overwritten or how errors are handled, but the core behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with zero filler. The primary action is front-loaded, followed by usage context, then a clear distinction from a sibling tool. Every sentence earns its place, making it easy for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one required parameter, partial update behavior) and the presence of an output schema, the description is nearly complete. It covers what, when, and how the tool behaves. It does not explicitly state that leadId must reference an existing lead (found via search_leads), but this is implied by the workflow described. A slightly more explicit precondition would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 20% (only workspaceId is documented). The description compensates by explicitly naming email, phone, and website as the contact fields being saved, and implies leadId is the target lead. It also clarifies that these fields are optional and partial updates are allowed. This adds meaning beyond the sparse schema, though it does not delve into formats or edge cases.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Save extracted contact information (email, phone, website) to a lead.' It clearly identifies the tool's function and explicitly distinguishes it from campaignstack_search_leads, which handles lookup. This is far from a tautology and leaves no ambiguity about the tool's core purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: 'Call this after that agent reads the overlay, or when the user supplies contact details by hand.' It also states an exclusion: 'It does not look the lead up by name: campaignstack_search_leads does that first.' This effectively routes the agent to the correct tool for lookup vs. update, which is exactly what a strong usage guideline should do.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_lead_listAInspect
Rename a lead list and/or update its query predicate. Setting a query converts the list to query type. Call this to rename a list or change what a query list matches. For a static list's membership, use campaignstack_add_leads_to_list or campaignstack_remove_leads_from_list instead. Use campaignstack_list_lead_lists to find valid lead list IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| query | No | ||
| leadListId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| success | No | |
| leadListId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, so the description carries the burden. It discloses a key side effect: setting a query converts the list to query type. However, it does not explain the consequences of the conversion, such as whether existing manual membership is lost or how query changes affect list membership. This leaves an agent uncertain about the mutational impact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five sentences with no filler; it front-loads the core action and then adds alternatives and ID guidance. Each sentence serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with a nested query parameter and output schema, the description covers the operational context: what it does, when to call it, and how to get IDs. It lacks only minor edge-case warnings (e.g., empty update calls), but overall it is sufficient for an agent to invoke the tool successfully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must add meaning. It explains leadListId by pointing to campaignstack_list_lead_lists, and conveys that name maps to renaming and query maps to the query predicate. But it does not elaborate on the query object's internal fields (include, exclude, filter, logic), which are critical for constructing a valid query.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Rename a lead list and/or update its query predicate') and clearly distinguishes it from sibling tools by noting it is not for static list membership changes. This enables an agent to differentiate it from add/remove leads tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool ('Call this to rename a list or change what a query list matches') and provides alternatives for static list membership ('use campaignstack_add_leads_to_list or campaignstack_remove_leads_from_list instead'), plus guidance for obtaining IDs. This fully covers when vs alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_lead_metadataAInspect
Update user-level metadata (notes and tags) on a lead. Only provided fields are updated. Use campaignstack_search_leads or campaignstack_get_lead to find lead IDs. Call this when the user wants to leave a note or tag on a lead already found. It does not change contact info: campaignstack_update_lead_contact_info does that.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | ||
| notes | No | ||
| leadId | Yes | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | No | |
| notes | No | |
| leadId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds the partial-update behavior ('Only provided fields are updated') and the boundary that contact info is not modified. Annotations only state readOnly=false, destructive=false, idempotent=false; the description adds meaningful non-annotation behavior without contradicting those hints. It does not detail tag replacement semantics or auth/rate limits, but the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each with distinct value: what it does, partial update, how to find leadId, and what it doesn't do. No redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a metadata-update tool with output schema and basic annotations, the description covers purpose, when to use, how to identify the target, and the key boundary. It leaves workspaceId semantics to the schema and doesn't explicitly spell out whether tags are replaced or merged, but 'Only provided fields are updated' mitigates that. Overall adequate for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 25% (only workspaceId described). Description clarifies 'notes and tags' as the user-level metadata being updated and implies leadId by referencing lead IDs. It also communicates partial update per-field, which is parameter behavior. However, it doesn't explain workspaceId or tag array behavior in detail; the schema description covers workspaceId. So it adds some, but not full, compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Update user-level metadata (notes and tags) on a lead.' It explicitly distinguishes from the sibling update_lead_contact_info by noting it does not change contact info, and names search/get tools for finding lead IDs. This differentiates it clearly from the large sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Call this when the user wants to leave a note or tag on a lead already found.' It also gives alternatives for finding lead IDs via campaignstack_search_leads/campaignstack_get_lead, and contrasts with the sibling for contact info. This is explicit when/when-not guidance with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_member_roleAInspect
Set a member's role to 'member'. Call this only when the user names the person and says to demote them; name them back before calling. It cannot grant admin or ownership: that needs the workspace settings UI. Use campaignstack_list_members to find member IDs.
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | Only "member" can be set via MCP | |
| memberId | Yes | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. |
Output Schema
| Name | Required | Description |
|---|---|---|
| role | No | |
| memberId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false and thus not informative, so the description carries the burden. It adds useful behavioral context: the role can only be set to 'member', admin/ownership is out of scope, and the member must be named back before calling. It does not mention side effects or reversibility, but the core behavioral boundary is clearly disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action, then usage conditions, limitations, and a pointer to the relevant sibling. Every sentence adds necessary information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating role tool, the description covers when to call it, what it cannot do, where to find a required ID, and the only allowed role value (reinforced by the schema). An output schema exists, so return-value details do not need to be in the description. Nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema describes role and workspaceId well (67% coverage), but memberId is only minLength. The description compensates by telling the agent to use campaignstack_list_members to find member IDs, adding meaning beyond the raw schema for the least-documented parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Set a member's role to member.' It immediately distinguishes itself from role-granting operations by stating it cannot grant admin or ownership, so an agent can tell exactly what this tool does and what it does not do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit call conditions: only when the user names the person and says to demote them. It also states the negative case (cannot grant admin/ownership) and points to the correct alternative for that case (workspace settings UI), plus names the sibling campaignstack_list_members for finding member IDs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_notification_preferencesAInspect
Update the calling user's notification email preferences. Call this when the user asks to turn a category of email on or off. Set a category's email delivery globally (omit workspaceId) or as a per-workspace override (pass workspaceId); pass clear=true to remove a stored deviation so resolution falls back from workspace to global to the default. Also toggles the weekly report via weeklyReport. Requires a USER API key (csu_). Categories: account_health, billing, reviews, engagement, workflow, reports. It changes only the caller's own preferences, never another member's. Use campaignstack_get_notification_preferences to inspect current values.
| Name | Required | Description | Default |
|---|---|---|---|
| clear | No | ||
| value | No | ||
| category | No | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| weeklyReport | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate readOnlyHint false and destructiveHint false, so the description carries the burden. It discloses the mutation effect, scope (only caller), API key requirement, and the fallback resolution logic for clear=true. It does not contradict annotations and adds meaningful behavioral context beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but every sentence carries useful information, with the main purpose front-loaded. It is well-structured, though slightly long; a minor tightening could improve it, but it remains efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
It covers the purpose, usage triggers, parameter behavior, key requirements, scope, and points to the getter. The main gap is the category list discrepancy (description lists 5 categories while schema enum has 7), which could mislead an agent into thinking meetings and signals are invalid. Otherwise, it is comprehensive for a complex tool with an output schema present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 20% schema description coverage, the description compensates fully: it explains the category semantics (listing categories, though omitting 'meetings' and 'signals' from the enum), the meaning of value (on/off), the clear flag behavior, weeklyReport, and the workspaceId distinction. This adds substantial meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (update), the resource (calling user's notification email preferences), and the scope (only the caller's). It explicitly differentiates from the sibling getter by directing to campaignstack_get_notification_preferences for inspection, making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear trigger ('when the user asks to turn a category of email on or off') and explains the global vs per-workspace distinction, the clear flag behavior, and the API key requirement. It also points to the alternative for inspecting values, giving solid usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_personaAInspect
Update a persona's name, description, pain points, goals, or objections; only provided fields change. Call this when the user revises an existing persona. Not for creating one: campaignstack_create_persona does that. Use campaignstack_list_personas to find the ID.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| goals | No | ||
| personaId | Yes | ||
| objections | No | ||
| painPoints | No | ||
| description | No | ||
| fitStatement | No | The person in role terms: what they run, who they report to, what they are measured on. Judged against a lead's title, headline and seniority, so keep it recognisable from those. Never the pitch. Over 200 characters is rejected, never shortened. | |
| objectionResponses | No | The workspace's own answer to each objection, used when a lead raises it in a reply. Ask the user for the wording and pass it through; never invent an answer for them. Over 8 pairs, or a line over its limit, is rejected rather than shortened. |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| name | No | |
| goals | No | |
| createdAt | No | |
| updatedAt | No | |
| campaignId | No | |
| objections | No | |
| painPoints | No | |
| description | No | |
| fitStatement | No | |
| objectionResponses | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a mutation (readOnlyHint=false) and not destructive (destructiveHint=false). The description adds the key behavior that 'only provided fields change' (partial update), but does not mention other behaviors like validation failures or side effects, which are only partially covered 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with a distinct purpose: scope of update, usage trigger, and pointer to alternatives. No redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the essential usage decision (update vs create), how to identify the target persona, and the partial-update behavior. The output schema exists (though not shown) to explain returns, so the absence of return details is acceptable. It does not mention permissions or side effects, but given the tool's simple update nature, the description is reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema description coverage at 25%, the description helps by listing the primary updatable fields ('name, description, pain points, goals, or objections') and clarifying partial updates. It omits fitStatement and objectionResponses, but those have detailed schema descriptions. Overall it adds moderate guidance but not deep semantics for each parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Update') and resource ('a persona'), lists the updatable fields ('name, description, pain points, goals, or objections'), and explicitly contrasts with campaignstack_create_persona, making its scope unambiguous and distinguishable from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly specifies when to call ('when the user revises an existing persona'), when not to ('Not for creating one'), and names the alternatives (create_persona) and the tool to find the ID (list_personas). No inference is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_phaseAInspect
Update a phase's name, description, objectives, phase type, or order; only provided fields change. Call this when the user reorders the roadmap or revises objectives. Not for creating one: campaignstack_create_phase does that. Use campaignstack_list_phases to find the ID.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| order | No | ||
| phaseId | Yes | ||
| phaseType | No | ||
| objectives | No | ||
| description | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| name | No | |
| order | No | |
| createdAt | No | |
| phaseType | No | |
| updatedAt | No | |
| campaignId | No | |
| objectives | No | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false (no readOnly/destructive hints), so the description carries the burden of behavioral disclosure. It does disclose a key behavior: 'only provided fields change', indicating partial updates with untouched fields remaining unchanged. However, it does not mention potential side effects, validation errors, or whether the operation is reversible. Given it is a mutation tool, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no redundancy. The main action and scope are front-loaded, followed by usage guidance and exclusions. Every sentence contributes to correct tool selection and invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 need not explain return values. It covers the essential context: what fields can change, when to use it, what not to use it for, and how to find the ID. Missing details like error handling or idempotency are minor for an update operation, so the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, meaning the description does not reference any parameter details beyond the schema. Yet it lists the updatable fields and explains that only provided fields change, which adds semantic meaning beyond the schema's type declarations. It also tells the agent to use list_phases to find the ID, directly aiding the required phaseId parameter. This compensates for the lack of schema-based description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Update') on a specific resource ('a phase') and enumerates the editable fields: name, description, objectives, phase type, or order. It also explicitly distinguishes from the sibling creation tool, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage conditions ('Call this when the user reorders the roadmap or revises objectives'), names the alternative for creation (campaignstack_create_phase), and instructs how to obtain the required phaseId via campaignstack_list_phases. This fully routes an agent to the correct tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_signal_agentAInspect
Update a signal agent's configuration; only provided fields change: name, response mode, observing/acting account lists, the agent playbook, or public reply config. Call this when the user asks to change how an existing watcher behaves. Account lists are kind-restricted: connection-watch and message agents are locked to their account (AGENT_POOL_LOCKED); group watch agents accept exactly one (GROUP_READ_POOL_SINGLE otherwise). It does not retarget the agent: target and type are fixed at creation, archive and recreate instead.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| agentId | Yes | ||
| accountIds | No | ||
| agentScript | No | The agent's standing orders, layered BELOW the workspace playbook: it wins where the two conflict and the workspace playbook applies where it is silent. Say what to DO at each stage of this thread (what to ask first, what counts as an answer, when to stop) and nothing about how to sound: tone, length and emoji come from the sender's measured voice profile, and an instruction here overrides a measurement with a guess, then shows up in the message as the model naming the tone it was asked for. Max 6000 characters, enforced server-side. Empty string clears it. | |
| responseMode | No | ||
| silenceHours | No | ||
| actAccountIds | No | ||
| publicReplyConfig | No | ||
| followUpDelaysHours | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| agentId | No | |
| warnings | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, so description carries the burden. It discloses partial-update semantics ('only provided fields change'), account-list kind restrictions (AGENT_POOL_LOCKED, GROUP_READ_POOL_SINGLE), and the no-retarget limitation. These are meaningful beyond the schema. However, it doesn't mention immediate applicability or other failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each serving a purpose: purpose, when-to-call, account restrictions, and non-retargeting limitation. No fluff, front-loaded with the action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There are 9 parameters with only 1 described in schema; the description covers the main categories but omits semantics for silenceHours and followUpDelaysHours, and doesn't explain the publicReplyConfig structure. Given output schema exists, return values are covered, but parameter completeness is lacking.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 11% (only agentScript has a description). The description names several parameters (name, responseMode, accountIds, actAccountIds, agentScript, publicReplyConfig) and explains the account restriction, but leaves silenceHours and followUpDelaysHours unexplained. It adds some meaning but doesn't fully compensate for the low coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Update a signal agent's configuration'. Lists the mutable fields and explicitly notes what it cannot do (retarget), differentiating from create/archive/delete siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-call: 'Call this when the user asks to change how an existing watcher behaves.' Provides an exclusion: does not retarget; archive and recreate instead. Names the alternative action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_workflowAInspect
Update a workflow's name, description, email sending account, and/or graph. Call this to rename a workflow, change its sending account, or restructure its steps. Provide name/description/emailGoogleAccountId to patch metadata; provide graph to replace the non-anchor nodes and edges. Both can be supplied in a single call. For one node's config only, use campaignstack_update_workflow_node instead. Set existingNodeId on graph nodes that update an existing node in place. Claimed nodes keep their in-flight leads, while removing a node that still holds active leads fails with NODE_HAS_ACTIVE_LEADS (drain it first with campaignstack_cancel_node_leads). Graph replacement runs validation. Invalid graphs are rejected and the workflow is left unchanged. To enable or disable a workflow use campaignstack_update_workflow_status instead.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New workflow name | |
| graph | No | Replacement workflow graph. Replaces all existing non-anchor nodes and edges. Use campaignstack_get_workflow_node_types to discover valid node types. | |
| workflowId | Yes | ||
| description | No | New workflow description | |
| outreachIntents | No | An UNRANKED menu of acceptable outcomes for this outreach. Answers 'why are we writing to these people': a message with no stated purpose reads as a compliment plus an open question. The craft picks the outcome this reader and this thread can plausibly give and says the reason in its own words, and it switches when the lead's own words open another door, so order carries no meaning and listing several is how a non-buyer still gets a relevant message. Resolution is workspace then campaign then workflow, and the narrowest non-empty list REPLACES the wider ones rather than merging, so setting it here overrides the level above. Pass an empty array to clear this level and fall back. | |
| emailGoogleAccountId | No | Workflow-level email sending account for google:email_send nodes (a googleAccounts id from campaignstack_list_external_email_accounts provider=google, or null to clear). When unset, sends fall back to the account matching the workflow's LinkedIn identity, then the campaign default. Setting an account resumes email leads parked as no_email_account_configured or account_expired. |
Output Schema
| Name | Required | Description |
|---|---|---|
| updated | No | |
| workflowId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no useful annotations (all hints false), the description carries full behavioral burden. It discloses key side effects: claimed nodes preserve in-flight leads, removing nodes with active leads fails with NODE_HAS_ACTIVE_LEADS, graph replacement runs validation and leaves the workflow unchanged on failure, and metadata/graph can be combined in one call. This goes far beyond a generic 'update' description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence is purposeful. It leads with the core action, then usage cases, parameter grouping, sibling alternatives, node semantics, validation behavior, and a final alternative. There is zero fluff; all content is decision-relevant for an LLM agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with nested graph objects, the description covers what an agent needs: how to patch metadata, how to replace graphs, what existingNodeId does, how leads are affected, what errors can occur)Skip, and which sibling tools to fall back to. The output schema exists, so return values are covered elsewhere. This is a complete and self-sufficient description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 83%, so the baseline is 3, but the description adds substantial meaning: it groups parameters by intent ('Provide name/description/emailGoogleAccountId to patch metadata; provide graph to replace non-anchor nodes'), explains the semantic of existingNodeId ('updates an existing node in place'), and highlights the failure mode related to active leads. This transforms the schema from a list of fields into a usable model.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Update a workflow's name, description, email sending account, and/or graph') and then enumerates concrete use cases (rename, change sending account, restructure steps). It explicitly distinguishes itself from two sibling tools (campaignstack_update_workflow_node and campaignstack_update_workflow_status), leaving no ambiguity about its scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: 'Call this to rename a workflow... change its sending account, or restructure its steps.' It names alternatives with precise conditions: 'For one node's config only, use campaignstack_update_workflow_node instead' and 'To enable or disable a workflow use campaignstack_update_workflow_status instead.' This is exemplary routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_workflow_nodeAInspect
Change ONE workflow node's label or config without rewriting the graph. config is shallow merged onto the stored config (null removes a key), so a one-key edit is a one-key call. Call this when the user wants to change a single node's setting, like a message template or a delay. Returns the node's new nodeId, nodeType, label, config and declaredActions. On an ai:autonomous node, changing the brief starts a fresh reading of which actions it takes, so declaredActions on this reply is the PREVIOUS reading or null: read it back with campaignstack_get_workflow a moment later to see the new one. Use campaignstack_update_workflow only when the shape of the graph itself changes (adding, removing or rewiring nodes).
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | New display label for the node. | |
| config | No | Config keys to change, SHALLOW MERGED onto the node's stored config: send only the keys you are changing, and set a key to null to remove it. Read the current config first with campaignstack_get_workflow. This is the narrow edit; campaignstack_update_workflow replaces the whole graph and drops any node you leave out of it. | |
| nodeId | Yes | The node to edit. | |
| workflowId | Yes | The workflow the node belongs to, from campaignstack_get_workflow. |
Output Schema
| Name | Required | Description |
|---|---|---|
| label | No | |
| config | No | |
| nodeId | No | |
| nodeType | No | |
| declaredActions | No | For an ai:autonomous node: the actions its brief was read as taking, the reach flags, and whether the brief said nothing legible. Also present inside config.declaredActions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false (readOnlyHint, destructiveHint, idempotentHint), so the description carries the full burden. It discloses the shallow-merge semantics (null removes a key), the return payload, and the subtle async behavior for ai:autonomous nodes where declaredActions is stale and must be re-read. This goes far beyond the minimal and is essential for correct usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured: it opens with the core purpose, then explains merge semantics, usage context, return value, the autonomous-node caveat, and the alternative. Every sentence adds value, though it is a bit long. For the complexity involved, the length is justified, so it earns a 4 rather than a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 doesn't need to detail return fields beyond a summary, which it provides. It covers the essential behavioral nuances (shallow merge, null removal, async action reading), the correct usage context, and the alternative tool. Nothing critical is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents the shallow-merge behavior and the need to read current config first. The tool description reinforces the 'one-key edit' idea but does not add meaningfully new per-parameter details beyond what the schema provides. The baseline of 3 is appropriate given high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Change'), a precise resource ('ONE workflow node'), and a clear scope ('label or config without rewriting the graph'). It explicitly differentiates from the sibling campaignstack_update_workflow by naming the condition when that other tool should be used, so an agent can easily tell them apart 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use ('when the user wants to change a single node's setting, like a message template or a delay') and when-not-to-use ('Use campaignstack_update_workflow only when the shape of the graph itself changes'), naming the alternative directly. This leaves no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_workflow_statusAInspect
Enable or disable a workflow. Enabling activates the workflow (status becomes active, the graph is validated, and initial sourcing starts); disabling pauses it. Call this when the user names a workflow and a direction, on or off; enabling starts sending to real people. When enabled, the workflow will process leads according to its node configuration. It never stops a run already dispatched, and touches no other workflow. Use campaignstack_get_workflow to inspect the current node configuration first.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | Yes | ||
| workflowId | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | No | |
| status | No | |
| enabled | No | |
| createdAt | No | |
| updatedAt | No | |
| campaignId | No | |
| workflowId | No | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavioral details: enabling validates the graph and starts initial sourcing, disabling pauses the workflow, it 'never stops a run already dispatched,' and it 'touches no other workflow.' This adds real safety-relevant context not present in the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then adds usage and behavioral details. It is slightly repetitive around enabling and processing leads, but each sentence adds meaningful guidance; overall it remains appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers when to call it, key side effects, and a recommended prerequisite inspection step. Since an output schema is present and annotations are simple, the description does not need to document return values or permission mechanics. It is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description must compensate for parameter meaning. It implicitly maps workflowId to 'a workflow' and enabled to 'a direction, on or off,' and explains the effect of each value. It does not explicitly name the parameters, but the mapping is inferable and the behavioral consequences are described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Enable or disable a workflow.' It clearly distinguishes this from siblings like campaignstack_update_workflow or campaignstack_trigger_workflow by framing it strictly as an on/off state change and stating that enabling 'starts sending to real people.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance: 'Call this when the user names a workflow and a direction, on or off.' It also recommends inspecting configuration first via campaignstack_get_workflow. It does not explicitly name alternative tools or state when not to use it, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_workspaceAInspect
Update workspace settings. Only provided fields are updated. Call this when the user asks to change the company name, website, industry, offer grounding, or playbook sections. offerContext is the factual company/offer grounding injected into every AI craft (pass an empty string to clear it). capabilities describes what the SYSTEM behind this workspace can detect and do (signal detection, automated actions, integrations), as opposed to what it sells: it is injected into AI reply crafts only, so the agent can recognise when a lead describes a problem the product solves. Keep it short and factual; it is never used as a pitch list. Pass an empty string to clear it. playbookSections is the playbook itself, one field per section, each with its own hard character cap: a write over a cap is rejected, so shorten rather than retry. jevFeatures sets how far along each AI judgment is for this workspace: off, shadow (it runs and is recorded but decides nothing) or live. Only the named judgments change. It does not touch team membership: campaignstack_invite_member does that. Read all current values via campaignstack_get_playbook.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| industry | No | ||
| sections | No | The workspace playbook, one field per section. Only the fields you pass are changed. Each field has a target length and a HARD character cap; a write over the cap is REJECTED, not truncated. Write to the target, not the cap: identity (aim for about 400, max 1200, sent on every message): who we are, positioning, what makes us different; voice (aim for about 400, max 1200, sent on every message): rules that survive any voice: what to answer first, one ask per message, length caps. Never adjectives about tone, which get written into the drafts; angles (aim for about 1000, max 3000, sent on messages we send first): reasons to reach out that land, and the levers that persuade; objections (aim for about 2000, max 6000, sent on replies, after they have written back): what people push back with, and the real answers; boundaries (aim for about 500, max 1500, sent on every message): topics to avoid, claims never to make. Each section is model-facing text the model reads verbatim under its own heading: explanations of how the field works belong in the interface, not in the field, and a section must stand alone rather than refer to another one. Sections are selected per message, so a long objections list costs a first message nothing. Do NOT restate the offer, the personas or the campaign goal here: all three already reach the prompt from structured data, and a second copy can only contradict the first. | |
| companyName | No | ||
| jevFeatures | No | ||
| workspaceId | Yes | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| capabilities | No | ||
| offerContext | No | ||
| outreachIntents | No | An UNRANKED menu of acceptable outcomes for this outreach. Answers 'why are we writing to these people': a message with no stated purpose reads as a compliment plus an open question. The craft picks the outcome this reader and this thread can plausibly give and says the reason in its own words, and it switches when the lead's own words open another door, so order carries no meaning and listing several is how a non-buyer still gets a relevant message. Resolution is workspace then campaign then workflow, and the narrowest non-empty list REPLACES the wider ones rather than merging, so setting it here overrides the level above. Pass an empty array to clear this level and fall back. | |
| companyWebsiteUrl | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| _id | No | |
| name | No | |
| industry | No | |
| sections | No | |
| warnings | No | Playbook lint warnings, when any |
| companyName | No | |
| jevFeatures | No | |
| capabilities | No | |
| offerContext | No | |
| outreachIntents | No | |
| companyWebsiteUrl | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the all-false annotations by explaining concrete behaviors: empty strings clear fields, capabilities are injected only into AI reply crafts and are never used as a pitch list, playbook cap violations are rejected rather than truncated, jevFeatures supports off/shadow/live, and only named judgments change. This gives an agent realistic expectations about side effects and limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense, with the key update-and-trigger sentence front-loaded. It earns most of its length given the complexity of the tool, but there is some redundancy with the extensive sections schema description and a naming inconsistency that adds confusion.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter nested update tool, the description covers the most important behaviors, usage triggers, and exclusions, and the schema itself documents outreachIntents and workspaceId in detail. The main gap is the ambiguous name/companyName distinction and the playbookSections-versus-sections mismatch, which leave an agent with unresolved field-mapping questions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With schema coverage at only 30%, the description compensates well by adding meaning to offerContext, capabilities, sections/playbook, and jevFeatures. However, it refers to 'playbookSections' while the actual schema property is 'sections', and it never disambiguates 'name' from 'companyName', both of which appear in the schema without descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb and resource: 'Update workspace settings.' It then enumerates the exact concerns the user might ask about — company name, website, industry, offer grounding, and playbook sections — and explicitly separates team membership into campaignstack_invite_member. This makes the tool's scope unambiguous even among many update_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a direct trigger: 'Call this when the user asks to change...' It also communicates partial-update semantics ('Only provided fields are updated') and explicitly routes team membership to campaignstack_invite_member and reads to campaignstack_get_playbook. That is strong when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_workspace_brandingAInspect
Update a workspace's branding: brandName, primaryColor (hex like #4f46e5), hidePoweredBy. Call this when the user names a specific branding value to change on shared reports. Pass null to reset a field to the CampaignStack default. Logo upload is not available here: it is set from workspace settings in the dashboard. Owner/admin only for user API keys. Use campaignstack_get_workspace_branding to inspect current values.
| Name | Required | Description | Default |
|---|---|---|---|
| brandName | No | ||
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| primaryColor | No | ||
| hidePoweredBy | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| error | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses that passing null resets a field to the CampaignStack default, that owner/admin permissions are required for user API keys, and that logo upload is handled elsewhere. These details significantly enrich the sparse annotations (all false booleans) with meaningful behavioral context, such as mutation semantics and permission constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each purposeful: the action and fields, the trigger condition, reset semantics, and exclusions/alternatives. Information density is high, and the most urgent details (what and when) are front-loaded; no filler or redundant phrasing exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Combined with an output schema, the description covers permission, reset behavior, field scope, and points to the getter tool for inspection. The only implicit element is that omitted fields remain unchanged, but the phrase 'specific branding value to change' implies that sufficiently; nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% (workspaceId alone). The description compensates by explaining primaryColor's hex format with an example, the null-reset convention for all three branding fields, and the overall semantic of changing named values. This adds the missing parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states the exact operation: 'Update a workspace's branding: brandName, primaryColor (hex like #4f46e5), hidePoweredBy.' It clearly names the resource and fields, and explicitly distinguishes itself from campaignstack_get_workspace_branding for inspecting values, making it easy to differentiate from the sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance: 'Call this when the user names a specific branding value to change on shared reports.' It also gives an exclusion ('Logo upload is not available here') and names the alternative for inspection (campaignstack_get_workspace_branding), so agents know exactly when to select this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_update_workspace_complianceAInspect
Turn the GDPR Article 14 lawful-basis notice on or off for a workspace (lawfulBasisNoticeEnabled). Call this only when the user explicitly asks to turn the notice on or off. When on, one fixed sentence and a link are appended to the first LinkedIn message or email each person receives; the text is not editable here. Pass null to reset to the default (off). Owner/admin only for user API keys.
| Name | Required | Description | Default |
|---|---|---|---|
| workspaceId | No | Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. | |
| lawfulBasisNoticeEnabled | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | No | |
| error | No | |
| notice | No | |
| stored | No | |
| resolved | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly=false annotation, the description discloses concrete side effects: when enabled, a fixed sentence and link are appended to the first LinkedIn message or email each person receives. It also documents the null-reset behavior, the default state (off), and the auth restriction, all of which are genuinely useful and not present in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, all information-dense and purposeful. The action is stated first, followed by when to call, the behavioral side effect, how to reset, and permission requirements. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity, the description covers the action, invocation trigger, side effects, default behavior, reset semantics, and permissions. The output schema already handles return-value documentation, and the workspaceId nuances are covered in the schema, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, with lawfulBasisNoticeEnabled lacking a description. The tool description compensates by explaining its on/off semantics, the null reset to default, and the fixed non-editable text behavior. It also reinforces the workspaceId concept by framing it as a workspace-level setting, adding value beyond the raw boolean type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: turning the GDPR Article 14 lawful-basis notice on or off for a workspace. It also names the relevant field (lawfulBasisNoticeEnabled), making the tool unmistakable and clearly distinct from siblings like get_workspace_compliance or update_workspace.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit invocation condition: call only when the user explicitly asks to turn the notice on or off. It also adds a permission constraint (owner/admin only for user API keys) and implicitly warns against using it to edit notice text by stating the text is not editable here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaignstack_whoamiARead-onlyIdempotentInspect
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 this first in a session, before any tool that takes a workspaceId, 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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| user | No | |
| scopes | No | |
| keyType | No | workspace, user, oauth or stdio |
| keyPrefix | No | |
| workspaces | No | Every workspace this person can reach, for the workspaceId argument |
| workspaceId | No | Set only for a key bound to one workspace |
| capabilities | No | Each granted scope in plain words |
| workspaceName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful context beyond those annotations by clarifying the exact scope of what it reads (connection identity and permissions) and explicitly noting it reads nothing about leads or campaigns. This is valuable behavioral disclosure, though slightly redundant with the read-only annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences, front-loading the core purpose first, then usage order, then a clarifying exclusion. Every sentence earns its place with no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, an output schema, and annotations covering mutability and idempotence, the description fully covers what an agent needs to decide when to invoke this tool and what to expect. It also provides cross-tool routing and session-ordering context, making it complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema coverage is 100%, so there are no parameter semantics to document. The description appropriately focuses on what the tool returns rather than inputs, matching the baseline for a no-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies what the tool returns: the bound workspace, approved permissions, and connection type (API key vs connected app). It explicitly distinguishes itself from campaignstack_explain_capabilities, which answers a different question, so an agent can select it accurately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs to call this tool first in a session, before any tool that takes a workspaceId, and names the alternative campaignstack_explain_capabilities for capability-selection questions. This is precise, actionable routing guidance with no ambiguity.
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.
243 tool updates
- Changed
campaignstack_accept_draft_checkup1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "checkupId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "decision": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_add_lead_to_external_list1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "provider": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "providerLeadId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_add_lead_to_sequence1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "provider": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "providerContactId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "sequenceActivated": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_add_leads_to_list1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "added": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "alreadyInList": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_add_manual_exclusion_urls1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "exclusionId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "results": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "error": { + "type": [ + "string", + "null" + ] + }, + "url": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_analyze_website1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "companyName": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "industry": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "positioning": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "services": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "targetMarket": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "teamSize": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "techStack": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_apply_agent_memory1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "changed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "id": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_approve_content_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "contentPostId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_approve_review1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "decision": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "entryId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_archive_campaign1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "archived": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "campaignId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_archive_signal_agent1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agentId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_build_search_url1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "searchUrl": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_cancel_node_leads1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "cancelled": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "nodeId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "stillProcessing": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_comment_on_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "jobId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_connect_apollo1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "integrationId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_connect_hubspot1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "errorCode": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "errorDetail": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "integrationId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "sourceProperty": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_connect_instantly1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "integrationId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_count_pending_reviews1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "count": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_count_unread_notifications1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "unreadCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_craft_comment1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "commentText": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "needsHumanReview": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "reviewReason": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_craft_followup1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "detectedIntent": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "ignoredSelfMessages": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "needsHumanReview": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "newMessagesFound": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "replyText": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "reviewReason": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_craft_message1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "messageText": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "needsHumanReview": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "reviewReason": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_craft_note1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "needsHumanReview": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "noteText": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "reviewReason": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_campaign1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "campaignId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "title": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_company_employee_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "created": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "watchId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_competitor_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "watchId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_connection_watch_agent1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agentId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_content_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "contentPostId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_icp3 fields changed- added
Input schema / properties / fitStatementAdded value: +{ + "description": "One line describing the company worth working, judged later against a real company's own words. Say what they do, who they sell to, roughly what size, and what has to be true for them to need this. Over 300 characters is rejected, never shortened.", + "maxLength": 300, + "type": "string" +} - added
Input schema / properties / siteFactsAdded value: +{ + "additionalProperties": false, + "description": "Target on what the company's own website says. Every filter you set has to hold. A company whose site has not been read, or whose reading is silent on what you asked, is neither matched nor penalised.", + "properties": { + "primaryBuyer": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + "productStage": { + "additionalProperties": false, + "description": "Stage from 0 (pre-launch) to 3 (mature), inclusive on both ends.", + "properties": { + "max": { + "maximum": 3, + "minimum": 0, + "type": "number" + }, + "min": { + "maximum": 3, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "selfServeSignup": { + "type": "boolean" + }, + "sellsToAgencies": { + "type": "boolean" + } + }, + "type": "object" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "icpId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_lead_list1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "leadCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "leadListId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_persona3 fields changed- added
Input schema / properties / fitStatementAdded value: +{ + "description": "The person in role terms: what they run, who they report to, what they are measured on. Judged against a lead's title, headline and seniority, so keep it recognisable from those. Never the pitch. Over 200 characters is rejected, never shortened.", + "maxLength": 200, + "type": "string" +} - added
Input schema / properties / objectionResponsesAdded value: +{ + "description": "The workspace's own answer to each objection, used when a lead raises it in a reply. Ask the user for the wording and pass it through; never invent an answer for them. Over 8 pairs, or a line over its limit, is rejected rather than shortened.", + "items": { + "additionalProperties": false, + "properties": { + "objection": { + "description": "The objection, in the words a lead uses.", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "response": { + "description": "What this workspace actually says back. Their assertion, never yours.", + "maxLength": 400, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "objection", + "response" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "personaId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_phase1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "phaseId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_query_lead_list1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "leadListId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "type": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_search_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "automationId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "campaignId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "disabledReason": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "enabled": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "topicId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_signal_agent1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agentId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_signal_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "created": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "watchId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_workflow1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "nodeCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "workflowId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_create_workspace1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "generationId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "mode": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "next": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_decide_playbook_proposal1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "decision": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "proposalId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_delete_agent_memory1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "deleted": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "id": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_delete_campaign1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "campaignId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "deleted": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_delete_competitor_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "deleted": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "watchId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_delete_content_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "contentPostId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "deleted": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_delete_icp1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "deleted": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "icpId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_delete_persona1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "deleted": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "personaId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_delete_phase1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "deleted": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "phaseId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_delete_signal_agent1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agentId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_delete_workflow1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "workflowId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_diagnose_lead_sourcing1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "alreadyInOtherWorkflow": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "alreadyInThisWorkflow": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "excludedBy": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "leadFound": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "matchesProviderFilters": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "score": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "scorePassesThreshold": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "boolean", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "verdict": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_disconnect_integration1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "message": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_duplicate_content_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "contentPostId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_edit_and_approve_review1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "decision": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "entryId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_edit_scheduled_message1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "decision": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "entryId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_enrich_company_info1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "fieldsWritten": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "provider": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_enrich_lead_contact_info1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "alreadyPresent": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "creditsReserved": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "email": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "emailStatus": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "emailWritten": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "message": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "profileWritten": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "provider": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "requestId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_estimate_cost1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "actionType": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "allowed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "balance": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "count": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "creditsPerUnit": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "isPaid": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "note": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "per": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "tool": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "total": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_explain_capabilities1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "topic": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_explain_draft1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "caller": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "craftAuditLogId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "draft": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "fixes": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "sentences": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "verdict": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_export_craft_audit1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "isDone": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "nextCursor": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "rows": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "attempts": { + "type": [ + "number", + "null" + ] + }, + "caller": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "model": { + "type": [ + "string", + "null" + ] + }, + "parsedText": { + "type": [ + "string", + "null" + ] + }, + "provider": { + "type": [ + "string", + "null" + ] + }, + "rawOutputChars": { + "type": [ + "number", + "null" + ] + }, + "systemPromptChars": { + "type": [ + "number", + "null" + ] + }, + "truncated": { + "type": [ + "boolean", + "null" + ] + }, + "userPromptChars": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_extract_company_employees1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "jobId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "runId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_extract_conversation_voice1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "version": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_extract_recent_comments1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "code": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "creditsCharged": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "error": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "message": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "ownAccount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "posts": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "profileUrl": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "profileUrn": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "requestsUsed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "stopReason": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_fetch_mutual_connections1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "jobId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "skipped": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_find_warm_paths1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "accountsChecked": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "paths": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "accountName": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "canMessageDirectly": { + "type": [ + "boolean", + "null" + ] + }, + "degree": { + "type": [ + "string", + "null" + ] + }, + "linkedinAccountId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "warmest": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "accountName": { + "anyOf": [ + { + "$ref": "#/properties/paths/anyOf/0/anyOf/1/items/properties/accountName/anyOf/0" + }, + { + "type": "null" + } + ] + }, + "canMessageDirectly": { + "type": [ + "boolean", + "null" + ] + }, + "degree": { + "type": [ + "string", + "null" + ] + }, + "linkedinAccountId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_follow_profile1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "jobId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_account1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "accountTier": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "connectionsCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "email": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "firstConnectedAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "hasSalesNavigator": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "headline": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "lastActionByType": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "lastHeartbeatAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "ownerWorkspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "pausedAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "platform": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "profileUrl": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "rampUpState": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + {}, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "todayBudgets": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaceIds": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_account_maintenance1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "accountUsable": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "connectionWatcher": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "agentId": { + "type": [ + "string", + "null" + ] + }, + "autoAcceptDailyCap": { + "type": [ + "number", + "null" + ] + }, + "autoAcceptEnabled": { + "type": "boolean" + }, + "autoPausedReason": { + "type": [ + "string", + "null" + ] + }, + "isSameWorkspace": { + "type": "boolean" + }, + "messageBrief": { + "type": [ + "string", + "null" + ] + }, + "reviewGated": { + "type": "boolean" + }, + "status": { + "type": "string" + }, + "workflowId": { + "type": [ + "string", + "null" + ] + }, + "workspaceId": { + "type": [ + "string", + "null" + ] + }, + "workspaceName": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "invitationHygiene": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": false, + "properties": { + "disabled": { + "type": "boolean" + }, + "lastSweepAt": { + "type": [ + "number", + "null" + ] + }, + "pendingInvitationsCount": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "messageWatcher": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "$ref": "#/properties/connectionWatcher/anyOf/0/anyOf/1/anyOf/0" + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "ownPostsWatcher": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "$ref": "#/properties/connectionWatcher/anyOf/0/anyOf/1/anyOf/0" + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "owner": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": false, + "properties": { + "workspaceId": { + "type": [ + "string", + "null" + ] + }, + "workspaceName": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_account_safety1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "acceptance": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "actions": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ], + "description": "Per write-type headroom, dispatchable and floor" + }, + { + "type": "null" + } + ], + "description": "Per write-type headroom, dispatchable and floor" + }, + "backlog": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + {}, + { + "type": "null" + } + ] + } + ], + "description": "Pending-invitation backlog by age" + }, + { + "type": "null" + } + ], + "description": "Pending-invitation backlog by age" + }, + "budgetDay": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "commentsPerWeek": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "connectionsCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "days": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ], + "description": "28-day daily series of observed/ours/foreign per type" + }, + { + "type": "null" + } + ], + "description": "28-day daily series of observed/ours/foreign per type" + }, + "flags": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "linkedinAccountId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "measuredAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "pending": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "score": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "tier": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "unmeasured": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "weeklyCap": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_automation_jobs1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "result": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "result": { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "error": { + "type": [ + "string", + "null" + ] + }, + "leadsImported": { + "type": [ + "number", + "null" + ] + }, + "resultCount": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "resultCount", + "leadsImported", + "error" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "startedAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_campaign1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "archivedAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "campaignGuidance": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "goal": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "icpSummary": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": false, + "properties": { + "icpId": { + "type": "string" + }, + "industries": { + "items": { + "type": "string" + }, + "type": "array" + }, + "seniorities": { + "items": { + "type": "string" + }, + "type": "array" + }, + "titles": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "icpId", + "titles", + "industries", + "seniorities" + ], + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "leadListCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "offerAddendum": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "workflowCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaceId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_campaign_metrics1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "dateRange": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "endDate": { + "type": "string" + }, + "startDate": { + "type": "string" + } + }, + "required": [ + "startDate", + "endDate" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "latest": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "avgMatchScore": { + "type": [ + "number", + "null" + ] + }, + "campaignId": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "date": { + "type": [ + "string", + "null" + ] + }, + "leadsAdded": { + "type": [ + "number", + "null" + ] + }, + "leadsContacted": { + "type": [ + "number", + "null" + ] + }, + "leadsConverted": { + "type": [ + "number", + "null" + ] + }, + "leadsFailed": { + "type": [ + "number", + "null" + ] + }, + "leadsResponded": { + "type": [ + "number", + "null" + ] + }, + "totalLeads": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "range": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "avgMatchScore": { + "type": [ + "number", + "null" + ] + }, + "campaignId": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "date": { + "type": [ + "string", + "null" + ] + }, + "leadsAdded": { + "type": [ + "number", + "null" + ] + }, + "leadsContacted": { + "type": [ + "number", + "null" + ] + }, + "leadsConverted": { + "type": [ + "number", + "null" + ] + }, + "leadsFailed": { + "type": [ + "number", + "null" + ] + }, + "leadsResponded": { + "type": [ + "number", + "null" + ] + }, + "totalLeads": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_campaign_topics1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "campaignId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "topics": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "topic": { + "anyOf": [ + { + "description": "Topic taxonomy row: _id, name, displayName, category" + }, + { + "type": "null" + } + ], + "description": "Topic taxonomy row: _id, name, displayName, category" + }, + "topicId": { + "type": [ + "string", + "null" + ] + }, + "weight": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "totalCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_campaign_weights1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "result": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "description": { + "type": [ + "string", + "null" + ] + }, + "enabled": { + "type": [ + "boolean", + "null" + ] + }, + "isCustom": { + "type": [ + "boolean", + "null" + ] + }, + "label": { + "type": [ + "string", + "null" + ] + }, + "scoreImpact": { + "type": [ + "number", + "null" + ] + }, + "signalType": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_company1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "companyName": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "companySource": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "domain": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "employeeRange": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "industry": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "leadCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "notes": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "profiles": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ], + "description": "Platform presence, keyed by platform, e.g. profiles.linkedin" + }, + { + "type": "null" + } + ], + "description": "Platform presence, keyed by platform, e.g. profiles.linkedin" + }, + "siteFacts": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + {}, + { + "type": "null" + } + ] + } + ], + "description": "What the company's own website says, read as typed answers: sellsToAgencies, selfServeSignup, hasPublicPricing, productStage, primaryBuyer. Each is null when the reading was not confident enough to state either way, which is not the same as a no." + }, + { + "type": "null" + } + ], + "description": "What the company's own website says, read as typed answers: sellsToAgencies, selfServeSignup, hasPublicPricing, productStage, primaryBuyer. Each is null when the reading was not confident enough to state either way, which is not the same as a no." + }, + "tags": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "watch": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + {}, + { + "type": "null" + } + ] + } + ], + "description": "The workspace's intelligence post watch on this company, when one exists" + }, + { + "type": "null" + } + ], + "description": "The workspace's intelligence post watch on this company, when one exists" + }, + "watchCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_competitor_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "companyId": { + "type": [ + "string", + "null" + ] + }, + "entityType": { + "type": [ + "string", + "null" + ] + }, + "imageSourceUrl": { + "type": [ + "string", + "null" + ] + }, + "imageUrl": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "lastAnalyzedAt": { + "type": [ + "number", + "null" + ] + }, + "latestPosts": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ], + "description": "Up to 5 most recent posts, newest first" + }, + { + "type": "null" + } + ], + "description": "Up to 5 most recent posts, newest first" + }, + "leadId": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "postCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "resolvedName": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "targetKey": { + "type": [ + "string", + "null" + ] + }, + "targetPlatform": { + "type": [ + "string", + "null" + ] + }, + "topicsSummary": { + "type": [ + "string", + "null" + ] + }, + "workspaceId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_contact_finder_request1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "number", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "creditsCharged": { + "type": [ + "number", + "null" + ] + }, + "creditsReserved": { + "type": [ + "number", + "null" + ] + }, + "errorCode": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "origin": { + "type": [ + "string", + "null" + ] + }, + "result": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "emailFound": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "emailStatus": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "emailWritten": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "phoneFound": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "phoneWritten": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "wantEmail": { + "type": [ + "boolean", + "null" + ] + }, + "wantPhone": { + "type": [ + "boolean", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_content_analytics1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "avgEngagement": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "prevPeriodPosts": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "topPerformingPosts": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "totalEngagement": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "totalPosts": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "trendPercent": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_content_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "author": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "body": { + "type": [ + "string", + "null" + ] + }, + "contentPostId": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "failureReason": { + "type": [ + "string", + "null" + ] + }, + "linkedinExtension": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "media": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mediaIds": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "platform": { + "type": [ + "string", + "null" + ] + }, + "publishedAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "rejectionReason": { + "type": [ + "string", + "null" + ] + }, + "revisionCount": { + "type": [ + "number", + "null" + ] + }, + "scheduledAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "tags": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + }, + "workspaceId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_conversation1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "account": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "conversationRef": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "platform": { + "type": "string" + } + }, + "required": [ + "platform", + "id" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "conversationUrl": { + "type": [ + "string", + "null" + ] + }, + "conversationUrn": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "displayName": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "hasOlderMessages": { + "type": [ + "boolean", + "null" + ] + }, + "lastMessage": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "lastSyncedAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "lead": { + "anyOf": [ + { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + { + "type": "null" + } + ] + }, + "leadRef": { + "anyOf": [ + { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "leadId": { + "type": "string" + }, + "leadSource": { + "type": "string" + } + }, + "required": [ + "leadId", + "leadSource" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + { + "type": "null" + } + ] + }, + "messages": { + "anyOf": [ + { + "description": "Oldest first; the last element is the most recent", + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Oldest first; the last element is the most recent" + }, + "messagesFetchedAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "needsFetch": { + "type": [ + "boolean", + "null" + ] + }, + "participants": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "platform": { + "type": [ + "string", + "null" + ] + }, + "read": { + "type": [ + "boolean", + "null" + ] + }, + "sponsored": { + "type": [ + "boolean", + "null" + ] + }, + "unreadCount": { + "type": [ + "number", + "null" + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_conversation_voice1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "backfill": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + {}, + { + "type": "null" + } + ] + } + ], + "description": "History backfill state, or null if never run" + }, + { + "type": "null" + } + ], + "description": "History backfill state, or null if never run" + }, + "profiles": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ], + "description": "One entry per language: active, version, readableSummary, corpusStats, core, overlays" + }, + { + "type": "null" + } + ], + "description": "One entry per language: active, version, readableSummary, corpusStats, core, overlays" + } + }, + "type": "object" +}
- Changed
campaignstack_get_craft_config_tree1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "campaigns": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "resolvedForSignalAgent": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "resolvedForWorkflow": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "signalAgents": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "voice": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "warnings": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "workflows": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "workspace": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_credit_balance1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "frozenPackBalance": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "included": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "isPaid": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "month": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "overageUsed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "packBalance": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "percentUsed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "remaining": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "rolledOver": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "totalPool": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "used": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_draft_checkup1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "checkup": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "findings": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "proposal": { + "anyOf": [ + { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + { + "type": "null" + } + ] + }, + "replays": { + "anyOf": [ + { + "description": "Before/after replays of real drafts under the proposed text", + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Before/after replays of real drafts under the proposed text" + }, + "stats": { + "anyOf": [ + { + "description": "windowDays, decisions, cleanApprovals, editedApprovals, rejections, draftsAnalyzed" + }, + { + "type": "null" + } + ], + "description": "windowDays, decisions, cleanApprovals, editedApprovals, rejections, draftsAnalyzed" + }, + "trigger": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_enrichment_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "accountGates": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "accountId": { + "type": [ + "string", + "null" + ] + }, + "allowed": { + "type": [ + "boolean", + "null" + ] + }, + "immediateOnly": { + "type": [ + "boolean", + "null" + ] + }, + "reason": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "completed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "creditsExhausted": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "failed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "pending": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "processing": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "total": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_exclusions1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "effective": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ], + "description": "Enabled entries only, level 0 first" + }, + { + "type": "null" + } + ], + "description": "Enabled entries only, level 0 first" + }, + "exclusions": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ], + "description": "Level-0 exclusion entries" + }, + { + "type": "null" + } + ], + "description": "Level-0 exclusion entries" + }, + "level0": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "level1": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "level1Source": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_external_import_progress1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "progress": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_icp_scores1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "icpMatchScore": { + "type": [ + "number", + "null" + ] + }, + "leadId": { + "type": [ + "string", + "null" + ] + }, + "leadName": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "leadSource": { + "type": [ + "string", + "null" + ] + }, + "matchedFields": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_inbox_unread_count1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "accountCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "total": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_lead1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "archived": { + "type": [ + "boolean", + "null" + ] + }, + "company": { + "anyOf": [ + { + "description": "The primary employer, resolved for this workspace" + }, + { + "type": "null" + } + ], + "description": "The primary employer, resolved for this workspace" + }, + "currentRoles": { + "anyOf": [ + { + "description": "Every position held right now, not just the primary", + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Every position held right now, not just the primary" + }, + "department": { + "type": [ + "string", + "null" + ] + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "firstName": { + "type": [ + "string", + "null" + ] + }, + "firstSeenAt": { + "type": [ + "number", + "null" + ] + }, + "fullName": { + "type": [ + "string", + "null" + ] + }, + "headline": { + "type": [ + "string", + "null" + ] + }, + "icpScores": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "lastName": { + "type": [ + "string", + "null" + ] + }, + "lastUpdatedAt": { + "type": [ + "number", + "null" + ] + }, + "leadId": { + "type": [ + "string", + "null" + ] + }, + "linkedInUrl": { + "type": [ + "string", + "null" + ] + }, + "location": { + "type": [ + "string", + "null" + ] + }, + "phone": { + "type": [ + "string", + "null" + ] + }, + "profiles": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "seniority": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "watch": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_lead_connections1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "connections": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "connectedAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "degree": { + "type": [ + "string", + "null" + ] + }, + "edgeSource": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "fullName": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "leadId": { + "type": [ + "string", + "null" + ] + }, + "leadSource": { + "type": [ + "string", + "null" + ] + }, + "sourceConnectedAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "total": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_lead_history1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "result": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "actionType": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "errorMessage": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "jobId": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "nodeId": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "nodeLabel": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "payload": { + "anyOf": [ + { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "workflowId": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "workflowName": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_lead_list1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "campaignId": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "leadCount": { + "type": [ + "number", + "null" + ] + }, + "leadListId": { + "type": [ + "string", + "null" + ] + }, + "leads": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": false, + "properties": { + "hasMore": { + "type": "boolean" + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "type": "number" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "source": { + "type": [ + "string", + "null" + ] + }, + "type": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_lead_score_breakdown1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "companySignalBreakdown": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "companySignalScore": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "connectionDegree": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "icpScore": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "matchedFields": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "negativeScore": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "positiveScore": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "signalBreakdown": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ], + "description": "Per-signal contributions with decay, recency, intent and topic multipliers" + }, + { + "type": "null" + } + ], + "description": "Per-signal contributions with decay, recency, intent and topic multipliers" + }, + "signalScore": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "totalScore": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_node_activity1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "entries": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "cancelReason": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "enteredAt": { + "type": [ + "number", + "null" + ] + }, + "errorMessage": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "jobId": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "leadId": { + "type": [ + "string", + "null" + ] + }, + "leadName": { + "type": [ + "string", + "null" + ] + }, + "leadProfileImageUrl": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "stats": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "completed": { + "type": [ + "number", + "null" + ] + }, + "failed": { + "type": [ + "number", + "null" + ] + }, + "processing": { + "type": [ + "number", + "null" + ] + }, + "total": { + "type": [ + "number", + "null" + ] + }, + "waiting": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_notification_preferences1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "categories": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ], + "description": "One entry per category: global value and what it resolves to" + }, + { + "type": "null" + } + ], + "description": "One entry per category: global value and what it resolves to" + }, + "weeklyReport": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaces": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ], + "description": "Per-workspace overrides, each marked inherited when unset" + }, + { + "type": "null" + } + ], + "description": "Per-workspace overrides, each marked inherited when unset" + } + }, + "type": "object" +}
- Changed
campaignstack_get_persona1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "campaignId": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "fitStatement": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "goals": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "objectionResponses": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": false, + "properties": { + "objection": { + "type": "string" + }, + "response": { + "type": "string" + } + }, + "required": [ + "objection", + "response" + ], + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "objections": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "painPoints": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_phase1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "campaignId": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "objectives": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "order": { + "type": [ + "number", + "null" + ] + }, + "phaseType": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_platform_capabilities1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "actions": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "connectedPlatforms": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "platforms": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "accountsSupported": { + "type": [ + "boolean", + "null" + ] + }, + "actions": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "connectedAccountCount": { + "type": [ + "number", + "null" + ] + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "platform": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_playbook1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "capabilities": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "capabilitiesMeta": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": {}, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "editableBy": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": {}, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "managed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "offerContext": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "offerContextMeta": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": {}, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "outreachIntents": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "playbookSections": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": {}, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "sectionMeta": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": {}, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_playbook_proposal1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "proposal": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "assistantMessage": { + "type": [ + "string", + "null" + ] + }, + "changes": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "request": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_signal_agent1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "eventsCount": { + "type": [ + "number", + "null" + ] + }, + "imageUrl": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "leadListId": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "postsCount": { + "type": [ + "number", + "null" + ] + }, + "readAccountUnavailable": { + "type": [ + "boolean", + "null" + ] + }, + "responseMode": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "targetName": { + "type": [ + "string", + "null" + ] + }, + "targetUrn": { + "type": [ + "string", + "null" + ] + }, + "type": { + "type": [ + "string", + "null" + ] + }, + "workflowId": { + "type": [ + "string", + "null" + ] + }, + "workspaceId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_signal_agent_stats1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "byPriority": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "leadsCreated": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "postsWatched": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "signalsToday": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "signalsTotal": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "watcherActivity": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": false, + "properties": { + "inbound7d": { + "type": "number" + }, + "inboundToday": { + "type": "number" + }, + "outbound7d": { + "type": "number" + }, + "outboundToday": { + "type": "number" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_workflow1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "accountRefs": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "campaignId": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "defaultGoogleAccountId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "edges": { + "anyOf": [ + { + "description": "sourceNodeId, targetNodeId, label, condition", + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "sourceNodeId, targetNodeId, label, condition" + }, + "enabled": { + "type": [ + "boolean", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "nodes": { + "anyOf": [ + { + "description": "Node id, type, label, config, position, execution target", + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ], + "description": "Node id, type, label, config, position, execution target" + }, + "sequence": { + "anyOf": [ + { + "description": "Step-lane projection: memberNodeIds, knobs, residualNodeIds" + }, + { + "type": "null" + } + ], + "description": "Step-lane projection: memberNodeIds, knobs, residualNodeIds" + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + }, + "workflowId": { + "type": [ + "string", + "null" + ] + }, + "workspaceId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_workflow_node_types1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "exampleGraph": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "graphShape": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "description": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "edgeFields": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "nodeFields": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "nodeTypes": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "budgeted": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "configHint": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "creditCost": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "example": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "exits": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "label": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "nodeType": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "platform": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "platforms": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_workflow_stats1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "edgeTraversals": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ], + "description": "Traversal counts, keyed by edge id" + }, + { + "type": "null" + } + ], + "description": "Traversal counts, keyed by edge id" + }, + "nodeStats": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ], + "description": "Per-node lead counts, keyed by node id" + }, + { + "type": "null" + } + ], + "description": "Per-node lead counts, keyed by node id" + }, + "pausedActionTypes": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_workspace1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "companyName": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "companyWebsiteUrl": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "icon": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "industry": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "linkedinAccountId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_workspace_billing1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "billingCycle": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "currentPeriodEnd": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "currentPeriodStart": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "plan": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_workspace_branding1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "resolved": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "brandName": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "hidePoweredBy": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "isCustomized": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "logoStorageId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "primaryColor": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "stored": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "brandName": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "hasLogo": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "hidePoweredBy": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "boolean", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "primaryColor": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_workspace_compliance1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "notice": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "text": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "text", + "url" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "resolved": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "lawfulBasisNoticeEnabled": { + "type": "boolean" + } + }, + "required": [ + "lawfulBasisNoticeEnabled" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "stored": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "lawfulBasisNoticeEnabled": { + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "lawfulBasisNoticeEnabled" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_workspace_metrics1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "dateRange": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "endDate": { + "type": "string" + }, + "startDate": { + "type": "string" + } + }, + "required": [ + "startDate", + "endDate" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "latest": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "activeCampaigns": { + "type": [ + "number", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "date": { + "type": [ + "string", + "null" + ] + }, + "leadsAddedToday": { + "type": [ + "number", + "null" + ] + }, + "leadsContactedToday": { + "type": [ + "number", + "null" + ] + }, + "leadsConvertedToday": { + "type": [ + "number", + "null" + ] + }, + "leadsFailedToday": { + "type": [ + "number", + "null" + ] + }, + "topCampaignId": { + "type": [ + "string", + "null" + ] + }, + "totalCampaigns": { + "type": [ + "number", + "null" + ] + }, + "totalLeads": { + "type": [ + "number", + "null" + ] + }, + "workspaceId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "range": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "activeCampaigns": { + "type": [ + "number", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "date": { + "type": [ + "string", + "null" + ] + }, + "leadsAddedToday": { + "type": [ + "number", + "null" + ] + }, + "leadsContactedToday": { + "type": [ + "number", + "null" + ] + }, + "leadsConvertedToday": { + "type": [ + "number", + "null" + ] + }, + "leadsFailedToday": { + "type": [ + "number", + "null" + ] + }, + "topCampaignId": { + "type": [ + "string", + "null" + ] + }, + "totalCampaigns": { + "type": [ + "number", + "null" + ] + }, + "totalLeads": { + "type": [ + "number", + "null" + ] + }, + "workspaceId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_get_workspace_setup1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "checklist": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "additionalProperties": true, + "properties": { + "complete": { + "type": "boolean" + }, + "dismissed": { + "type": "boolean" + }, + "items": { + "items": { + "additionalProperties": true, + "properties": { + "agentField": { + "type": [ + "string", + "null" + ] + }, + "agentWritten": { + "type": [ + "boolean", + "null" + ] + }, + "done": { + "type": [ + "boolean", + "null" + ] + }, + "href": { + "type": [ + "string", + "null" + ] + }, + "key": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "items", + "complete", + "dismissed" + ], + "type": "object" + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "completedAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "completedSteps": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "created": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ], + "description": "Ids created so far: campaignId, icpId, leadListId, workflowId, etc." + }, + { + "type": "null" + } + ], + "description": "Ids created so far: campaignId, icpId, leadListId, workflowId, etc." + }, + "createdAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "currentStep": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "error": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "generationId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "inputs": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ], + "description": "websiteUrl, profileUrl, goal the build ran from" + }, + { + "type": "null" + } + ], + "description": "websiteUrl, profileUrl, goal the build ran from" + }, + "next": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "steps": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ], + "description": "Each step: name, status, detail, startedAt, completedAt" + }, + { + "type": "null" + } + ], + "description": "Each step: name, status, detail, startedAt, completedAt" + }, + "totalSteps": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "workspace": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + {}, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_import_external_leads1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "addedToCampaign": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "errorCode": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "errors": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "imported": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "leadIds": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "skipped": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "total": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_import_leads_csv1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "created": { + "type": [ + "number", + "null" + ] + }, + "errors": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "skipped": { + "type": [ + "number", + "null" + ] + }, + "totalRows": { + "type": [ + "number", + "null" + ] + }, + "updated": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_invite_member1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "email": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "invitationId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "role": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_like_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "jobId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_link_account_to_workspace1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "accountId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "alreadyLinked": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "email": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "isWorkspaceDefault": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "linked": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "platform": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_link_integration1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "alreadyLinked": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "integrationId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "provider": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "sourceWorkspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_link_lead_profile1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "leadId": { + "type": [ + "string", + "null" + ] + }, + "leadSource": { + "type": [ + "string", + "null" + ] + }, + "linked": { + "type": [ + "boolean", + "null" + ] + }, + "platform": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_accounts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "email": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "ownerWorkspaceId": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "pausedAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "platform": { + "type": [ + "string", + "null" + ] + }, + "profileUrl": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "todayBudget": { + "anyOf": [ + { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_agent_memories1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "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" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_ai_suggestions1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "count": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "suggestions": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_automations1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "description": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "disabledReason": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "enabled": { + "type": [ + "boolean", + "null" + ] + }, + "label": { + "type": [ + "string", + "null" + ] + }, + "lastFiredAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "lastResultCount": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "lastRunOutcome": { + "anyOf": [ + { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + { + "type": "null" + } + ] + }, + "schedule": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "scriptId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_campaigns1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "archivedAt": { + "type": [ + "number", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "goal": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + }, + "workspaceId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_companies1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "addedAt": { + "type": [ + "number", + "null" + ] + }, + "companyName": { + "type": [ + "string", + "null" + ] + }, + "companySource": { + "type": [ + "string", + "null" + ] + }, + "employeeRange": { + "type": [ + "string", + "null" + ] + }, + "industry": { + "type": [ + "string", + "null" + ] + }, + "leadCount": { + "type": [ + "number", + "null" + ] + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "tags": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "watchCount": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_company_employee_watches1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "companyId": { + "type": [ + "string", + "null" + ] + }, + "companyName": { + "type": [ + "string", + "null" + ] + }, + "lastRunAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "pauseReason": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_company_employees1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "email": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "fullName": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "headline": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "linkedInUrl": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "seniority": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "title": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_company_signals1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "detectedAt": { + "type": [ + "number", + "null" + ] + }, + "expiresAt": { + "type": [ + "number", + "null" + ] + }, + "label": { + "type": [ + "string", + "null" + ] + }, + "metadata": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "newValue": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "previousValue": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "signalType": { + "type": [ + "string", + "null" + ] + }, + "sourcePlatform": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_competitor_watches1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "totalCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "watches": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "companyId": { + "type": [ + "string", + "null" + ] + }, + "entityType": { + "type": [ + "string", + "null" + ] + }, + "imageSourceUrl": { + "type": [ + "string", + "null" + ] + }, + "lastAnalyzedAt": { + "type": [ + "number", + "null" + ] + }, + "leadId": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "postCount": { + "type": [ + "number", + "null" + ] + }, + "resolvedName": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "targetKey": { + "type": [ + "string", + "null" + ] + }, + "targetPlatform": { + "type": [ + "string", + "null" + ] + }, + "topicsSummary": { + "type": [ + "string", + "null" + ] + }, + "workspaceId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_contact_finder_requests1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "requests": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "completedAt": { + "type": [ + "number", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "creditsCharged": { + "type": [ + "number", + "null" + ] + }, + "creditsReserved": { + "type": [ + "number", + "null" + ] + }, + "errorCode": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "origin": { + "type": [ + "string", + "null" + ] + }, + "result": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "emailFound": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "emailStatus": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "emailWritten": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "phoneFound": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "phoneWritten": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "wantEmail": { + "type": [ + "boolean", + "null" + ] + }, + "wantPhone": { + "type": [ + "boolean", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_content_calendar1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "count": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "posts": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_content_posts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "author": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "body": { + "type": [ + "string", + "null" + ] + }, + "contentPostId": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "failureReason": { + "type": [ + "string", + "null" + ] + }, + "linkedinExtension": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "media": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "mediaIds": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "platform": { + "type": [ + "string", + "null" + ] + }, + "publishedAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "rejectionReason": { + "type": [ + "string", + "null" + ] + }, + "revisionCount": { + "type": [ + "number", + "null" + ] + }, + "scheduledAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "tags": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + }, + "workspaceId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_external_email_accounts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "accounts": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "provider": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_external_lead_lists1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "lists": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "provider": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_external_sequences1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "provider": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "sequences": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_guidance_versions1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "versions": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "author": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "replacedBy": { + "type": [ + "string", + "null" + ] + }, + "target": { + "type": [ + "string", + "null" + ] + }, + "targetId": { + "type": [ + "string", + "null" + ] + }, + "text": { + "type": [ + "string", + "null" + ] + }, + "versionId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_icps1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "campaignId": { + "type": [ + "string", + "null" + ] + }, + "companySizes": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "fitStatement": { + "type": [ + "string", + "null" + ] + }, + "icpId": { + "type": [ + "string", + "null" + ] + }, + "industries": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "isRefreshing": { + "type": [ + "boolean", + "null" + ] + }, + "keywords": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "seniorities": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "titles": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_inbox_conversations1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "account": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "conversationRef": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "platform": { + "type": "string" + } + }, + "required": [ + "platform", + "id" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "displayName": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "groupChat": { + "type": [ + "boolean", + "null" + ] + }, + "hasSchedulingLink": { + "type": [ + "boolean", + "null" + ] + }, + "lastMessageAt": { + "type": [ + "number", + "null" + ] + }, + "lastMessagePreview": { + "type": [ + "string", + "null" + ] + }, + "lead": { + "anyOf": [ + { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "fullName": { + "type": "string" + }, + "normalizedLinkedInUrl": { + "type": "string" + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + { + "type": "null" + } + ] + }, + "leadRef": { + "anyOf": [ + { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "leadId": { + "type": "string" + }, + "leadSource": { + "type": "string" + } + }, + "required": [ + "leadId", + "leadSource" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + { + "type": "null" + } + ] + }, + "matchSnippet": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ], + "description": "Only present on a search match" + }, + { + "type": "null" + } + ], + "description": "Only present on a search match" + }, + "participants": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "platform": { + "type": [ + "string", + "null" + ] + }, + "read": { + "type": [ + "boolean", + "null" + ] + }, + "sponsored": { + "type": [ + "boolean", + "null" + ] + }, + "unreadCount": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_integrations1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_creationTime": { + "type": [ + "number", + "null" + ] + }, + "_id": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "hasApiKey": { + "type": [ + "boolean", + "null" + ] + }, + "hasWebhookSecret": { + "type": [ + "boolean", + "null" + ] + }, + "lastFailure": { + "type": [ + "string", + "null" + ] + }, + "lastSyncAt": { + "type": [ + "number", + "null" + ] + }, + "lastTestedAt": { + "type": [ + "number", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "provider": { + "type": [ + "string", + "null" + ] + }, + "scopeWarning": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_invitations1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "invitedAt": { + "type": [ + "number", + "null" + ] + }, + "role": { + "type": [ + "string", + "null" + ] + }, + "status": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_lead_lists1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "campaignId": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "leadCount": { + "type": [ + "number", + "null" + ] + }, + "leadListId": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "source": { + "type": [ + "string", + "null" + ] + }, + "type": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_lead_signals1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "hasMore": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "nextCursor": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "signals": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_leads_at_node1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "cancelReason": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "companyName": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "enteredAt": { + "type": [ + "number", + "null" + ] + }, + "entryId": { + "type": [ + "string", + "null" + ] + }, + "errorMessage": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "fullName": { + "type": [ + "string", + "null" + ] + }, + "headline": { + "type": [ + "string", + "null" + ] + }, + "jobId": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "leadId": { + "type": [ + "string", + "null" + ] + }, + "profileImageUrl": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_manual_exclusion_urls1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "exclusionId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "urls": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "firstName": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "fullName": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "linkedInUrl": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_members1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "email": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "image": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "joinedAt": { + "type": [ + "number", + "null" + ] + }, + "memberId": { + "type": [ + "string", + "null" + ] + }, + "name": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "role": { + "type": [ + "string", + "null" + ] + }, + "userId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_notifications1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "body": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "link": { + "anyOf": [ + { + "description": "In-app path to the thing it is about", + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ], + "description": "In-app path to the thing it is about" + }, + "notificationId": { + "type": [ + "string", + "null" + ] + }, + "read": { + "type": [ + "boolean", + "null" + ] + }, + "sourceId": { + "type": [ + "string", + "null" + ] + }, + "sourceType": { + "type": [ + "string", + "null" + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "type": { + "type": [ + "string", + "null" + ] + }, + "workspaceId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_pending_reviews1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "aiReasoning": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "aiSources": { + "anyOf": [ + { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + { + "type": "null" + } + ] + }, + "bookedMeeting": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "campaignId": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "campaignName": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "companyFacts": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "conversationHistory": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "craftedContent": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "draftUnavailable": { + "type": [ + "boolean", + "null" + ] + }, + "entryId": { + "type": [ + "string", + "null" + ] + }, + "leadCompany": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "leadFacts": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "leadHeadline": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "leadId": { + "type": [ + "string", + "null" + ] + }, + "leadLinkedInUrl": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "leadName": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "leadProfileImageUrl": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "leadSource": { + "type": [ + "string", + "null" + ] + }, + "linkedinProfile": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "nodeId": { + "type": [ + "string", + "null" + ] + }, + "nodeLabel": { + "type": [ + "string", + "null" + ] + }, + "reviewContext": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "reviewTags": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "sendingAccount": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "sharedLinkGrounded": { + "type": [ + "boolean", + "null" + ] + }, + "sharedLinkUrl": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "signalContext": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "supersededDraft": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "workflowId": { + "type": [ + "string", + "null" + ] + }, + "workflowName": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_personas1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "campaignId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "description": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "fitStatement": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "goals": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "objectionResponses": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": false, + "properties": { + "objection": { + "type": "string" + }, + "response": { + "type": "string" + } + }, + "required": [ + "objection", + "response" + ], + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "objections": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "painPoints": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "updatedAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_phases1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "campaignId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "description": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "objectives": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "order": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "phaseType": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "updatedAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_playbook_versions1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "versions": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "author": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "playbook": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "replacedBy": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_search_topics1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "topics": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "campaignName": { + "type": [ + "string", + "null" + ] + }, + "topicId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "totalCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_signal_agent_leads1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "entry": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "lead": { + "anyOf": [ + { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "_id": { + "type": "string" + }, + "companyName": { + "type": "string" + }, + "firstName": { + "type": [ + "string", + "null" + ] + }, + "lastName": { + "type": [ + "string", + "null" + ] + }, + "linkedinUrl": { + "type": "string" + }, + "title": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + { + "type": "null" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_signal_agents1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "eventsCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "imageUrl": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "leadListId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "postsCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "readAccountUnavailable": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "boolean", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "responseMode": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "targetName": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "targetUrn": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "type": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "workflowId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_signal_watches1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "lastCheckedAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "leadId": { + "type": [ + "string", + "null" + ] + }, + "leadName": { + "type": [ + "string", + "null" + ] + }, + "leadSource": { + "anyOf": [ + { + "enum": [ + "global", + "private" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "nextCheckAt": { + "anyOf": [ + { + "type": [ + "number", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "pauseReason": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_split_optimization_logs1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "branchStats": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "killedBranches": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "newWeights": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "nodeId": { + "type": [ + "string", + "null" + ] + }, + "oldWeights": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "reasoning": { + "type": [ + "string", + "null" + ] + }, + "workflowId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_voice_experiment_results1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "channels": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "collecting": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "craftKinds": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "generic": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "$ref": "#/properties/voice/anyOf/0/anyOf/1" + } + ] + }, + { + "type": "null" + } + ] + }, + "profileVersions": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "number" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "relativeLift": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "thesisValidated": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "voice": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": false, + "properties": { + "accepted": { + "type": "number" + }, + "interval": { + "additionalProperties": false, + "properties": { + "high": { + "type": "number" + }, + "low": { + "type": "number" + } + }, + "required": [ + "low", + "high" + ], + "type": "object" + }, + "replies": { + "type": "number" + }, + "replyRate": { + "type": "number" + }, + "sends": { + "type": "number" + } + }, + "required": [ + "sends", + "replies", + "accepted", + "replyRate", + "interval" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_voice_versions1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "versions": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "active": { + "type": [ + "boolean", + "null" + ] + }, + "author": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "language": { + "type": [ + "string", + "null" + ] + }, + "readableSummary": { + "type": [ + "string", + "null" + ] + }, + "replacedBy": { + "type": [ + "string", + "null" + ] + }, + "situations": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "version": { + "type": [ + "number", + "null" + ] + }, + "versionId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_webhook_templates1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "templates": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "category": { + "type": [ + "string", + "null" + ] + }, + "configExample": { + "anyOf": [ + {}, + { + "type": "null" + } + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "id": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "provider": { + "type": [ + "string", + "null" + ] + }, + "secretFields": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "userFields": { + "anyOf": [ + { + "items": {}, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_list_workflows1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "campaignId": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "enabled": { + "type": [ + "boolean", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "nodeCount": { + "type": [ + "number", + "null" + ] + }, + "signalAgentId": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + }, + "workflowId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "result": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "campaignId": { + "anyOf": [ + { + "$ref": "#/properties/data/anyOf/0/anyOf/1/items/properties/campaignId/anyOf/0" + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "enabled": { + "type": [ + "boolean", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "nodeCount": { + "type": [ + "number", + "null" + ] + }, + "signalAgentId": { + "anyOf": [ + { + "$ref": "#/properties/data/anyOf/0/anyOf/1/items/properties/signalAgentId/anyOf/0" + }, + { + "type": "null" + } + ] + }, + "status": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + }, + "workflowId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_mark_all_notifications_read1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "error": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "ok": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_mark_conversation_read1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "error": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "ok": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_mark_notification_read1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "error": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "ok": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_onboard_workspace1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "next": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "note": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "state": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "agentWrittenUnconfirmed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "caps": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "employerCompany": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "fields": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "linkedinProfile": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "workspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "written": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_optimize_split_node1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "nodeId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_pause_company_employee_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "watchId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_pause_competitor_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "watchId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_pause_signal_agent1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agentId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_pause_signal_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "watchId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_preview_craft_prompt1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "caller": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "chars": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "systemPrompt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "userPrompt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "index": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "nodeType": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "systemPrompt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "userPrompt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_priority_enrich1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "alreadyProcessing": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "queued": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "upgraded": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_propose_playbook_change1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "assistantMessage": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "proposalId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_queue_leads1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "errors": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "failed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "succeeded": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_refresh_inbox1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "errors": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "refreshed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "skipped": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_regenerate_playbook1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "regenerated": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_reject_content_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "contentPostId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_reject_draft_checkup1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "checkupId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "decision": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_reject_review1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "decision": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "entryId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_remove_company_employee_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "removed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "watchId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_remove_lead_list1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "deleted": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "leadListId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_remove_leads_from_list1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "removed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_remove_manual_exclusion_url1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "deleted": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "importedLeadId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_remove_member1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "removedMemberId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_remove_signal_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "removed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "watchId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_reopen_review1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "decision": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "entryId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_reply_to_comment1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "needsHumanReview": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "replyText": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "reviewReason": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_request_connect_link1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "expiresAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "extensionUrl": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "instructions": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "next": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "platform": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "url": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_reread_review_link1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "decision": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "entryId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "linkUrl": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_restore_superseded_draft1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "entryId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "restored": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_resume_company_employee_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "watchId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_resume_competitor_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "watchId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_resume_signal_agent1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agentId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_resume_signal_watch1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "watchId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_retry_content_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "contentPostId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_retry_failed_entries_at_node1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "nodeId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "remaining": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "retried": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_retry_failed_entry1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "entryId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "newStatus": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_retry_review1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "decision": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "entryId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_revert_guidance1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "target": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "targetId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "text": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_revert_playbook1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "reverted": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_revert_voice1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "language": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "version": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_revoke_invitation1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "invitationId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "revoked": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_run_draft_checkup1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "checkupId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "ok": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "reason": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_schedule_content_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "contentPostId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_search_leads1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "data": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "properties": { + "company": { + "type": [ + "string", + "null" + ] + }, + "email": { + "type": [ + "string", + "null" + ] + }, + "fullName": { + "type": [ + "string", + "null" + ] + }, + "leadId": { + "type": [ + "string", + "null" + ] + }, + "linkedInUrl": { + "description": "Alias of profiles.linkedin.url", + "type": [ + "string", + "null" + ] + }, + "profiles": { + "anyOf": [ + { + "description": "Per-platform profile, keyed by platform" + }, + { + "type": "null" + } + ], + "description": "Per-platform profile, keyed by platform" + }, + "title": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "pagination": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "hasMore": { + "type": [ + "boolean", + "null" + ] + }, + "nextCursor": { + "type": [ + "string", + "null" + ] + }, + "totalCount": { + "description": "Total matching rows when known", + "type": [ + "number", + "null" + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_send_connection_request1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "jobId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_send_inmail1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "jobId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_send_message1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "messageEntityUrn": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_set_account_owner_workspace1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "ownerWorkspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "previousOwnerWorkspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_set_account_watcher1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agentId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "created": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "string", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_set_agent_exclusions1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "count": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "signalAgentId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_set_workflow_accounts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "accountCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "workflowId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_start_connections_export1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "jobId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "message": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_submit_content_for_approval1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "contentPostId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_submit_feedback1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "reportId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "submitted": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_sync_lead_to_hubspot1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "companyId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "contactId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "degraded": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ], + "description": "Steps that fell back gracefully" + }, + { + "type": "null" + } + ], + "description": "Steps that fell back gracefully" + }, + "noteId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_toggle_automation1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "automationId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "enabled": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_toggle_exclusion1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "enabled": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "exclusionId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_trigger_icp_scoring1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "icpId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "scheduled": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_trigger_workflow1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "triggered": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "workflowStatus": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_unarchive_campaign1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "archived": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "campaignId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_unlink_lead_profile1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "leadSource": { + "type": [ + "string", + "null" + ] + }, + "newLeadId": { + "description": "The lead the unlinked profile now lives on", + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_unschedule_content_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "contentPostId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "scheduledAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": [ + "number", + "null" + ] + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_campaign1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "archivedAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "campaignGuidance": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "goal": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "icpSummary": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": false, + "properties": { + "icpId": { + "type": "string" + }, + "industries": { + "items": { + "type": "string" + }, + "type": "array" + }, + "seniorities": { + "items": { + "type": "string" + }, + "type": "array" + }, + "titles": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "icpId", + "titles", + "industries", + "seniorities" + ], + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "leadListCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "offerAddendum": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "title": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "workflowCount": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaceId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_campaign_weight1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "id": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "scoreImpact": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "signalType": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_company_metadata1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "changed": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "notes": { + "type": "string" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "companyId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_competitor_watch_accounts1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "accountIds": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "watchId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_content_post1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "contentPostId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_conversation_voice1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "version": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_filter_exclusion_rules1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "exclusionId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "logic": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "rules": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_icp3 fields changed- added
Input schema / properties / fitStatementAdded value: +{ + "description": "One line describing the company worth working, judged later against a real company's own words. Say what they do, who they sell to, roughly what size, and what has to be true for them to need this. Over 300 characters is rejected, never shortened.", + "maxLength": 300, + "type": "string" +} - added
Input schema / properties / siteFactsAdded value: +{ + "additionalProperties": false, + "description": "Target on what the company's own website says. Every filter you set has to hold. A company whose site has not been read, or whose reading is silent on what you asked, is neither matched nor penalised.", + "properties": { + "primaryBuyer": { + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + "productStage": { + "additionalProperties": false, + "description": "Stage from 0 (pre-launch) to 3 (mature), inclusive on both ends.", + "properties": { + "max": { + "maximum": 3, + "minimum": 0, + "type": "number" + }, + "min": { + "maximum": 3, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + "selfServeSignup": { + "type": "boolean" + }, + "sellsToAgencies": { + "type": "boolean" + } + }, + "type": "object" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "icpId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_lead_contact_info1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "leadId": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_lead_list1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "leadListId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "success": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_lead_metadata1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "leadId": { + "type": [ + "string", + "null" + ] + }, + "notes": { + "type": [ + "string", + "null" + ] + }, + "tags": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_member_role1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "memberId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "role": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_notification_preferences1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "error": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "ok": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_persona3 fields changed- added
Input schema / properties / fitStatementAdded value: +{ + "description": "The person in role terms: what they run, who they report to, what they are measured on. Judged against a lead's title, headline and seniority, so keep it recognisable from those. Never the pitch. Over 200 characters is rejected, never shortened.", + "maxLength": 200, + "type": "string" +} - added
Input schema / properties / objectionResponsesAdded value: +{ + "description": "The workspace's own answer to each objection, used when a lead raises it in a reply. Ask the user for the wording and pass it through; never invent an answer for them. Over 8 pairs, or a line over its limit, is rejected rather than shortened.", + "items": { + "additionalProperties": false, + "properties": { + "objection": { + "description": "The objection, in the words a lead uses.", + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "response": { + "description": "What this workspace actually says back. Their assertion, never yours.", + "maxLength": 400, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "objection", + "response" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "campaignId": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "fitStatement": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "goals": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "objectionResponses": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": false, + "properties": { + "objection": { + "type": "string" + }, + "response": { + "type": "string" + } + }, + "required": [ + "objection", + "response" + ], + "type": "object" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "objections": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "painPoints": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_phase1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "type": [ + "string", + "null" + ] + }, + "campaignId": { + "type": [ + "string", + "null" + ] + }, + "createdAt": { + "type": [ + "number", + "null" + ] + }, + "description": { + "type": [ + "string", + "null" + ] + }, + "name": { + "type": [ + "string", + "null" + ] + }, + "objectives": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ] + }, + "order": { + "type": [ + "number", + "null" + ] + }, + "phaseType": { + "type": [ + "string", + "null" + ] + }, + "updatedAt": { + "type": [ + "number", + "null" + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_signal_agent1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "agentId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "warnings": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_workflow1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "updated": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "workflowId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_workflow_node1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "config": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "declaredActions": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "anyOf": [ + { + "additionalProperties": false, + "description": "For an ai:autonomous node: the actions its brief was read as taking, the reach flags, and whether the brief said nothing legible. Also present inside config.declaredActions.", + "properties": { + "actions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "briefHash": { + "type": "string" + }, + "evaluatedAt": { + "type": "number" + }, + "flags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "model": { + "type": "string" + }, + "uncertain": { + "type": "boolean" + } + }, + "type": "object" + }, + { + "type": "null" + } + ], + "description": "For an ai:autonomous node: the actions its brief was read as taking, the reach flags, and whether the brief said nothing legible. Also present inside config.declaredActions." + } + ], + "description": "For an ai:autonomous node: the actions its brief was read as taking, the reach flags, and whether the brief said nothing legible. Also present inside config.declaredActions." + }, + { + "type": "null" + } + ], + "description": "For an ai:autonomous node: the actions its brief was read as taking, the reach flags, and whether the brief said nothing legible. Also present inside config.declaredActions." + }, + "label": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "nodeId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "nodeType": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_workflow_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "campaignId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "createdAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "description": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "enabled": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "updatedAt": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "number" + } + ] + }, + { + "type": "null" + } + ] + }, + "workflowId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_workspace2 fields changed- added
Input schema / properties / jevFeaturesAdded value: +{ + "additionalProperties": false, + "properties": { + "agentGuard": { + "$ref": "#/properties/jevFeatures/properties/replyIntent" + }, + "briefIntent": { + "$ref": "#/properties/jevFeatures/properties/replyIntent" + }, + "confidenceGate": { + "$ref": "#/properties/jevFeatures/properties/replyIntent" + }, + "critic": { + "$ref": "#/properties/jevFeatures/properties/replyIntent" + }, + "draftLabels": { + "$ref": "#/properties/jevFeatures/properties/replyIntent" + }, + "replyIntent": { + "enum": [ + "off", + "shadow", + "live" + ], + "type": "string" + } + }, + "type": "object" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "_id": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "capabilities": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "companyName": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "companyWebsiteUrl": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "industry": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "jevFeatures": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "name": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "offerContext": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "outreachIntents": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "sections": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + {} + ] + }, + { + "type": "null" + } + ] + }, + "warnings": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": {}, + "type": "array" + } + ], + "description": "Playbook lint warnings, when any" + }, + { + "type": "null" + } + ], + "description": "Playbook lint warnings, when any" + } + }, + "type": "object" +}
- Changed
campaignstack_update_workspace_branding1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "error": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "ok": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_update_workspace_compliance1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "error": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "notice": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "text": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "text", + "url" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "ok": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "boolean" + } + ] + }, + { + "type": "null" + } + ] + }, + "resolved": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "lawfulBasisNoticeEnabled": { + "type": "boolean" + } + }, + "required": [ + "lawfulBasisNoticeEnabled" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "stored": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "lawfulBasisNoticeEnabled": { + "type": [ + "boolean", + "null" + ] + } + }, + "required": [ + "lawfulBasisNoticeEnabled" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
campaignstack_whoami1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, + "properties": { + "capabilities": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "additionalProperties": true, + "properties": { + "direction": { + "type": [ + "string", + "null" + ] + }, + "means": { + "type": [ + "string", + "null" + ] + }, + "note": { + "type": [ + "string", + "null" + ] + }, + "scope": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "type": "array" + } + ], + "description": "Each granted scope in plain words" + }, + { + "type": "null" + } + ], + "description": "Each granted scope in plain words" + }, + "keyPrefix": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "keyType": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ], + "description": "workspace, user, oauth or stdio" + }, + { + "type": "null" + } + ], + "description": "workspace, user, oauth or stdio" + }, + "scopes": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + { + "type": "null" + } + ] + }, + "user": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "additionalProperties": true, + "properties": { + "email": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + }, + "id": { + "type": [ + "string", + "null" + ] + }, + "name": { + "anyOf": [ + { + "type": [ + "string", + "null" + ] + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaceId": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ], + "description": "Set only for a key bound to one workspace" + }, + { + "type": "null" + } + ], + "description": "Set only for a key bound to one workspace" + }, + "workspaceName": { + "anyOf": [ + { + "anyOf": [ + { + "not": {} + }, + { + "type": "string" + } + ] + }, + { + "type": "null" + } + ] + }, + "workspaces": { + "anyOf": [ + { + "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" + } + ], + "description": "Every workspace this person can reach, for the workspaceId argument" + } + }, + "type": "object" +}
6 tool updates
- Added
campaignstack_create_workspace - Added
campaignstack_get_workspace_setup - Added
campaignstack_link_account_to_workspace - Added
campaignstack_link_integration - Added
campaignstack_onboard_workspace - Added
campaignstack_request_connect_link
3 tool updates
- Added
campaignstack_apply_agent_memory - Added
campaignstack_delete_agent_memory - Added
campaignstack_list_agent_memories
24 tool updates
- Added
campaignstack_archive_signal_agent - Changed
campaignstack_comment_on_post10 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / accountIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / commentTextAdded value: +{ + "maxLength": 1250, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / dangerouslyBypassSafetySystemAdded value: +{ + "description": "Deprecated name for overrideOwnLimits. Use overrideOwnLimits.", + "type": "boolean" +} - added
Input schema / properties / leadIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / overrideOwnLimitsAdded 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" +} - added
Input schema / properties / platformAdded value: +{ + "enum": [ + "linkedin" + ], + "type": "string" +} - added
Input schema / properties / profileUrlAdded value: +{ + "format": "uri", + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "platform", + "commentText" +]
- Changed
campaignstack_craft_comment9 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / campaignIdAdded value: +{ + "type": "string" +} - added
Input schema / properties / instructionsAdded value: +{ + "type": "string" +} - added
Input schema / properties / leadIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / postContentAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / workflowIdAdded value: +{ + "description": "Workflow the craft belongs to. Used to resolve signal-agent playbooks. Injected automatically for runner agents.", + "type": "string" +} - added
Input schema / properties / workspaceIdAdded value: +{ + "description": "Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach.", + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "leadId", + "postContent" +]
- Changed
campaignstack_craft_followup11 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / accountIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / campaignIdAdded value: +{ + "type": "string" +} - added
Input schema / properties / conversationMessagesAdded value: +{ + "description": "Optional. Messages the LEAD sent that you read on screen and the platform may not have synced yet. The thread itself is read from the stored conversation. Never include your own messages: every message this account sent already has a row, and a self entry is ignored.", + "items": { + "additionalProperties": false, + "properties": { + "sender": { + "enum": [ + "self", + "lead" + ], + "type": "string" + }, + "text": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "sender", + "text" + ], + "type": "object" + }, + "maxItems": 100, + "type": "array" +} - added
Input schema / properties / instructionsAdded value: +{ + "type": "string" +} - added
Input schema / properties / leadIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / leadSourceAdded value: +{ + "description": "Optional. Leave it out unless you know which lead store the id came from: the server derives it from the leadId and ignores a value that disagrees.", + "enum": [ + "global", + "private" + ], + "type": "string" +} - added
Input schema / properties / workflowIdAdded value: +{ + "description": "Workflow the craft belongs to. Used to resolve signal-agent playbooks. Injected automatically for runner agents.", + "type": "string" +} - added
Input schema / properties / workspaceIdAdded value: +{ + "description": "Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach.", + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "leadId", + "accountId" +]
- Changed
campaignstack_craft_message9 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / campaignIdAdded value: +{ + "type": "string" +} - added
Input schema / properties / instructionsAdded value: +{ + "type": "string" +} - added
Input schema / properties / leadIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / messageTemplateAdded value: +{ + "type": "string" +} - added
Input schema / properties / workflowIdAdded value: +{ + "description": "Workflow the craft belongs to. Used to resolve signal-agent playbooks. Injected automatically for runner agents.", + "type": "string" +} - added
Input schema / properties / workspaceIdAdded value: +{ + "description": "Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach.", + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "leadId" +]
- Changed
campaignstack_craft_note8 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / campaignIdAdded value: +{ + "type": "string" +} - added
Input schema / properties / instructionsAdded value: +{ + "type": "string" +} - added
Input schema / properties / leadIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / workflowIdAdded value: +{ + "description": "Workflow the craft belongs to. Used to resolve signal-agent playbooks. Injected automatically for runner agents.", + "type": "string" +} - added
Input schema / properties / workspaceIdAdded value: +{ + "description": "Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach.", + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "leadId" +]
- Changed
campaignstack_create_workflow1 field changed- changed
Input schema / properties / sourceConfig / descriptionPrevious value: -"Source node configuration (providers format only). Omit to use the default: a single campaign_pool provider with icpScoreMin 50. Signal-intake graphs using lead-list-based sources are not supported by this tool."New value: +"Source node configuration (providers format only). Omit to use the default: a single campaign_pool provider with icpScoreMin 50. A lead-list-based (signal-intake) source cannot be authored here: create the watcher that owns it instead, which generates the workflow and its lead list together. campaignstack_explain_capabilities with topic workflows says which watcher to use."
- Changed
campaignstack_diagnose_lead_sourcing6 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / leadIdAdded value: +{ + "type": "string" +} - added
Input schema / properties / profileUrlAdded value: +{ + "type": "string" +} - added
Input schema / properties / workflowIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "workflowId" +]
- Added
campaignstack_explain_capabilities - Changed
campaignstack_follow_profile9 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / accountIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / dangerouslyBypassSafetySystemAdded value: +{ + "description": "Deprecated name for overrideOwnLimits. Use overrideOwnLimits.", + "type": "boolean" +} - added
Input schema / properties / leadIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / overrideOwnLimitsAdded 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" +} - added
Input schema / properties / platformAdded value: +{ + "enum": [ + "linkedin" + ], + "type": "string" +} - added
Input schema / properties / profileUrlAdded value: +{ + "format": "uri", + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "platform" +]
- Removed
campaignstack_get_apollo_import_progress - Changed
campaignstack_get_external_import_progress1 field changed- changed
Input schema / properties / provider / enumPrevious value: -[ - "instantly", - "hubspot" -]New value: +[ + "apollo", + "instantly", + "hubspot" +]
- Removed
campaignstack_import_apollo_list - Changed
campaignstack_import_external_leads2 fields changed- changed
Input schema / properties / provider / enumPrevious value: -[ - "instantly", - "hubspot" -]New value: +[ + "apollo", + "instantly", + "hubspot" +] - changed
Input schema / properties / sourceKind / descriptionPrevious value: -"Whether sourceId is a provider lead list, a provider campaign (instantly only), or the whole portal (hubspot only: every contact)."New value: +"Whether sourceId is a provider lead list (apollo, instantly, hubspot), a provider campaign (instantly only), or the whole portal (hubspot only: every contact)."
- Changed
campaignstack_like_post9 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / accountIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / dangerouslyBypassSafetySystemAdded value: +{ + "description": "Deprecated name for overrideOwnLimits. Use overrideOwnLimits.", + "type": "boolean" +} - added
Input schema / properties / leadIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / overrideOwnLimitsAdded 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" +} - added
Input schema / properties / platformAdded value: +{ + "enum": [ + "linkedin" + ], + "type": "string" +} - added
Input schema / properties / profileUrlAdded value: +{ + "format": "uri", + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "platform" +]
- Removed
campaignstack_list_apollo_sources - Changed
campaignstack_list_external_lead_lists1 field changed- changed
Input schema / properties / provider / enumPrevious value: -[ - "instantly", - "hubspot", - "clay" -]New value: +[ + "apollo", + "instantly", + "hubspot", + "clay" +]
- Changed
campaignstack_list_split_optimization_logs5 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limitAdded value: +{ + "default": 20, + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / nodeIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / workflowIdAdded value: +{ + "minLength": 1, + "type": "string" +}
- Changed
campaignstack_reply_to_comment11 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / addDmHintAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / campaignIdAdded value: +{ + "type": "string" +} - added
Input schema / properties / commentTextAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / instructionsAdded value: +{ + "type": "string" +} - added
Input schema / properties / leadIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / postContentAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / workflowIdAdded value: +{ + "description": "Workflow the craft belongs to. Used to resolve signal-agent playbooks. Injected automatically for runner agents.", + "type": "string" +} - added
Input schema / properties / workspaceIdAdded value: +{ + "description": "Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach.", + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "leadId", + "commentText", + "postContent" +]
- Changed
campaignstack_send_connection_request10 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / accountIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / dangerouslyBypassSafetySystemAdded value: +{ + "description": "Deprecated name for overrideOwnLimits. Use overrideOwnLimits.", + "type": "boolean" +} - added
Input schema / properties / leadIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / noteAdded value: +{ + "maxLength": 300, + "type": "string" +} - added
Input schema / properties / overrideOwnLimitsAdded 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" +} - added
Input schema / properties / platformAdded value: +{ + "enum": [ + "linkedin" + ], + "type": "string" +} - added
Input schema / properties / profileUrlAdded value: +{ + "format": "uri", + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "platform" +]
- Changed
campaignstack_send_inmail11 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / accountIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / dangerouslyBypassSafetySystemAdded value: +{ + "description": "Deprecated name for overrideOwnLimits. Use overrideOwnLimits.", + "type": "boolean" +} - added
Input schema / properties / leadIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / messageTextAdded value: +{ + "maxLength": 1900, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / overrideOwnLimitsAdded 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" +} - added
Input schema / properties / platformAdded value: +{ + "enum": [ + "linkedin" + ], + "type": "string" +} - added
Input schema / properties / profileUrlAdded value: +{ + "format": "uri", + "type": "string" +} - added
Input schema / properties / subjectAdded value: +{ + "maxLength": 200, + "minLength": 1, + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "platform", + "subject", + "messageText" +]
- Changed
campaignstack_send_message3 fields changed- removed
Input schema / properties / dangerouslyBypassSafetySystem / defaultRemoved value: -false - added
Input schema / properties / dangerouslyBypassSafetySystem / descriptionAdded value: +"Deprecated name for overrideOwnLimits. Use overrideOwnLimits." - added
Input schema / properties / overrideOwnLimitsAdded 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" +}
- Changed
campaignstack_sync_lead_to_hubspot1 field changed- changed
Input schema / properties / lifecycleStage / descriptionPrevious value: -"HubSpot lifecyclestage to set (e.g. 'lead'). NEVER sent unless provided — sending it can downgrade an existing customer contact"New value: +"HubSpot lifecyclestage to set (e.g. 'lead'). NEVER sent unless provided: sending it can downgrade an existing customer contact"
- Changed
campaignstack_update_workflow9 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / descriptionAdded value: +{ + "description": "New workflow description", + "type": "string" +} - added
Input schema / properties / emailGoogleAccountIdAdded value: +{ + "anyOf": [ + { + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Workflow-level email sending account for google:email_send nodes (a googleAccounts id from campaignstack_list_external_email_accounts provider=google, or null to clear). When unset, sends fall back to the account matching the workflow's LinkedIn identity, then the campaign default. Setting an account resumes email leads parked as no_email_account_configured or account_expired." +} - added
Input schema / properties / graphAdded value: +{ + "additionalProperties": false, + "description": "Replacement workflow graph. Replaces all existing non-anchor nodes and edges. Use campaignstack_get_workflow_node_types to discover valid node types.", + "properties": { + "anchorEdges": { + "items": { + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "targetIndex": { + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "targetIndex", + "label" + ], + "type": "object" + }, + "maxItems": 25, + "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": { + "additionalProperties": {}, + "default": {}, + "type": "object" + }, + "existingNodeId": { + "description": "Id of an existing workflow node this node updates in place (get ids via campaignstack_get_workflow). Claimed nodes keep their in-flight leads; nodes without a claim are created fresh, and existing nodes nobody claims are deleted; this fails with NODE_HAS_ACTIVE_LEADS if they still hold active leads.", + "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" +} - added
Input schema / properties / nameAdded value: +{ + "description": "New workflow name", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / outreachIntentsAdded value: +{ + "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" +} - added
Input schema / properties / workflowIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "workflowId" +]
137 tool updates
- Changed
campaignstack_accept_draft_checkup1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_add_lead_to_external_list1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_add_lead_to_sequence1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_add_manual_exclusion_urls1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_approve_review1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_cancel_node_leads1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_connect_apollo1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_connect_hubspot1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_connect_instantly1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_count_pending_reviews1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_count_unread_notifications1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_create_campaign1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_create_company_employee_watch1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_create_competitor_watch1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_create_connection_watch_agent1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_create_content_post1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_create_signal_agent1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_create_signal_watch1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_create_workflow1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_decide_playbook_proposal1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_disconnect_integration1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_edit_and_approve_review1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_edit_scheduled_message1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_enrich_company_info1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_enrich_lead_contact_info1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Added
campaignstack_estimate_cost - Added
campaignstack_explain_draft - Changed
campaignstack_export_craft_audit1 field changed- added
Input schema / properties / includeAdded value: +{ + "description": "Heavy fields to include verbatim. Default: neither. A single row's prompts run to tens of thousands of characters, so ask for them only when you are going to read them, which usually means one row you already identified. systemPromptChars, userPromptChars and rawOutputChars are always returned.", + "items": { + "enum": [ + "prompts", + "rawOutput" + ], + "type": "string" + }, + "maxItems": 2, + "type": "array" +}
- Changed
campaignstack_extract_company_employees1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_extract_conversation_voice1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_extract_recent_comments1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_fetch_mutual_connections1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_find_warm_paths1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_account_maintenance1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_account_safety1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_apollo_import_progress1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_contact_finder_request1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_content_analytics1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_conversation_voice1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Added
campaignstack_get_craft_config_tree - Changed
campaignstack_get_credit_balance1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_draft_checkup1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_enrichment_status1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_exclusions1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_external_import_progress1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_inbox_unread_count1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_lead_history1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_platform_capabilities1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_playbook1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_playbook_proposal1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_workspace1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_workspace_billing1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_workspace_branding1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_workspace_compliance1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_get_workspace_metrics1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_import_apollo_list1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_import_external_leads1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_import_leads_csv1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_invite_member1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_link_lead_profile1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_accounts1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_ai_suggestions1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_apollo_sources1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_campaigns1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_companies1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_company_employee_watches1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_competitor_watches1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_contact_finder_requests1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_content_calendar1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_content_posts1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_external_email_accounts1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_external_lead_lists1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_external_sequences1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Added
campaignstack_list_guidance_versions - Changed
campaignstack_list_inbox_conversations1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_integrations1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_invitations1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_manual_exclusion_urls1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_members1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_notifications1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_pending_reviews1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_playbook_versions1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_search_topics1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_signal_agents1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_signal_watches1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_list_voice_experiment_results1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Added
campaignstack_list_voice_versions - Changed
campaignstack_list_workflows3 fields changed- added
Input schema / properties / campaignId / descriptionAdded value: +"List only this campaign's workflows. Omit to list EVERY workflow in the workspace, including ones whose campaign was archived and ones a signal agent owns." - added
Input schema / properties / workspaceIdAdded value: +{ + "description": "Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach.", + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "campaignId" -]
- Changed
campaignstack_mark_all_notifications_read1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_pause_company_employee_watch1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_pause_signal_watch1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Added
campaignstack_preview_craft_prompt - Changed
campaignstack_priority_enrich1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_propose_playbook_change1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_queue_leads1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_refresh_inbox1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_regenerate_playbook1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_reject_draft_checkup1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_reject_review1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_remove_company_employee_watch1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_remove_manual_exclusion_url1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_remove_member1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_remove_signal_watch1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_reopen_review1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_reread_review_link1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_restore_superseded_draft1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_resume_company_employee_watch1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_resume_signal_watch1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_retry_failed_entries_at_node1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_retry_failed_entry1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_retry_review1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Added
campaignstack_revert_guidance - Changed
campaignstack_revert_playbook1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Added
campaignstack_revert_voice - Changed
campaignstack_revoke_invitation1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_run_draft_checkup1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_search_leads1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_set_account_owner_workspace1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach. This workspace will OWN the connected account."
- Changed
campaignstack_set_account_watcher1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_set_agent_exclusions1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_submit_feedback1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_sync_lead_to_hubspot1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_toggle_exclusion1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_unlink_lead_profile1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_update_campaign3 fields changed- added
Input schema / properties / campaignGuidanceAdded value: +{ + "description": "Tone and tactics for this campaign only, APPENDED below the workspace playbook (it never stands alone). Read the workspace playbook first with campaignstack_get_playbook and write only what differs for this audience. Pass an empty string to clear it.", + "maxLength": 2000, + "type": "string" +} - added
Input schema / properties / offerAddendumAdded value: +{ + "description": "What this campaign can offer that the workspace offer does not, e.g. a free audit or a sample report. Rendered inside COMPANY CONTEXT as fact, so the craft may promise it; anything not stated in the offer or here is invented and the craft is told to drop it. Facts only, never tone (tone is campaignGuidance). Pass an empty string to clear it.", + "maxLength": 1500, + "type": "string" +} - changed
Input schema / properties / outreachIntents / descriptionPrevious value: -"Acceptable outcomes for this outreach, most preferred FIRST. Answers 'why are we writing to these people': a message with no stated purpose reads as a compliment plus an open question. 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. The craft picks the highest outcome the individual reader could plausibly give, so listing several is how a non-buyer still gets a relevant message."New value: +"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."
- Changed
campaignstack_update_company_metadata1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_update_conversation_voice4 fields changed- added
Input schema / properties / overlays / additionalProperties / properties / authoredFieldsAdded value: +{ + "description": "Read-only. Server-owned: the fields a human set, which a re-extraction leaves alone.", + "items": { + "type": "string" + }, + "maxItems": 25, + "type": "array" +} - added
Input schema / properties / overlays / additionalProperties / properties / origin / descriptionAdded value: +"Read-only. Server-owned: an edit is recorded as authored whatever is sent here." - changed
Input schema / properties / overlays / additionalProperties / requiredPrevious value: -[ - "n", - "words", - "sentenceLengthAvg", - "sentenceLengthVariance", - "wordsMedian", - "wordsP90", - "emojiRate", - "greetings", - "signOffs", - "delivery", - "exemplars", - "origin" -]New value: +[ + "n", + "words", + "sentenceLengthAvg", + "sentenceLengthVariance", + "wordsMedian", + "wordsP90", + "emojiRate", + "greetings", + "signOffs", + "delivery", + "exemplars" +] - changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_update_filter_exclusion_rules1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_update_lead_contact_info1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_update_lead_metadata1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (required for user keys; workspace keys are bound)"New value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_update_member_role1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_update_notification_preferences1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_update_signal_agent2 fields changed- added
Input schema / properties / agentScriptAdded value: +{ + "description": "The agent's standing orders, layered BELOW the workspace playbook: it wins where the two conflict and the workspace playbook applies where it is silent. Say what to DO at each stage of this thread (what to ask first, what counts as an answer, when to stop) and nothing about how to sound: tone, length and emoji come from the sender's measured voice profile, and an instruction here overrides a measurement with a guess, then shows up in the message as the model naming the tone it was asked for. Max 6000 characters, enforced server-side. Empty string clears it.", + "maxLength": 6000, + "type": "string" +} - removed
Input schema / properties / playbookRemoved value: -{ - "maxLength": 6000, - "type": "string" -}
- Added
campaignstack_update_workflow_node - Changed
campaignstack_update_workspace4 fields changed- changed
Input schema / properties / outreachIntents / descriptionPrevious value: -"Acceptable outcomes for this outreach, most preferred FIRST. Answers 'why are we writing to these people': a message with no stated purpose reads as a compliment plus an open question. 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. The craft picks the highest outcome the individual reader could plausibly give, so listing several is how a non-buyer still gets a relevant message."New value: +"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." - removed
Input schema / properties / playbookSectionsRemoved value: -{ - "additionalProperties": false, - "description": "The workspace playbook, one field per section. Only the fields you pass are changed. Each field has a target length and a HARD character cap; a write over the cap is REJECTED, not truncated. Write to the target, not the cap: identity (aim for about 400, max 1200, sent on every message): who we are, positioning, what makes us different; voice (aim for about 400, max 1200, sent on every message): tone, formality, words to use and avoid; boundaries (aim for about 500, max 1500, sent on every message): topics to avoid, claims never to make; angles (aim for about 1000, max 3000, sent on messages we send first): reasons to reach out that land, and the levers that persuade; objections (aim for about 2000, max 6000, sent on replies, after they have written back): what people push back with, and the real answers. Sections are selected per message, so a long objections list costs a first message nothing. Do NOT restate the offer, the personas or the campaign goal here: all three already reach the prompt from structured data, and a second copy can only contradict the first.", - "properties": { - "angles": { - "type": "string" - }, - "boundaries": { - "type": "string" - }, - "identity": { - "type": "string" - }, - "objections": { - "type": "string" - }, - "voice": { - "type": "string" - } - }, - "type": "object" -} - added
Input schema / properties / sectionsAdded value: +{ + "additionalProperties": false, + "description": "The workspace playbook, one field per section. Only the fields you pass are changed. Each field has a target length and a HARD character cap; a write over the cap is REJECTED, not truncated. Write to the target, not the cap: identity (aim for about 400, max 1200, sent on every message): who we are, positioning, what makes us different; voice (aim for about 400, max 1200, sent on every message): rules that survive any voice: what to answer first, one ask per message, length caps. Never adjectives about tone, which get written into the drafts; angles (aim for about 1000, max 3000, sent on messages we send first): reasons to reach out that land, and the levers that persuade; objections (aim for about 2000, max 6000, sent on replies, after they have written back): what people push back with, and the real answers; boundaries (aim for about 500, max 1500, sent on every message): topics to avoid, claims never to make. Each section is model-facing text the model reads verbatim under its own heading: explanations of how the field works belong in the interface, not in the field, and a section must stand alone rather than refer to another one. Sections are selected per message, so a long objections list costs a first message nothing. Do NOT restate the offer, the personas or the campaign goal here: all three already reach the prompt from structured data, and a second copy can only contradict the first.", + "properties": { + "angles": { + "type": "string" + }, + "boundaries": { + "type": "string" + }, + "identity": { + "type": "string" + }, + "objections": { + "type": "string" + }, + "voice": { + "type": "string" + } + }, + "type": "object" +} - added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_update_workspace_branding1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
- Changed
campaignstack_update_workspace_compliance1 field changed- added
Input schema / properties / workspaceId / descriptionAdded value: +"Workspace ID. REQUIRED for a user key (csu_), which spans every workspace you belong to; omitted for a workspace key (cs_), which is bound to one and ignores this argument. campaignstack_whoami reports which kind of key you are holding and, for a user key, the workspaces it can reach."
5 tool updates
- Changed
campaignstack_extract_conversation_voice1 field changed- changed
Input schema / properties / analysisMessageCount / descriptionPrevious value: -"How many stored messages the extraction analyzes (default 200)"New value: +"How many stored messages the extraction analyzes per language (default 200)"
- Changed
campaignstack_get_conversation_voice1 field changed- added
Input schema / properties / languageAdded value: +{ + "description": "ISO 639-1 language of the profile to read (a bilingual person has one profile per language); omit for all", + "maxLength": 3, + "minLength": 2, + "type": "string" +}
- Removed
campaignstack_get_workspace_voice - Removed
campaignstack_update_brand_identity - Changed
campaignstack_update_conversation_voice6 fields changed- added
Input schema / properties / activeAdded value: +{ + "description": "Turn this language's voice on or off for every craft", + "type": "boolean" +} - added
Input schema / properties / coreAdded value: +{ + "additionalProperties": false, + "description": "The full core object; read it first, edit fields, send it back whole.", + "properties": { + "bannedPhrases": { + "items": { + "type": "string" + }, + "maxItems": 25, + "type": "array" + }, + "capitalization": { + "type": "string" + }, + "confidence": { + "additionalProperties": false, + "properties": { + "messages": { + "type": "number" + }, + "sources": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "words": { + "type": "number" + } + }, + "required": [ + "messages", + "words", + "sources" + ], + "type": "object" + }, + "emojiSet": { + "items": { + "type": "string" + }, + "maxItems": 25, + "type": "array" + }, + "fingerprint": { + "additionalProperties": false, + "properties": { + "topCharNgrams": { + "items": { + "type": "string" + }, + "maxItems": 50, + "type": "array" + }, + "topWordNgrams": { + "items": { + "type": "string" + }, + "maxItems": 50, + "type": "array" + } + }, + "required": [ + "topWordNgrams", + "topCharNgrams" + ], + "type": "object" + }, + "functionWordProfile": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "humor": { + "type": "string" + }, + "punctuationHabits": { + "type": "string" + }, + "selfReference": { + "type": "string" + }, + "signaturePhrases": { + "items": { + "type": "string" + }, + "maxItems": 25, + "type": "array" + } + }, + "required": [ + "fingerprint", + "functionWordProfile", + "signaturePhrases", + "bannedPhrases", + "emojiSet", + "confidence" + ], + "type": "object" +} - added
Input schema / properties / languageAdded value: +{ + "description": "ISO 639-1 language of the profile to edit", + "maxLength": 3, + "minLength": 2, + "type": "string" +} - added
Input schema / properties / overlaysAdded value: +{ + "additionalProperties": { + "additionalProperties": false, + "properties": { + "ctaStyle": { + "type": "string" + }, + "delivery": { + "additionalProperties": false, + "properties": { + "interMessageGapMsMedian": { + "type": "number" + }, + "interMessageGapMsP90": { + "type": "number" + }, + "messagesPerTouchDistribution": { + "items": { + "additionalProperties": false, + "properties": { + "messages": { + "type": "number" + }, + "share": { + "type": "number" + } + }, + "required": [ + "messages", + "share" + ], + "type": "object" + }, + "maxItems": 25, + "type": "array" + } + }, + "required": [ + "messagesPerTouchDistribution" + ], + "type": "object" + }, + "emojiRate": { + "type": "number" + }, + "exemplars": { + "items": { + "additionalProperties": false, + "properties": { + "channel": { + "description": "The situation key the exemplar was taken from", + "type": "string" + }, + "intent": { + "type": "string" + }, + "messages": { + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" + }, + "origin": { + "enum": [ + "humanGuaranteed", + "uncertain" + ], + "type": "string" + } + }, + "required": [ + "channel", + "messages", + "origin" + ], + "type": "object" + }, + "maxItems": 10, + "type": "array" + }, + "formality": { + "type": "string" + }, + "greetings": { + "items": { + "type": "string" + }, + "maxItems": 25, + "type": "array" + }, + "maxChars": { + "type": "number" + }, + "n": { + "type": "number" + }, + "openers": { + "type": "string" + }, + "origin": { + "enum": [ + "extracted", + "authored", + "prior" + ], + "type": "string" + }, + "paragraphStyle": { + "type": "string" + }, + "sentenceLengthAvg": { + "type": "number" + }, + "sentenceLengthVariance": { + "type": "number" + }, + "signOffs": { + "items": { + "type": "string" + }, + "maxItems": 25, + "type": "array" + }, + "words": { + "type": "number" + }, + "wordsMedian": { + "type": "number" + }, + "wordsP90": { + "type": "number" + } + }, + "required": [ + "n", + "words", + "sentenceLengthAvg", + "sentenceLengthVariance", + "wordsMedian", + "wordsP90", + "emojiRate", + "greetings", + "signOffs", + "delivery", + "exemplars", + "origin" + ], + "type": "object" + }, + "description": "The full overlays map keyed by situation (e.g. linkedin:dm:cold); send it back whole.", + "type": "object" +} - removed
Input schema / properties / profileRemoved value: -{ - "additionalProperties": false, - "description": "The full profile object to store. Read the current one first, edit fields, send it back whole.", - "properties": { - "constraints": { - "additionalProperties": false, - "properties": { - "maxWordsPerCraftKind": { - "additionalProperties": { - "type": "number" - }, - "type": "object" - }, - "personalizationSlots": { - "items": { - "type": "string" - }, - "maxItems": 25, - "type": "array" - } - }, - "type": "object" - }, - "delivery": { - "additionalProperties": false, - "properties": { - "interMessageGapMsMedian": { - "type": "number" - }, - "interMessageGapMsP90": { - "type": "number" - }, - "messagesPerTouchDistribution": { - "items": { - "additionalProperties": false, - "properties": { - "messages": { - "type": "number" - }, - "share": { - "type": "number" - } - }, - "required": [ - "messages", - "share" - ], - "type": "object" - }, - "maxItems": 25, - "type": "array" - } - }, - "required": [ - "messagesPerTouchDistribution" - ], - "type": "object" - }, - "exemplars": { - "items": { - "additionalProperties": false, - "properties": { - "channel": { - "type": "string" - }, - "intent": { - "type": "string" - }, - "messages": { - "items": { - "type": "string" - }, - "maxItems": 10, - "type": "array" - }, - "origin": { - "enum": [ - "humanGuaranteed", - "uncertain" - ], - "type": "string" - } - }, - "required": [ - "channel", - "messages", - "origin" - ], - "type": "object" - }, - "maxItems": 10, - "type": "array" - }, - "fingerprint": { - "additionalProperties": false, - "properties": { - "topCharNgrams": { - "items": { - "type": "string" - }, - "maxItems": 50, - "type": "array" - }, - "topWordNgrams": { - "items": { - "type": "string" - }, - "maxItems": 50, - "type": "array" - } - }, - "required": [ - "topWordNgrams", - "topCharNgrams" - ], - "type": "object" - }, - "lexicon": { - "additionalProperties": false, - "properties": { - "bannedPhrases": { - "items": { - "type": "string" - }, - "maxItems": 25, - "type": "array" - }, - "greetings": { - "items": { - "type": "string" - }, - "maxItems": 25, - "type": "array" - }, - "signOffs": { - "items": { - "type": "string" - }, - "maxItems": 25, - "type": "array" - }, - "signaturePhrases": { - "items": { - "type": "string" - }, - "maxItems": 25, - "type": "array" - } - }, - "required": [ - "signaturePhrases", - "bannedPhrases", - "greetings", - "signOffs" - ], - "type": "object" - }, - "origin": { - "const": "extracted", - "type": "string" - }, - "rhetoric": { - "additionalProperties": false, - "properties": { - "ctaStyle": { - "type": "string" - }, - "humor": { - "type": "string" - }, - "openers": { - "type": "string" - }, - "selfReference": { - "type": "string" - } - }, - "type": "object" - }, - "style": { - "additionalProperties": false, - "properties": { - "capitalization": { - "type": "string" - }, - "emojiUsage": { - "type": "string" - }, - "formality": { - "type": "string" - }, - "paragraphStyle": { - "type": "string" - }, - "punctuationHabits": { - "type": "string" - }, - "sentenceLengthAvg": { - "type": "number" - }, - "sentenceLengthVariance": { - "type": "number" - } - }, - "required": [ - "sentenceLengthAvg", - "sentenceLengthVariance" - ], - "type": "object" - } - }, - "required": [ - "style", - "lexicon", - "rhetoric", - "delivery", - "constraints", - "fingerprint", - "exemplars", - "origin" - ], - "type": "object" -} - changed
Input schema / requiredPrevious value: -[ - "linkedinAccountId", - "profile" -]New value: +[ + "linkedinAccountId", + "language" +]
3 tool updates
- Added
campaignstack_get_workspace_compliance - Changed
campaignstack_start_connections_export2 fields changed- added
Input schema / properties / keepUpToDateAdded value: +{ + "description": "Keep the list current: new connections are added automatically from the account's daily connection read, at no extra LinkedIn activity. Default false (one-shot export).", + "type": "boolean" +} - added
Input schema / properties / listNameAdded value: +{ + "description": "Name for the connections list. Used only when the account has no connections list in this workspace yet; an existing list keeps its name.", + "maxLength": 120, + "minLength": 1, + "type": "string" +}
- Added
campaignstack_update_workspace_compliance
2 tool updates
- Added
campaignstack_extract_recent_comments - Added
campaignstack_get_account_safety
1 tool update
- Added
campaignstack_restore_superseded_draft
1 tool update
- Changed
campaignstack_list_inbox_conversations1 field changed- added
Input schema / properties / searchAdded value: +{ + "maxLength": 200, + "minLength": 2, + "type": "string" +}
1 tool update
- Changed
campaignstack_set_account_watcher1 field changed- changed
Input schema / properties / kind / enumPrevious value: -[ - "connection_watcher", - "message" -]New value: +[ + "connection_watcher", + "message", + "own_posts_watcher" +]
1 tool update
- Changed
campaignstack_update_filter_exclusion_rules1 field changed- changed
Input schema / properties / rules / items / properties / field / descriptionPrevious value: -"Lead field the rule reads (e.g. companyName, title, headline, seniority, location)"New value: +"Lead field the rule reads: companyName (current employer), pastCompanyName (any former employer on the profile), title, headline, seniority, location"
134 tool updates
- Changed
campaignstack_accept_draft_checkup1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_add_lead_to_external_list1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_add_lead_to_sequence1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_add_manual_exclusion_urls1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_approve_ad_creative - Removed
campaignstack_check_calendar_availability - Removed
campaignstack_check_company_news - Changed
campaignstack_connect_apollo1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_connect_hubspot1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_connect_instantly1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_create_ad_campaign - Removed
campaignstack_create_ad_creative - Removed
campaignstack_create_calendar_event - Changed
campaignstack_create_campaign1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_create_competitor_watch1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_create_content_post1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_create_signal_agent1 field changed- added
Input schema / properties / followUpDelaysHours / maxItemsAdded value: +10
- Changed
campaignstack_create_workflow1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_decide_playbook_proposal1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_delete_calendar_event - Removed
campaignstack_disable_warmup - Changed
campaignstack_disconnect_integration1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_discover_lead_magnets - Removed
campaignstack_dismiss_lead_magnet_creator - Removed
campaignstack_dismiss_lead_magnet_post - Removed
campaignstack_enable_warmup - Changed
campaignstack_enrich_company_info1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_enrich_lead_contact_info1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_export_craft_audit1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace to export from. Defaults to the API key's workspace."New value: +"Workspace to export from. Workspace ID (required for user keys; workspace keys are bound)."
- Changed
campaignstack_extract_conversation_voice1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_generate_ad_campaign - Removed
campaignstack_get_ad_analytics - Removed
campaignstack_get_ad_campaign - Removed
campaignstack_get_ad_dashboard - Changed
campaignstack_get_apollo_import_progress1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_get_company1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Only needed for imported (workspace-scoped) companies. Defaults to the API key's workspace"New value: +"Only needed for imported (workspace-scoped) companies. Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_get_company_metric_history - Changed
campaignstack_get_contact_finder_request1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_get_content_analytics1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_get_conversation_voice1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_get_credit_balance1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_get_draft_checkup1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_get_exclusions1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_get_external_import_progress1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_get_free_slots - Removed
campaignstack_get_lead_magnet_run - Removed
campaignstack_get_lead_magnet_schedule - Changed
campaignstack_get_playbook1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_get_playbook_proposal1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_get_private_proxy - Removed
campaignstack_get_warmup_status - Changed
campaignstack_get_workspace_billing1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_get_workspace_metrics1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_get_workspace_voice1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_import_apollo_list1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_import_external_leads1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_import_leads_csv1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_link_lead_profile1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_list_ad_accounts - Removed
campaignstack_list_ad_campaigns - Removed
campaignstack_list_ad_creatives - Removed
campaignstack_list_ad_lead_forms - Changed
campaignstack_list_ai_suggestions1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_list_apollo_sources1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_list_campaigns1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_list_companies1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_list_company_discoveries - Removed
campaignstack_list_company_funding_events - Removed
campaignstack_list_company_news_events - Removed
campaignstack_list_company_reviews - Changed
campaignstack_list_competitor_watches1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_list_contact_finder_requests1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_list_content_calendar1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_list_content_posts1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_list_external_email_accounts1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_list_external_lead_lists1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_list_external_sequences1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_list_integrations1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_list_lead_magnet_creators - Removed
campaignstack_list_lead_magnet_posts - Changed
campaignstack_list_manual_exclusion_urls1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_list_playbook_versions1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_list_search_topics1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_list_voice_experiment_results1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_list_workspace_warmups - Removed
campaignstack_mark_as_warmed_up - Removed
campaignstack_onboard_workspace - Removed
campaignstack_promote_lead_magnet_creator - Changed
campaignstack_propose_playbook_change1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_refresh_company - Changed
campaignstack_regenerate_playbook1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_reject_ad_creative - Changed
campaignstack_reject_draft_checkup1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_remove_manual_exclusion_url1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_remove_private_proxy - Changed
campaignstack_revert_playbook1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_run_draft_checkup1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_search_console_dead_pages - Removed
campaignstack_search_console_draft_post - Removed
campaignstack_search_console_get_demand - Removed
campaignstack_search_console_list_competitors - Removed
campaignstack_search_console_list_queries - Removed
campaignstack_search_console_set_competitor - Removed
campaignstack_search_console_status - Removed
campaignstack_search_console_sync - Changed
campaignstack_search_leads1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_send_gmail - Removed
campaignstack_seo_get_advisory - Removed
campaignstack_seo_get_latest_report - Removed
campaignstack_seo_get_visibility - Removed
campaignstack_seo_list_prompts - Removed
campaignstack_seo_run_audit - Removed
campaignstack_seo_update_prompts - Removed
campaignstack_seo_white_label_report - Removed
campaignstack_set_ad_autopilot - Changed
campaignstack_set_agent_exclusions1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_set_google_app_password - Removed
campaignstack_set_lead_magnet_schedule - Removed
campaignstack_set_private_proxy - Removed
campaignstack_source_lead_magnet_post - Changed
campaignstack_submit_feedback1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_sync_lead_to_hubspot1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Workspace ID (defaults to the bound workspace)"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_toggle_exclusion1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_unlink_lead_profile1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_update_ad_campaign - Changed
campaignstack_update_brand_identity1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_update_calendar_event - Changed
campaignstack_update_company_metadata1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_update_conversation_voice1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_update_filter_exclusion_rules1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_update_lead_contact_info1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Removed
campaignstack_update_lead_magnet_topics - Changed
campaignstack_update_lead_metadata1 field changed- changed
Input schema / properties / workspaceId / descriptionPrevious value: -"Defaults to the API key's workspace"New value: +"Workspace ID (required for user keys; workspace keys are bound)"
- Changed
campaignstack_update_signal_agent1 field changed- added
Input schema / properties / followUpDelaysHours / maxItemsAdded value: +10
1 tool update
- Added
campaignstack_onboard_workspace
5 tool updates
- Changed
campaignstack_create_signal_agent2 fields changed- added
Input schema / properties / followUpDelaysHoursAdded value: +{ + "items": { + "type": "number" + }, + "type": "array" +} - added
Input schema / properties / silenceHoursAdded value: +{ + "maximum": 720, + "minimum": 1, + "type": "integer" +}
- Added
campaignstack_edit_scheduled_message - Added
campaignstack_reopen_review - Added
campaignstack_set_account_owner_workspace - Changed
campaignstack_update_signal_agent3 fields changed- added
Input schema / properties / followUpDelaysHoursAdded value: +{ + "items": { + "type": "number" + }, + "type": "array" +} - added
Input schema / properties / playbookAdded value: +{ + "maxLength": 6000, + "type": "string" +} - added
Input schema / properties / silenceHoursAdded value: +{ + "maximum": 720, + "minimum": 1, + "type": "integer" +}
282 tool updates
- First observed
campaignstack_accept_draft_checkup - First observed
campaignstack_add_lead_to_external_list - First observed
campaignstack_add_lead_to_sequence - First observed
campaignstack_add_leads_to_list - First observed
campaignstack_add_manual_exclusion_urls - First observed
campaignstack_analyze_website - First observed
campaignstack_approve_ad_creative - First observed
campaignstack_approve_content_post - First observed
campaignstack_approve_review - First observed
campaignstack_archive_campaign - First observed
campaignstack_build_search_url - First observed
campaignstack_cancel_node_leads - First observed
campaignstack_check_calendar_availability - First observed
campaignstack_check_company_news - First observed
campaignstack_comment_on_post - First observed
campaignstack_connect_apollo - First observed
campaignstack_connect_hubspot - First observed
campaignstack_connect_instantly - First observed
campaignstack_count_pending_reviews - First observed
campaignstack_count_unread_notifications - First observed
campaignstack_craft_comment - First observed
campaignstack_craft_followup - First observed
campaignstack_craft_message - First observed
campaignstack_craft_note - First observed
campaignstack_create_ad_campaign - First observed
campaignstack_create_ad_creative - First observed
campaignstack_create_calendar_event - First observed
campaignstack_create_campaign - First observed
campaignstack_create_company_employee_watch - First observed
campaignstack_create_competitor_watch - First observed
campaignstack_create_connection_watch_agent - First observed
campaignstack_create_content_post - First observed
campaignstack_create_icp - First observed
campaignstack_create_lead_list - First observed
campaignstack_create_persona - First observed
campaignstack_create_phase - First observed
campaignstack_create_query_lead_list - First observed
campaignstack_create_search_watch - First observed
campaignstack_create_signal_agent - First observed
campaignstack_create_signal_watch - First observed
campaignstack_create_workflow - First observed
campaignstack_decide_playbook_proposal - First observed
campaignstack_delete_calendar_event - First observed
campaignstack_delete_campaign - First observed
campaignstack_delete_competitor_watch - First observed
campaignstack_delete_content_post - First observed
campaignstack_delete_icp - First observed
campaignstack_delete_persona - First observed
campaignstack_delete_phase - First observed
campaignstack_delete_signal_agent - First observed
campaignstack_delete_workflow - First observed
campaignstack_diagnose_lead_sourcing - First observed
campaignstack_disable_warmup - First observed
campaignstack_disconnect_integration - First observed
campaignstack_discover_lead_magnets - First observed
campaignstack_dismiss_lead_magnet_creator - First observed
campaignstack_dismiss_lead_magnet_post - First observed
campaignstack_duplicate_content_post - First observed
campaignstack_edit_and_approve_review - First observed
campaignstack_enable_warmup - First observed
campaignstack_enrich_company_info - First observed
campaignstack_enrich_lead_contact_info - First observed
campaignstack_export_craft_audit - First observed
campaignstack_extract_company_employees - First observed
campaignstack_extract_conversation_voice - First observed
campaignstack_fetch_mutual_connections - First observed
campaignstack_find_warm_paths - First observed
campaignstack_follow_profile - First observed
campaignstack_generate_ad_campaign - First observed
campaignstack_get_account - First observed
campaignstack_get_account_maintenance - First observed
campaignstack_get_ad_analytics - First observed
campaignstack_get_ad_campaign - First observed
campaignstack_get_ad_dashboard - First observed
campaignstack_get_apollo_import_progress - First observed
campaignstack_get_automation_jobs - First observed
campaignstack_get_campaign - First observed
campaignstack_get_campaign_metrics - First observed
campaignstack_get_campaign_topics - First observed
campaignstack_get_campaign_weights - First observed
campaignstack_get_company - First observed
campaignstack_get_company_metric_history - First observed
campaignstack_get_competitor_watch - First observed
campaignstack_get_contact_finder_request - First observed
campaignstack_get_content_analytics - First observed
campaignstack_get_content_post - First observed
campaignstack_get_conversation - First observed
campaignstack_get_conversation_voice - First observed
campaignstack_get_credit_balance - First observed
campaignstack_get_draft_checkup - First observed
campaignstack_get_enrichment_status - First observed
campaignstack_get_exclusions - First observed
campaignstack_get_external_import_progress - First observed
campaignstack_get_free_slots - First observed
campaignstack_get_icp_scores - First observed
campaignstack_get_inbox_unread_count - First observed
campaignstack_get_lead - First observed
campaignstack_get_lead_connections - First observed
campaignstack_get_lead_history - First observed
campaignstack_get_lead_list - First observed
campaignstack_get_lead_magnet_run - First observed
campaignstack_get_lead_magnet_schedule - First observed
campaignstack_get_lead_score_breakdown - First observed
campaignstack_get_node_activity - First observed
campaignstack_get_notification_preferences - First observed
campaignstack_get_persona - First observed
campaignstack_get_phase - First observed
campaignstack_get_platform_capabilities - First observed
campaignstack_get_playbook - First observed
campaignstack_get_playbook_proposal - First observed
campaignstack_get_private_proxy - First observed
campaignstack_get_signal_agent - First observed
campaignstack_get_signal_agent_stats - First observed
campaignstack_get_warmup_status - First observed
campaignstack_get_workflow - First observed
campaignstack_get_workflow_node_types - First observed
campaignstack_get_workflow_stats - First observed
campaignstack_get_workspace - First observed
campaignstack_get_workspace_billing - First observed
campaignstack_get_workspace_branding - First observed
campaignstack_get_workspace_metrics - First observed
campaignstack_get_workspace_voice - First observed
campaignstack_import_apollo_list - First observed
campaignstack_import_external_leads - First observed
campaignstack_import_leads_csv - First observed
campaignstack_invite_member - First observed
campaignstack_like_post - First observed
campaignstack_link_lead_profile - First observed
campaignstack_list_accounts - First observed
campaignstack_list_ad_accounts - First observed
campaignstack_list_ad_campaigns - First observed
campaignstack_list_ad_creatives - First observed
campaignstack_list_ad_lead_forms - First observed
campaignstack_list_ai_suggestions - First observed
campaignstack_list_apollo_sources - First observed
campaignstack_list_automations - First observed
campaignstack_list_campaigns - First observed
campaignstack_list_companies - First observed
campaignstack_list_company_discoveries - First observed
campaignstack_list_company_employee_watches - First observed
campaignstack_list_company_employees - First observed
campaignstack_list_company_funding_events - First observed
campaignstack_list_company_news_events - First observed
campaignstack_list_company_reviews - First observed
campaignstack_list_company_signals - First observed
campaignstack_list_competitor_watches - First observed
campaignstack_list_contact_finder_requests - First observed
campaignstack_list_content_calendar - First observed
campaignstack_list_content_posts - First observed
campaignstack_list_external_email_accounts - First observed
campaignstack_list_external_lead_lists - First observed
campaignstack_list_external_sequences - First observed
campaignstack_list_icps - First observed
campaignstack_list_inbox_conversations - First observed
campaignstack_list_integrations - First observed
campaignstack_list_invitations - First observed
campaignstack_list_lead_lists - First observed
campaignstack_list_lead_magnet_creators - First observed
campaignstack_list_lead_magnet_posts - First observed
campaignstack_list_lead_signals - First observed
campaignstack_list_leads_at_node - First observed
campaignstack_list_manual_exclusion_urls - First observed
campaignstack_list_members - First observed
campaignstack_list_notifications - First observed
campaignstack_list_pending_reviews - First observed
campaignstack_list_personas - First observed
campaignstack_list_phases - First observed
campaignstack_list_playbook_versions - First observed
campaignstack_list_search_topics - First observed
campaignstack_list_signal_agent_leads - First observed
campaignstack_list_signal_agents - First observed
campaignstack_list_signal_watches - First observed
campaignstack_list_split_optimization_logs - First observed
campaignstack_list_voice_experiment_results - First observed
campaignstack_list_webhook_templates - First observed
campaignstack_list_workflows - First observed
campaignstack_list_workspace_warmups - First observed
campaignstack_mark_all_notifications_read - First observed
campaignstack_mark_as_warmed_up - First observed
campaignstack_mark_conversation_read - First observed
campaignstack_mark_notification_read - First observed
campaignstack_optimize_split_node - First observed
campaignstack_pause_company_employee_watch - First observed
campaignstack_pause_competitor_watch - First observed
campaignstack_pause_signal_agent - First observed
campaignstack_pause_signal_watch - First observed
campaignstack_priority_enrich - First observed
campaignstack_promote_lead_magnet_creator - First observed
campaignstack_propose_playbook_change - First observed
campaignstack_queue_leads - First observed
campaignstack_refresh_company - First observed
campaignstack_refresh_inbox - First observed
campaignstack_regenerate_playbook - First observed
campaignstack_reject_ad_creative - First observed
campaignstack_reject_content_post - First observed
campaignstack_reject_draft_checkup - First observed
campaignstack_reject_review - First observed
campaignstack_remove_company_employee_watch - First observed
campaignstack_remove_lead_list - First observed
campaignstack_remove_leads_from_list - First observed
campaignstack_remove_manual_exclusion_url - First observed
campaignstack_remove_member - First observed
campaignstack_remove_private_proxy - First observed
campaignstack_remove_signal_watch - First observed
campaignstack_reply_to_comment - First observed
campaignstack_reread_review_link - First observed
campaignstack_resume_company_employee_watch - First observed
campaignstack_resume_competitor_watch - First observed
campaignstack_resume_signal_agent - First observed
campaignstack_resume_signal_watch - First observed
campaignstack_retry_content_post - First observed
campaignstack_retry_failed_entries_at_node - First observed
campaignstack_retry_failed_entry - First observed
campaignstack_retry_review - First observed
campaignstack_revert_playbook - First observed
campaignstack_revoke_invitation - First observed
campaignstack_run_draft_checkup - First observed
campaignstack_schedule_content_post - First observed
campaignstack_search_console_dead_pages - First observed
campaignstack_search_console_draft_post - First observed
campaignstack_search_console_get_demand - First observed
campaignstack_search_console_list_competitors - First observed
campaignstack_search_console_list_queries - First observed
campaignstack_search_console_set_competitor - First observed
campaignstack_search_console_status - First observed
campaignstack_search_console_sync - First observed
campaignstack_search_leads - First observed
campaignstack_send_connection_request - First observed
campaignstack_send_gmail - First observed
campaignstack_send_inmail - First observed
campaignstack_send_message - First observed
campaignstack_seo_get_advisory - First observed
campaignstack_seo_get_latest_report - First observed
campaignstack_seo_get_visibility - First observed
campaignstack_seo_list_prompts - First observed
campaignstack_seo_run_audit - First observed
campaignstack_seo_update_prompts - First observed
campaignstack_seo_white_label_report - First observed
campaignstack_set_account_watcher - First observed
campaignstack_set_ad_autopilot - First observed
campaignstack_set_agent_exclusions - First observed
campaignstack_set_google_app_password - First observed
campaignstack_set_lead_magnet_schedule - First observed
campaignstack_set_private_proxy - First observed
campaignstack_set_workflow_accounts - First observed
campaignstack_source_lead_magnet_post - First observed
campaignstack_start_connections_export - First observed
campaignstack_submit_content_for_approval - First observed
campaignstack_submit_feedback - First observed
campaignstack_sync_lead_to_hubspot - First observed
campaignstack_toggle_automation - First observed
campaignstack_toggle_exclusion - First observed
campaignstack_trigger_icp_scoring - First observed
campaignstack_trigger_workflow - First observed
campaignstack_unarchive_campaign - First observed
campaignstack_unlink_lead_profile - First observed
campaignstack_unschedule_content_post - First observed
campaignstack_update_ad_campaign - First observed
campaignstack_update_brand_identity - First observed
campaignstack_update_calendar_event - First observed
campaignstack_update_campaign - First observed
campaignstack_update_campaign_weight - First observed
campaignstack_update_company_metadata - First observed
campaignstack_update_competitor_watch_accounts - First observed
campaignstack_update_content_post - First observed
campaignstack_update_conversation_voice - First observed
campaignstack_update_filter_exclusion_rules - First observed
campaignstack_update_icp - First observed
campaignstack_update_lead_contact_info - First observed
campaignstack_update_lead_list - First observed
campaignstack_update_lead_magnet_topics - First observed
campaignstack_update_lead_metadata - First observed
campaignstack_update_member_role - First observed
campaignstack_update_notification_preferences - First observed
campaignstack_update_persona - First observed
campaignstack_update_phase - First observed
campaignstack_update_signal_agent - First observed
campaignstack_update_workflow - First observed
campaignstack_update_workflow_status - First observed
campaignstack_update_workspace - First observed
campaignstack_update_workspace_branding - First observed
campaignstack_whoami
Related MCP Connectors
AI-agent outreach: cold email, warmup, LinkedIn, Instagram, WhatsApp, verification, 200M leads
Give AI agents the LinkedIn tools to find, qualify, engage, and follow up with prospects.
Run cold email outbound from an AI agent: campaigns, leads, replies, sender accounts, autopilot.
Run LinkedIn outreach from your AI chat: find leads, launch campaigns, send, and reply.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceEnables AI agents to export leads from LinkedIn, Sales Navigator, and Apollo searches, enrich profiles, look up companies, find decision makers, and discover or verify work emails without writing HTTP calls.MIT- AlicenseNot gradedqualityCmaintenanceConnects AI assistants to LinkedIn outreach, enabling lead finding, campaign management, messaging, and analytics through natural language.MIT
- AlicenseAqualityCmaintenanceProvides AI agents with tools for structuring and auditing cold outreach messages, building follow-up sequences, handling replies, and detecting red flags.730 npmMIT

Prospeo MCP Serverofficial
AlicenseAqualityFmaintenanceEnables AI tools to search and enrich B2B leads, including finding professional emails, company profiles, and filtering people and companies by various criteria.5343 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.