LinkedCamp
Server Details
Remote MCP server for LinkedCamp. Run LinkedIn and email outreach from ChatGPT, Claude or Cursor: campaigns, unified inbox, leads and analytics in 133 tools.
- Status
- Healthy
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 133 tools
The descriptions go to great lengths to distinguish similar tools, but with 133 tools there is still substantial conceptual overlap: analytics_account/analytics_campaign/analytics_reporting/analytics_trend, flow_get/sequence_list/flow_history, and lead_get/lead_flow_state/activity_list all require careful reading to choose correctly. Boundaries are documented, but the sheer number of near-neighbors makes misselection likely.
Most names are readable snake_case and follow predictable domain_verb or verb_noun patterns, with many consistent get/list/upsert/update/delete tools. There are deviations such as whoami, reference, unread_counts, and noun-first names like linkedin_account_daily_stats and campaign_activity_summary, but they remain interpretable.
At 133 tools this is far beyond a well-scoped MCP surface and into extreme breadth for any single server. Even a broad LinkedIn outreach platform does not need this many similarly themed analytics, sequence, lead, inbox, publishing, agent, and admin operations in one toolset.
The surface is very extensive, covering campaigns, leads, sequences, inbox, agents, mailboxes, LinkedIn accounts, analytics, publishing, tasks, templates, personas, and blacklists. There are notable deliberate gaps and dead ends—appointments are read-only, some entities lack deletion, LinkedIn account connection and team management are web-app-only—but most core workflows have a tool or a stated workaround.
Available Tools
133 toolsaccount_settings_updateUpdate account settingsAIdempotentInspect
Update your own profile and notification preferences: name, language, and the inbox-manager / reporting / notification toggles. Billing details, password and email are intentionally not writable over MCP. Your own user profile only. It does not touch a LinkedIn account's settings (linkedin_account_update), a mailbox's (email_account_update), or anything on a campaign (campaign_update). Billing, team management and tenant configuration are outside this server entirely.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | UI language code, e.g. "en", "fr", "de", "it", "pt", "ja". | |
| lastName | No | Family name. | |
| settings | No | Inbox, reporting and notification toggles. | |
| firstName | No | Given name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so safety is covered structurally; the description adds real value by naming fields that are deliberately non-writable (billing, password, email) and by bounding the blast radius to the caller's own profile. It stops short of describing partial-update semantics (zero required params means unspecified fields are left untouched) or what the tool returns, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the writable fields, followed by scope limits and alternatives — the right order for an agent scanning for eligibility. Slightly redundant at the tail: billing is declared non-writable in sentence two and then again as outside the server entirely, which costs a few words without adding 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 mutation tool with four optional parameters, a nested settings object and no output schema, the description covers scope, exclusions and non-writable fields adequately, and annotations carry the safety profile. The remaining gap is return behavior on success/partial failure, which matters given there is no output schema to fall back 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 coverage is 100%, so the nested settings toggles are already fully documented field-by-field and the baseline would be 3. The description still adds meaning beyond the schema by grouping the parameters into profile fields vs. inbox/reporting/notification toggles and by stating which account attributes are intentionally excluded from the writable surface.
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 a precisely scoped resource (your own profile and notification preferences), then enumerates the writable field groups: name, language, inbox-manager/reporting/notification toggles. It also names the sibling tools it is not (linkedin_account_update, email_account_update, campaign_update), 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?
Explicit about when to use it (own user profile only) and when not to: LinkedIn account settings, mailbox settings, campaign settings, billing, team management and tenant configuration are all declared out of scope, with the correct alternative tool named for each. The exclusion of password and email as non-writable is also stated up front.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
activity_listList activitiesARead-onlyIdempotentInspect
Completed actions — one row per lead per step. Only COMPLETED activities are returned; the upstream field cannot return PENDING or FAILED rows. To see a failure and its failedReason, read one lead with lead_get. Note that status here filters the LEAD's pipeline status, not the activity's.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number. | |
| range | No | Date window as { from, to } — epoch milliseconds or ISO 8601. Omit for the backend default. | |
| status | No | Filters the LEAD pipeline status, not the activity status. Activities are always COMPLETED. | |
| keyword | No | Free-text search. | |
| campaignId | No | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, and the description adds genuinely non-obvious behavior: the upstream field cannot return PENDING or FAILED rows at all, and failures are only visible via lead_get. It also warns that the status parameter filters the lead's pipeline status rather than the activity's, preventing a very plausible 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?
Three tight sentences: what it returns, what it cannot return, and the disambiguation warning. The scope constraint is front-loaded and no sentence is 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 no output schema, the description supplies the shape ('one row per lead per step') and the completeness limitation (no pending/failed rows), which is the critical information. It stops short of describing pagination/ordering or the default range window, but nothing essential for calling 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 page, range and its date aliases, keyword, and the status enum. The description's status clarification is valuable but duplicates what the schema field description already states, and it says nothing about range/pagination semantics beyond what is structured.
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 resource (completed activities) and even the row grain ('one row per lead per step'), with an explicit scope constraint that only COMPLETED rows are returned. It does not name sibling listing tools like campaign_activity_summary or activity_skip, so differentiation is partially inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule — use lead_get to inspect a failure and its failedReason — which is exactly the kind of alternative-selection guidance agents need. It lacks a 'when not to use' condition for aggregate/analytics siblings, so it is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
activity_skipSkip a queued actionADestructiveInspect
Mark one pending action SKIPPED, to unblock a lead stuck on a step that will never succeed. That status is the only thing it writes — it does not itself schedule the next step, so do not promise the lead has advanced; re-read with lead_flow_state to see what the flow does next. It acts on an activity id, not a lead id. To stop a lead entirely use lead_update with paused or isExcluded.
| Name | Required | Description | Default |
|---|---|---|---|
| activityId | Yes | Activity id, from `activity_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=false; the description adds real context by narrowing the blast radius ('that status is the only thing it writes') and warning that it does not schedule the next step, preventing a false success claim. The remaining gap is silence on whether a skip can be undone or what happens when the activity is not pending, which matters given destructiveHint=true and idempotentHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the verb and status written, then the caveat, the id-type warning, and the alternative. No sentence is redundant and each carries a distinct constraint.
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 one parameter, full schema coverage, and annotations covering the safety profile, the description supplies nearly everything needed: effect, non-effect, follow-up verification, and an alternative tool. Only the failure mode (non-pending or unknown activityId) and reversibility are unaddressed.
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 single parameter already documents its source (`activity_list`), so the baseline is 3. The description adds disambiguation beyond the schema by stressing it acts on an activity id rather than a lead id, which is the most likely caller error for this 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?
States a specific verb and resource ('Mark one pending action SKIPPED') plus the scope constraint ('one pending action', 'activity id, not a lead id'). It explicitly distinguishes itself from `lead_update` and points to `lead_flow_state` for follow-up, so an agent can separate it from adjacent flow/lead tools 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?
Gives the triggering condition ('unblock a lead stuck on a step that will never succeed'), the alternative for a different intent ('to stop a lead entirely use `lead_update` with `paused` or `isExcluded`'), and the post-call action ('re-read with `lead_flow_state`'). When-to-use, when-to-use-something-else, and what-to-do-next are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_deleteDelete an agentADestructiveInspect
Delete an agent. Campaigns and conversations pointing at it lose their automated replies, silently — prospects mid-conversation simply stop getting answers. Irreversible, and its knowledge attachments and training go with it. Read agent_list for which campaigns use it, show the user, and get an explicit yes first. To stop an agent replying without destroying it, use agent_upsert with isActive: false, or conversation_update with assistant: false for one thread. Requires the "Agents" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | Yes | AI agent id, from `agent_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds the operational consequences an agent can't infer: campaigns and conversations silently lose automated replies, prospects mid-conversation go unanswered, and knowledge attachments plus training are destroyed. It also discloses the required 'Agents' plan permission, which is not in the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly five sentences, each doing distinct work: what it does, what breaks, irreversibility, the confirmation protocol, the non-destructive alternatives, the permission gate. The consequence is front-loaded before the 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?
For a one-parameter destructive mutation with no output schema, everything an agent needs is present: blast radius, irreversibility, a pre-flight confirmation workflow, alternatives, and the authorization requirement. 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?
Schema coverage is 100% and the single parameter already carries a description ('AI agent id, from `agent_list`'), so the baseline is 3. The description reinforces the `agent_list` provenance but adds no format or validation detail 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 and resource ('Delete an agent') and immediately distinguishes it from non-destructive siblings by naming the alternative paths (agent_upsert with isActive:false, conversation_update with assistant:false). An agent knows exactly what this does and what it costs versus those 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 preconditions (read `agent_list`, show the user, get an explicit yes) and explicit when-not-to-use guidance that routes to two specific sibling tools for the softer cases. This is the strongest possible form of usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_duplicateDuplicate an agentAInspect
Copy an agent, optionally into a sub-account. Copies the configuration; the duplicate still needs agent_train before its knowledge works. Passing userId to place it in another user's account is accepted only from an account owner. Requires the "Agents" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| userId | No | Create the copy inside a SUB-ACCOUNT instead of your own account. Accepted only from an agency owner, and only for an account inside your own agency: take the id from `subaccount_list` and never construct or guess one. An id outside that list is refused. This WRITES into that sub-account, so name it to the user and get a yes first. Omit it to copy within your own account. | |
| agentId | Yes | AI agent id, from `agent_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, destructive=false, non-idempotent), so the description's job is additive context — and it delivers: the copy is configuration-only and the knowledge will not function until agent_train runs, plus a plan-level "Agents" permission is required and cross-account placement is owner-restricted. It does not say whether the duplicate is created active/paused or how it is named, which are the main remaining behavioral gaps.
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: purpose, then the critical post-copy caveat, then the permission/ownership constraints. Nothing is wasted and the most decision-relevant warning (needs agent_train) comes early.
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 only two parameters, full schema coverage, and no output schema, the description covers what an agent needs to invoke it correctly and not be surprised afterwards. It is missing only the return value (presumably the new agent id) and whether the copy inherits settings like status, both of which matter for a duplication 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 100% and the userId schema text is far more precise than the description (naming subaccount_list, forbidding guessed ids, requiring a user confirmation). The description's "optionally into a sub-account" and "account owner" only restate that at a higher level, and it says "account owner" where the schema says "agency owner" — a loose summary rather than added meaning. 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?
"Copy an agent, optionally into a sub-account" states a specific verb (copy/duplicate) and resource (agent) with an explicit scope option. An agent can immediately tell this apart from agent_upsert, agent_get, or agent_delete 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?
Gives clear context: it names agent_train as the mandatory follow-up step before the knowledge works, and states the owner-only precondition for the cross-account variant. It stops short of naming an explicit alternative tool or a "do not use this when..." exclusion, but the post-copy routing guidance is genuinely actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_getGet an agentARead-onlyIdempotentInspect
One agent's full configuration: personality, intent, instructions, FAQs, follow-ups and booking action. Read this out to the user when they are choosing an existing agent. Configuration only: for what it actually said use agent_logs, for how it would answer a specific question agent_query, and for volumes agent_stats. Requires the "Agents" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | Yes | AI agent id, from `agent_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered; the description adds genuinely new context by stating the "Agents" permission requirement and by scoping the result to configuration only (no conversational output). It does not discuss response size or shape, which is the remaining 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 tight sentences: payload contents first, usage instruction second, sibling routing third, permission note last. Nothing is redundant and 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 single-parameter read tool with full annotations and no output schema, the description covers what is returned, when to call it, what it does not return, and the auth requirement. An agent has everything needed 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?
Only one parameter and schema coverage is 100% — the schema already documents agentId and its provenance from `agent_list`. The description adds no extra semantics about the id format, so 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?
States a specific verb and resource ("One agent's full configuration") and enumerates exactly what fields are returned: personality, intent, instructions, FAQs, follow-ups, booking action. It then explicitly separates itself from agent_logs, agent_query and agent_stats, so an agent can pick correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an affirmative condition ("Read this out to the user when they are choosing an existing agent") and names three sibling alternatives with the question each answers. When-to-use and when-to-use-something-else are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_listList AI agentsARead-onlyIdempotentInspect
AI agents configured for this account. CHAT agents reply to prospects in the inbox, CONTENT agents draft LinkedIn posts, and the rest are specialised assistants. Start here when the user asks about automated replies, and show them agent_get so they can judge the fit before anything is attached. An agent writes replies; a persona (persona_list) decides who qualifies; a knowledge base (kb_list) is the material an agent draws on. Attaching one to a campaign is campaign_update — and it answers real prospects by itself, so never attach one unasked. Requires the "Agents" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Filter by type. | |
| keyword | No | Free-text search. | |
| withStats | No | Include conversation and booking counts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds material beyond them: the plan-level 'Agents' permission requirement and the consequence that an attached agent 'answers real prospects by itself'. It does not cover return size, pagination, or default ordering for a list endpoint, which is the remaining behavioural 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?
Front-loaded with the resource, then the when-to-use routing, then the conceptual disambiguation. The agent/persona/knowledge-base sentence is useful for disambiguation but is the longest piece and could be trimmed; the rest earns its space.
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 no output schema, the description should imply what comes back; it hints at the list being inspectable via agent_get but never says the result contains agent IDs and types the caller can feed forward. Permissions, safety, and routing are all covered, so only the return-shape detail 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 each of the three parameters is documented in the schema, so the description adds little on this axis. It does gloss the semantics of two enum values (CHAT replies to prospects, CONTENT drafts posts) and never mentions withStats, so it neither clarifies nor misleads beyond the schema 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 identifies the resource and its scope ('AI agents configured for this account') and enumerates the sub-types (CHAT, CONTENT, others), so the agent knows exactly what set it is dealing with. It also separates the concept from neighbouring resources (personas, knowledge bases). The verb is only carried by the name/title rather than the description text, keeping it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit entry point is given ('Start here when the user asks about automated replies') along with the follow-up flow ('show them agent_get so they can judge the fit before anything is attached'). It also names the mutating sibling campaign_update and states an exclusion/caution ('never attach one unasked'), which is exactly the when-not guidance most definitions lack.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_logsAgent call logARead-onlyIdempotentInspect
What an agent was asked and what it answered — the trace to read when its replies look wrong. What it actually said in real conversations. To try a hypothetical instead, without sending anything, use agent_query; to read the prospect-facing thread use conversation_get. Requires the "Agents" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number. | |
| agentId | Yes | AI agent id, from `agent_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds a real behavioral constraint the annotations lack: it requires the "Agents" permission on the plan. It stops short of describing pagination or log volume, which is the only remaining 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?
Front-loaded with the core purpose, then routing alternatives, then the permission note. The middle sentence ('What it actually said in real conversations') slightly restates the opening clause rather than adding new information, but the description stays short 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?
For a read-only log tool with no output schema, the description adequately conveys what is returned (the ask/answer trace) and the routing alternatives. The permission requirement is a useful addition. Pagination behavior for potentially large logs is the one notable omission.
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 only two parameters, so the schema already documents both agentId and page. The description adds no parameter detail beyond what the schema provides, which is the expected baseline when the schema does the heavy lifting.
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 resource and scope: the trace of what an agent was asked and what it answered. It explicitly names the sibling tools it is not (agent_query for hypotheticals, conversation_get for the prospect-facing thread), 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?
Gives an explicit trigger — read this when an agent's replies look wrong — and names two alternatives with the condition that selects each ('to try a hypothetical instead... use agent_query'; 'to read the prospect-facing thread use conversation_get'). Nothing about tool selection 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.
agent_queryAsk an agentARead-onlyIdempotentInspect
Run a question through an agent against a real conversation, to see how it would answer. Returns the answer without sending anything — nothing reaches the prospect, which makes this the safe way to vet an agent before it goes active. For what it has already said use agent_logs. This is not a way to reply to anyone: replying by hand is message_send, and only on an explicit yes. Requires the "Agents" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The question to put to the agent. | |
| agentId | Yes | AI agent id, from `agent_list`. | |
| conversationId | Yes | Context for the retrieval. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds meaningfully beyond them: the no-delivery guarantee ('nothing reaches the prospect') and the plan-level 'Agents' permission requirement — both are behavioral facts not encoded in annotations. It doesn't describe what the returned answer looks like or latency/token behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then return behavior, disambiguation, and permissions in that order — every sentence carries distinct information. Slightly dense with three sibling references in one paragraph, which costs a point on structure but not clarity.
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 no output schema, the description states that the answer is returned and that nothing is sent — exactly what an agent needs to interpret the result. Params are fully schema-described, permissions are named, and alternatives are routed.
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 all three required params are documented in the schema (`query`, `agentId` with a pointer to `agent_list`, `conversationId` as context). The description adds no param-level detail beyond that, 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?
States a specific verb and resource — run a question through an agent against a real conversation — and immediately frames the purpose (preview how it would answer). It explicitly distinguishes itself from `agent_logs` (past output) and `message_send` (actual replying), so the agent can place it among 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?
Gives the when (vetting an agent before it goes active), the when-not (not a way to reply; replying by hand is `message_send`, and only on an explicit yes), and the alternative for historical output (`agent_logs`). Routing is explicit rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_statsAgent performanceARead-onlyIdempotentInspect
Conversations handled, replies sent and appointments booked, across all agents. Totals across every agent, not one — there is no per-agent breakdown here. To judge a single agent's quality read agent_logs. Requires the "Agents" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive semantics, so the description correctly spends its words elsewhere — adding the plan-level 'Agents' permission requirement, which is a real call-time prerequisite an agent cannot infer from annotations. It stops short of noting time windowing or freshness of the totals.
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 what is returned, then the scope constraint, then the alternative and the prerequisite. No redundant restatement of the title 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 no output schema, the description does the essential work of enumerating the returned metrics and clarifying aggregation scope, and adds the permission requirement. It does not state the reporting period for the totals, which is the one thing an agent might still need to assume.
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 takes zero parameters, so there is no parameter semantics to explain; the baseline for a no-param tool applies. The description instead clarifies the implicit scoping decision (all agents, no filter) that an agent might otherwise expect to control.
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?
Names the exact metrics returned (conversations handled, replies sent, appointments booked) and the aggregation scope (all agents). A reader knows precisely what this tool produces and how it differs from agent_logs 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?
Explicitly routes the agent: use this for aggregate totals, and read `agent_logs` for a single agent's quality. It also pre-empts a likely misuse by stating 'there is no per-agent breakdown here.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_trainRetrain an agentAInspect
Rebuild the agent's knowledge embeddings from its attached knowledge-base entries. Required after every kb_upsert or kb_attach, or the agent answers from stale material — this is the step most easily forgotten. It only re-indexes existing knowledge: it does not change the agent's instructions (agent_upsert) and does not teach it anything not attached via kb_attach. Requires the "Agents" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | Yes | AI agent id, from `agent_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the description's real contribution is the scope statement: it only re-indexes existing knowledge and does not alter instructions or teach unattached material. It also discloses the "Agents" permission requirement, which annotations cannot express. It stops short of saying whether the rebuild is synchronous, how long it takes, or what the call returns — a meaningful gap for a non-idempotent 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, each load-bearing: what it does, when it must run, and what it does not do. The trigger constraint is front-loaded right after the definition, 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 mutation with no output schema, the definition covers scope, prerequisites, permission gating, and sibling boundaries. The only shortfall is operational: no mention of latency, async behavior, or whether the call can fail on missing KB entries, which an agent retrying or chaining calls would want.
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 single agentId parameter is already documented in-schema as coming from agent_list. The description adds no further semantics about the identifier, 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?
States a specific verb and resource: "Rebuild the agent's knowledge embeddings from its attached knowledge-base entries." It also explicitly bounds the operation against two named siblings (agent_upsert for instructions, kb_attach for adding material), so an agent can distinguish it 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?
Gives an explicit trigger ("Required after every kb_upsert or kb_attach") plus the consequence of skipping it (stale answers). It also names the alternatives for the adjacent needs, making the when/when-not split unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agent_upsertCreate or update an AI agentADestructiveIdempotentInspect
Create an AI agent, or update one by passing agentId. A CHAT agent will reply to real prospects once it is active and attached to a campaign — set isActive: false while iterating on its instructions. The behaviour comes from personality (who it is), intent (what it is trying to achieve) and instructions (how it should write). This creates or edits the agent and nothing else. It does not attach it to a campaign (campaign_update), give it source material (kb_upsert then kb_attach), or build its embeddings (agent_train, which must run after any knowledge change). Test with agent_query before it touches a real conversation. There is no tool to delete an agent. Requires the "Agents" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| faqs | No | Canned answers the agent should use verbatim. | |
| name | Yes | Internal name. | |
| type | No | CHAT for inbox replies, CONTENT for post drafting. | |
| action | No | Enable calendar booking. | |
| intent | No | The outcome it is steering the conversation toward. | |
| notify | No | Notify you when the agent replies. | |
| prompt | No | Raw system prompt override. Usually leave unset. | |
| topics | No | Subjects the agent is allowed to discuss. | |
| agentId | No | Omit to create a new agent. | |
| userIds | No | Share this agent with these sub-accounts. | |
| channels | No | Where the agent operates, e.g. ["linkedin","email"]. | |
| isActive | No | Whether the agent runs. Keep false while drafting. | |
| language | No | Language code, e.g. "en", "fr", "de", "it", "pt", "ja". | |
| provider | No | Primary model provider. Must be connected. | |
| waitTime | No | Minutes to wait before replying, so it reads as human. | |
| followups | No | Follow-up messages sent when a lead goes quiet. | |
| maxMessages | No | Cap on agent messages per conversation. | |
| personality | No | Who the agent is and how it carries itself. | |
| businessName | No | Company the agent represents; injected into its prompt. | |
| instructions | No | Concrete writing rules: tone, length, what to avoid. | |
| stopScenarios | No | Situations in which the agent stops replying. | |
| actionSettings | No | Booking settings. Used when `action` is "APPOINTMENT". | |
| prohabitedWords | No | Words the agent must never use. Field name is spelled this way in the schema. | |
| fallbackProvider | No | Used when the primary provider errors. | |
| pauseBotOnManualMessage | No | Stand down as soon as a human replies in the thread. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With destructiveHint/idempotentHint/openWorldHint already declared, the description adds real value: it scopes the side effect ('creates or edits the agent and nothing else'), names the required 'Agents' plan permission, warns that an active CHAT agent talks to real prospects, and notes no delete tool exists. It does not explain what an update does to omitted fields among the 25 parameters, which matters given destructiveHint=true.
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 and create-vs-update discriminator are front-loaded, then behaviour, then exclusions, then prerequisites. Every sentence carries a decision an agent would otherwise get wrong (active-state risk, knowledge-change ordering, permission requirement) — no filler for a 25-parameter 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?
Covers creation versus update, permission gate, side-effect boundary, and prerequisite/ordering tools, which is substantial for a 25-param nested destructive upsert. The remaining gap is that with no output schema, it never says what is returned (e.g. the new agent id) after a create, which an agent would need for follow-up 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?
Schema coverage is 100%, so 3 is the baseline; the description goes slightly beyond by framing the three behavioural fields as distinct axes (personality = identity, intent = goal, instructions = writing rules) and by advising `isActive: false` during drafting. It does not add merge/replace semantics for the many optional fields, so it is not a full 5.
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 (create/update an AI agent) and defines the discriminator inline: pass `agentId` to update. It also draws the boundary against siblings by name (campaign_update, kb_upsert/kb_attach, agent_train, agent_query), so an agent can place it in the workflow 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?
Explicit when-to guidance (set `isActive: false` while iterating; test with `agent_query` before real conversations) plus explicit what-this-does-not-do with the correct alternative for each gap: attaching to a campaign, sourcing knowledge, and building embeddings via `agent_train` after any knowledge change. Nothing about tool selection 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.
analytics_accountAccount-level analyticsARead-onlyIdempotentInspect
Roll-up across every campaign in your account: totals by action type, reply sentiment breakdown, and tag distribution. SLOW — it aggregates every campaign and every lead. On a large account it may not complete at all. Prefer analytics_reporting for a time series or analytics_campaign for one campaign; reach for this only when a true account-wide roll-up is needed, and narrow it with range.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Date window as { from, to } — epoch milliseconds or ISO 8601. Omit for the backend default. | |
| tagId | No | Restrict to leads carrying this tag. | |
| status | No | Restrict to campaigns in this status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
It discloses critical behavioral traits such as performance limitations ('SLOW,' 'may not complete at all') and the aggregation scope, which are essential operational details not found in standard 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 highly dense and perfectly structured to front-load critical constraints and guidance before detailing the specific functionality and scope.
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-risk/performance nature of this tool, the description is exceptionally complete by providing warnings about failure likelihood and guiding the agent towards more suitable alternatives.
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?
While the schema is 100% covered, the description adds semantic guidance by stating the need to 'narrow' the scope using the `range` parameter, linking the tool's performance directly to parameter usage.
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 defines the resource (account campaigns) and the specific aggregated metrics it returns, distinguishing its role as a full account roll-up.
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 comparative usage guidelines: warns that it is SLOW, suggests alternatives for specific use cases (`analytics_reporting`, `analytics_campaign`), and states the precise condition for its use ('true account-wide roll-up is needed').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analytics_campaignCampaign analyticsARead-onlyIdempotentInspect
Headline performance for one campaign: prospects found, invites sent and accepted, messages, InMails, emails sent/opened/clicked/bounced, and replies. Omit campaignId for a roll-up across your whole account. Start here for "how is this campaign doing" — it is the cheap one. Totals only: for a day-by-day series use analytics_reporting, for where people drop out use sequence_step_stats, and for a spreadsheet use campaign_export_stats.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Date window as { from, to } — epoch milliseconds or ISO 8601. Omit for the backend default. | |
| userId | No | Read a SUB-ACCOUNT instead of your own data. Accepted only from an agency owner, and only for an account inside your own agency: take the id from `subaccount_list` and never construct or guess one. An id outside that list is refused. Omit it to read your own data, and name the account to the user when you pass it. | |
| campaignId | No | Campaign id, from `campaign_list` or `campaign_create`. | |
| includeGraph | No | Also return the day-by-day series for charting. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover safety (readOnly, idempotent, non-destructive, closed-world), and the description adds genuinely new behavioral facts: results are totals-only, and this is the cheap call relative to the alternatives. It stops short of describing pagination or latency/cost specifics beyond 'cheap', and the 'totals only' claim sits slightly at odds with the `includeGraph` option, so not a full 5.
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 metric inventory, then the scope trick, then the routing. Every clause carries information an agent needs; no filler or restated title.
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 no output schema, the description usefully enumerates the returned headline metrics, which is the key missing structured data. Remaining gaps are minor: it does not describe how `range` defaults resolve or what the graph series looks like when `includeGraph` is set, but the schema covers the former and the latter is secondary.
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 earns above baseline by explaining the meaningful omission semantics of `campaignId` (roll-up across the whole account), which the schema does not state. It adds nothing new for `range`, `userId`, or `includeGraph`, which the schema already documents 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 description names a specific verb+resource (headline performance for one campaign) and enumerates the exact metric families returned: prospects, invites, messages, InMails, emails sent/opened/clicked/bounced, replies. It also states the scope variant (omit `campaignId` for an account roll-up), so it is distinguishable from every analytics sibling without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Start here for "how is this campaign doing" — it is the cheap one' and then routes the agent away to three named alternatives with the exact condition selecting each: `analytics_reporting` for a day-by-day series, `sequence_step_stats` for drop-off, `campaign_export_stats` for a spreadsheet. This is when/when-not/alternatives all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analytics_campaign_funnelCampaign funnelARead-onlyIdempotentInspect
Stage-by-stage conversion for one campaign over a window — the numbers behind "where are we losing people". SLOW on a campaign with many leads: it walks every activity row and may not complete at all. Use sequence_step_stats for a fast per-step breakdown — it answers the same question on a large campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Date window as { from, to } — epoch milliseconds or ISO 8601. Omit for the backend default. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds important behavioral context beyond annotations: it is SLOW on campaigns with many leads, walks every activity row, and may not complete at all. It does not describe return shape or pagination, but the performance warning 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 short, front-loaded with the core purpose, then immediately gives the performance caveat and the faster alternative. 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?
For a read-only analytics tool with no output schema and 100% schema coverage, the description provides enough context: what the funnel represents, the performance risk, and the recommended alternative. It does not explain the exact returned stages or metric fields, but that is a minor gap given the structured schema and annotations.
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 are documented in the schema: campaignId with its source, and range with date format and alias details. The description adds no parameter-level syntax or constraints beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb-like operation, resource, and scope: stage-by-stage conversion for one campaign over a window. It explicitly clarifies the underlying question ('where are we losing people'), which distinguishes it from generic analytics and 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?
Names a concrete alternative, `sequence_step_stats`, and explains exactly when to prefer it: on large campaigns where this tool is slow or may not complete. This is explicit when/when-not guidance tied to a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analytics_reportingTime series reportARead-onlyIdempotentInspect
Parallel daily series — engagements, invites, messages, InMails, follows, event invites, opportunities, emails sent/opened/clicked/bounced, accepted, replied — aligned to a shared dates array. The right tool for "how did we trend over the last 30 days". A series per day, not a total: for one campaign's totals use analytics_campaign, and for months rather than days use analytics_trend. Note it scopes by LinkedIn account, not by campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Date window as { from, to } — epoch milliseconds or ISO 8601. Omit for the backend default. | |
| filter | No | Restrict to specific series names, e.g. ["invites","accepted","replied"]. | |
| userId | No | Read a SUB-ACCOUNT instead of your own data. Accepted only from an agency owner, and only for an account inside your own agency: take the id from `subaccount_list` and never construct or guess one. An id outside that list is refused. Omit it to read your own data, and name the account to the user when you pass it. | |
| linkedAccountId | No | Narrow to one LinkedIn account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: results are per-day series aligned to a shared `dates` array rather than totals, and scope is by LinkedIn account not campaign. It does not discuss pagination or limits, keeping it just short of 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core definition and metric list, then routes to alternatives. The long metric enumeration is dense but informative; slightly verbose but every clause carries 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?
No output schema exists, but the description explains the return shape (per-day series aligned to a `dates` array) and the scoping dimension, which is the key thing an agent needs. Minor gaps around pagination/limits keep it from 5.
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 all four parameters (range, filter, userId, linkedAccountId) are already documented in the schema. The description adds only the `dates` alignment concept and the account-vs-campaign scoping note, not parameter syntax or format detail. 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?
States a specific verb+resource (parallel daily series report) and enumerates the metrics returned, plus explicitly names the two sibling tools it is not (analytics_campaign, analytics_trend). An agent can distinguish it from siblings 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?
Gives an explicit use case ("how did we trend over the last 30 days") and names alternatives with the conditions that select them: totals per campaign → analytics_campaign, months rather than days → analytics_trend. Also states the scoping caveat (LinkedIn account, not campaign).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
analytics_trendMonthly trendARead-onlyIdempotentInspect
Month-over-month totals for one action type, optionally scoped to a campaign or LinkedIn account. One action type per call and one point per month — the long view. For daily granularity across all action types at once use analytics_reporting.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Action type, e.g. "CONNECT", "MESSAGE", "EMAIL". | |
| months | No | How many months back to include. | |
| campaignId | No | Campaign id, from `campaign_list` or `campaign_create`. | |
| linkedAccountId | No | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, and closed-world behavior. The description adds useful behavioral context beyond that: one action type per call, one point per month, and optional campaign or LinkedIn-account scoping. It still does not describe the exact aggregation semantics or return fields, but it adds meaningful clarity for this read-only analytics 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?
Two tightly written sentences, front-loaded with the core purpose and followed by the key alternative. There is 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?
For a simple read-only analytics tool with rich annotations and full parameter schema coverage, the description is nearly complete. It conveys aggregation level and scoping, though it leaves the exact returned metric fields unstated.
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 parameter meanings are already fully documented in the schema. The description reinforces the one-action-type constraint and optional campaign/account scoping, but adds little syntax or format detail 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 resource and shape: month-over-month totals for one action type, optionally scoped to a campaign or LinkedIn account. It also distinguishes the tool from `analytics_reporting` by contrasting monthly one-action-type trends with daily all-action-type 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?
It clearly signals the intended use case: monthly trend analysis for a single action type, with an explicit alternative for daily granularity across all action types. It does not explicitly distinguish itself from other analytics siblings such as `analytics_campaign` or `analytics_account`, so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
appointment_getGet an appointmentARead-onlyIdempotentInspect
Full detail for one booked meeting: time, timezone, status, and the lead and conversation it came out of. Read-only, like appointment_list — rescheduling and cancelling happen in the web app.
| Name | Required | Description | Default |
|---|---|---|---|
| appointmentId | Yes | Appointment id, from `appointment_list`. |
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 that no mutation path exists in the API and that this behaves like `appointment_list`. The field list also gives a useful preview of the response, which matters since there is no 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?
Two tight sentences, front-loaded with the payload description and followed by the read-only/mutation-location caveat. 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 read tool with strong annotations, the description covers purpose, response shape, and the absence of write operations. Minor gaps remain around not-found behavior and whether paging or expansion is needed for related lead/conversation data.
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 has 100% schema description coverage and the schema already says the id comes from `appointment_list`, so the description cannot add much. It offers no format, length, or error semantics for `appointmentId` beyond what the schema states.
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 — full detail for one booked meeting — and enumerates what is returned (time, timezone, status, lead, conversation). This is clearly distinguishable from `appointment_list`, which it names 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?
Explicitly frames the tool as read-only and tells the agent that rescheduling and cancelling happen in the web app, which is an effective 'do not use this for mutations' signal. It does not restate the lookup path to an id (that lives in the schema), so guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
appointment_listList appointmentsARead-onlyIdempotentInspect
Meetings booked out of conversations, or created in the web app. Read-only here by design: appointments are never inserted or edited by hand over this server, so there is no tool to create, change or cancel one. For the thread a meeting came out of use conversation_get.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number. | |
| leadId | No | Lead id, from `lead_list`. | |
| status | No | Filter by status. | |
| conversationId | No | Conversation id, from `conversation_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint, but the description adds the non-obvious rationale — appointments are never hand-inserted or edited over this server, so write tools are absent by design. That prevents an agent from hunting for a create/update sibling. Pagination and ordering behavior are not 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 short sentences: resource definition first, read-only constraint second, sibling routing last. No filler, and the most decision-relevant constraint is front-loaded after the resource statement.
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 is no output schema, so the description carries some burden for return shape — it doesn't say whether results are paginated envelopes, what fields appear, or default ordering. For an all-optional-filter list tool the scope statement is enough to call it correctly, but not enough to 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 description coverage is 100%, so all four parameters (page, leadId, status, conversationId) are already documented with sourcing hints. The description adds no filtering semantics, default sort, or pagination guidance beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description defines the resource precisely — meetings booked out of conversations or created in the web app — which is more informative than a generic 'list appointments'. It also implicitly scopes itself against write tools by stating none exist. It stops short of stating the verb/return shape (a paginated collection) in the description itself, relying on the title for that.
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 rules out creation/editing ('there is no tool to create, change or cancel one') and routes the agent to `conversation_get` when the underlying thread is wanted. It does not, however, contrast with the sibling `appointment_get`, so an agent choosing between fetching one appointment vs listing many gets no guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
automation_duplicateDuplicate an automationAInspect
Copy an automation into a new inactive draft. The copy starts inactive, so it is safe: nothing runs until automation_upsert sets isActive: true. Use it to try a change without touching the automation currently handling live events.
| Name | Required | Description | Default |
|---|---|---|---|
| automationId | Yes | Automation id, from `automation_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds genuinely non-obvious behavior beyond the annotations: the copy is created inactive and nothing executes until isActive is set via automation_upsert. It leaves out whether repeated calls create multiple copies (annotations say idempotentHint=false) and what the call returns, which matters for chaining.
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 outcome ('new inactive draft'), followed by the safety implication and the use case. Nothing is 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?
For a single-parameter mutation this covers the safety story well, and the annotations carry the write profile. However, the description tells the agent to activate the copy via automation_upsert without saying whether this tool returns the new automation id — a real gap for chaining, and there is no output schema to fall back 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?
The single parameter has 100% schema coverage and already points to automation_list as the source of the id. The description adds no format, default, or constraint information 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?
'Copy an automation into a new inactive draft' is a specific verb+resource+result-state, not a restatement of the name. An agent can immediately distinguish this from automation_upsert and automation_get in the 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?
It gives a clear use case ('try a change without touching the automation currently handling live events') and names automation_upsert as the step that activates the copy. It stops short of explicit exclusions (e.g. when to edit in place instead of duplicating) but the selection context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
automation_getGet an automationARead-onlyIdempotentInspect
One automation with its full workflow graph. Read one before authoring another with automation_upsert: the node and edge shape is not documented anywhere else, and a hand-built graph that does not match it will not run.
| Name | Required | Description | Default |
|---|---|---|---|
| automationId | Yes | Automation id, from `automation_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the read-only, idempotent, non-destructive profile, so the description appropriately adds context beyond them: it returns the full workflow graph and warns that the graph shape is undocumented and must match for execution. It does not describe auth needs or exact response fields, but it adds meaningful 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?
Two sentences, front-loaded with the returned resource, followed by the key authoring warning. 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?
For a simple one-parameter get tool with no output schema, the description sufficiently covers what is returned (an automation and its full workflow graph) and why the shape matters. It could say a bit more about the response structure, but the critical context 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 100%, and the schema already explains that `automationId` comes from `automation_list`. The description adds no parameter-specific detail beyond implying the single automation by ID, so the 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 identifies the resource returned—'One automation with its full workflow graph'—and implicitly frames it as a read operation. It distinguishes the tool from `automation_upsert` by explaining why to read before writing, though it does not explicitly contrast with `automation_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?
It gives clear usage context: read one automation before authoring another with `automation_upsert`, and explains that the node/edge shape is otherwise undocumented. It does not cover when to use this versus `automation_list`, but the primary alternative is named with a clear condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
automation_listList automationsARead-onlyIdempotentInspect
Account automations — event-driven workflows that run outside any single campaign. This is also where event delivery to your own systems belongs: webhooks are deprecated and their tools are gone, so do not look for them. A campaign sequence is a different thing entirely — that is flow_get and flow_set.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds useful domain context and deprecation warnings, but it does not describe listing behavior, return format, or pagination.
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 resource definition, then immediately clarifies the two common confusions: webhooks and campaign sequences. Every sentence earns its place by preventing a likely wrong tool selection.
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 list tool with rich annotations and no output schema, the description is largely complete: it defines scope and steers away from deprecated webhook tools and campaign-flow tools. It could mention the shape of returned automation objects, but that absence is minor given the tool's low complexity.
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 input parameters, so there are no parameter semantics to explain. Per the zero-parameter baseline, a 4 is appropriate; the description does not need to compensate for parameter 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 defines the resource precisely as account-level event-driven workflows outside any single campaign, and explicitly distinguishes it from campaign sequences handled by `flow_get`/`flow_set`. It does not directly state the listing action, but the tool name and title make that clear, and the scope is well differentiated 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 gives explicit exclusions and alternatives: webhook tools are deprecated and should not be looked for, while campaign sequences belong to `flow_get`/`flow_set`. This routes the agent away from wrong siblings, though it does not state prerequisites or when to prefer `automation_get` after listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
automation_upsertCreate or update an automationAIdempotentInspect
Create an automation, or update one by passing _id. The flow graph uses the same node/edge shape as the automations builder in the web app — read an existing one with automation_get before authoring a new graph by hand. Setting isActive: true makes it run against live events, which can message real people — leave it false while drafting and get an explicit yes before activating. It replaces the whole flow graph rather than patching it, so pass the complete graph. It does not touch any campaign sequence (flow_set). There is no tool to delete an automation.
| Name | Required | Description | Default |
|---|---|---|---|
| _id | No | Omit to create a new automation. | |
| flow | No | Workflow graph — nodes and edges. | |
| title | Yes | Short label. | |
| isActive | No | Whether it runs. Keep false while drafting. | |
| description | Yes | Longer explanatory text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses critical behavior: the whole `flow` graph is replaced rather than patched, activation makes the automation run against live events and can message real people, and campaign sequences are untouched. These details materially change how an agent should invoke 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 front-loaded with create-or-update behavior, then moves through graph shape, activation risk, replacement semantics, and scope. Every sentence contributes operational guidance 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 nested, mutation-style tool with no output schema, the description covers the important invocation and safety context. It does not explain what the call returns, which is a minor gap, but the core behavior and graph-replacement semantics are 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 100%, so the schema already defines all five parameters. The description adds valuable meaning for key parameters, especially `_id` for update mode, the replacement semantics of `flow`, and the live-event risk of `isActive`; however, it does not detail the internal node/edge shape beyond pointing to the builder and `automation_get`.
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 upsert operation for automations and clearly distinguishes creation (omit `_id`) from update (pass `_id`). It also names related tools (`automation_get`, `flow_set`) so the agent can separate this from neighboring 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?
It gives explicit workflow guidance: read an existing graph with `automation_get` before hand-authoring, keep `isActive` false while drafting, and get explicit approval before activating. It also names exclusions, including `flow_set` and the absence of a delete tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blacklist_addAdd a blacklist ruleAInspect
Exclude prospects by profile URL, company URL, keyword, job title or email. KEYWORD and JOB_TITLE match as substrings against the profile, so keep them specific — "director" would exclude a very large slice of a search. Account-wide and lasting — it is not a way to skip one prospect in one campaign, which is lead_update with isExcluded. For a list of rules at once use blacklist_add_bulk. There is no tool to delete a rule.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Filter by type. | |
| keyword | Yes | The value to match — a URL, an email, or a substring for KEYWORD / JOB_TITLE. | |
| linkedAccountId | Yes | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give generic hints (readOnly=false, destructive=false, non-idempotent); the description adds real behavioral facts: the rule is account-wide and lasting, matching is substring-based for KEYWORD/JOB_TITLE with a concrete warning about over-broad terms, and rules cannot be deleted afterwards.
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 what the tool does, then the matching caveat, then the routing alternatives. Every clause carries distinct information; nothing is restated from the title or schema verbatim.
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 mutation with no output schema, the description covers scope, matching semantics, alternatives, and irreversibility. The only omission is what the call returns (e.g., a created rule id), which is minor given no output schema exists.
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 operational meaning beyond the schema by explaining that keyword values are matched as substrings against the profile and must be kept specific, plus the concrete failure mode ('director' would exclude a large slice).
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 ('Exclude') and enumerates the exact matchable resources (profile URL, company URL, keyword, job title, email). It is immediately distinguishable from siblings by naming `lead_update`/`isExcluded` and `blacklist_add_bulk` as different routes.
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 not to use it ('not a way to skip one prospect in one campaign, which is `lead_update` with `isExcluded`') and which tool handles batches (`blacklist_add_bulk`). It even closes the loop on rule removal by stating no delete tool exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blacklist_add_bulkBulk-add blacklist rulesAInspect
Add many exclusion rules at once — a competitor domain list, or an opt-out export. Same effect as blacklist_add, one call. Rules cannot be removed afterwards by any tool, so review the list with the user before loading it.
| Name | Required | Description | Default |
|---|---|---|---|
| entries | Yes | Rules to add, up to 5,000 per call. | |
| linkedAccountId | Yes | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the description's key contribution is the irreversible consequence: rules 'cannot be removed afterwards by any tool.' That is exactly the kind of context annotations cannot convey. It does not address idempotency (annotations say not idempotent), so whether duplicate keywords are silently doubled is left unclear.
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 bulk-vs-single relationship and the irreversible warning are both front-loaded, and there is no filler or redundancy 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 an irreversible bulk mutation with no output schema, the description supplies the one piece an agent most needs — that the effect cannot be undone. It leaves open what happens to a 5,000-entry payload that partially fails and what the response reports, which is a real gap for a bulk operation but a minor one given full schema coverage.
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 documented inline, including the type enum and keyword matching semantics, so the schema does the heavy lifting. The description's examples ('competitor domain list, or an opt-out export') loosely illustrate what entries look like but add no format or constraint detail beyond the schema (e.g. the 5,000 cap comes from 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 ('add many exclusion rules at once') and explicitly relates it to the sibling `blacklist_add` ('same effect as `blacklist_add`, one call'), so an agent can distinguish bulk from single-add 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?
It gives clear usage context (a competitor domain list, an opt-out export) and implicitly routes single additions to `blacklist_add`, plus a procedural prerequisite to review the list with the user. It stops short of explicit when-not conditions, such as what to do on partial failure or whether to prefer `lead_blacklist` for individual leads.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blacklist_copyCopy blacklist between accountsAInspect
Clone every exclusion rule from one LinkedIn account onto another. Adds to the destination rather than replacing it, and there is no tool to remove rules afterwards — read the destination with blacklist_list first so the user knows what the result will be.
| Name | Required | Description | Default |
|---|---|---|---|
| linkedAccountId | Yes | Source account. | |
| newLinkedAccountId | Yes | Destination account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses merge-not-replace semantics, the irreversibility of the operation (no delete tool), and a recommended pre-check. Annotations (destructiveHint=false, idempotentHint=false) are consistent with an additive, non-undoable write, and the description supplies the practical consequence the flags don't 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?
Two sentences, zero waste: the core action comes first, then the merge semantics, then the prerequisite. The parenthetical caveat about no removal tool is placed exactly where it matters.
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 with no output schema, the description covers what changes, what does not change (destination rules preserved), that the change cannot be undone, and how to preview the outcome. Nothing an agent needs before calling 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 already labels `linkedAccountId` as source and `newLinkedAccountId` as destination. The description's 'from one account onto another' mirrors that mapping without adding new detail such as ID format or validation.
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+scope: cloning every exclusion rule from one LinkedIn account to another. Clearly distinguishes itself from siblings like blacklist_add (single rule), blacklist_list (read), and blacklist_delete by making it a whole-set transfer between two accounts.
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 routes the agent through a prerequisite: read the destination with `blacklist_list` first. It also gives a negative constraint (no removal tool exists afterwards), which is exactly the when-to-be-careful 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.
blacklist_deleteDelete a blacklist ruleADestructiveInspect
Remove an exclusion rule. Prospects it was blocking become targetable again — which is the risk: a rule added for an opt-out, a competitor or a do-not-contact request starts letting those people back into campaigns. Read the rule with blacklist_list and show the user exactly what it blocks before calling, and get an explicit yes. This removes a RULE, not a blacklisted person: a lead blacklisted via lead_blacklist is a separate record and no tool removes it.
| Name | Required | Description | Default |
|---|---|---|---|
| blacklistId | Yes | Blacklist rule id, from `blacklist_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the description is not burdened with the basic safety profile. It goes further, disclosing the concrete consequence (previously blocked prospects become targetable again) and why that is dangerous (opt-outs, competitors, do-not-contact requests leaking back into campaigns). That is exactly the value-add this dimension rewards.
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 the risk, then the scoping caveat. The risk statement sits ahead of the workflow instruction, which is the right priority for a destructive tool, and nothing is 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?
A one-parameter destructive tool with full annotation coverage and no output schema needs exactly this: consequence of the mutation, pre-call verification workflow, and disambiguation from the similarly named blacklist tools. All present; no return-value explanation is required.
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 single parameter is already documented as a blacklist rule id sourced from `blacklist_list`. The description repeats that provenance rather than adding new meaning about the id's format or behavior. Baseline 3 is correct when the schema does the work.
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 ('Remove an exclusion rule') and immediately distinguishes the scope from the nearest confusion point: it removes a rule, not a blacklisted person, which is handled by `lead_blacklist`. An agent can separate this from `blacklist_list`, `blacklist_add`, and `lead_blacklist` 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?
Gives an explicit pre-call procedure: read the rule with `blacklist_list`, show the user exactly what it blocks, and obtain an explicit yes. It also names the alternative record path (`lead_blacklist`) and notes no tool removes that record, so both the when and the when-not are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blacklist_exportExport blacklistAInspect
Generate a CSV of every exclusion rule on an account. A file for the user. To read the rules in the conversation use blacklist_list.
| Name | Required | Description | Default |
|---|---|---|---|
| linkedAccountId | Yes | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=false. The description adds that the output is a CSV delivered as a file rather than inline data, which is genuinely useful context. However, it says nothing about where the file lands, whether repeated calls duplicate artifacts, or how the file is surfaced to the agent, so the added behavioral surface is thin.
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, and the core action is front-loaded ahead of the sibling routing hint. The fragment "A file for the user" is clipped and could be folded into the first sentence, but nothing is wasteful.
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 one documented parameter, no output schema, and annotations covering the safety profile, the description covers the essential decision (export to file vs. list in chat) and states the output medium. The only gap is what the caller actually receives back (file reference, link, or notification), which it doesn't specify.
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 a single required parameter with 100% schema description coverage, and that description already points to `linkedin_account_list` for the id. The description adds no further meaning about the parameter (e.g., whether the export is scoped strictly to one linked account), so 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 ("Generate a CSV of every exclusion rule on an account") and explicitly distinguishes itself from the sibling `blacklist_list` for in-conversation reading. An agent can separate this export tool from the list/add/delete blacklist siblings 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?
It names the alternative explicitly and gives the condition that selects it ("To read the rules in the conversation use `blacklist_list`"). It doesn't cover exclusions such as prerequisites, account-scope caveats, or when an export is inappropriate (e.g., large accounts), so it stops short of a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
blacklist_listList blacklist entriesARead-onlyIdempotentInspect
Exclusion rules for a LinkedIn account. Matching prospects are filtered out before they ever enter a campaign. Per LinkedIn account, not per campaign, so a rule here affects every campaign on that account. Read it when a search returns fewer leads than expected. Excluding one lead from one campaign instead is lead_update with isExcluded.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number. | |
| pageSize | No | Rows per page. | |
| linkedAccountId | No | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a safe, read-only, idempotent operation. Beyond that, the description adds meaningful behavior: rules are per LinkedIn account, affect every campaign on that account, and filter prospects before they enter campaigns.
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 resource definition and then adds only the scope, diagnostic use, and alternative. There is no wasted text, and the per-account versus per-campaign distinction is stated efficiently.
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 with fully described parameters and clear annotations, the description is nearly complete. The main gap is that it does not state what happens when `linkedAccountId` is omitted, even though the schema marks it optional.
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 three parameters are already documented by the schema. The description reinforces the account-level scope but does not add format or behavior details beyond what `linkedAccountId`, `page`, and `pageSize` 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 defines the resource as exclusion rules for a LinkedIn account and explains their effect: matching prospects are filtered before entering campaigns. It distinguishes this list from the per-campaign exclusion alternative, though the retrieval verb itself is only implied by 'Read it' rather than stated directly.
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 diagnostic use case: read this when a search returns fewer leads than expected. It also names the alternative for a different need, `lead_update` with `isExcluded`, and clarifies the per-account scope that separates this tool from per-campaign exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_activity_summaryCampaign activity summaryARead-onlyIdempotentInspect
Aggregate counts of pending, completed and failed actions across the campaign. Three numbers for the whole campaign — the cheapest "is it working" check. For the same split per step use sequence_step_stats, and for the leads behind one step sequence_leads_at_step.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered. The description adds value beyond that by disclosing the return shape ('three numbers for the whole campaign') and a relative cost signal ('cheapest'), which helps an agent decide when to reach for it. Minor gap: no note on how quickly counts refresh relative to recent sends.
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, zero waste, with the core purpose and scope front-loaded before the sibling routing. 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?
No output schema exists, and the description compensates by naming the three metrics returned (pending, completed, failed) and their granularity (whole campaign). Combined with annotations covering safety and a single fully documented parameter, 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 single campaignId parameter has 100% schema description coverage, including where to obtain it (campaign_list or campaign_create), so the schema does the work. The description adds nothing about the parameter, which is acceptable at this coverage level but not additive.
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 ('aggregate counts') and resource ('pending, completed and failed actions across the campaign'), and explicitly contrasts its scope with per-step and per-lead siblings. An agent can distinguish it from sequence_step_stats and sequence_leads_at_step 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?
Gives an explicit selection rule: this is the cheapest 'is it working' check for the whole campaign, while sequence_step_stats covers the same split per step and sequence_leads_at_step covers leads behind one step. Both alternatives and the condition that selects them are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_add_prospectsAdd more prospects to a running campaignADestructiveInspect
Top up an already-running campaign with prospects from a new source, without touching its sequence or existing leads. Runs in the background and can take several minutes. Two hard preconditions, both enforced by the backend as thrown errors: the campaign must be ACTIVE — a DRAFTED one fails with "Campaign is not active!" — and it must have finished filtering its first batch. So this is never how a new campaign gets its audience: for that use campaign_set_source (a search URL) or campaign_upload_leads (CSV rows) before launching. It also does not add leads to this campaign directly — the backend creates a child campaign pointing at this one, which is why campaign_delete reports removing active children.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | LinkedIn source URL, for non-CRM types. | |
| type | Yes | Source kind for the new batch. | |
| field | No | CRM sources: contact property holding the profile URL. | |
| query | No | CRM sources: segment / list query. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the destructive/openWorld/non-idempotent annotations: it discloses async background execution with multi-minute latency, the thrown-error preconditions with literal messages, and the non-obvious side effect that a child campaign is created (which explains why campaign_delete reports removing active children). This is exactly the context structured fields cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then preconditions, then alternatives, then the child-campaign note. Dense but each sentence carries real information; the campaign_delete cross-reference is slightly tangential but justifies itself as a side-effect disclosure.
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 no output schema, the description compensates by stating it runs in the background and can take minutes, so the agent knows not to expect immediate leads. It doesn't say what is returned or how to track progress of the background job, which is the one remaining gap for an async mutation.
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 each property (url, type, field, query, campaignId) is documented in the schema, so baseline 3 applies. The description adds only an implicit mapping of 'new source' to the `type` enum and does not clarify which of url/field/query applies to which type branch.
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+scope: 'Top up an already-running campaign with prospects from a new source, without touching its sequence or existing leads.' This is immediately distinguishable from campaign_create, campaign_set_source, and campaign_upload_leads 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?
Explicitly names the when-not case ('this is never how a new campaign gets its audience') and routes to the two correct alternatives by name, campaign_set_source and campaign_upload_leads. Two hard preconditions (ACTIVE, first batch filtered) are stated with the exact backend error string.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_createCreate campaignAInspect
Create a DRAFTED campaign. Nothing sends until campaign_launch. Pass sourceUrl to set the prospect source at the same time (a LinkedIn or Sales Navigator search URL, a group, an event, or a post). For a CSV-driven campaign, omit sourceUrl and follow up with campaign_upload_leads. This is the right starting point for EVERY new campaign. Never begin one with campaign_duplicate unless the user named a campaign to copy — see that tool for why. It creates the campaign and nothing else: the sequence comes from flow_set, accounts and limits from campaign_update, and it only sends after campaign_launch.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Campaign name, shown throughout the app. | |
| sourceUrl | No | LinkedIn search / Sales Navigator / Recruiter / group / event / post URL to harvest prospects from. The source type is inferred from the URL shape. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-readOnly, non-destructive, non-open-world, non-idempotent, but the description adds the crucial behavioral facts the annotations cannot convey: the campaign is created in DRAFT state and nothing is sent until campaign_launch. It also clarifies the call has a single narrow effect ('creates the campaign and nothing else'), so the agent won't assume side effects like sequence or account configuration.
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 the key fact (draft, nothing sends until launch) and organized around sourceUrl paths. Slightly redundant: 'Nothing sends until campaign_launch' is restated by 'it only sends after campaign_launch' at the end, costing a bit of density.
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 only 2 fully-described params and no output schema, the description supplies the missing workflow context — post-creation steps (flow_set, campaign_update, campaign_launch, campaign_upload_leads) — so an agent knows exactly where this call sits in the campaign-building sequence.
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 already 100%, so the baseline would be 3; the description earns above that by explaining sourceUrl's accepted URL families (LinkedIn/Sales Nav/Recruiter/group/event/post) and the strategic choice of when to supply it versus omitting it. It doesn't add format specifics beyond the schema's own inference note, keeping it at 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?
States a specific verb+resource ('Create a DRAFTED campaign') and immediately scopes it: the draft is inert until campaign_launch. The final sentence enumerates what this call does NOT do (sequence, accounts/limits, sending), cleanly separating it from flow_set, campaign_update, and campaign_launch.
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 routing: pass sourceUrl for URL-harvested prospects, omit it and use campaign_upload_leads for CSV, and never start with campaign_duplicate unless the user named a campaign to copy. This is a textbook when-to-use / when-not / alternative specification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_create_ab_variantCreate A/B split campaignAInspect
Split a campaign into an A/B pair so two versions of the sequence run against comparable halves of the audience. Compare them later with analytics_campaign. This SPLITS, it does not copy: the backend moves half of the not-yet-contacted leads out of the original into a new DRAFTED campaign, copies the flow, and renames the original to " [A]". The original therefore ends up with half the audience it had. It needs more than 10 leads still waiting to be contacted and refuses otherwise with "Not enough leads to do AB testing, Duplicate campaign instead!" — in which case campaign_duplicate is the backend's own suggestion. Use campaign_duplicate when the audience should be left alone, and this when the point is to compare two versions on one audience.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the exact side effects: half of not-yet-contacted leads are moved out of the original into a new DRAFTED campaign, the flow is copied, and the original is renamed to '<title> [A]' leaving it with half its audience. It also quotes the failure mode and error string. Although the audience loss on the original sits in some tension with destructiveHint=false, leads are moved rather than deleted and the outcome is fully disclosed, so this is not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the decisive fact (splits, not copies) in the first sentence, then layers side effects, precondition, and the alternative in descending importance. Dense with no filler despite 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?
One parameter, no output schema, so the description only needs to cover selection logic and consequences. It covers both thoroughly, including the exact error message and the backend's own suggested fallback.
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 single `campaignId` parameter is already documented as coming from `campaign_list` or `campaign_create`. The description adds no syntax, format, or constraint 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?
States a specific verb and resource (split a campaign into an A/B pair) and immediately distinguishes it from the confusingly similar `campaign_duplicate` by insisting 'This SPLITS, it does not copy.' An agent can select correctly 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?
Gives explicit routing rules in both directions: use `campaign_duplicate` when the audience should be left alone, use this when the point is to compare two versions on one audience. It also states the precondition (>10 contacts still waiting) and points to `analytics_campaign` for the follow-up comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_deleteDelete a campaignADestructiveIdempotentInspect
Remove a campaign from your account by moving it to DELETED. Nothing is erased — the campaign, its leads, sequences and activity records all stay in the database, and the campaign simply stops appearing in listings. There is no tool to bring it back, so confirm with the user first. Sending stops because the workers only pick up ACTIVE campaigns; to stop sending without removing the campaign, that is a pause, which belongs in the web app. The only tool allowed to write a campaign status, and the only value it writes is DELETED — campaign_update has no status parameter and nothing sets ACTIVE, PAUSED or ARCHIVED. Deleted campaigns vanish from campaign_list, so confirm before calling: there is no undelete.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint and idempotentHint, but the description goes well beyond them: it explains this is a soft delete, that leads/sequences/activity records persist, that sending halts because workers only pick up ACTIVE campaigns, and that there is no reversal path. That is rich, non-obvious behavioral context that the annotations 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?
The critical warning (no undelete, confirm first) is front-loaded, and most sentences carry distinct information. However, the irreversibility point is restated three times ("no tool to bring it back," "confirm with the user first," "confirm before calling: there is no undelete"), which is more repetition than the warning requires.
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 no output schema, the definition covers safety, side effects, and post-call visibility thoroughly. The remaining gap is the inaccurate claim about being the sole status writer, which could cause an agent to overlook `campaign_set_status`.
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 a single parameter with 100% schema description coverage, and the schema already documents it as the id from `campaign_list` or `campaign_create`. The description adds no syntax, format, or edge-case guidance about campaignId, so 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 gives a precise verb and resource plus the actual mechanism: the campaign is moved to DELETED rather than erased. It also distinguishes the tool from campaign_update by parameter shape. The only blemish is the flat assertion that this is "the only tool allowed to write a campaign status," which sits awkwardly against the sibling `campaign_set_status` and could mislead an agent comparing 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?
Explicit when-to-use, when-not-to-use (pausing sending belongs in the web app), and a required confirmation step with the user before calling. It also names the consequence of misuse (vanishing from campaign_list, no undelete), which is exactly the routing information an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_duplicateDuplicate campaignAInspect
Copy one specific existing campaign — its settings and its whole sequence — into a new DRAFTED campaign, without copying the leads. Use this ONLY when the user asks to duplicate a campaign they have named. It is not a way to start a new campaign: a new campaign has nothing to duplicate, and the copied sequence carries the original audience's messaging. To start fresh, use campaign_create. The copied steps cannot be rewritten from here either — sequence_update edits are reverted at launch on a campaign that has not launched yet, so a duplicate is only useful when the existing copy is meant to be kept.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | The existing campaign the user named. Never guess this — get it from `campaign_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only, non-destructive, non-idempotent operation. The description adds valuable beyond-annotation context: the result is a new DRAFTED campaign, leads are not copied, the copied sequence preserves original messaging, and sequence_update edits are reverted at launch on an unlaunched duplicate.
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 and then layers usage, exclusions, and limitations in four purposeful sentences. Every sentence contributes actionable selection or invocation guidance, with no 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 duplication tool with no output schema, the description covers purpose, when to use it, when not to use it, alternatives, and important behavioral limitations. The one minor gap is that it does not state what the tool returns, such as the new campaign identifier, but the selection and invocation guidance 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 100%, and the schema already documents campaignId as the existing campaign obtained from campaign_list. The description reinforces that it must be one specific existing campaign but adds no new syntax or format 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: copy an existing campaign's settings and whole sequence into a new DRAFTED campaign, without leads. It also explicitly distinguishes this from campaign_create and sequence_update, so an agent can identify 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?
It gives an explicit ONLY condition — when the user asks to duplicate a campaign they have named — and directly names campaign_create as the alternative for starting fresh. It further clarifies that a duplicate is only useful when the existing copy is meant to be kept, which rules out misuse for sequence editing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_export_statsExport campaign stats to CSVAInspect
Generate a CSV export of campaign performance. Returns a filename; the file is served from the CDN and also emailed to the account owner — so it leaves the conversation, which is worth mentioning before calling it. Performance numbers, not people: for a file of prospects use lead_export, and to read the numbers here instead use analytics_campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Date window as { from, to } — epoch milliseconds or ISO 8601. Omit for the backend default. | |
| campaignId | No | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and destructiveHint=false; the description adds the material hidden behavior — the file is served from a CDN and emailed to the account owner, i.e. it leaves the conversation. That is exactly the out-of-band side effect an agent needs to know before invoking a non-idempotent export.
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, then the delivery caveat, then routing. Slightly self-referential with 'which is worth leaving in' style asides ('so it leaves the conversation, which is worth mentioning before calling it'), but no sentence is 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?
No output schema exists, and the description compensates by stating what is returned (a filename) plus where the file lives (CDN) and that it is emailed. With zero required params and fully documented schema, nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the nested `range` object already documents `from`/`to` aliases, ISO/epoch formats, and the backend default when omitted. The description adds no parameter-level guidance, so the schema carries the load and 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?
States a specific verb and resource ('Generate a CSV export of campaign performance') and adds the return shape (a filename). It explicitly distinguishes itself from the two nearest siblings, `lead_export` (prospect data) and `analytics_campaign` (inline numbers), so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use-each rule: use this for performance numbers as a file, `lead_export` for a file of prospects, `analytics_campaign` to read the numbers in-conversation. It also surfaces a precondition (the export leaves the conversation and is emailed to the account owner) that should be considered before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_generate_ai_sequenceDraft a campaign with AIAInspect
Ask the platform's own AI to draft a whole campaign — copy and multi-step sequence — from a brief, and create it as a draft. Requires an AI provider connected in the web app under Settings - Integrations. Use this when the user wants the platform to write the sequence for them; to author one yourself, use flow_set.
| Name | Required | Description | Default |
|---|---|---|---|
| goal | Yes | What the campaign should achieve, e.g. "book discovery calls". | |
| tone | Yes | Voice of the copy, e.g. "friendly", "direct", "consultative". | |
| title | Yes | Campaign name. | |
| country | No | Country. | |
| industry | Yes | Industry. | |
| keyPoints | Yes | Proof points or hooks the copy should work in. | |
| stepCount | Yes | How many steps the sequence should have. | |
| targetPersona | Yes | Who is being targeted, e.g. "Heads of RevOps at Series B SaaS". | |
| productDescription | Yes | What you are offering, in a sentence or two. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the description's added prerequisite about the connected AI provider is genuine value beyond the structured data. It also clarifies the result lands as a draft rather than a launched campaign, which is useful behavioral context. It does not mention that AI drafting is slow/long-running or that repeated non-idempotent calls create duplicate campaigns, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste: the core action and its output come first, the prerequisite second, and the sibling routing last. Nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-param, 8-required mutation with no output schema, the description is nearly complete — action, prerequisite, and alternative are all present. The remaining gap is the return value: it never says whether the call yields a campaign ID, the generated sequence, or just a success flag, which matters for chaining into campaign_launch or flow_get.
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 param carries an example-bearing description, so the schema does the heavy lifting and 3 is the baseline. The description adds only the framing that the inputs constitute a "brief"; it says nothing about stepCount bounds (1-10) or how the fields interact with the generated sequence.
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?
Names a specific verb and resource ("ask the platform's own AI to draft a whole campaign — copy and multi-step sequence") and states the outcome ("create it as a draft"). Clearly distinguishes from the manual-authoring sibling flow_set and from campaign_create, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit selection rule ("Use this when the user wants the platform to write the sequence for them") plus the inverse case with the named alternative ("to author one yourself, use flow_set"). It also states a hard prerequisite (AI provider connected under Settings - Integrations) that would otherwise cause a silent runtime failure.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_getGet campaignARead-onlyIdempotentInspect
Everything about one campaign: settings, schedule, limits, attached accounts, lead source, live counters and the flow outline. This is the tool to call before changing anything — it also reports what is still missing before the campaign can launch, in _readiness.blockers, which must be empty before campaign_launch. Read status here before choosing how to edit copy: flow_set for a DRAFTED campaign, sequence_update only once it is ACTIVE or PAUSED. A settings-and-counters snapshot: for the sequence in detail use flow_get, for performance analytics_campaign, and for the people lead_list.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. | |
| includeFlow | No | Include a readable outline of the campaign sequence. |
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: the readiness-blocker gating logic, the status field's role in choosing an edit path, and the fact that this is a snapshot rather than a detailed sequence or performance view. No output schema exists, and the description compensates by enumerating the returned 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?
Three dense sentences, each carrying distinct information: contents, gating precondition, and sibling routing. The most important constraint (readiness before launch) is front-loaded and nothing is 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?
For a read-only getter with no output schema, the description covers return contents, the readiness/blocker contract, and how the result drives downstream tool choice. An agent has everything needed to call it and act on the response.
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 (campaignId, includeFlow) are documented in the schema itself. The description adds no syntax, format, or defaulting 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?
States a specific verb and resource ('Everything about one campaign') and enumerates exactly what is returned: settings, schedule, limits, attached accounts, lead source, counters, flow outline. It explicitly distinguishes itself from flow_get, analytics_campaign, and lead_list, so an agent can pick it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('call before changing anything'), a hard precondition ('_readiness.blockers must be empty before campaign_launch'), and conditional routing based on `status` (flow_set for DRAFTED, sequence_update for ACTIVE/PAUSED). Alternatives are named with 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.
campaign_launchLaunch campaignADestructiveInspect
Start a campaign. THIS BEGINS SENDING REAL OUTREACH to real people from the connected LinkedIn account and mailboxes — invitations, messages and emails go out on the configured schedule. Run campaign_get first and clear every blocker: a saved flow, a lead source, a sending account, and (for CSV campaigns) a finished import. Show the user the full sequence and the audience and get an explicit yes in the conversation before calling — not an assumed one. Launch rebuilds every step from the saved flow graph, so any sequence_update edit made while the campaign was a draft is overwritten here; fix a draft's copy with flow_set instead. This is the only tool that starts a campaign. Pausing or resuming one afterwards is campaign_set_status.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. | |
| skipPreflight | No | Skip the local readiness check and let the backend decide. Only useful if the check is wrong. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructive/openWorld/non-idempotent) by spelling out the real-world consequence — outreach is actually sent to real people on a schedule — and a non-obvious behavior: launch rebuilds every step from the saved flow graph, overwriting any `sequence_update` edits made while in draft. That is exactly the kind of gotcha the annotations 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?
Front-loads the action and consequence, then layers prerequisites, consent, the overwrite warning, and sibling routing. Every sentence carries an operational constraint; nothing is filler despite the 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 non-idempotent, destructive, side-effect-heavy launch tool with no output schema, it covers readiness blockers, required human confirmation, destructive overwrite semantics, and correct sibling picks. An agent has everything needed to call 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?
Schema coverage is 100%, so `campaignId` and `skipPreflight` are already documented in the schema. The description implies a preflight/readiness concept ('clear every blocker') but never ties it explicitly to the `skipPreflight` flag, so it adds only marginal value beyond the structured fields. 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?
States a specific verb and resource ('Start a campaign') and immediately describes the concrete effect: real invitations, messages and emails go out from the connected LinkedIn account and mailboxes. It explicitly separates itself from siblings ('the only tool that starts a campaign'; pausing/resuming is `campaign_set_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?
Gives explicit preconditions (run `campaign_get` first, clear every blocker: saved flow, lead source, sending account, finished CSV import) and an explicit consent requirement (show the sequence and audience, get a real yes, not an assumed one). It also names the correct alternative for editing draft copy (`flow_set`) and for lifecycle changes (`campaign_set_status`).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_listList campaignsARead-onlyIdempotentInspect
Campaigns in your account, newest first, 20 per page. Use status to filter — DRAFTED campaigns are the ones still being built, ACTIVE ones are sending right now. DELETED campaigns never appear here, which is why a deletion looks like a disappearance. The list view, a few fields each: for one campaign in full use campaign_get, and for performance analytics_campaign. Passing userId to read a sub-account's campaigns is accepted only from an account owner.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number. | |
| status | No | Filter by lifecycle status. | |
| userId | No | Read a SUB-ACCOUNT instead of your own data. Accepted only from an agency owner, and only for an account inside your own agency: take the id from `subaccount_list` and never construct or guess one. An id outside that list is refused. Omit it to read your own data, and name the account to the user when you pass it. | |
| keyword | No | Search campaign titles. |
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 real context beyond them: newest-first ordering, 20-per-page pagination, the fact that DELETED campaigns never appear (so deletion looks like disappearance), and the owner-only constraint on userId. That is exactly the extra behavioral detail annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: scope and ordering first, then filter semantics, then the deletion caveat, then sibling routing, then the permission note. No sentence is 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?
No output schema exists, and the description compensates by telling the agent the return shape is a partial list ('a few fields each') and pointing to campaign_get for full detail. Combined with pagination and permission notes, 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%, so the baseline is 3, but the description adds meaning the schema does not: the practical distinction between DRAFTED and ACTIVE statuses and the permission rule for userId. It stops short of covering page/keyword semantics, which the schema already handles.
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 ('Campaigns in your account') plus ordering and page size, and explicitly distinguishes itself from campaign_get and analytics_campaign. An agent can tell it apart from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternatives and the condition that selects them: 'for one campaign in full use campaign_get, and for performance analytics_campaign.' It also explains what the status filter means in practice (DRAFTED = being built, ACTIVE = sending now).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_logsCampaign audit logARead-onlyIdempotentInspect
Chronological record of everything that happened to a campaign: created, started, paused, resumed, lead sources added, settings changed, limits hit. Changes to the CAMPAIGN, written by whoever made them — the audit trail to read when a user asks why a campaign stopped or who changed a limit. Not what happened to the prospects: that is activity_list, lead_get or sequence_step_stats.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
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 covered. The description adds value beyond that by disclosing that entries are chronological and attributed to the actor ('written by whoever made them'), which is what makes it an audit trail. It stops short of stating retention window, pagination, or volume caps for a log that could be long.
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 core definition and the event list before the exclusion. Dense but every clause earns its place; the em-dash parenthetical could be tightened slightly, but nothing is 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?
For a one-parameter, read-only, non-open-world log tool with no output schema, the description covers what the resource is, what an entry represents, and who authored it. It does not describe the entry shape (timestamp/actor/event fields) or result size, which would help since there is no output schema, but the essential calling information 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?
With a single parameter and 100% schema description coverage (campaignId, sourced from `campaign_list` or `campaign_create`), the schema carries the full burden. The description adds no further detail about the id format or how missing/invalid ids behave, so 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?
States a specific resource and scope: a chronological record of everything that happened to a campaign, with an enumerated list of event types (created, started, paused, resumed, lead sources added, settings changed, limits hit). It also draws a hard line against prospect-level history, naming the sibling tools that cover that instead, so an agent can distinguish it 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?
Gives an explicit use case: 'the audit trail to read when a user asks why a campaign stopped or who changed a limit.' It also names the negative case and routes to alternatives (`activity_list`, `lead_get`, `sequence_step_stats`). Both when-to-use and when-not-to-use are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_preview_messagePreview a message with merge fields resolvedARead-onlyIdempotentInspect
Render a draft message against a real lead from the campaign so you can see how the merge fields resolve before committing the copy to a step. Nothing is sent and nothing is saved — this is the safe way to check a {{placeholder}} actually resolves, since an unknown one renders empty rather than failing. Save the copy with flow_set; to put a real email in front of yourself instead, campaign_send_test_email.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | Draft copy, including {{firstName}}-style placeholders. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a read-only, idempotent, non-destructive operation. The description adds valuable behavioral context beyond annotations: nothing is sent or saved, and unknown placeholders render empty rather than failing, which is non-obvious and important for interpreting preview 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 tightly written and front-loads the primary purpose. Every sentence carries useful information: the preview behavior, the safety/failure semantics, and the alternative tools.
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, read-only preview tool with full schema coverage and annotations, the description is complete enough. It explains what the agent will see and why it is safe, and it routes adjacent work to the correct 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 description coverage is 100%, so both `campaignId` and `message` are already documented in the input schema. The description adds some useful context about placeholder resolution and using a real lead, but does not provide additional parameter syntax or format details 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: render a draft message against a real campaign lead to inspect merge-field resolution. It also distinguishes the preview action from saving via `flow_set` and from sending a test email via `campaign_send_test_email`.
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: check the copy before committing it to a step. It also names the alternatives for adjacent tasks, `flow_set` for saving and `campaign_send_test_email` for putting a real email in front of the user.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_send_test_emailSend a test emailADestructiveInspect
Send one real email to an address you control, using a campaign mailbox, so you can check rendering and deliverability before launch. This does send mail: show the user the recipient, subject and body and get an explicit yes first. Only ever to an address they control — it is not a way to message a prospect, and there is no tool for that. To check merge fields without sending anything, use campaign_preview_message.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | Where to send the test. Use your own address. | ||
| content | Yes | Email body. | |
| subject | No | Subject line. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. | |
| emailAsText | No | Send as plain text rather than HTML. | |
| emailAccountId | Yes | Mailbox to send from. See `email_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and openWorldHint=true, so the description's real contribution is spelling out what that means in practice: one real email leaves the system, the user must see recipient/subject/body and give an explicit yes, and it is only for addresses the user controls. It does not say anything about rate limits or what comes back on success, which keeps it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with what the tool does, then the safety gate, then the alternative. Every sentence earns its place and nothing is repeated from 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 single-fire side-effecting tool with no output schema, the description covers purpose, consent requirements and the safer alternative. The only soft gap is that it does not say what the agent gets back or how failures surface, though annotations and the simple shape make that low-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 description coverage is 100%, so every parameter including the campaignId and emailAccountId cross-references is already documented. The description only mentions recipient, subject and body in the confirmation flow and adds no format or validation details beyond the schema — baseline 3.
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 ('Send one real email ... using a campaign mailbox') and scopes it to a testing purpose, which cleanly separates it from campaign_preview_message and from the prospect-messaging tools. The sibling it is not is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use conditions (check rendering and deliverability before launch), an explicit when-not-to-use ('not a way to message a prospect, and there is no tool for that'), and names the alternative for the read-only case: campaign_preview_message.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_set_sourceSet the prospect sourceADestructiveIdempotentInspect
Point a DRAFTED campaign at where its prospects come from: a LinkedIn/Sales Navigator search URL, a group, an event, a post, or a CRM segment. For an ACTIVE campaign use campaign_add_prospects instead — that adds to the existing pool rather than replacing the source.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | A LinkedIn LIST url — a basic search, a Sales Navigator (`/sales/`) search, a Recruiter (`/talent/`) search, or a group / event / post. Not a single profile. Required unless using a CRM source. | |
| type | No | Override the inferred source type. Use "hubspot" or "ghl" for CRM pulls. | |
| field | No | CRM sources: the contact property holding the LinkedIn profile URL. | |
| query | No | CRM sources: the segment / list / filter query to pull. | |
| surface | No | Assert which LinkedIn surface the url belongs to. The call is rejected if the url does not match, the same way the web app validates its Sales Navigator and Recruiter tabs. Omit to detect it. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=true; the description earns credit by explaining the nature of that destruction ('replacing the source'). It does not cover validation failures at the tool level (only the surface parameter schema notes rejection) or the effect on prospects already attached to the campaign.
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, zero filler, with the state constraint and source kinds front-loaded and the sibling routing placed second. Every clause 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 6-parameter mutation tool with fully documented schema, the description covers the essential draft-vs-active distinction and replacement semantics. It stops short of saying what happens to previously staged prospects or whether the call can be re-run safely, which idempotentHint implies but does not confirm.
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. The description's enumeration of source kinds loosely maps to the 'type' enum and hints that CRM sources exist, but adds no syntax, defaults, or cross-parameter rules beyond 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?
States a specific verb+resource ('Point a DRAFTED campaign at where its prospects come from') and enumerates the accepted source kinds: LinkedIn/Sales Navigator search URL, group, event, post, or CRM segment. It explicitly contrasts itself with campaign_add_prospects, so an agent can separate the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('DRAFTED campaign') and names the alternative for the other state ('For an ACTIVE campaign use campaign_add_prospects instead'). It also explains the behavioral difference — replacing the source vs adding to the existing pool — which is the exact decision the agent must make.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_set_statusPause or resume a campaignAIdempotentInspect
Pause a running campaign, or resume one that is paused. PAUSED halts sending immediately; pending steps stay queued and pick up where they left off when it resumes. ACTIVE starts real outreach again, so ASK THE USER before resuming — the campaign may have been paused for a reason they know and you do not. Nothing is destroyed either way, so your client will not prompt for you: the confirmation has to be one you asked for. Pausing needs no ceremony — it only stops sending, and is undone by resuming. Deliberately narrower than the status field it writes. It will not ARCHIVE or COMPLETE a campaign — those are web-app housekeeping — and it will not DELETE one, which is campaign_delete. It also refuses to resume anything that is not already PAUSED: updateCampaign writes the field blindly, so setting ACTIVE on a DRAFTED campaign would mark it live without a lead source, a saved flow, a sending account or materialised sequences, none of which this path checks. A campaign that has never run is started with campaign_launch, which validates all of that first.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | PAUSED halts sending. ACTIVE resumes a paused campaign, and is refused for any other current status. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=false and idempotentHint=true, but the description adds the operationally critical fact that the client will not prompt for confirmation — the agent must solicit it itself — plus that pending steps stay queued and resume in place. It also discloses the refusal behavior for non-PAUSED campaigns and the failure mode of the blind `updateCampaign` path.
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 sentence one and every sentence carries operational weight. Slightly dense and clause-heavy in the middle, but no sentence is 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?
Two required params, full schema coverage, no output schema needed, and annotations covering the safety profile — the description closes the remaining gaps (confirmation ownership, queue behavior, refusal conditions, sibling routing) with nothing material 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 enum is documented, so the baseline is 3. The description earns an extra point by explaining *why* ACTIVE is refused for non-PAUSED states (a DRAFTED campaign would be marked live without a lead source, flow, sending account, or sequences), which is rationale the schema does not carry.
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 pair and resource (pause/resume a campaign) and immediately delimits itself against siblings: `campaign_launch`, `campaign_delete`, and raw `updateCampaign`. An agent can distinguish this from every adjacent campaign tool without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (pausing needs no ceremony), when-not (won't ARCHIVE, COMPLETE, DELETE, or start a never-run campaign — use `campaign_launch`), and a hard gating rule: ask the user before resuming because the pause reason may be unknown to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_updateUpdate campaign settingsAIdempotentInspect
Change a campaign's SETTINGS: title, sending accounts, schedule, daily limits, timezone and every safety toggle. Only the fields you pass are changed. Attaching accounts is done here: one linkedAccountId for LinkedIn steps, and emailAccountIds — a list — for EMAIL steps. Ask the user which accounts when there is a choice. NOT this tool: campaign status. It cannot start, pause, resume, archive or delete a campaign, and there is no status parameter. To start one use campaign_launch; to pause or resume one, campaign_set_status; to remove one, campaign_delete. Archiving is web-app only and has no tool at all — say so rather than looking for a substitute. Nor does it touch the sequence (flow_set) or the audience (campaign_set_source). One side effect worth knowing: changing linkedAccountId rewrites that account onto every lead already in the campaign, not just future ones.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tag ids applied to every lead in this campaign — this identifies the campaign's leads, so it should be a tag belonging to THIS campaign. Never reuse another campaign's tag: the two campaigns' leads then become indistinguishable. Mint one with `tag_create` (short label, interest NEUTRAL) and pass its id. Pass [] to remove all tags. | |
| title | No | Short label. | |
| reload | No | Re-run the search periodically to pull in newly matching prospects. | |
| agentId | No | AI agent that answers replies in this campaign's inbox. Pass null to detach it. Never set this on your own: an agent writes to real prospects without further approval. Ask the user whether they want one, and offer both routes — pick an existing agent from `agent_list`, or build one with `agent_upsert`, give it material with `kb_upsert` and `kb_attach`, then `agent_train`. A campaign with no agent is perfectly normal; replies just come to the inbox. | |
| assignTo | No | Assign leads to team members. Shape mirrors the web app. | |
| schedule | No | Sending window per weekday, keyed 0 (Sunday) to 6 (Saturday), in the campaign timezone. | |
| timezone | No | IANA timezone, e.g. "America/New_York". Governs the schedule. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. | |
| snOutreach | No | Use Sales Navigator messaging. Requires a Premium LinkedIn account. | |
| trackOpens | No | EMAIL steps: insert an open-tracking pixel. | |
| emailAsText | No | Send email as plain text. Better deliverability, no tracking. | |
| scheduledAt | No | Future timestamp to auto-start the campaign, instead of launching it now with `campaign_launch`. | |
| stopOnReply | No | Halt a lead's sequence as soon as they reply. Default true. | |
| trackClicks | No | EMAIL steps: rewrite links for click tracking. | |
| skipProfiles | No | Skip prospects you already have an open conversation with. | |
| leadsPriority | No | Ordering strategy for working the lead queue, e.g. "newest" / "oldest". | |
| pauseCampaign | No | Pause the campaign without changing its status. | |
| campaginLimits | No | Per-day caps per step type. Note the field spelling. | |
| uniqueProfiles | No | Never enrol the same profile in two campaigns. Default true. | |
| emailAccountIds | No | Mailboxes for EMAIL steps. Unlike the LinkedIn account, several are allowed and sends rotate across them. Only attach these if the user wants email steps, and ask which mailboxes. | |
| linkedAccountId | No | The ONE LinkedIn account this campaign sends from. Required for any LinkedIn step. A campaign cannot use two. If `linkedin_account_list` returns more than one, ask the user which — do not pick for them. | |
| premiumProfiles | No | Only target LinkedIn Premium / Open Profile members. | |
| connectionOutreach | No | Target existing 1st-degree connections instead of new ones. | |
| prioritizeNewLeads | No | Work newly-found prospects before older ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important mutation semantics: only passed fields are changed, and changing linkedAccountId rewrites that account onto every existing lead in the campaign. It also explains account-attachment behavior and cautions that agentId should not be set without user approval.
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 appropriately sized for a 24-parameter mutation tool, and it is front-loaded with the core purpose before exclusions and side effects. Each section adds operational value rather than restating 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?
Given the tool's complexity, nested schema, and lack of an output schema, the description covers the critical context: scope, exclusions, alternatives, account attachment, and the linkedAccountId side effect. An agent has enough information to invoke it correctly without needing return-value 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 coverage is 100%, so the baseline is 3, but the description adds meaningful cross-parameter semantics: linkedAccountId is singular, emailAccountIds is a rotating list, and the user should be asked when there is a choice. It also adds caution around tags and agentId, though it does not explain every one of the 24 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 verb and resource: changing campaign settings such as title, accounts, schedule, limits, timezone, and safety toggles. It explicitly distinguishes this from status, sequence, and audience operations, so an agent can separate it from siblings like campaign_set_status, flow_set, and campaign_set_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?
It gives explicit when-to-use and when-not-to-use guidance, naming alternatives for launching, pausing/resuming, deleting, sequence changes, and audience changes. It also states that archiving is web-app only and has no tool, which prevents the agent from searching for a nonexistent substitute.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaign_upload_leadsUpload leads from CSV dataAInspect
Bulk-load prospects into a campaign from parsed CSV rows. header maps each column name to a platform field — profileUrl, salesNavUrl, recruiterUrl, email, firstName, lastName, fullName, personalization, phone, website, or "customVariable" to keep it as a merge field. Rows with neither a profile URL nor an email are skipped silently. Import runs asynchronously; the campaign is only launchable once isFiltered flips true. Use this when the user has a list in hand. When they describe an audience instead, the audience is a LinkedIn search and belongs in campaign_set_source — build the URL with search_url_build. For a campaign that is already running, neither applies: that is campaign_add_prospects.
| Name | Required | Description | Default |
|---|---|---|---|
| leads | Yes | Row objects keyed by the CSV column names used in `header`. | |
| header | Yes | { "CSV Column Name": "targetField" }. Use "customVariable" for anything you want as a merge field. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. | |
| removeDuplicates | No | Skip prospects already enrolled in another active or paused campaign on this account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (not read-only, not idempotent, not destructive); the description adds the behavior that actually matters: rows lacking both a profile URL and an email are dropped silently, the import is asynchronous, and the campaign is not launchable until isFiltered flips true. That silent-skip and blocking-state disclosure is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, zero filler, front-loaded with purpose then field mapping then edge-case behavior then routing. Each sentence carries distinct information an agent needs.
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 4-parameter mutation with no output schema, it covers async behavior, silent-skip rules, the launch-blocking flag, and sibling routing. The remaining gap is what the call returns (imported vs skipped counts, job handle for polling) — with no output schema, a hint there would close the loop.
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 would be 3, but the description adds genuine value the schema lacks: the header schema declares additionalProperties:false without enumerating permitted target fields, and the description supplies the full list (profileUrl, salesNavUrl, recruiterUrl, email, firstName, lastName, fullName, personalization, phone, website, customVariable). It does not explain removeDuplicates semantics, which keeps it from a 5.
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: "Bulk-load prospects into a campaign from parsed CSV rows." It immediately distinguishes itself from campaign_add_prospects and campaign_set_source, so an agent can pick it 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?
Explicitly gives the selecting condition ("Use this when the user has a list in hand") plus two exclusions with named alternatives: audience-described cases go to campaign_set_source (built via search_url_build), and already-running campaigns go to campaign_add_prospects. When-to-use, when-not-to-use, and alternatives are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversation_getRead a conversationAIdempotentInspect
One thread with its full message history, the lead behind it, and which campaign it came from. Note the side effect: reading a thread marks it seen, so do not call it to browse unless the user wants the badge cleared. This is the prospect-facing exchange. For what an AI agent reasoned on its way to a reply use agent_logs, and for the lead's step history lead_get.
| Name | Required | Description | Default |
|---|---|---|---|
| conversationId | Yes | Conversation id, from `conversation_list`. | |
| includeMessages | No | Include the full message thread. Can be long. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a non-obvious side effect not captured by annotations: reading a thread marks it seen. This aligns with the non-read-only annotation and gives the agent critical operational context before 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 front-loaded with what is returned, immediately follows with the side-effect warning, and then routes to alternatives. Every sentence contributes either purpose, caution, or differentiation.
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 two parameters, full schema coverage, no output schema, and a meaningful side effect, the description provides enough context to invoke it correctly. It covers returned contents, the key warning, and sibling-tool boundaries.
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 only lightly echoes the message-history behavior through its mention of full history, without adding parameter-specific syntax or constraints 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 identifies the resource as one conversation thread and specifies that it returns the full message history, the associated lead, and the originating campaign. It also distinguishes this prospect-facing exchange from sibling tools like agent_logs and lead_get, so an agent can tell what it retrieves 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?
It gives an explicit when-not-to-use rule: reading marks the thread seen, so it should not be used merely to browse unless the user wants the badge cleared. It also names the correct alternatives for agent reasoning logs and lead step history, leaving little inference for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversation_listList conversationsARead-onlyIdempotentInspect
The unified inbox: LinkedIn and email threads with prospects, newest activity first, 20 per page. This is where replies land. Filter by campaignId to review one campaign's responses, or keyword to find a specific person. Threads, newest first — the conversation view. For one thread's messages use conversation_get, for the person behind it lead_get, and for campaign reply counts rather than the threads themselves analytics_campaign. Nothing here sends: there is no tool to send an inbox message.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number. | |
| tags | No | Comma-separated tag ids. | |
| type | No | Thread kind, e.g. "email". | |
| keyword | No | Search names and message bodies. | |
| platform | No | Filter by channel, e.g. "linkedin" or "email". | |
| campaignId | No | Campaign id, from `campaign_list` or `campaign_create`. | |
| emailAccountId | No | Only threads on this mailbox. | |
| linkedAccountId | No | Only threads on this LinkedIn account. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds genuinely new behavior — default ordering by newest activity, 20-per-page paging, and that no send capability exists anywhere in the surface. It stops short of describing the thread object's fields, which matters since there is no 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?
Front-loaded with the resource and ordering, and every routing sentence carries information. There is some redundancy — 'newest activity first' is restated as 'Threads, newest first — the conversation view' — which slightly dilutes an otherwise tight block.
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 an 8-parameter read tool with no output schema, the description covers ordering, page size, two key filters and all plausible sibling substitutions. The main residual gap is the shape of a returned thread (fields, participants, unread state), which the agent must infer.
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 earns a bump by explaining the intent behind two filters — campaignId as 'review one campaign's responses' and keyword as finding 'a specific person' — which reframes the schema's 'Search names and message bodies'. The remaining six filters (tags, type, platform, emailAccountId, linkedAccountId, page) are left entirely to 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?
Opens with a concrete resource framing — 'The unified inbox: LinkedIn and email threads with prospects' — plus ordering and page size. It explicitly distinguishes itself from conversation_get, lead_get and analytics_campaign, so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions for two filters ('campaignId to review one campaign's responses', 'keyword to find a specific person') and names three alternatives with the exact scenario each serves. It also states a boundary case ('Nothing here sends'), closing off a plausible but wrong intent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversation_mark_all_readMark all threads readAInspect
Clear the unread badge across every thread on one LinkedIn account. Blunt and account-wide — it marks everything read, including threads nobody has looked at, so confirm before using it to tidy a badge. For one thread use conversation_update.
| Name | Required | Description | Default |
|---|---|---|---|
| linkedAccountId | Yes | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation safety profile, but the description adds meaningful behavioral context: the operation is account-wide, marks even unread threads nobody has looked at, and should be confirmed before use. It does not cover permissions, reversibility, or response behavior, but it substantially improves transparency 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 tightly written sentences with no waste. Impact and caution are front-loaded, and the sibling alternative is mentioned at the end where it is most useful.
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 tool with annotations and no output schema, the description covers purpose, scope, side effect, caution, and the relevant sibling alternative. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter (`linkedAccountId`) with 100% schema description coverage, including the source tool for obtaining the value. The description does not add syntax or meaning beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: clearing the unread badge across every thread on one LinkedIn account. It also explicitly distinguishes itself from the single-thread alternative `conversation_update`, so an agent can choose 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?
Provides explicit when-to-use context and a clear alternative: use this for account-wide badge clearing, but use `conversation_update` for one thread. It also advises confirming before use because the effect is blunt and account-wide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
conversation_updateUpdate a conversationAIdempotentInspect
Archive a thread, mark it read, or hand it between the AI assistant and a human. Setting assistant: false stops the bot replying so a person can take over — the one call to make when an agent is answering badly and a human needs the thread. Scope is this thread: it does not stop the agent elsewhere (agent_upsert with isActive: false), detach it from the campaign (campaign_update), or change the lead itself (lead_update). It cannot send a reply either.
| Name | Required | Description | Default |
|---|---|---|---|
| seen | No | Mark as read. | |
| assistant | No | Whether the AI agent handles this thread. | |
| isArchived | No | Move out of the main list without deleting. | |
| conversationId | Yes | Conversation id, from `conversation_list`. | |
| pauseBotOnManualMessage | No | Automatically stand the bot down as soon as a human sends a message here. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-destructive, idempotent, open-world behavior, so the description only needs to add context — and it does, by bounding the blast radius ("scope is this thread: it does not stop the agent elsewhere... or change the lead itself") and by clarifying the tool cannot send a reply. It stops short of stating whether the change is trivially reversible for the non-archived flags, which would have completed the 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?
The capability statement is front-loaded, followed by the highest-value scenario, then the boundary conditions. Every sentence carries routing or scoping information; there is no restatement of the title or the schema beyond what adds 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 5-parameter mutation with no output schema, the description plus annotations cover safety, scope, and alternatives well. The only omission is any indication of what the call returns or how partial updates behave (whether omitted fields are left untouched), which matters for an idempotent partial-update 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%, so the schema baseline is a 3; the description earns above baseline by explaining the operational consequence of `assistant: false` ("stops the bot replying so a person can take over"), which is meaning the schema's one-line field note does not convey. The other parameters (seen, isArchived, pauseBotOnManualMessage) are left entirely to 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 opening sentence names three concrete operations (archive, mark read, hand off between AI and human) on a clearly identified resource, a conversation thread. It is immediately distinguishable from siblings like conversation_mark_all_read or message_send, which the description also implicitly rules out.
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: "the one call to make when an agent is answering badly and a human needs the thread," tied to the concrete `assistant: false` parameter. It also gives explicit when-not/where-else guidance by naming agent_upsert with isActive: false, campaign_update, and lead_update as the correct tools for the adjacent concerns.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_account_add_imapConnect IMAP mailboxAInspect
Connect a mailbox over IMAP/SMTP with a username and password. Google and Microsoft mailboxes should go through email_account_oauth_url instead — OAuth avoids storing a password and survives 2FA. Requires a Pro or Agency plan.
| Name | Required | Description | Default |
|---|---|---|---|
| imap | Yes | IMAP/SMTP connection details. | |
| Yes | Email address. | ||
| lastName | No | Family name. | |
| password | Yes | Mailbox or app-specific password. | |
| firstName | No | Given name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare the key safety profile: not read-only, non-idempotent, non-destructive, open-world. The description adds meaningful context beyond that, including that credentials are stored as a password and that the operation requires a Pro or Agency plan. It does not say what happens on duplicate connection or whether the connection is validated before success.
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 action, then the exclusion, then the plan requirement. Every sentence adds decision-relevant information and there is no 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?
For a connection/mutation tool with no output schema, the description covers the key decision context: authentication type, the sibling alternative, 2FA implications, and plan gating. It leaves minor operational details unstated, such as duplicate handling and whether a connection test occurs, but the essential call guidance 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 100%, with the nested `imap` object fully documented, including example hostnames and typical ports. The description adds no parameter-level detail beyond reinforcing 'username and password', so 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: connecting a mailbox over IMAP/SMTP with a username and password. It also explicitly distinguishes this tool from the sibling `email_account_oauth_url`, so an agent can route Google/Microsoft mailboxes 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?
It gives explicit when-not-to-use guidance: Google and Microsoft mailboxes should go through `email_account_oauth_url` instead, with the rationale that OAuth avoids storing a password and survives 2FA. It also states a prerequisite: 'Requires a Pro or Agency plan.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_account_getGet email accountARead-onlyIdempotentInspect
Detail for one mailbox: sending limits, warm-up state, signature and IMAP/SMTP settings. Settings as configured; for what the mailbox actually sent use email_account_stats. Change any of it with email_account_update.
| Name | Required | Description | Default |
|---|---|---|---|
| emailAccountId | Yes | Mailbox id, from `email_account_list`. |
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 covered. The description's real addition is the 'settings as configured' framing, which tells the agent the values are a configuration snapshot rather than live metrics. It says nothing about behavior when the id is unknown or whether the record is scoped to the caller's subaccount.
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: content first, then routing to the two siblings. No filler, and the most important disambiguation is front-loaded with the field list.
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 full annotations and no output schema, the description should convey return content, and it does name the primary sections. It stops short of an exhaustive field list or an error case, which is minor for a simple read-by-id 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?
Single parameter with 100% schema description coverage that already explains the id comes from email_account_list. The description adds no syntax, format or lookup guidance beyond the schema, so the high-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?
Names the resource precisely ('one mailbox') and enumerates the returned surface: sending limits, warm-up state, signature, IMAP/SMTP settings. The final clauses explicitly separate it from email_account_stats (actual sending) and email_account_update (mutation), so an agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives both when-to-use and when-not-to-use with named alternatives: use email_account_stats for what the mailbox actually sent, and email_account_update to change anything. The configuration-vs-performance distinction is the exact decision an agent needs to make here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_account_listList email accountsARead-onlyIdempotentInspect
Mailboxes connected for email steps (Google, Microsoft or IMAP). A campaign with an EMAIL step needs at least one attached via campaign_update → emailAccountIds. Unlike the single LinkedIn account, several mailboxes are allowed and sends rotate across them — ask the user which, do not attach all of them. Connecting a new one is email_account_oauth_url (Google/Microsoft) or email_account_add_imap, both Pro-only.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by status. | |
| userId | No | Read a SUB-ACCOUNT instead of your own data. Accepted only from an agency owner, and only for an account inside your own agency: take the id from `subaccount_list` and never construct or guess one. An id outside that list is refused. Omit it to read your own data, and name the account to the user when you pass it. | |
| keyword | No | Free-text search. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, idempotent read, so the bar is lower; the description still adds real context — multiple mailboxes allowed, sends rotate across them, and account creation is Pro-only. It doesn't mention whether results are paginated or what status/keyword filtering actually does on the returned set.
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 doing work: resource definition, dependency, cardinality rule, creation path. Front-loaded with what the tool is; the Pro-only note is a slightly trailing detail but not 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?
With no output schema and full parameter documentation in the schema, the description covers the operational essentials an agent needs: why this list matters, how many to attach, and where to create new entries. It stops short of describing the shape of a returned account (id, provider, status), which would have made 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?
Schema description coverage is 100% and the schema already explains status, userId (with the subaccount_list constraint) and keyword. The description adds nothing about parameters, so 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?
Opens with a concrete resource definition — 'Mailboxes connected for email steps (Google, Microsoft or IMAP)' — so the agent knows exactly what is enumerated. It distinguishes itself from email_account_get/add_imap by implication rather than explicit contrast, keeping it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions ('A campaign with an EMAIL step needs at least one attached via campaign_update → emailAccountIds'), an explicit behavioral rule ('ask the user which, do not attach all of them'), and routes to the correct siblings for creating accounts (email_account_oauth_url, email_account_add_imap). It also contrasts against the LinkedIn account case, so the agent knows why cardinality differs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_account_oauth_urlGet mailbox OAuth URLARead-onlyIdempotentInspect
Build the Google or Microsoft consent URL for connecting a mailbox. Hand the URL to the user to open in a browser — the OAuth callback is completed by the web app, not by MCP, so returning the URL is the whole job and the mailbox will not appear in email_account_list until they finish. Preferred over email_account_add_imap for Google and Microsoft: no password is stored and it survives 2FA. There is no equivalent for LinkedIn accounts. Requires a Pro or Agency plan.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | Opaque value echoed back on the callback. Use the user id or any correlation token. | |
| provider | Yes | Which connected AI provider to use. Providers are connected in the web app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so safe-read semantics are covered. The description adds genuinely useful behavior: the callback is handled by the web app not MCP, the mailbox will not appear in email_account_list until the user finishes, and the plan gate. However for a closed-world read-only URL builder, these additions are contextual rather than critical gaps, so a 3 is fair.
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 the core action, then handoff semantics, sibling preference, exclusion, and plan requirement. Every sentence supplies distinct 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?
No output schema exists, but the description explains that returning the URL is the whole job and that the callback occurs elsewhere. For a 2-parameter read-only builder this is complete enough to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters, including `state` and the `provider` enum. The description adds only implicit mapping (Google/Microsoft) which the enum already states, and says nothing new about `state`. 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?
States a specific verb+resource ("Build the Google or Microsoft consent URL for connecting a mailbox") and immediately differentiates from the sibling email_account_add_imap. An agent can identify the tool and its scope 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?
Explicitly covers when to use (Google/Microsoft preference over IMAP, no password, survives 2FA), when not to (no LinkedIn equivalent), the handoff flow (give URL to user for browser), and prerequisites (Pro or Agency plan). This is the full when/when-not/alternatives set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_account_statsEmail account statsARead-onlyIdempotentInspect
Sends, opens, clicks and bounces for one mailbox over a date range. Per mailbox, which is the right view when diagnosing deliverability. For the same numbers per campaign use analytics_campaign.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Date window as { from, to } — epoch milliseconds or ISO 8601. Omit for the backend default. | |
| emailAccountId | Yes | Mailbox id, from `email_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds that the aggregation grain is per-mailbox and enumerates the returned metric categories, which substitutes usefully for the absent output schema. It does not mention pagination, rate limits, or whether metrics are totals versus per-period series.
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, zero filler, with the metric/scope definition front-loaded before the sibling disambiguation. Every clause carries information the agent needs for selection.
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 read tool with a nested range object and no output schema, the description supplies the metric list that would otherwise be unknown, which is the main gap. Remaining minor omissions are return shape per period and whether `range` omission yields a documented default — the schema does cover the latter.
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%, including the nested `range` object with its `from`/`to`/alias fields and the backend-default behavior when omitted. The description only restates the grains ('one mailbox', 'date range') without adding format or aliasing detail. Baseline 3 applies since the schema carries the 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 first sentence names the exact metrics (sends, opens, clicks, bounces) and the exact aggregation grain (one mailbox over a date range), so an agent knows precisely what the tool returns. The second sentence explicitly separates it from the campaign-grain sibling `analytics_campaign`. No ambiguity with `email_account_get` or `analytics_account` remains.
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 selecting condition — 'the right view when diagnosing deliverability' — and routes the agent to `analytics_campaign` for campaign-grain numbers. Both the when-to-use and the alternative are spelled out rather than implied. This is exactly the routing guidance an agent needs when several analytics tools are siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_account_updateUpdate email accountAIdempotentInspect
Change sending behaviour for a mailbox: daily volume, the gap between sends, reply-to address, signature, warm-up and pause state. Affects every campaign using the mailbox, not one campaign. It cannot connect a mailbox (email_account_oauth_url, email_account_add_imap) or choose which campaign uses it (campaign_update). Raising daily volume on a cold mailbox risks deliverability — leave warm-up alone unless asked.
| Name | Required | Description | Default |
|---|---|---|---|
| delay | No | Minutes to wait between consecutive sends. | |
| replyTo | No | Address replies are delivered to, when it differs from the sending address. | |
| isPaused | No | Pause without deleting. | |
| isWarmup | No | Ramp volume up gradually instead of starting at the full limit. | |
| lastName | No | Family name. | |
| firstName | No | Given name. | |
| signature | No | HTML signature appended to outgoing mail. | |
| emailsPerDay | No | Daily send ceiling for this mailbox. | |
| emailAccountId | Yes | Mailbox id, from `email_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, but the description adds what annotations cannot: the change propagates to every campaign sharing the mailbox, and the warm-up interaction carries deliverability risk. That is exactly the blast-radius and side-effect context an agent needs before mutating shared sending infrastructure.
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 scope before exclusions before risk. Every clause earns its place — no restatement of the title, 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?
Strong for a 9-parameter mutation with no output schema: scope, exclusions and risk are all covered. The remaining gap is that it never says whether omitted fields are left untouched (partial vs. full replacement) and says nothing about the return payload, though idempotentHint=true softens the former.
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 delay, replyTo, isPaused, isWarmup, signature, emailsPerDay and emailAccountId are all documented in-schema; the description's field list mostly restates them with no added format or boundary detail. Notably it omits firstName/lastName, two mutable parameters the schema does expose.
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 plus resource ("Change sending behaviour for a mailbox") and immediately enumerates the mutable facets: daily volume, inter-send gap, reply-to, signature, warm-up, pause state. It also draws a bright line against the lookalike siblings it is not (email_account_oauth_url, email_account_add_imap, campaign_update), so an agent can route 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?
Explicitly scopes the blast radius ("Affects every campaign using the mailbox, not one campaign") and names three alternatives with the condition that selects each — connecting a mailbox vs. assigning a campaign vs. this tool. It even carries a conditional warning for the risky case (raising volume on a cold mailbox).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_auditLast sequence-change impactARead-onlyIdempotentInspect
What the most recent sequence edit actually did to the leads in flight: how many were re-pointed at a different step, how many were orphaned because their step no longer exists, and how many pending actions were cancelled or rescheduled. Call this straight after flow_set on an ACTIVE campaign — it is the only way to see the collateral damage of a rewrite, and orphaned leads stop progressing. It reports; it does not repair. Fixing an orphan means another flow_set, or lead_move.
| Name | Required | Description | Default |
|---|---|---|---|
| flowId | Yes | From `flow_get`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already declare a safe read-only operation, the description adds operational behavior: orphaned leads stop progressing, the tool reports but does not repair, and remediation requires another call. That is meaningful 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?
The description is front-loaded with the core purpose, then usage timing, then non-repair behavior. Each sentence contributes distinct information, and nothing is 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?
For a one-parameter read-only audit tool with no output schema, the description explains what will be reported, when to invoke it, and how it relates to remediation. An agent has enough to call it correctly and interpret its role.
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 required parameter and schema description coverage is 100%, with the schema itself noting `flowId` comes from `flow_get`. The description does not add semantic detail about the parameter, so the high schema coverage makes 3 the correct 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 reporting purpose: what the most recent sequence edit did to leads in flight, including re-pointed, orphaned, and cancelled/rescheduled counts. It clearly distinguishes this audit from flow_set and lead_move, which are named as repair paths.
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 straight after `flow_set` on an ACTIVE campaign and explains why: it is the only way to see collateral damage. It also states what the tool does not do and names the alternatives (`flow_set`, `lead_move`) for fixing orphans.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_from_templateApply a prebuilt sequence templateAInspect
Attach one of the platform's named sequence templates to a campaign and fill in its copy placeholders. Only works on a campaign that has no flow yet. The template decides which slots exist — supply whichever of longNote, shortNote, message1..3, subject1..3, content1..3 it uses. One of three ways to get a sequence, and the only one that reuses a prebuilt shape: flow_set writes an arbitrary sequence from a step list, and campaign_generate_ai_sequence has the platform draft one from a brief. List the available templates with template_list first — the name is matched against that library. To change the copy afterwards, call flow_set; this tool cannot be re-run on a campaign that already has a flow.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Copy substituted into the template slots. | |
| sequence | Yes | Template name, matched against the shared template library. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-idempotent, non-destructive write, and the description adds the substantive constraints behind that: the one-flow-per-campaign precondition, the fact it cannot be re-run, and that post-creation edits must go through `flow_set`. That is real behavioral context beyond the annotation flags.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what it does and its key precondition, then spends the remaining sentences on routing and the placeholder rule. The 'one of three ways' comparison is compact and each clause carries distinct information; nothing is 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?
Covers purpose, preconditions, alternatives, and the conditional placeholder rule, which is enough to invoke it correctly. The only omission is what the call returns (e.g., the created flow id) — minor, but with no output schema there is nothing else to fall back 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 coverage is 100%, so the baseline would be 3, but the description supplies the conditional requirement the schema cannot express: which of longNote/shortNote/message1..3/subject1..3/content1..3 apply is determined by the chosen template. It also clarifies that `sequence` is a library name, not 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?
States a specific verb and resource ('Attach one of the platform's named sequence templates to a campaign') plus the side effect ('fill in its copy placeholders'). It explicitly distinguishes itself from `flow_set` and `campaign_generate_ai_sequence`, so an agent can pick it out of a large sibling set without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (reuse a prebuilt shape), when-not-to-use (campaign already has a flow; cannot be re-run), and named alternatives for both other paths (`flow_set`, `campaign_generate_ai_sequence`). It also prescribes the ordering dependency: call `template_list` first because the name is matched against that library.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_getGet campaign sequenceARead-onlyIdempotentInspect
The saved sequence for a campaign, as both a readable outline and the raw React Flow graph. Node ids in the outline are the sequence ids you pass to sequence_leads_at_step and sequence_step_stats. Read-only. Read this before changing a sequence, then write with flow_set (any campaign) or sequence_update (copy only, and only once the campaign is ACTIVE or PAUSED).
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. | |
| includeRaw | No | Include the full nodes/edges arrays. Verbose — only needed to hand-edit the graph. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered; the description's 'Read-only' is redundant but harmless. It adds genuine context beyond annotations by revealing the dual return shape and by disclosing the precondition that sequence_update only works on ACTIVE/PAUSED campaigns. Minor imprecision: it says the sequence comes back 'as both' forms, while the raw graph is actually gated behind includeRaw=false.
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-loaded with what is returned, then how to use the node ids, then the read-then-write workflow order. 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?
There is no output schema, and the description does most of the work an agent needs: it explains the two return representations and how outline node ids feed downstream tools. It stops short of noting pagination/size limits or when includeRaw is worth the verbosity beyond the schema's own note.
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 (campaignId, includeRaw) are already fully documented, which sets the baseline at 3. The description's note that outline node ids are the ids used by sequence_leads_at_step and sequence_step_stats is useful cross-tool context, but it describes output rather than parameter meaning, and includeRaw is never mentioned 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+resource (fetch the saved sequence for a campaign) and names the two return forms (readable outline and raw React Flow graph). It is clearly distinguishable from flow_set and sequence_update, which are named as the write-side counterparts.
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 sequencing guidance: 'Read this before changing a sequence', then write with flow_set for any campaign or sequence_update for the copy, and only once the campaign is ACTIVE or PAUSED. When-to-use and when-to-use-the-alternative are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flow_historySequence version historyARead-onlyIdempotentInspect
Every saved version of a campaign's sequence, each with the change audit: which steps were added, removed or edited, and how many leads that save moved or orphaned. The history of edits. Read it to explain how a sequence got into its current state — but it is not a way back: there is no tool to restore an old version, so a rollback means calling flow_set with the old steps. For the current sequence use flow_get, and for the effect of the latest save alone flow_audit.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Most recent versions to return. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
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 the non-obvious operational fact that no restore tool exists and rollback must be done by rewriting via `flow_set` — the kind of trap an agent would otherwise fall into. It also discloses the output content (per-save step diffs and lead movement/orphan counts) that the absent output schema leaves undocumented.
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 what you get, then the caveat, then the alternatives — a sensible order with no filler. It runs slightly long across four sentences, and the fragment 'The history of edits' restates the first sentence without earning 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 only two well-documented parameters, full annotation coverage, and no output schema, the remaining burden is explaining what comes back — which the description does concretely (per-version change audit, step-level diffs, lead movement/orphan counts). Nothing an agent needs to call it or interpret results 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%, with `limit` self-documented as 'most recent versions to return' and `campaignId` pointing at `campaign_list`/`campaign_create` as sources. The description does not add ordering, default, or format detail beyond what the schema already provides, so this is the baseline case.
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 resource (every saved version of a campaign's sequence) plus the payload each entry carries (steps added/removed/edited, leads moved or orphaned), which is far more than the title's 'Sequence version history'. It explicitly separates itself from `flow_audit` (latest save only) and `flow_get` (current sequence).
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 use case ('read it to explain how a sequence got into its current state'), an explicit non-use with its consequence ('it is not a way back'), the workaround (rollback means calling `flow_set` with the old steps), and two named alternatives with 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.
flow_setAuthor the campaign sequenceADestructiveIdempotentInspect
Replace a campaign's sequence with the steps you describe. This is how you write a campaign: give an ordered list of steps and the graph is compiled, validated and saved.
Each step is one action — CONNECT, MESSAGE, EMAIL, INMAILS, ENGAGEMENT, FOLLOW, WITHDRAW, QUALIFIER, GPT, ASSIGN_TAG, TASK … — with a delay measured from the previous step. A TRIGGER step branches on a condition (If_Replied, If_Connected, If_Email_Opened, …); it must be the last entry in its list, and the steps that follow go under yes or no. An omitted branch simply ends there.
On a campaign that is already ACTIVE this is DESTRUCTIVE: leads are re-evaluated against the new graph, some are moved to different steps, and pending actions can be cancelled or rescheduled. flow_audit reports exactly what moved. On a DRAFTED campaign nothing is at stake.
Call reference with topic "sequence_steps" first if you are unsure which fields a step type needs.
| Name | Required | Description | Default |
|---|---|---|---|
| steps | Yes | The full sequence, in order. This replaces whatever is currently saved. | |
| title | No | Label for this flow version, shown in flow history. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description goes well beyond them by naming exactly what is destroyed: leads are re-evaluated against the new graph, some are moved to different steps, and pending actions can be cancelled or rescheduled. It also discloses that the graph is compiled and validated before saving, and points at flow_audit for the diff.
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 the mutation and its consequence, then the step model, then the risk profile, then the escape hatch to `reference` — a sensible order. The step-type enumeration overlaps the `type` enum already present in the schema, which is the one mildly redundant passage.
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 deeply nested, high-blast-radius mutation this covers the branching model, delay semantics, and destructive consequences, and correctly outsources field-level detail to `reference`. It does not say what a successful call returns or how validation failures surface, which matters for a compile-and-save operation with no 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 100%, so the baseline would be 3, but the description adds structural rules the schema does not encode: a TRIGGER must be the last entry in its list with children under `yes`/`no`, an omitted branch ends the flow, and `delay` is measured from the previous step. These are the semantics an agent would otherwise get wrong when nesting steps.
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 ('Replace a campaign's sequence') and frames it as the authoring path ('This is how you write a campaign'), which separates it from read-side siblings like flow_get and flow_audit. It never names the closest alternatives (flow_from_template, sequence_update), so an agent still has to infer which authoring 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 clear when-to-use context split by campaign state: on ACTIVE campaigns it warns the call is destructive and suggests flow_audit to see what moved; on DRAFTED campaigns nothing is at stake. It also routes the agent to `reference` with topic 'sequence_steps' before guessing field shapes. It stops short of telling the agent when NOT to use it in favour of flow_from_template or sequence_update.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
help_videosList help videosARead-onlyIdempotentInspect
Product walkthrough videos, for linking a user to the right explainer. Reach for it when the answer is a web-app action with no tool — connecting a LinkedIn account, archiving a campaign, billing — so the user is pointed somewhere useful rather than told no. Links only; it changes nothing and reads no account data, unlike whoami or notification_list.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, idempotent, non-destructive, and non-open-world behavior. The description reinforces this with 'links only; it changes nothing and reads no account data' and usefully distinguishes it from data-reading siblings. It does not describe the exact return shape, but with no output schema and a simple lookup tool, the key behavioral traits 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 front-loaded with the resource and primary use case, then gives concrete examples and exclusions. It is slightly verbose in phrasing ('so the user is pointed somewhere useful rather than told no'), but every sentence contributes to selection 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?
For a zero-parameter, read-only lookup tool with no output schema, the description is nearly complete: it explains purpose, usage, exclusions, and that only links are returned. It stops short of describing the exact link format or whether multiple videos are returned, but the essential context 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?
There are zero parameters, so there is no parameter semantics to explain. Baseline 4 applies because the description correctly implies no input 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 clearly identifies the resource as product walkthrough videos and explains their purpose in linking users to explainers. It does not explicitly say it lists or returns them, but 'Links only' makes the retrieval behavior clear enough. It is distinguishable from siblings through the usage scenario.
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: when the answer is a web-app action with no corresponding tool. It names concrete examples (connecting LinkedIn, archiving a campaign, billing) and contrasts with alternatives like `whoami` and `notification_list`, which read account data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
holiday_addBlock a dateAInspect
Stop all outreach on a given date across every campaign. Every campaign on the account, not one — there is no per-campaign holiday. To stop a single campaign use campaign_set_status with PAUSED, and to stop one lead use lead_update. Reversible with holiday_delete.
| Name | Required | Description | Default |
|---|---|---|---|
| blockedAt | Yes | The date, as epoch milliseconds or ISO 8601. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false), so the description is not solely responsible for those traits. It adds meaningful behavioral context: the block is account-wide across every campaign, there is no per-campaign holiday, and the action is reversible via holiday_delete. It does not cover permissions, timezone handling, or effects on already-scheduled outreach.
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 short and front-loaded with the primary action. Each sentence earns its place by clarifying account-wide scope, routing to alternatives, or noting reversibility.
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 annotations and no output schema, the description covers the essential scope, alternatives, and reversibility. Minor gaps remain around timezone interpretation and what happens to already-scheduled messages on the blocked date.
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 the single blockedAt parameter, and the schema already explains that the date may be epoch milliseconds or ISO 8601. The description only refers generally to a 'given date' and does not add format or timezone 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 action and resource: stopping all outreach on a date across every campaign. It explicitly distinguishes this from per-campaign and per-lead stopping, so the agent can separate it from siblings like campaign_set_status and lead_update.
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 and names the alternatives for narrower scopes: campaign_set_status with PAUSED for one campaign and lead_update for one lead. It also names holiday_delete as the reverse operation, leaving little 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.
holiday_deleteUnblock a dateADestructiveInspect
Remove a blocked date so campaigns send on it again. Removes the block only; it does not resend anything that was skipped while the date was blocked — those sends are gone, not deferred. Check holiday_list first so the user knows which date is being unblocked.
| Name | Required | Description | Default |
|---|---|---|---|
| holidayId | Yes | Blocked-date id, from `holiday_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, but the description adds the consequence that annotations cannot express: skipped sends are 'gone, not deferred.' That is exactly the kind of beyond-annotation context an agent needs before confirming a destructive action. It stops short of a 5 because it never addresses the non-idempotent behavior (what happens if the same id is deleted twice).
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 doing distinct work: what it does, the irreversible side effect, and the prerequisite. The warning about lost sends is placed before the routine instruction, which is the right order for a destructive 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?
For a single-parameter destructive tool with full annotation coverage and no output schema, the description covers purpose, consequence, and prerequisites adequately. The only residual gap is the lack of guidance on error behavior for a repeated delete, which matters given idempotentHint=false.
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 and schema coverage is 100%, with the schema itself noting the id comes from `holiday_list`. The description reinforces the source of the id but adds no format or validation detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Remove a blocked date') and immediately ties it to the domain outcome ('so campaigns send on it again'). This is clearly distinguishable from holiday_add and holiday_list among the 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 an explicit prerequisite workflow: 'Check `holiday_list` first so the user knows which date is being unblocked,' which routes the agent to the correct sibling before calling. It does not state an explicit when-not-to-use case, keeping it 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.
holiday_listList blocked datesARead-onlyIdempotentInspect
Dates on which no campaign sends anything — public holidays and company shutdowns. Account-wide pauses by date. Read this when a user asks why nothing sent on a particular day. The weekly sending window and timezone are per campaign instead, in campaign_update.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered; the description adds the meaningful behavioral fact that blocking is account-wide rather than per campaign. It stops short of saying what a returned entry looks like (date only, or date plus label), which is the remaining 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 tight sentences: definition first, then the use case, then the disambiguation. Every sentence carries information an agent would otherwise have to guess.
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 zero params, rich annotations and no output schema, the description covers what an agent needs to decide to call it and what the data means. The only missing piece is the shape of the returned entries, which is a minor omission for a simple date list.
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 takes no parameters and the schema is an empty object with additionalProperties false, so there is nothing to disambiguate. Baseline 4 applies; the description correctly implies an unfiltered full listing rather than a lookup by date.
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?
Defines the resource precisely: dates on which no campaign sends anything, covering public holidays and company shutdowns, scoped account-wide. It also separates itself from per-campaign scheduling settings held in `campaign_update`, so an agent can distinguish it from that 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?
Gives a concrete trigger — 'Read this when a user asks why nothing sent on a particular day' — and redirects the adjacent question (weekly sending window, timezone) to `campaign_update`. That is explicit when-to-use plus a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hyperise_imagesList Hyperise imagesARead-onlyIdempotentInspect
Personalised-image templates from a connected Hyperise account, for use in email and message copy. Pass sync: true to re-pull from Hyperise first. Read-only listing. Hyperise itself is connected in the web app under Settings - Integrations, and the image is used by referencing it in copy you pass to flow_set.
| Name | Required | Description | Default |
|---|---|---|---|
| sync | No | Re-pull from the upstream service before returning. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so 'Read-only listing' repeats structured data. The genuinely additive context is the integration prerequisite (Settings - Integrations) and the flow_set consumption path, which go beyond annotations but leave return format/shape unstated.
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, purpose and the sync behavior front-loaded. The final sentence mixes setup and downstream usage compactly without waste, though it could be split.
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-required-param read listing with no output schema, the description covers what the images are, how to refresh them, and the prerequisite connection. Return value shape is unspecified but low-risk for a simple list.
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?
Only one parameter and schema coverage is 100%, with the schema describing 'sync' as a re-pull. The description's 'Pass sync: true to re-pull from Hyperise first' adds the ordering hint but little beyond the schema, matching the baseline 3.
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 the resource precisely ('personalised-image templates from a connected Hyperise account') and the title supplies the listing verb. It is distinguishable from sibling list tools like template_list or placeholder_list by naming the Hyperise source, though the verb itself is only implied.
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?
Explains the intended context ('for use in email and message copy') and the downstream mechanism ('referencing it in copy you pass to flow_set'), plus when to set sync. No explicit when-not-to-use or alternative named, 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.
kb_attachAttach knowledge to an agentAInspect
Include or exclude a knowledge entry for one agent. Run agent_train afterwards or the change has no effect on answers. Scoped to one agent: it neither creates the entry (kb_upsert) nor deletes it, and there is no tool to delete a knowledge entry. Requires the "Agents" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| kbId | Yes | Knowledge-base entry id, from `kb_list`. | |
| value | No | true attaches, false detaches. | |
| agentId | Yes | AI agent id, from `agent_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses the essential post-call workflow (`agent_train`), the permission requirement, and the boundary that this tool does not create or delete knowledge entries. These are meaningful behavioral details that prevent incorrect agent behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then adds the critical follow-up, scope boundary, and permission requirement in compact sentences. Every sentence carries useful information for 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 three-parameter mutation tool with full schema coverage and useful annotations, the description covers the important gaps: follow-up training, one-agent scope, non-creation/non-deletion boundaries, and permissions. No output schema exists, so return-value explanation is not required.
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 all three parameters are already documented in the schema. The description only reinforces scope and inclusion/exclusion semantics; it does not add parameter-level syntax or edge-case 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 states a specific verb and resource: include or exclude a knowledge entry for one agent. It also distinguishes the operation from `kb_upsert` creation and deletion behavior, so an agent can tell what this tool does without inspecting 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?
It gives the critical follow-up requirement: run `agent_train` afterwards or the change has no effect on answers. It also names the sibling alternative for creating entries (`kb_upsert`), states that this tool neither creates nor deletes, and notes the permission prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_deleteDelete knowledgeADestructiveInspect
Remove a knowledge entry and its embeddings. The source material is gone — a crawled page would have to be crawled again, pasted text retyped — so confirm with the user first; kb_list shows what is there. The agent keeps answering, just without this material, and it will still cite it until agent_train reruns. To stop one agent using an entry while keeping it, use kb_attach to exclude it instead of deleting. Requires the "Agents" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| kbId | Yes | Knowledge-base entry id, from `kb_list`. | |
| agentId | Yes | AI agent id, from `agent_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true and idempotent=false, but the description adds important consequences: source material is unrecoverable, embeddings are removed, the agent keeps answering without the material, and citations persist until `agent_train` reruns. It also states the required "Agents" permission.
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 destructive action and consequence, then gives confirmation guidance, alternatives, and permission requirements. Every sentence adds useful information 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 destructive two-parameter tool with no output schema, the description covers consequences, user confirmation, alternatives, and permissions. 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 100%, and both parameters are documented in the schema with their sources (`kb_list` and `agent_list`). The description does not add meaning beyond the schema, 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?
States a specific verb and resource: remove a knowledge entry and its embeddings. It also distinguishes the tool from `kb_attach` and `kb_list`, so an agent can identify its role 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?
Explicitly says to confirm with the user first, points to `kb_list` for inspection, and names `kb_attach` as the alternative when the goal is to stop one agent using an entry without deleting it. This gives 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.
kb_listList knowledge-base entriesARead-onlyIdempotentInspect
Source material agents can draw on: crawled URLs, uploaded files and pasted text. Account-wide. Which agent may use which entry is set per agent by kb_attach, so an entry listed here is not necessarily in use. Requires the "Agents" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds context the annotations cannot: the account-wide visibility model, the decoupling of listing from per-agent attachment, and the requirement for the "Agents" permission on the plan. Only the return shape/pagination is undisclosed.
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: what the entries are, their scope, then the attach caveat and permission note. Every sentence carries distinct information and the identity of the resource 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 zero-parameter read tool with no output schema, the description covers scope, permission prerequisites and the relationship to kb_attach. The one remaining gap is that it never hints at what a listed entry looks like (fields, IDs, pagination), which matters more here since there is no output schema to fall back 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?
The tool takes zero parameters, so the baseline is 4. The description correctly describes no filtering or paging inputs, consistent with the empty, additionalProperties=false 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 defines the resource precisely by enumerating its kinds (crawled URLs, uploaded files, pasted text) and its scope (account-wide), which lets an agent distinguish it from kb_upsert, kb_delete and kb_attach. It does not itself state the verb 'list' – that only appears in the title and in the incidental phrase 'an entry listed here' – so it falls just short of the verb+resource ideal.
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 real decision context: entries are account-wide, and being listed here does not mean an entry is in use, because usage is set per agent via `kb_attach`. That is enough to steer an agent toward this tool for discovery and toward kb_attach for wiring. It stops short of an explicit 'use this before calling kb_attach' instruction or any exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_upsertAdd or update knowledgeADestructiveIdempotentInspect
Add source material for agents. Type URL crawls a page, TEXT stores pasted content. Three steps, and skipping either of the last two leaves the agent unchanged: add it here, attach it with kb_attach, then rebuild with agent_train. Storing material does not change how the agent writes — that is agent_upsert instructions. Requires the "Agents" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| _id | No | Omit to create a new entry. | |
| url | No | Required when type is URL. | |
| type | Yes | Filter by type. | |
| title | No | Short label. | |
| content | No | Required when type is TEXT. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the description's add is context on top: it discloses the plan-level 'Agents' permission requirement and the workflow consequence of incomplete sequencing. It does not explain what overwriting via _id destroys, which is the one behavioral gap for a destructive upsert.
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 doing distinct work: purpose, type semantics, workflow sequencing, intent boundary, and permission prerequisite. The most decision-relevant constraint, that material alone leaves the agent unchanged, is placed early.
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 five-parameter mutation tool with full schema coverage and no output schema, the description covers purpose, sequencing, prerequisites, and intent routing. The remaining gap is update semantics — whether supplying _id replaces prior content — which matters given destructiveHint=true.
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 would be 3; the description earns above baseline by adding real meaning to the type enum — URL triggers a page crawl, TEXT stores pasted content — and by flagging the create-vs-update distinction implicit in _id. It stays silent on FILE, whose behavior is left entirely to the enum 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?
Specific verb+resource ('Add source material for agents') plus an explicit type breakdown (URL crawls a page, TEXT stores pasted content) tells the agent exactly what this tool does. It also carves out a boundary against the similarly named agent_upsert by stating that instructions are not stored here.
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 lays out the required three-step sequence (add here, kb_attach, agent_train) and warns that skipping either of the last two leaves the agent unchanged — a concrete when/when-not statement naming both alternatives. It also names agent_upsert as the sibling for a different intent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lead_addAdd a leadAInspect
Add one prospect to a campaign by LinkedIn profile URL and/or email. A lead needs at least one of those two — a row with neither is rejected. For more than a handful, use campaign_upload_leads.
| Name | Required | Description | Default |
|---|---|---|---|
| No | Required if there is no profile URL. | ||
| phone | No | Phone number. | |
| website | No | Website URL. | |
| fullName | No | Full display name. Use instead of first/last when you only have one string. | |
| lastName | No | Family name. | |
| location | No | City, region or country. | |
| firstName | No | Given name. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. | |
| designation | No | Job title. | |
| profileLink | No | linkedin.com/in/… profile URL. | |
| customFields | No | Extra merge fields, e.g. { "recentPost": "…" }, usable as {{recentPost}}. | |
| salesNavLink | No | Sales Navigator profile URL. | |
| recruiterLink | No | LinkedIn Recruiter profile URL. | |
| personalization | No | Free-text hook available in copy as {{personalization}}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose that this is a non-read-only, non-idempotent, non-destructive write operation. The description adds useful behavioral context by saying a row with neither profile URL nor email is rejected, and that bulk input should use the upload 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 three compact sentences, front-loads the core action, states the validation rule, and routes to the bulk alternative without any wasted text.
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 14-parameter mutation with fully documented schema fields and annotations, the description covers the essential selection and invocation constraints. It does not cover duplicate handling or return behavior, but those are less central because the schema documents all 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%, so the baseline is 3. The description adds meaningful semantics beyond the schema by stating that at least one of profile URL or email is required, which is not captured by the schema's only required field (campaignId).
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: adding one prospect to a campaign. It also scopes the operation to LinkedIn profile URL and/or email, and explicitly distinguishes it from the bulk sibling campaign_upload_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 gives clear usage guidance: use this tool for one prospect, but for more than a handful use campaign_upload_leads. It also states the minimum identifier requirement, so the agent knows when a call is invalid.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lead_blacklistBlacklist a leadADestructiveInspect
Add a lead to the blacklist: their sequence stops and they will be excluded from every future campaign on this account. The right response to an opt-out request. Account-wide and lasting, and no tool removes a blacklist entry — confirm the person and get an explicit yes before calling. To stop sending to someone without excluding them permanently, use lead_update with isExcluded: true instead.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | Lead id, from `lead_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive, but the description adds substantial operational context: the lead's sequence stops, they are excluded from every future campaign, the effect is account-wide and lasting, and no tool removes a blacklist entry. That is exactly the kind of irreversible behavior an agent needs to know before invoking.
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 effect of the call, then the usage condition, then the durability warning, then the alternative. Every sentence contributes to safe tool selection and none is 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?
For a one-parameter destructive mutation with no output schema, the description covers purpose, usage, irreversible behavior, and the safer alternative. An agent has everything needed to decide whether to call it and what consequences to expect.
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 100% description coverage for the single parameter and already states that `leadId` comes from `lead_list`. The description does not add parameter-specific semantics beyond that, 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?
States a specific verb and resource: adding a lead to the blacklist. It also specifies the account-wide, lasting scope and the immediate effect of stopping the lead's sequence, so 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?
Explicitly identifies this as the right response to an opt-out request and gives a clear when-not/alternative: use `lead_update` with `isExcluded: true` to stop sending without permanent exclusion. It also adds a strong prerequisite: confirm the person and get an 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.
lead_deleteDelete leadsADestructiveInspect
Permanently remove leads from a campaign along with their pending actions. Irreversible — confirm with the user, and prefer lead_update with isExcluded: true when they only want sending to stop.
| Name | Required | Description | Default |
|---|---|---|---|
| leadIds | No | Specific leads to delete. | |
| selectAll | No | Delete every lead matching a filter instead of an id list, e.g. { "status": "FAILED" }. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-idempotent, but the description adds critical context they don't carry: the deletion is irreversible and cascades to pending actions. That cascade side-effect is exactly the kind of trait an agent needs before invoking.
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, zero waste. The destructive consequence is front-loaded, and the safer alternative follows immediately.
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 three-parameter destructive tool with no output schema, the description covers the destructive consequence, the cascade, the confirmation requirement, and the safer alternative. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so leadIds, selectAll, and campaignId are all documented in structured fields. The description adds no syntax or format 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?
States a specific verb and resource ("Permanently remove leads from a campaign") plus a scope extension ("along with their pending actions"). It is immediately distinguishable from sibling tools like lead_update or lead_move.
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 names the alternative ("prefer `lead_update` with `isExcluded: true`") and the exact condition that selects it ("when they only want sending to stop"). It also mandates confirming with the user first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lead_exportExport leads to CSVAInspect
Generate a CSV of leads filtered by campaign, status and tags. Returns a filename served from the CDN. Use it when the user wants a file. To read leads in the conversation use lead_list; for campaign performance numbers rather than people, campaign_export_stats.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Tag ids to filter by, from `tag_list`. | |
| campaignId | No | Campaign id, from `campaign_list` or `campaign_create`. | |
| leadStatus | No | Filter by lead pipeline status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, non-idempotent, non-destructive; the description adds the missing behavioral payload by explaining the return value ('a filename served from the CDN'), which annotations cannot express. It does not say whether repeated calls generate duplicate export files (relevant given idempotentHint=false) or whether the file expires, so a small gap remains.
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, zero filler: capability first, return shape second, disambiguation third. Nothing to trim.
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?
Return handling is covered despite no output schema, and all filters being optional is visible in the schema. It never states what happens when no filters are supplied (full export of all leads, potentially large), which is a meaningful omission for an export 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%, so the schema already documents all three filter parameters including the enum source for tags and campaign ids. The description only restates the filter names collectively and adds no format, default, or combination 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?
States a specific verb and resource ('Generate a CSV of leads') plus the available filters, and explicitly distinguishes itself from `lead_list` (in-conversation reading) and `campaign_export_stats` (aggregate numbers). An agent can tell exactly what this produces 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?
Gives an explicit trigger ('Use it when the user wants a file') and names two siblings with the conditions that select them instead. Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lead_flow_stateLead's position in the flowARead-onlyIdempotentInspect
Where a lead sits in its campaign sequence right now, when the next action fires, and whether it has been orphaned by a sequence edit. One lead, current position only. For every lead waiting on a given step use sequence_leads_at_step; for what a sequence rewrite did to the whole campaign use flow_audit.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | Lead id, from `lead_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnly/idempotent/non-destructive, so the description's added value is the content: current position, next-fire timing, and orphan status after a sequence edit — behavior an agent cannot get from annotations. It stops short of noting what happens for an unknown or deleted lead, which would be the remaining 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 tight sentences with the scope constraint and alternatives up front, no filler. One small blemish: 'in its campaign sequence' could be misread as campaign-level, and the alternatives clause is dense, but 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?
With no output schema, the description effectively sketches the return payload (position, next action time, orphan flag), which is what an agent needs to decide whether to call it. Missing only error/not-found behavior for a leadId that is not in any flow.
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?
Only one parameter and schema coverage is 100%; the schema already says leadId comes from lead_list. The description adds no format or sourcing detail beyond that, 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-less but precise query: where a lead sits in its campaign sequence now, when the next action fires, and whether it was orphaned by a sequence edit. That is a distinct resource (single lead's flow position) that is clearly separable from flow_get, flow_audit, and sequence_leads_at_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?
Explicitly scopes to 'one lead, current position only' and names two alternatives with the conditions that select them: sequence_leads_at_step for all leads on a step, flow_audit for campaign-wide rewrite effects. No inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lead_getGet leadARead-onlyIdempotentInspect
Full profile for one lead, plus its complete activity history and current position in the campaign flow — the single call to make when asked "what happened with this person". This is also the only place a FAILED action and its failedReason can be read: activity_list returns COMPLETED rows only. Do not page through lead_list to assemble one lead's history.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | Lead id, from `lead_list`. | |
| includeMessages | No | Include the full message thread. Can be long. | |
| includeActivities | No | Include the per-step activity history. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, idempotent read, so the description correctly spends its words elsewhere: it discloses that this tool returns the full activity history and campaign-flow position, and that FAILED rows with `failedReason` are visible here only because activity_list returns COMPLETED rows. That is non-obvious behavioral context an agent could not infer from 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?
Three sentences, front-loaded with the primary payload and then the routing constraints. The 'single call to make when asked...' clause is followed by two concrete alternatives that each carry distinct information; nothing is 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?
With no output schema, the description still tells the agent what comes back (profile, activity history, campaign position, failedReason) and how it differs from the cheaper list calls. Nothing needed to invoke or interpret the 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?
Schema description coverage is 100%, so leadId, includeMessages, and includeActivities are already documented. The description adds nothing about the optional flags (e.g. that includeMessages is the heavy one to avoid), so 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?
States a specific verb+resource ('Full profile for one lead') and enumerates the payload: profile, complete activity history, and current campaign position. It explicitly separates itself from two siblings (activity_list, lead_list), so an agent can choose it 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?
Gives a concrete trigger phrase ('when asked "what happened with this person"') plus two negative exclusions: it is the only source for FAILED actions, and lead_list should not be paged to reconstruct history. When-to-use, when-not-to-use, and alternatives are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lead_listList leadsARead-onlyIdempotentInspect
Prospects in a campaign (or across your whole account), with their current pipeline status. The list view: many leads, a few fields each. For one person's full story use lead_get, for where they are in the sequence lead_flow_state, and for a spreadsheet lead_export. Filter by status to answer questions like "who replied this week" (REPLIED) or "who accepted but never answered" (CONNECTED).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number. | |
| tags | No | Tag ids — leads must carry at least one. | |
| range | No | Date window as { from, to } — epoch milliseconds or ISO 8601. Omit for the backend default. | |
| status | No | Filter by pipeline status. | |
| keyword | No | Search name, email or company. | |
| pageSize | No | Rows per page. | |
| campaignId | No | Omit to search every campaign. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuine behavior context by characterizing the return payload as a shallow, high-volume list view, which tells the agent not to expect rich per-lead data. It doesn't mention pagination defaults or result ordering, which is the remaining 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: scope first, payload shape second, sibling routing third, filter semantics last. No filler, no repetition of schema or annotation 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?
With no output schema, the description carries the burden of describing results and does so at the right altitude ('many leads, a few fields each'). All 7 params are documented in-schema and the key filter is elaborated. Missing only ordering/default-window behavior, a minor gap for a list tool with zero required params.
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. The description earns above baseline by explaining the `status` filter operationally - translating enum values into the human questions they answer - which is meaning the schema's one-line 'Filter by pipeline status' does not 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?
States a specific resource (prospects/leads) with scope variants (a campaign, or the whole account) and the payload shape ('many leads, a few fields each'). It then explicitly separates itself from three siblings by name, so an agent can pick 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 explicit when-not-to-use routing: use `lead_get` for one person's full record, `lead_flow_state` for sequence position, `lead_export` for a spreadsheet. It also gives concrete when-to-use examples for the `status` filter ('who replied this week' → REPLIED, 'accepted but never answered' → CONNECTED).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lead_moveMove leads to another campaignAInspect
Transfer leads into a different campaign. Understand what the backend actually does before offering this, because it is not a relocation: it INSERTS a new lead row in the destination at status FOUND, clearing acceptedAt and repliedAt, schedules a fresh activity on the destination's first step, and soft-deletes the original with deleteReason: "MOVED". So the prospect restarts from the beginning and the per-step history does not come along — inbox conversations do, they are repointed at the new row. A lead already in the destination by profile URL or email is skipped. The destination must have a LinkedIn account attached or it throws "Destination campaign has no LinkedAccount." — set one with campaign_update first. Beware selectAll: it moves every lead from the first listed lead's campaign and ignores the rest of the list.
| Name | Required | Description | Default |
|---|---|---|---|
| leadIds | Yes | Lead ids, from `lead_list`. | |
| selectAll | No | Move every lead matching the current filter rather than the id list. | |
| campaignId | Yes | Destination campaign id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses the actual mechanics beyond annotations: new row at status FOUND, acceptedAt/repliedAt cleared, fresh activity scheduled on step one, original soft-deleted with deleteReason 'MOVED', per-step history lost but inbox conversations repointed, and the exact thrown error string. That is exactly the destructive/lossy context the annotations do not carry.
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-loads the surprising behavior ('it is not a relocation'), then the mechanics, then the prerequisite, then the selectAll trap. Dense but every sentence is load-bearing; nothing is repeated from the schema or title.
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?
Complex, lossy mutation tool with no output schema and 3 params. The description covers effect, data-loss surface, skip behavior, prerequisite, error message, and selectAll pitfall — everything an agent needs to avoid a wrong 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 coverage is 100%, so baseline is 3, but the description adds critical semantics the schema's one-liner omits: `selectAll` silently moves every lead from the first listed lead's campaign and ignores the rest of the list, and leadIds are skipped when already in the destination by profile URL or email. This meaningfully changes how an agent should populate 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?
States a specific verb and resource ('Transfer leads into a different campaign') and immediately distinguishes it from the naive reading by declaring 'it is not a relocation: it INSERTS a new lead row.' An agent can tell exactly what this does versus lead_add or campaign_add_prospects 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?
Gives real preconditions ('The destination must have a LinkedIn account attached... set one with `campaign_update` first') and an edge-case exclusion (leads already present by profile URL or email are skipped). What it lacks is an explicit alternative routing sentence (e.g., 'use lead_add / campaign_add_prospects to add new leads'), so it stops just short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lead_note_addAdd a note to a leadAInspect
Write an internal note on a lead. Never sent to the prospect — this is not a way to message anyone; messaging the prospect is message_send. Use lead_note_update to change one afterwards; it replaces the whole body.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | Lead id, from `lead_list`. | |
| content | Yes | Body text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, non-destructive, non-idempotent, and closed-world behavior. The description adds useful context beyond that: the note is internal and never sent to the prospect, and `lead_note_update` replaces the whole body. It does not address retry/duplicate behavior despite `idempotentHint=false`, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, followed by the key exclusion and the update alternative. Every sentence carries useful routing or behavioral 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 simple two-parameter note-creation tool with annotations and no output schema, the description covers purpose, exclusions, and the follow-up update path. 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 100%, and both parameters are documented in the schema (`leadId` from `lead_list`, `content` as body text). The description adds no parameter-specific syntax, constraints, or examples beyond what the schema already provides, so the 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?
States a specific verb and resource: 'Write an internal note on a lead.' It also explicitly distinguishes this from messaging the prospect and from lead_note_update, so an agent can identify the tool 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?
Explicitly says this is not a way to message anyone and names `message_send` as the alternative for prospect messaging. It also directs the agent to `lead_note_update` when changing an existing note, covering both when-not and alternative paths.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lead_notes_listList notes on a leadARead-onlyIdempotentInspect
Internal notes your team has written about a lead. Not visible to the prospect. Notes are free text for humans and have no effect on sending. For the messages actually exchanged with the prospect read conversation_get.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | Yes | Lead id, from `lead_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation as read-only, idempotent, non-destructive, and closed-world, so safety is covered. The description adds genuinely non-obvious context that annotations cannot: these notes are internal, invisible to the prospect, and have no effect on sending. It does not mention ordering, pagination, or what the returned note objects look like.
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 core resource definition and followed immediately by the visibility constraint and the sibling alternative. Every sentence earns its place and there is no repetition of structured 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 simple one-parameter read-only list tool whose schema and annotations are complete, this description supplies the important domain semantics and the key alternative. The main omission is return-shape or pagination context, but with no output schema and a highly constrained operation, this is a minor 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?
There is only one parameter, and the schema already fully documents it, including that the lead id comes from `lead_list`. The description adds no additional meaning about the `leadId` parameter, so this sits at the baseline 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?
The description clearly establishes that this tool deals with internal notes about a lead, and it distinguishes that resource from prospect-facing messages by naming `conversation_get`. It does not explicitly state that it lists/returns all notes, nor does it distinguish itself from sibling mutation tools like `lead_note_add` or `lead_note_update`.
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 alternative for the most likely confusion point: if you want the actual exchanged messages, use `conversation_get`. It stops short of saying when to use `lead_note_add`/`lead_note_update` instead, so the routing guidance is good but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lead_note_updateEdit a noteADestructiveIdempotentInspect
Rewrite an existing internal note. Replaces the whole body — pass the full text, not a fragment, and read it with lead_notes_list first if you do not already have it. Editing a note changes nothing the prospect sees.
| Name | Required | Description | Default |
|---|---|---|---|
| noteId | Yes | Note id, from `lead_notes_list`. | |
| content | Yes | Body text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, idempotent=true, and readOnly=false. The description adds non-obvious semantics: the whole body is replaced, not partially updated, and the edit is internal so the prospect sees no change. It does not restate the annotation safety profile, but adds 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 short sentences, front-loaded with the action and the replacement warning. Every sentence carries useful 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 two-parameter mutation with rich annotations and no output schema, the description covers replacement semantics, the prerequisite read, and the visibility impact. 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 coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by warning that `content` must be the full body, not a fragment, and by reinforcing that `noteId` can come from `lead_notes_list`.
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 ('Rewrite') and resource ('existing internal note'), and distinguishes it from creating a note via 'existing' and from prospect-visible changes via 'internal'. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to read the note with `lead_notes_list` first if the agent does not already have it, and to pass the full text rather than a fragment. It implies use for existing notes rather than `lead_note_add`, though it does not explicitly name that alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lead_updateUpdate a leadAIdempotentInspect
Edit a lead: correct contact details, pause its sequence, exclude it from sending, or attach merge-field data. paused: true freezes just this lead; isExcluded: true takes it out of the campaign without deleting the record. Scope is one lead. It cannot pause a whole campaign — that is campaign_set_status — and it cannot move a lead elsewhere (lead_move) or change its tags for reply classification, which happens on the conversation via conversation_update.
| Name | Required | Description | Default |
|---|---|---|---|
| seen | No | Mark as read. | |
| No | Email address. | ||
| phone | No | Phone number. | |
| leadId | Yes | Lead id, from `lead_list`. | |
| paused | No | Freeze this lead's sequence without removing it. | |
| website | No | Website URL. | |
| lastName | No | Family name. | |
| firstName | No | Given name. | |
| isExcluded | No | Remove from sending while keeping the record. | |
| designation | No | Job title. | |
| customFields | No | Extra merge-field data, e.g. { "recentPost": "…" }, usable in copy as {{recentPost}}. | |
| isInterested | No | Mark the reply as positive intent. | |
| personalization | No | Free-text hook for this person, available in copy as {{personalization}}. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), and the description adds genuine context on top: `paused` freezes only this lead, and `isExcluded` removes from sending 'without deleting the record', which clarifies the non-destructive boundary. It stops short of covering side effects like what happens to an in-flight sequence when email is changed, or whether repeat updates are no-ops despite 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?
Front-loads the core purpose in the first clause and packs the routing hints into two efficient sentences with zero filler. It is dense — the second sentence stacks three exclusions — but 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 13-parameter mutation with no output schema, the description covers purpose, scope, alternatives, and the semantics of the two highest-risk flags. Minor gaps remain around update side effects and no-op/idempotency behavior, but nothing an agent needs in order to select and 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 all 13 parameters including the nested customFields are already documented, making 3 the baseline. The description paraphrases `paused` and `isExcluded` and gestures at merge-field data, but adds little semantic detail the schema does not already carry, and says nothing about `seen`, `isInterested`, or `personalization`.
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 ('Edit a lead') and immediately enumerates the concrete edit classes: contact details, sequence pause, exclusion, merge-field data. It then explicitly names the three siblings it is not (campaign_set_status, lead_move, conversation_update), so an agent can route 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?
Gives both when-to-use ('correct contact details, pause its sequence, exclude it from sending, or attach merge-field data') and when-not, with the correct alternative named for each excluded case. The scope constraint 'Scope is one lead' further bounds use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_account_daily_statsDaily activity statsARead-onlyIdempotentInspect
Day-by-day action counts for a LinkedIn account. Use this to check how close an account is running to its daily ceilings before raising limits. Read this before linkedin_account_update ever touches limits — it is the evidence for whether there is headroom. It reports what was sent; the ceilings themselves are in linkedin_account_get.
| Name | Required | Description | Default |
|---|---|---|---|
| endDate | No | Window end, as epoch milliseconds or an ISO 8601 string. | |
| startDate | No | Window start, as epoch milliseconds or an ISO 8601 string. | |
| linkedAccountId | No | Omit to aggregate across all accounts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, so the description adds context a schema cannot: the data reported is actual sent volume, not configured ceilings. That framing ('it is the evidence for whether there is headroom') tells the agent why the call is safe and what it proves. It does not describe aggregation default behavior when `linkedAccountId` is omitted, though the schema covers 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 short sentences, front-loaded with what the tool returns, then when to use it, then how it differs from the two adjacent tools. No filler and no repetition of 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?
With no output schema, the description carries the burden of saying what comes back; 'day-by-day action counts' plus 'reports what was sent' covers the essentials. The exact breakdown of action types per day is not stated, a minor gap for an analytics read with three optional params.
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 all three parameters documented including the accept-both-formats date types and the omit-to-aggregate behavior. The description adds no parameter-level detail beyond that, so 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 names a specific resource and granularity (day-by-day action counts for a LinkedIn account) and explicitly separates itself from two siblings: `linkedin_account_get` (ceilings) and `linkedin_account_update` (limit changes). It does not distinguish itself from `linkedin_account_stats`, the closest sibling, leaving that ambiguity unresolved.
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 an explicit trigger ('check how close an account is running to its daily ceilings before raising limits') and names the downstream tool whose call it should precede. It gives clear positive usage context but does not state when this tool should be skipped in favor of `linkedin_account_stats` or `analytics_account`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_account_getGet LinkedIn accountARead-onlyIdempotentInspect
Full detail for one LinkedIn account, including its per-action daily limits and warm-up state. Configuration as it stands, not activity: for volumes sent use linkedin_account_stats, for today's headroom against the caps linkedin_account_daily_stats. Like the list, it cannot tell you whether the account has a Sales Navigator or Recruiter seat — ask the user.
| Name | Required | Description | Default |
|---|---|---|---|
| linkedAccountId | Yes | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds real value on top: it defines the returned scope as configuration rather than activity, and warns about a data gap (Sales Navigator / Recruiter seat) that the caller must resolve out of band. It doesn't mention error behavior for an unknown linkedAccountId, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero filler: scope first, negative scoping second, limitation last. Every sentence changes how an agent would select or interpret the call.
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 full annotation coverage, the definition covers what it returns, what it explicitly does not return, which siblings to use instead, and one known blind spot. No output schema is needed given the description enumerates the relevant fields.
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 single parameter's description already tells the agent to source the id from `linkedin_account_list`. The tool description adds nothing about the id's format or behavior for invalid ids, so it neither compensates for nor improves on the schema — baseline 3.
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?
"Full detail for one LinkedIn account" states a specific verb and resource and immediately names the payload (per-action daily limits, warm-up state). It then explicitly distinguishes itself from the two nearest siblings, so an agent can route between linkedin_account_get, linkedin_account_stats and linkedin_account_daily_stats without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Unusually explicit routing: "Configuration as it stands, not activity" followed by two named alternatives and the condition that selects each (volumes sent → linkedin_account_stats; today's headroom against the caps → linkedin_account_daily_stats). It also states a hard limitation and the fallback (no seat info — ask the user).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_account_listList LinkedIn accountsARead-onlyIdempotentInspect
The LinkedIn accounts connected to this account. A campaign sends from exactly one of them, attached via campaign_update; if there is more than one, ask the user which. Whether an account has a Sales Navigator or Recruiter seat is NOT in this output — those flags exist on the account record but are not exposed by the API, and the worker only sets them during a send. Ask the user, because INMAILS steps and /sales/ or /talent/ lead sources depend on it. Check isValid, isPaused, accountRestricted and weeklyLimitReached before assigning an account — a campaign attached to a broken account will launch but never send. This lists; it does not connect. Adding a LinkedIn account takes a password and a verification PIN and has no tool at all — it is done in the web app. Attaching an existing account to a campaign is campaign_update, and changing the account's own limits is linkedin_account_update.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Backend-side status filter, e.g. "active", "paused", "invalid". | |
| userId | No | Read a SUB-ACCOUNT instead of your own data. Accepted only from an agency owner, and only for an account inside your own agency: take the id from `subaccount_list` and never construct or guess one. An id outside that list is refused. Omit it to read your own data, and name the account to the user when you pass it. | |
| keyword | No | Filter by name or email. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, idempotent read; the description goes well beyond them by disclosing an API limitation (Sales Navigator/Recruiter seat flags exist on the record but are not exposed by this endpoint), the consequence of ignoring validation state ("will launch but never send"), and why the flags matter for INMAILS and `/sales/` or `/talent/` sources.
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-loads the resource and the routing rule before the caveats, and most sentences carry distinct operational value. It is on the long side — the seat-flag explanation and the "no tool at all" note overlap somewhat with the adjacent alternative-tool sentence 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?
No output schema exists, and the description compensates by naming the fields to inspect in the response and explicitly calling out what is absent from the output. Combined with the mutation-path guidance, an agent has everything needed to call 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% and the `userId` and `status` parameters are already documented in detail in the schema, so the description carries no additional parameter burden. It adds nothing about `status`, `userId`, or `keyword` semantics itself, but the baseline of 3 applies when the schema does the heavy lifting.
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?
Identifies the resource precisely (LinkedIn accounts connected to this account) and explicitly scopes the operation: "This lists; it does not connect." It also names the siblings it is not — `campaign_update` for attaching, `linkedin_account_update` for limits — so an agent can route 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?
Gives explicit when-to-use rules (one account per campaign; ask the user if there are several), a pre-assignment checklist (`isValid`, `isPaused`, `accountRestricted`, `weeklyLimitReached`), and named alternatives for the operations this tool does not perform, including noting that account creation has no tool at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_account_refreshRefresh LinkedIn sessionAInspect
Re-establish the browser session for a LinkedIn account after it goes invalid. May return pinDetected: true, meaning LinkedIn is asking for a verification PIN — that has to be entered in the web app; MCP cannot complete it — tell the user plainly rather than retrying. It repairs the session only. It does not change settings (linkedin_account_update), connect a new account, or clear a LinkedIn-imposed restriction — check accountRestricted in linkedin_account_list for that.
| Name | Required | Description | Default |
|---|---|---|---|
| linkedAccountId | Yes | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing a failure mode the schema cannot express: a possible pinDetected: true that requires human entry in the web app and cannot be completed over MCP. That non-retryable behavior is exactly the kind of context annotations can't carry. It stops short of describing what else the refresh returns or what happens when refresh fails for other reasons.
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 primary action and its scope lead the description, followed by the failure-handling caveat and then the negative boundaries. Every clause carries an actionable fact; there is no filler or restatement of the title.
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 one parameter and no output schema, the description covers the full decision surface: when to call it, what the notable return field means, what the agent must do instead of retrying, and which sibling to use for the adjacent 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 100% and there is a single required parameter, so the schema already explains linkedAccountId and its source (linkedin_account_list). The description adds operational context around failure handling but no additional meaning about the parameter itself, 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?
States a specific verb and resource: 'Re-establish the browser session for a LinkedIn account after it goes invalid.' It immediately scopes what the tool does and does not touch, and explicitly separates itself from linkedin_account_update, account connection, and restriction clearing.
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 the triggering condition (session invalid) and names the alternatives for adjacent needs: linkedin_account_update for settings, linkedin_account_list/accountRestricted for a LinkedIn-imposed restriction. It also instructs the agent not to retry on a PIN prompt, which is a direct usage constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_account_ssiSocial Selling IndexARead-onlyIdempotentInspect
The account's latest LinkedIn SSI score and its four component scores. LinkedIn's own measure of selling activity, nothing to do with campaign performance — for that use analytics_campaign or linkedin_account_stats.
| Name | Required | Description | Default |
|---|---|---|---|
| linkedAccountId | Yes | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent, so the safety profile is covered. The description adds real semantic context: the score is 'latest' (freshness), is LinkedIn's own metric rather than a platform computation, and is not a campaign-performance measure — these prevent misreading the returned numbers.
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, zero padding: the primary payload is front-loaded, and the disambiguation clause follows immediately. 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?
There is no output schema, so the description carries the burden of describing returns — it does state the score and its four components, which is sufficient shape information. It does not mention behavior when no SSI has ever been computed for the account, a small remaining 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?
Only one parameter and it is fully documented in the schema (source tool for obtaining `linkedAccountId`). The description adds no syntax, format, or validity information beyond that, so 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?
States a specific resource and scope: the account's latest LinkedIn SSI score plus its four component scores. It also explicitly disambiguates from analytics tools, so an agent can distinguish it from `linkedin_account_stats` and `analytics_campaign` without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly says what this tool is NOT for and names the two alternatives to use instead for campaign performance. What is missing is a positive 'use this when' trigger, but that is largely implied by the named resource (SSI).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_account_statsLinkedIn account statsARead-onlyIdempotentInspect
Send volumes, acceptance and reply rates for one LinkedIn account over a date range. Totals for the window, by account. For one campaign instead use analytics_campaign, and for a day-by-day breakdown linkedin_account_daily_stats.
| Name | Required | Description | Default |
|---|---|---|---|
| range | No | Date window as { from, to } — epoch milliseconds or ISO 8601. Omit for the backend default. | |
| linkedAccountId | Yes | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds the aggregation semantics ('Totals for the window, by account'), clarifying this is a rolled-up summary rather than a per-day series, which the schema does not state.
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 what the tool returns, followed by sibling routing. No wasted text.
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 enough for a read-only stats tool: it states the metrics and aggregation level, and annotations carry the safety profile. Without an output schema, it could hint at the response shape, a minor 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 100%, so the range and linkedAccountId parameters are fully documented in the schema. The description adds no format or syntax detail beyond referencing the date range, so the 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?
States a specific verb and resource plus the exact metrics returned (send volumes, acceptance and reply rates) for one LinkedIn account over a date range. It also names what it is not, distinguishing it from `analytics_campaign` and `linkedin_account_daily_stats`.
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 routes the agent: use `analytics_campaign` for a single campaign and `linkedin_account_daily_stats` for a day-by-day breakdown. This covers both when-to-use and named alternatives with conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
linkedin_account_updateUpdate LinkedIn account settingsAIdempotentInspect
Change the safety limits and automation settings on a LinkedIn account: daily caps per action, pause/resume, warm-up, and the birthday / work-anniversary / role-change auto-congratulation messages. Raising daily limits raises LinkedIn restriction risk — leave limits alone unless the user asked for a specific number, and check linkedin_account_daily_stats first. Scope is the account, so pausing here stops every campaign that sends from it — to stop one campaign use campaign_set_status with PAUSED, and to stop one lead use lead_update. It cannot connect or disconnect an account, fix an invalid session (linkedin_account_refresh), or decide which campaign uses it (campaign_update).
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | Auto-congratulate on job changes. | |
| limits | No | Daily ceilings per action type. | |
| warmup | No | Ramp volumes up gradually instead of starting at full limits. | |
| birthday | No | Auto-congratulate connections on their birthday. | |
| isPaused | No | Pause every campaign running on this account. | |
| anniversary | No | Auto-congratulate connections on a work anniversary. | |
| roleContent | No | Message sent when a connection changes job. | |
| birthdayContent | No | Message sent on a connection's birthday. | |
| linkedAccountId | Yes | LinkedIn account id, from `linkedin_account_list`. | |
| anniversaryContent | No | Message sent on a work anniversary. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a mutating, idempotent, non-destructive, open-world write; the description adds genuine behavioral context beyond that — the risk profile of raising daily caps (elevated LinkedIn restriction risk) and the blast radius of isPaused (it stops every campaign on the account, not one). It also scopes out operations it cannot perform (connect/disconnect, session repair, campaign attribution), so the agent will not misuse 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, each with a distinct job: settings scope, risk/routing for `limits`, then blast radius plus exclusions. The highest-risk item (raising limits) is placed ahead of the lower-stakes disambiguation, so the agent reads the caution before acting.
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?
Ten parameters including a nested object, no output schema, and only coarse annotations — yet the description closes every meaningful gap: what the fields do in aggregate, the risk of the one dangerous field, the side effect of pausing, and the adjacent tools that handle the things this one does not.
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 nested `limits` sub-fields and boolean toggles are already documented; a 3 is the baseline. The description nonetheless adds decision-relevant meaning the schema cannot carry — that `limits` is a high-risk field to be left untouched absent an explicit user request — which is the single most important semantic for this tool's 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?
Opens with a specific verb + resource ('Change the safety limits and automation settings on a LinkedIn account') and enumerates the exact setting groups: daily caps, pause/resume, warm-up, and the three auto-congratulation messages. An agent can immediately distinguish this from linkedin_account_get, linkedin_account_refresh, and campaign_set_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?
Explicit when-not guidance with named alternatives: 'to stop one campaign use campaign_set_status with PAUSED, and to stop one lead use lead_update.' It also states a prerequisite check ('check linkedin_account_daily_stats first') and a caution on when not to touch `limits` unless the user asked for a specific number.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
message_deleteDelete a messageADestructiveInspect
Remove a message from the stored thread record. It does NOT unsend anything: the recipient keeps the message on LinkedIn or in their mailbox, so this only edits your own history of the conversation and cannot undo a send. Irreversible and there is no tool to restore it — show the user which message and get an explicit yes first.
| Name | Required | Description | Default |
|---|---|---|---|
| messageId | Yes | Message id, from `conversation_get` or `message_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds substantial context the annotations cannot: the deletion is local-history only (recipient retains the message), it cannot undo a send, and it is irreversible with no restore tool. This is exactly the behavioral information an agent needs before invoking a destructive write.
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 what the tool does, then the critical scope caveat, then the safety instruction. Every sentence carries distinct information (scope, recipient impact, irreversibility, confirmation requirement) with no repetition of the name or title.
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 single-parameter destructive tool with full annotation coverage and no output schema. The description covers scope, side effects, reversibility, and the required human-confirmation step, so nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single messageId parameter is documented with its source (conversation_get or message_list), so the schema does the heavy lifting. The description adds no additional parameter-level guidance, which is the correct baseline for a fully documented single-param 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 and resource ('Remove a message from the stored thread record') and immediately distinguishes the operation from the sibling action it is most likely to be confused with (message_send): it does not unsend anything and only edits the caller's own history. An agent can tell exactly what this tool does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition: show the user which message and obtain an explicit yes before calling, because the action is irreversible and no restore tool exists. It does not name a specific alternative sibling for the 'I want to unsend' case, only states none exists, so it falls just short of explicit when/when-not/alternatives routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
message_draft_ai_replyDraft a reply with AIAInspect
Ask a connected AI provider to draft a reply for a thread, given a prompt. Returns the draft only and sends nothing. Show it to the user; they can send it from the web app, or approve it for message_send, which delivers immediately and cannot be recalled — so only on an explicit yes for that exact text. This is a one-off draft from a prompt. A configured agent that replies on its own is agent_upsert plus campaign_update; to see how such an agent would answer, agent_query. Requires an AI provider connected in the web app under Settings - Integrations.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | What the reply should do, e.g. "propose three times next week for a 20-min call". | |
| provider | Yes | Which connected provider to use. Providers are connected in the web app. | |
| conversationId | Yes | Conversation id, from `conversation_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations say readOnlyHint=false and destructiveHint=false but cannot convey that nothing is transmitted — the description closes that gap ('Returns the draft only and sends nothing') and warns that the downstream message_send 'cannot be recalled'. It also discloses the prerequisite that an AI provider must be connected under Settings - Integrations, which no structured field carries.
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 critical constraint (draft only, nothing sent) and the send-approval warning are front-loaded before the sibling routing, which is the right order. It runs long at six sentences and 'This is a one-off draft from a prompt' mildly restates the opening, costing a bit of tightness.
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 three-required-parameter tool with no output schema, the description covers the return value ('the draft only'), the side-effect boundary, the auth prerequisite, and the escape hatch to sending. Nothing an agent needs in order 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 coverage is 100% with per-parameter descriptions and an enum for provider, so the structured data already does the work. The description adds only a light gloss ('given a prompt', connected provider) and no format or constraint detail beyond the schema; 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?
States a specific verb+resource ('draft a reply for a thread') and immediately bounds the outcome ('returns the draft only and sends nothing'), which distinguishes it from message_send without opening either schema. It also explicitly separates itself from the autonomous-agent siblings (agent_upsert/campaign_update, agent_query).
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 routing: use this for a one-off prompt-driven draft; use agent_upsert plus campaign_update for a self-replying agent; use agent_query to preview how such an agent would answer. It also states the human-in-the-loop condition for escalating to message_send — 'only on an explicit yes for that exact text'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
message_sendSend a messageADestructiveInspect
Send a message into a conversation. THIS DELIVERS TO A REAL PERSON immediately, on LinkedIn or by email depending on the thread, and cannot be recalled or edited — there is no tool to delete a sent message. Show the user the exact text and the recipient, and get an explicit yes in the conversation, before every call. Never send copy the user has not read, and never send to a thread they did not name. Sending by hand also stands the AI agent down on that thread when the agent has pauseBotOnManualMessage set, so one manual reply can stop the agent answering there. For a draft the user sends themselves use message_draft_ai_reply; to hand a thread to a human without sending anything, conversation_update with assistant: false.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | The message, exactly as it will be delivered. | |
| attachment | No | Optional file to attach; must already be hosted at a fetchable URL. | |
| conversationId | Yes | Conversation id, from `conversation_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and openWorldHint=true, but the description adds consequences an agent cannot infer: the message reaches a real person immediately, cannot be recalled or edited, and manual sending stands the agent down on that thread when `pauseBotOnManualMessage` is set. That side-effect disclosure is genuinely valuable beyond the structured hints. Minor caveat: the claim "there is no tool to delete a sent message" sits uneasily beside the sibling `message_delete`, which could mislead an agent about cleanup options, though that is a factual tension rather than an 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?
Front-loaded with the action and the irreversibility warning, and nearly every sentence carries an operational instruction. It runs slightly long, and the bot-pausing sentence plus the closing alternative list make it denser than strictly necessary, but no sentence is 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 non-idempotent, destructive send tool with no output schema, the description covers impact, irreversibility, consent protocol, channel variability, side effects, and the two safer alternatives. An agent has everything needed to decide whether to call it and how to prepare the user first.
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 `content`, `conversationId` and the nested attachment object are already documented, including examples. The description reinforces that `content` must be the exact delivered text and that the recipient must be named, but adds no syntax or format detail beyond the schema. 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?
States a specific verb and resource ("Send a message into a conversation") and immediately clarifies the delivery channel (LinkedIn or email depending on the thread). It also explicitly separates itself from `message_draft_ai_reply` and `conversation_update`, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition (show the exact text and recipient, get an explicit yes before every call) plus two hard exclusions (never send copy the user has not read, never send to a thread they did not name). It names both alternatives and the condition that selects each: `message_draft_ai_reply` for a draft the user sends, `conversation_update` with `assistant: false` for a silent handoff.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notification_listList notificationsARead-onlyIdempotentInspect
In-app notifications: disconnected accounts, campaigns running low on prospects, positive replies, limits hit. The platform telling you something needs attention — worth reading when diagnosing why a campaign stopped. These are not prospect replies (conversation_list) and not to-dos (task_list). Clear the badge with notification_mark_read; there is no tool to delete a notification.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a safe, read-only, idempotent operation. The description adds useful behavioral context beyond the annotations: what kinds of alerts appear, that there is no delete tool, and that notification_mark_read clears the badge. It does not describe return fields or pagination, but those are secondary for a zero-parameter notification list.
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 tightly written sentences, front-loaded with the resource and examples. Each sentence adds distinct value: examples, diagnostic use case, sibling exclusions, and the related mark-read 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 zero-parameter, non-destructive list tool with rich annotations and no output schema, the description supplies everything an agent needs to decide whether to call it. It covers content, exclusions, diagnostic relevance, and the badge-clearing alternative without unnecessary return-value detail.
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 takes zero parameters, and the schema is fully specified with additionalProperties false. There is no parameter semantics for the description to explain, so the baseline of 4 for a zero-parameter tool 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 names the specific resource (in-app notifications) and gives concrete examples of what appears there, such as disconnected accounts and limits hit. It explicitly distinguishes notifications from prospect replies in conversation_list and to-dos in task_list, so an agent can identify the right tool 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?
It states when the tool is useful: reading notifications is worth doing when diagnosing why a campaign stopped. It also names the alternatives for adjacent concepts (conversation_list for prospect replies, task_list for to-dos) and points to notification_mark_read for clearing the badge.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notification_mark_readMark notifications readAInspect
Mark one notification read, or all of them if notificationId is omitted — so omitting it clears the whole badge, which is worth confirming first. It only changes read state; the notification is kept, and deleting one is not available. For inbox threads use conversation_update or conversation_mark_all_read instead.
| Name | Required | Description | Default |
|---|---|---|---|
| notificationId | No | Notification id, from `notification_list`. Omit to act on all of them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only say non-read-only, non-destructive), it discloses that only read state changes, the notification is retained, deletion is not offered, and that omission has a broad bulk effect. It does not address whether read state can be reverted or which permissions are needed, so not a full 5, but it meaningfully exceeds the 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?
Two sentences, front-loaded with the primary behavior and scope, then the caution, then the alternative routing. No redundant restatement of the title or name.
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-optional-parameter mutation with no output schema and existing annotations, the description covers scope, side effects, the destructive-ish bulk case, and sibling alternatives. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3; the description adds the semantic consequence of omitting notificationId (acts on all, clears badge), which is the key decision the parameter drives. It does not restate the id source, which 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?
States a specific verb ('mark read') and resource ('notification'), plus the dual scope (one vs. all) in the first clause. It names the sibling tools it is not (conversation_update, conversation_mark_all_read), so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the condition for the all-notifications path ('if notificationId is omitted'), warns to confirm first because it clears the whole badge, and redirects inbox-thread cases to conversation_update / conversation_mark_all_read. Both when-to-use and alternatives are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
persona_createCreate a personaAInspect
Define an ideal customer profile. Returns a personaId — a QUALIFIER step needs one, and the flow save is rejected without it, so create the persona before calling flow_set. This defines the filter only; it does not add a QUALIFIER step to any sequence. Note QUALIFIER also needs the Personas permission on top of Pro. Requires a Pro or Agency plan.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Persona name, e.g. "Series B RevOps leaders". | |
| criteria | Yes | Qualification rules. Unrecognised keys are stripped server-side. | |
| description | No | Longer explanatory text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses the return value (`personaId`), plan gating (Pro/Agency), and an extra permission requirement (`Personas` on top of Pro for QUALIFIER). Annotations only cover readOnly/destructive/idempotent flags, so this prerequisite and return contract information is genuinely additive.
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-loads the purpose and the blocking dependency in the first sentence, then the scope caveat and plan requirement. Slightly redundant — 'a QUALIFIER step needs one' and 'the flow save is rejected without it' convey nearly the same urgency — but nothing is wasted overall.
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-param create tool with a nested criteria object and no output schema, it covers the return contract, prerequisites, and plan limits. Minor gap: no mention of what happens when criteria are partially specified or whether the persona is immediately usable in flows.
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 100% schema description coverage across all 3 parameters and rich per-field docs inside `criteria`, the schema carries the semantic load. The description adds no parameter-level guidance (e.g. whether `criteria` may be empty or how filters combine), so 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?
States a specific verb and resource — 'Define an ideal customer profile' — plus the concrete artifact returned (`personaId`). It also carves out a hard boundary versus sequence tooling ('This defines the filter only; it does not add a QUALIFIER step'), but never explicitly contrasts with sibling persona_list / persona_update / persona_delete.
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 ordering ('create the persona before calling `flow_set`') and the consequence of skipping it ('the flow save is rejected without it'). It also states what the tool is NOT for (does not add a QUALIFIER step to any sequence), which is exactly the when-not 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.
persona_deleteDelete a personaADestructiveInspect
Delete a persona. Any QUALIFIER step still pointing at it breaks, and that campaign's flow will fail to save until the step is repointed. Check usageCount in persona_list first and tell the user which campaigns it would break — a persona shared by several flows breaks all of them. Irreversible, so get an explicit yes. To change who qualifies without breaking anything, use persona_update. Requires a Pro or Agency plan.
| Name | Required | Description | Default |
|---|---|---|---|
| personaId | Yes | Persona id, from `persona_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: destructiveHint=true already signals danger, but the description explains the concrete cascade — QUALIFIER steps pointing at the persona break and the referencing campaign's flow will fail to save — and that a shared persona breaks several flows. It also flags irreversibility and a plan requirement, which annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then stacks consequence, required pre-check, alternative tool, and prerequisite in that order. Every sentence carries distinct operational information — nothing is padding or restatement of the title.
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 destructive tool with no output schema, the description covers everything an agent needs before calling: consequence of the write, verification step, confirmation requirement, alternative, and access prerequisite. No relevant 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 100% and there is only one required string parameter, so the schema already does the work. The description's only added value is indirectly pointing at `persona_list` as the source of persona ids and `usageCount`, which is consistent with the schema's own description rather than new 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 ("Delete a persona") in the first three words, and immediately contrasts with `persona_update` for the non-destructive alternative. An agent can distinguish it from `persona_get`/`persona_list`/`persona_update` 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?
Gives an explicit pre-flight procedure (check `usageCount` via `persona_list`, report affected campaigns, obtain explicit confirmation) and names the alternative tool `persona_update` with the condition that selects it. It also states a hard eligibility gate (Pro or Agency plan).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
persona_getGet a personaARead-onlyIdempotentInspect
Full qualification criteria for one persona — job titles, seniority, industries, size, locations and keyword rules — as a QUALIFIER step will apply them. Read this to explain why a lead did or did not qualify. It does not say which leads qualified: for that read the step with sequence_leads_at_step. Requires a Pro or Agency plan.
| Name | Required | Description | Default |
|---|---|---|---|
| personaId | Yes | Persona id, from `persona_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent safety, so the description's added value is the 'as a QUALIFIER step will apply them' framing of how the criteria are interpreted, plus the Pro/Agency plan requirement. It doesn't describe output size or shape, but with no output schema and a single-record read, the gap is minor.
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 compact sentences, front-loaded with the resource and contents, then the disambiguation, then the prerequisite. 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 read with full schema coverage and full annotation coverage, the description covers purpose, contents, disambiguation, and access gating. 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 personaId is documented as coming from persona_list, so the schema does the heavy lifting. The description adds no syntax or format detail beyond what the schema already says about the 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 and resource ('Full qualification criteria for one persona') and enumerates the contents (job titles, seniority, industries, size, locations, keyword rules). It also names the sibling it is not — sequence_leads_at_step — so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Read this to explain why a lead did or did not qualify') and an explicit exclusion with the alternative named ('It does not say which leads qualified: for that read... sequence_leads_at_step'). The plan prerequisite is also stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
persona_listList personasARead-onlyIdempotentInspect
Ideal-customer definitions used by QUALIFIER steps. usageCount shows how many flows reference each one. A persona describes WHO a lead must be to pass a QUALIFIER step. It is not an AI agent (agent_list, which writes replies) and not a lead tag (tag_list, which classifies replies after the fact). Requires a Pro or Agency plan.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description correctly spends its budget elsewhere: it explains that usageCount reports how many flows reference a persona, and discloses a plan-level entitlement gate. Return shape beyond usageCount is not described, and no output schema exists to cover 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?
Front-loaded and dense: the core definition comes first, then the usageCount note, then the sibling disambiguation, then the plan requirement. The first and second sentences overlap ('used by QUALIFIER steps' vs 'to pass a QUALIFIER step'), costing a little tightness.
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 no parameters, no output schema, and safety fully covered by annotations, the remaining burden is conceptual and entitlement context, both of which are handled. An agent still has no idea what fields a persona record returns besides usageCount, which is the one real 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?
Zero input parameters, so there is nothing to disambiguate and the baseline is 4. The mention of usageCount is a response field rather than a parameter, but it does not confuse the schema, which is empty and closed.
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?
Defines the resource precisely ('ideal-customer definitions used by QUALIFIER steps') and explicitly separates it from two siblings, agent_list and tag_list, with a parenthetical reason for each. The listing verb itself is only carried by the title, not the description text, which keeps it just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The exclusions are explicit and useful ('not an AI agent... not a lead tag'), and the Pro/Agency plan prerequisite is stated up front, which prevents a failed call. It stops short of telling the agent when to prefer persona_list over persona_get or how to follow up with persona_create/update.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
persona_updateUpdate a personaADestructiveIdempotentInspect
Change a persona's criteria. Live QUALIFIER steps pick this up on their next evaluation — leads already past the step are not re-scored, so editing a persona never revisits a decision already made. Check usageCount in persona_list first: a persona shared by several flows changes all of them at once. Requires a Pro or Agency plan.
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | Short label. | |
| criteria | No | Qualification rules. Unrecognised keys are stripped server-side. | |
| personaId | Yes | Persona id, from `persona_list`. | |
| description | No | Longer explanatory text. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations (destructiveHint=true, idempotentHint=true) by explaining exactly what is and isn't affected: live QUALIFIER steps re-evaluate, but already-passed leads are never re-scored. Also discloses that shared personas change every consuming flow at once — critical for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the purpose first, then the non-retroactive behavior, then the shared-usage warning and plan requirement. 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?
Covers the mutation's scope, side effects, prerequisite check, and plan requirement for a destructive nested-object update with no output schema. The only gap is not enumerating which fields (title, description, criteria) can be changed.
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 each criteria field is documented inline, including the personaId source ('from persona_list'). The description adds no parameter-level detail beyond the schema, so 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?
States a specific verb+resource: 'Change a persona's criteria', which separates it from persona_create/delete/get/list siblings. Minor understatement: the schema also allows updating title and description, which the description doesn't mention.
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 precondition ('Check usageCount in persona_list first') and a plan gate (Pro or Agency), and frames the edit's blast radius across flows. It stops short of naming alternative tools for other persona operations, but the guidance is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
placeholder_addAdd a merge fieldAInspect
Define a merge field with a default value, usable as {{key}} in any campaign copy. The default is used when a lead has no value of its own, so a sensible default is what stops a message reading oddly. This defines the field for the whole account; it does not set any lead's value, which is lead_update. There is no tool to delete a placeholder.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | Token name, without braces. | |
| value | No | Fallback value when a lead has none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds genuine scope context beyond the annotations: the field is account-wide and does not touch individual lead values. What it omits matters given idempotentHint=false — it never says what happens if the same key is added twice (error, overwrite, duplicate), which is the main behavioral risk for a non-idempotent create.
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, front-loaded with the definition and followed by rationale, sibling routing, and a caveat. Nothing is padded, but the final sentence is wasted space because the fact it asserts is incorrect.
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 create with no output schema, the description covers purpose, scope, and the sibling boundary well. It leaves two gaps an agent needs: what the call returns (the created field? just an ack?) and how re-adding an existing key behaves, both amplified by the non-idempotent annotation.
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 earns more by explaining the interpolation syntax ({{key}}) and the resolution rule that the default only fires when a lead has no value of its own. That gives the `value` parameter a purpose and consequence the schema's one-line "Fallback value" 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 opening sentence states a specific verb and resource (define a merge field) plus its operational form (usable as {{key}} in campaign copy). It goes further and distinguishes the tool from `lead_update`, which sets a lead's value, so an agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when-to-use signal (defining account-wide tokens for copy) and an explicit not-this alternative (`lead_update` when you want to set a lead's value). However, the closing claim that "There is no tool to delete a placeholder" is factually wrong — `placeholder_delete` and `placeholder_list` are both siblings — which actively misroutes the agent away from the correct tool chain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
placeholder_deleteDelete a merge fieldADestructiveInspect
Remove a merge field. Copy still referencing {{key}} will render it empty — silently, with no error, so a live campaign starts sending messages with a hole in them. That is the danger here and it is worse than it sounds: nothing fails, the sends just go out wrong. Search existing sequences for the key first, show the user, and get an explicit yes. To change the fallback text instead of removing the field, re-add it with placeholder_add.
| Name | Required | Description | Default |
|---|---|---|---|
| placeholderId | Yes | Merge-field id, from `placeholder_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds genuine value beyond them: the failure is silent, no error is raised, and live campaigns will send with an empty hole. That is the exact consequence an agent needs to know before invoking. It stops short of stating recoverability or whether the deletion can be undone.
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 warning is well front-loaded right after the verb, but the silent-failure point is restated three times ("render it empty — silently", "nothing fails", "the sends just go out wrong"), which costs a sentence without adding 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 one-parameter destructive tool with no output schema, the description covers what is destroyed, the failure mode, the safety workflow, and the alternative tool. Nothing an agent needs to call this 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 coverage is 100% and the single parameter's description already points to `placeholder_list` as the source of the id. The description adds no format or validation detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: "Remove a merge field." It is immediately distinguishable from the sibling tools `placeholder_add` and `placeholder_list`, which are named later, so an agent can route correctly without inspecting 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?
It gives an explicit precondition workflow (search sequences for the key, show the user, get an explicit yes) and names the alternative for a different intent (`placeholder_add` to change fallback text instead of deleting). When-to-use, when-not-to-use, and the substitute are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
placeholder_listList merge fieldsARead-onlyIdempotentInspect
Team-defined merge fields available in campaign copy, on top of the built-ins (firstName, lastName, designation, location, companyName, industry, senderName, signature). Check this before writing copy that uses a {{key}} the user mentions — a placeholder that does not exist renders empty rather than failing, which is how a message goes out with a hole in it. Per-lead values are set on the lead by lead_update, not here.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent and non-destructive traits, so the bar is lower, but the description adds the single most valuable behavioral fact: a nonexistent placeholder renders empty rather than failing, making this a silent-failure trap. It does not fill the remaining gap of whether the list is paginated beyond the default page or how large it typically is.
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: what is in the set, when to call it and why it matters, and what it is not for. The built-in enumeration is long but pays for itself by removing a reason to call the tool at all.
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 full annotation coverage, the description covers purpose, trigger and failure mode well. With no output schema present, it leaves the return shape implicit — the agent must infer it gets field keys/labels rather than, say, rendered values.
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?
Only one parameter (`page`) with 100% schema description coverage, so the schema already explains it fully. The description adds nothing about pagination behaviour or when the agent would need to page, which is the baseline-3 case where the schema does the work.
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 — lists team-defined merge fields — and immediately scopes it by enumerating the built-ins so the agent knows exactly what this set contains versus what it already knows. It also distinguishes the resource from per-lead values, clarifying this is not a lead data 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?
Gives an explicit trigger condition: 'Check this before writing copy that uses a {{key}} the user mentions.' It also names the alternative for the adjacent need — per-lead values go through `lead_update`, not here — so the agent is routed away from a plausible misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_generateDraft a post with AIARead-onlyIdempotentInspect
Generate LinkedIn post copy from a prompt using a connected AI provider. Returns text only and stores nothing — save it with post_upsert, or the copy is lost when the conversation moves on. Requires an AI provider connected in the web app under Settings - Integrations. Requires the "Publish" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | What the post should be about, and in what voice. | |
| provider | Yes | Which connected AI provider to use. Providers are connected in the web app. |
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 critical non-annotation context: output is text only, nothing is stored, the copy is lost unless saved, and provider/Publish-permission prerequisites apply.
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-loads purpose and follows immediately with the persistence warning and prerequisites. Each sentence adds actionable information; 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?
No output schema exists, so the description's 'Returns text only' is essential and present. It also covers persistence, the follow-up tool, provider connection requirements, and plan permissions, leaving no major gap for calling 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%, with both `prompt` and `provider` documented. The description adds provider-connection context, but the schema already notes providers are connected in the web app, so it does not significantly extend 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 action ('Generate LinkedIn post copy'), resource, and input source ('from a prompt using a connected AI provider'). It also names `post_upsert` as the saving sibling, making the drafting-vs-persistence 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?
Explains that the tool returns text only and stores nothing, and explicitly directs the agent to `post_upsert` or the copy is lost. It also gives prerequisites (connected AI provider, Publish permission). It does not compare against other AI-drafting siblings, but usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_listList LinkedIn postsARead-onlyIdempotentInspect
Posts drafted, scheduled or published from a LinkedIn account, with their engagement numbers. Includes per-status counts. Posts published to the account's own feed — unrelated to campaign outreach, which is campaign_list and analytics_campaign. Read this before post_upsert to avoid creating a near-duplicate of something already queued. Requires the "Publish" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Filter by status. | |
| linkedAccountId | Yes | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), and the description adds value beyond them: the required plan permission and the fact that the response includes engagement metrics and per-status counts. It does not discuss result-set size or ordering, which is the only remaining behavioral 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?
Front-loaded with what the tool returns, then scope exclusions, then the pre-use guidance. Every sentence carries information, though the duplication between 'drafted, scheduled or published' and 'per-status counts' is mildly 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?
With only two parameters, no output schema, and simple read-only annotations, the description covers everything an agent needs: what it lists, what comes back, which account scope applies, permission requirements, and how it relates to the write tool downstream.
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 both `linkedAccountId` and `status` documented and an enum for status values, so the schema carries the parameter burden. The description only implicitly signals status filtering via 'per-status counts' and adds no enum semantics (e.g. what REQUIRE_APPROVAL means for the caller).
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 resource (LinkedIn posts) and enumerates the states it covers — drafted, scheduled, published — plus what it returns (engagement numbers, per-status counts). It explicitly separates itself from `campaign_list` and `analytics_campaign`, so an agent can distinguish it from the outreach tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit pre-condition for use: read this before `post_upsert` to avoid creating a near-duplicate. It also names the sibling tools it replaces for the campaign-outreach use case and states the 'Publish' permission prerequisite, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_schedule_getGet the posting scheduleARead-onlyIdempotentInspect
The recurring weekly slots at which queued posts are published for an account. The repeating timetable, not the queue: for the posts themselves use post_list. Change the slots with post_schedule_set and the timezone or approval rules with post_schedule_settings. Requires the "Publish" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| linkedAccountId | Yes | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered structurally. The description adds a genuinely non-structural behavioral fact: the call requires the "Publish" permission on the plan, which an agent cannot infer from the schema or annotations. It stops short of describing the returned shape (no output schema exists).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what the resource is, then sibling routing, then the permission prerequisite. No filler and no restatement of the title 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 single-parameter read with no output schema, the description covers resource identity, sibling boundaries, and an auth prerequisite. The remaining gap is that it never characterizes the return value (fields, whether slots include weekday/time/timezone), which matters slightly more given there is no 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?
With a single parameter at 100% schema description coverage (including provenance via `linkedin_account_list`), the schema carries the parameter burden and the description adds nothing beyond it. 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 defines the exact resource returned — the recurring weekly publishing slots for an account — and explicitly contrasts it with the queue ('the repeating timetable, not the queue'). An agent can distinguish it from post_list and from its two write siblings without opening a schema, though the verb 'get/return' is only implied by the noun phrase.
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 names the alternatives and the condition that selects each: post_list for the posts themselves, post_schedule_set for changing slots, post_schedule_settings for timezone/approval rules. That is explicit when-to-use and when-not-to-use routing across all three adjacent tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_schedule_setSet a posting slotADestructiveIdempotentInspect
Define the publishing times for one weekday. Queued posts are released into these slots. One weekday per call, and it replaces that day's times rather than adding to them — read post_schedule_get first. It does not schedule any particular post; that is post_upsert with scheduledAt. Requires the "Publish" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| day | Yes | Weekday, e.g. "monday". | |
| times | Yes | Publish times as 24-hour "HH:MM", e.g. ["09:00","17:30"]. | |
| agentId | No | CONTENT agent that fills empty slots automatically. | |
| approval | No | Require human approval before an auto-generated post publishes. | |
| isActive | No | Whether this is live. Keep false while drafting. | |
| timezone | No | IANA timezone for these times. | |
| scheduleId | No | Omit to create a new slot. | |
| linkedAccountId | Yes | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With destructiveHint=true and idempotentHint=true already declared, the description adds the crucial substance: the write replaces that day's existing times rather than merging, which explains the destructive nature concretely. It also discloses the required 'Publish' permission and the auto-fill boundary via agentId, plus sets the correct mental model that no post is scheduled here.
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 four short sentences, each carrying distinct information: purpose, replacement semantics, the cross-tool boundary, and the permission requirement. The destructive replacement caveat is front-loaded before the alternatives, which is the correct order for a mutating 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?
For an 8-parameter mutating tool with full schema coverage and rich annotations, the description covers purpose, replacement risk, prerequisites, and siblings. The only gap is what a successful call returns or confirms (no output schema exists), which would help an agent verify the write—minor given everything else is 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 every parameter including day, times, agentId, approval, isActive, timezone, and scheduleId is already documented in the schema; the baseline is 3. The description only reinforces the 'one weekday per call' constraint and the agentId empty-slot behavior that the schema already states, adding little new 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 first sentence states a specific verb and resource with scope: 'Define the publishing times for one weekday.' It then explicitly distinguishes itself from the two nearest siblings: post_schedule_get (read first) and post_upsert with scheduledAt (per-post scheduling). An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use context and exclusions: one weekday per call, replaces rather than appends, read post_schedule_get first, and it does not schedule an individual post (use post_upsert with scheduledAt). The prerequisite ('Publish' permission on the plan) is also named, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_schedule_settingsUpdate posting settingsAInspect
Set the timezone, the auto-drafting CONTENT agent, and whether posts need approval before publishing. Account-wide publishing policy, not times — the times are post_schedule_set. Attaching a CONTENT agent here lets it draft posts on its own, so confirm with the user first; the agent is configured in agent_upsert. Requires the "Publish" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | No | AI agent id, from `agent_list`. | |
| approval | No | Require human approval before anything auto-generated goes out. | |
| timezone | No | IANA timezone, e.g. "America/New_York". | |
| linkedAccountId | Yes | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it as a non-read-only, non-destructive, open-world mutation, and the description adds genuinely new behavior: the required "Publish" permission on the plan and the downstream effect that an attached agent will autonomously draft posts. It does not address idempotency semantics (annotation says idempotentHint=false) or what happens to fields omitted from a call.
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-loaded with the operative settings and followed by scope disambiguation, side-effect warning, and permission requirement. Dense but every clause carries information; slightly crowded with backtick cross-references.
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 4-parameter mutation with full schema coverage, no output schema, and clear annotations, the description covers scope, side effects, prerequisites, and sibling boundaries. Only the partial-update semantics and response are unstated, which are secondary.
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 real meaning beyond the schema: `agentId` is framed as enabling autonomous drafting (with a caution), and `approval` is framed as a publishing policy rather than a bare boolean. Minor gap: no guidance on partial updates or unsupplied fields.
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?
Names the exact verb and the three settings it controls (timezone, auto-draft CONTENT agent, approval policy), then explicitly scopes it as account-wide policy. It directly distinguishes itself from the similarly named sibling `post_schedule_set`, so an agent can pick between them 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?
Explicitly routes time-related scheduling to `post_schedule_set` and agent configuration to `agent_upsert`, leaving no ambiguity about boundaries. It also adds a conditional instruction ('confirm with the user first') for the risky part of the operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
post_upsertCreate, schedule or update a postADestructiveIdempotentInspect
Draft or schedule a LinkedIn post. status: "DRAFTED" keeps it private; "PENDING" with a scheduledAt queues it for publishing; "REQUIRE_APPROVAL" routes it to a reviewer. A PENDING post with a past or imminent scheduledAt will go live publicly — confirm the copy with the user first. This is the only tool that saves a post. post_generate writes copy but stores nothing, and post_schedule_set defines the weekly slots a PENDING post is released into, not this post's own time. Requires the "Publish" permission on the plan.
| Name | Required | Description | Default |
|---|---|---|---|
| postId | No | Omit to create a new post. | |
| status | No | DRAFTED keeps it private; PENDING queues it for publishing. | |
| content | Yes | Post body. | |
| attachment | No | Image, video or document to attach. | |
| scheduledAt | No | When to publish, as epoch milliseconds or ISO 8601. | |
| pinnedComment | No | Comment auto-posted underneath, e.g. a link. | |
| linkedAccountId | Yes | Account that will publish it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructive/openWorld annotations, it discloses the real risk (a PENDING post with a past or imminent scheduledAt goes live publicly), the reviewer routing behavior, and the "Publish" permission requirement. This is exactly the operational context annotations 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?
Front-loads the core action, then the status semantics, then the public-publish warning, then sibling disambiguation and permissions. Every sentence carries distinct 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 7-param mutation tool with a nested attachment object and no output schema, the description covers the risky paths, permission gate, and tool boundaries. Nothing an agent needs to invoke it 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 coverage is 100%, so baseline is 3, and the description earns above that by explaining the interaction between status and scheduledAt and the reviewer semantics of REQUIRE_APPROVAL. It leaves the remaining enum values (PUBLISHED, APPROVED, REJECTED) and postId-for-update undocumented in prose, so not a full 5.
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 ("Draft or schedule a LinkedIn post") and immediately clarifies that this is the only tool that persists a post, explicitly contrasting post_generate and post_schedule_set. An agent can distinguish it from siblings 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?
Explicitly maps each status value to a use case (DRAFTED = private, PENDING + scheduledAt = queued, REQUIRE_APPROVAL = reviewer) and names two alternatives with the reason they are not substitutes. Also states the precondition of confirming copy before an imminent PENDING publish.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
referenceReference vocabularyARead-onlyIdempotentInspect
The exact enum values, step-field requirements and defaults this API accepts. Read this before authoring a campaign flow or filtering by status — guessing a value produces a validation error, and the vocabulary is not guessable (e.g. campaign settings use the field name campaginLimits, spelled that way in the schema). A static vocabulary, not account data — it says which values exist, never which the account has. For the account's own tags, templates, personas or placeholders use tag_list, template_list, persona_list or placeholder_list.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Narrow the reference to one area to keep the response small. | all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/closed-world, so the bar is lower, and the description still adds real context: this is a static vocabulary rather than account data, and guessing values yields validation errors. The misspelled `campaginLimits` example is a concrete, non-obvious behavioral warning. It stops short of describing response shape or size beyond the topic-narrowing hint.
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: what it is, why it must be read, then what it is not. The spelling example and the sibling routing list both earn their place. Slightly dense, but 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 no output schema, the description still conveys what comes back conceptually (which values exist, never account state) and warns about the failure mode of guessing. Adequate for a one-optional-param read-only lookup; only the response shape/size is left implicit.
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 `topic` parameter has 100% schema coverage with an enum and its own description ('narrow the reference to one area to keep the response small'), so the schema carries the load. The tool description never mentions `topic` or suggests which value to pick for which task, so it adds nothing beyond the schema — baseline 3.
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 resource (the API's static enum/field vocabulary) and what it contains: enum values, step-field requirements, defaults. It also explicitly distinguishes itself from the four account-data siblings it could be confused with.
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 ('read this before authoring a campaign flow or filtering by status') and an explicit alternative routing rule ('for the account's own tags, templates, personas or placeholders use tag_list/template_list/persona_list/placeholder_list'). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reminder_createCreate a reminderAInspect
Set a follow-up reminder on a lead or conversation. You are notified at remindAt — you, not the prospect; nothing is sent to them. It does not schedule a campaign step or delay one. To make a lead wait, use lead_update with paused. Cancel with reminder_delete.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Short label. | |
| leadId | No | Lead id, from `lead_list`. | |
| remindAt | Yes | When to fire, epoch milliseconds or ISO 8601. | |
| description | No | Longer explanatory text. | |
| conversationId | No | Conversation id, from `conversation_list`. | |
| linkedAccountId | No | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare this is a non-read, non-destructive, non-idempotent create; the description adds the crucial behavioral fact that the notification fires to the caller, not the prospect, and that nothing is sent externally. That is real context beyond the structured fields. It stops short of warning that repeated calls produce multiple reminders (the non-idempotent trait), leaving that inference to the agent.
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 doing distinct work: purpose, recipient semantics, negative scope, cancellation. The core behavior is front-loaded in the first sentence with zero restatement of the title.
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 6-param create tool with full schema coverage and no output schema, the description covers recipient semantics, scope exclusions, and cleanup. It doesn't say what a successful call returns (e.g., the new reminder's id), which would close the last gap in a create-then-reference workflow.
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; the description earns above that by clarifying who `remindAt` notifies ("You are notified at `remindAt` — you, not the prospect"), which the schema's format note (epoch ms or ISO 8601) does not convey. Remaining params are fully documented in-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 and resource ("Set a follow-up reminder on a lead or conversation") and immediately delimits scope against lookalike operations: it does not schedule or delay a campaign step. An agent can separate it from campaign_* and lead_update 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?
Explicit when-not clauses: it is not a campaign step, and if the goal is to make a lead wait, use `lead_update` with `paused`. It also names the cancel path (`reminder_delete`), so both the alternative and the reversal are routable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reminder_deleteDelete a reminderADestructiveInspect
Cancel a reminder so it never fires. Does not affect the lead, the conversation, or any scheduled campaign step — only your own nudge goes away. One of the few deletions available here, and it destroys nothing a prospect sees. To close a to-do instead use task_upsert with isCompleted.
| Name | Required | Description | Default |
|---|---|---|---|
| reminderId | Yes | Reminder id, from `reminder_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so the description's real value is blast-radius disclosure: it clarifies that only the reminder goes away and nothing a prospect sees is destroyed, which directly softens the scary destructive flag. It stops short of covering the non-idempotent behavior (what happens on a second call for an already-cancelled reminder), which is the one meaningful 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 short sentences, front-loaded with the action and its effect, then the non-effects, then the alternative. Every clause adds decision-relevant 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 one-parameter delete tool with full annotation coverage and no output schema, the description supplies everything an agent needs: what it does, what it does not touch, and which sibling to use for a different intent. 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?
With a single parameter at 100% schema description coverage, the schema already documents reminderId and even points to reminder_list as the source. The description adds no format or id-lookup detail beyond that, so 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?
States a specific verb and resource — 'Cancel a reminder so it never fires' — and immediately scopes it against the lead, conversation, and campaign steps. An agent can distinguish this from sibling deletions like lead_delete or message_delete 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?
Explicitly names the alternative for a related intent: 'To close a to-do instead use task_upsert with isCompleted.' This routes the agent between the two closest overlapping concepts (nudge vs. task) with a concrete parameter callout.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reminder_listList remindersARead-onlyIdempotentInspect
Follow-up reminders set on a conversation or a lead. Private nudges for your team at a point in time. They send nothing to the prospect and are unrelated to the campaign schedule, which is campaign_update.
| Name | Required | Description | Default |
|---|---|---|---|
| leadId | No | Lead id, from `lead_list`. | |
| conversationId | No | Conversation id, from `conversation_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds substantive domain behavior: reminders are internal-only ('send nothing to the prospect') and are independent of campaign scheduling. That prevents the agent from conflating a reminder with an outbound scheduled message. Return format and pagination remain undisclosed.
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 definition front-loaded and zero filler. The closing clause 'the campaign schedule, which is `campaign_update`' is slightly ambiguous about whether `campaign_update` is the schedule or the tool that edits it, a minor wording cost.
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 parameter-optional, read-only list tool with full schema coverage, four annotations, and no output schema, the description supplies the essential conceptual framing. It stops short of stating what happens when both IDs are omitted (list everything vs error), which is the one behavior an agent would still have to guess.
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 two ID parameters are already fully documented with their source tools. The phrase 'on a conversation or a lead' faintly signals that the filters are alternative scopes rather than required inputs, but adds no syntax, mutual exclusivity, or default behavior 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 names the resource precisely as 'follow-up reminders set on a conversation or a lead' and adds a clarifying gloss ('private nudges for your team at a point in time'), so an agent knows exactly what entity is being enumerated. The list verb itself is only carried by the name/title, and no sibling listing is contrasted, but the resource 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?
The final clause routes the agent away from campaign scheduling to `campaign_update`, which is a genuine when-not signal. However, it never addresses the closest alternatives (`reminder_create`, `reminder_delete`) or says whether to call this with both, one, or neither ID, so routing is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
saved_reply_listList saved repliesARead-onlyIdempotentInspect
Reusable reply snippets your team keeps for common inbox situations. Text a human can copy when replying by hand. These are not sequence steps (flow_get), not agent FAQs (agent_get), and nothing here is sent automatically.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, closed-world, so the safety profile is covered. The description adds genuine context beyond that: these snippets are never auto-sent and are meant for manual copy, which is a behavioral distinction no annotation conveys.
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 what the resource is before the exclusions. 'Text a human can copy when replying by hand' borders on redundant with the first sentence but does reinforce the manual-copy distinction.
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 list tool with full annotation coverage, the description is nearly sufficient. Since there is no output schema, a note about what each entry contains (e.g., title/body) would close the remaining gap, but nothing an agent needs in order to call it 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 takes zero parameters, so there is nothing for the description to disambiguate; the schema is trivially complete. Baseline 4 applies with no parameter semantics to elaborate.
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 defines the resource precisely (reusable human-copyable reply snippets kept by the team) and explicitly rules out two adjacent resource types, flow_get and agent_get. It relies on the title/name for the 'list' verb rather than stating it, but an agent can still tell exactly what data this returns 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?
Negative routing is explicit — 'not sequence steps (flow_get), not agent FAQs (agent_get)' — which is exactly the discrimination needed among many *_list tools. It also clarifies the data is human-facing and 'nothing here is sent automatically,' implying a read/browse use case. It stops short of naming saved_reply_upsert as the write path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
saved_reply_upsertCreate or update a saved replyADestructiveIdempotentInspect
Create a saved reply, or update one by passing savedRepliesId. Stores a snippet for humans to reuse; it does not send anything, schedule anything, or teach an agent — agent wording lives in agent_upsert. There is no tool to delete a saved reply.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Short label shown in the reply picker. | |
| content | Yes | Body. Supports {{firstName}}-style merge fields. | |
| assignedUsers | No | Restrict visibility to these team member ids. | |
| savedRepliesId | No | Omit to create a new one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real value beyond annotations by ruling out side effects: it does not send, schedule, or train an agent. However, annotations declare destructiveHint=true and the description never says an update overwrites the existing title/content/assignedUsers — the one behavioral risk an agent most needs to know before calling. The note that no delete tool exists is useful but orthogonal to the destructive flag.
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-loaded with the verb, and each sentence carries a distinct disambiguation (artifact type, alternatives, absence of delete). No filler, though the delete-tool remark is a lower-value clause relative to the overwrite warning that is missing.
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 is no output schema, so the description must carry the call-shape burden; it covers purpose and side-effect boundaries but omits the overwrite semantics implied by destructiveHint=true and idempotentHint=true. Adequate for routing, incomplete for safe mutation.
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. The description restates the `savedRepliesId` semantics that the schema already documents ('Omit to create a new one') and adds nothing about `assignedUsers` visibility or merge-field behavior beyond what the schema says.
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 (create/update a saved reply) and immediately disambiguates the update path via `savedRepliesId`. It also explicitly separates itself from `agent_upsert` (agent wording) and clarifies what the artifact is not (not a send, schedule, or agent-training 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?
Gives a clear create-vs-update rule (omit or pass `savedRepliesId`) and names the sibling alternative `agent_upsert` for agent wording. It stops short of explicit when-not-to-use conditions for the saved reply itself, but the routing signal is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_url_buildBuild a LinkedIn search URLARead-onlyIdempotentInspect
Turn an audience description into a LinkedIn or Sales Navigator people-search URL, so a campaign source can be described rather than pasted. Returns the url plus what it managed to express — hand it to campaign_set_source.
What it can build: job titles (included and excluded) and free-text keywords with boolean operators. What it CANNOT build: geography, industry, company size, seniority and years-in-role. Sales Navigator only accepts those as numeric ids from its own typeahead (id:103644278 is United States), they cannot be derived from a name, and a wrong id silently searches the wrong audience. For those, either ask the user to paste a Sales Navigator URL with the filters already set, or pass the ids through extraFilters if the user supplies them. Never guess one.
Recruiter (/talent/) URLs cannot be built at all — ask the user for one.
| Name | Required | Description | Default |
|---|---|---|---|
| school | No | Basic search only: school, free text. | |
| titles | No | Job titles to include, as plain text. | |
| company | No | Basic search only: current company, free text. | |
| surface | Yes | "basic" is ordinary LinkedIn search; "sales-navigator" needs a Sales Navigator seat. | |
| keywords | No | Free text. Supports boolean operators, e.g. '"chatbot" OR "AI agent"'. | |
| lastName | No | Basic search only. | |
| firstName | No | Basic search only. | |
| extraFilters | No | Id-based filters, only when the USER supplied the ids or they came from a URL they pasted. Do not populate this from memory. | |
| excludeTitles | No | Job titles to exclude. Sales Navigator only — basic search cannot express an exclusion. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare read-only/idempotent; the description adds the critical failure mode — a wrong numeric id silently searches the wrong audience — plus the return payload ('url plus what it managed to express') and the downstream handoff. That is behavior an agent cannot infer from annotations or 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?
Front-loads the purpose and return contract, then splits capability and non-capability into clearly labelled blocks. Dense and largely waste-free, though the warnings about ids are restated in both prose and the extraFilters schema description.
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?
A 9-parameter tool with no output schema, and the description still covers return shape, the surface tradeoffs, the constraint on id-based filters, and the handoff target. 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%, so the baseline is 3; the description still adds value by explaining why id-based filters cannot be derived from names (Sales Navigator typeahead ids, e.g. id:103644278) and that excludeTitles is unavailable on basic search. It stops short of mapping the basic-search-only fields (school, company, firstName, lastName), which the schema already labels.
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 ('turn an audience description into a LinkedIn or Sales Navigator people-search URL') and frames it as a source-description step feeding campaign_set_source. An agent can distinguish it from campaign_* and lead_* siblings 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?
Explicitly enumerates what it can build versus what it cannot, and gives concrete alternatives for the gaps: ask the user to paste a filtered URL, or pass user-supplied ids through extraFilters, never guess. It also excludes Recruiter /talent/ URLs and routes those to the user.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequence_leads_at_stepLeads sitting at a stepARead-onlyIdempotentInspect
Which leads are currently at a given step, and — for failures — why. The drill-down behind a step's pending/completed/failed counter. Takes a step id from sequence_list or flow_get. For one lead's own position instead use lead_flow_state, and to unblock a stuck action activity_skip.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number. | |
| status | No | Filter to PENDING, COMPLETED or FAILED. | |
| keyword | No | Search across name and email. | |
| pageSize | No | Rows per page. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. | |
| sequenceId | Yes | Step id from `sequence_list` or the outline in `flow_get`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is carried. The description adds real context beyond that: it returns not just membership but the reason for failures, which tells the agent what to expect from the payload.
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 zero filler; the purpose leads and the disambiguation follows. Every clause carries information the agent needs.
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 six fully documented parameters and no output schema, the description covers purpose, input sourcing and sibling routing adequately. What it omits is the shape of the returned rows and pagination behavior, a minor gap given the complete 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 description coverage is 100%, including the enum on status and the clarification that sequenceId is a step id, so the schema does the heavy lifting. The description reinforces the step-id semantics but adds no filter or pagination detail beyond the structured fields.
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: which leads sit at a given step, plus failure reasons. The second sentence pins down its role as the drill-down behind the step counters, which cleanly separates it from sequence_step_stats.
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 sourcing for the step id (`sequence_list` / `flow_get`) and names two alternatives with the conditions that select them: `lead_flow_state` for one lead's own position, `activity_skip` to unblock a stuck action. When-to-use and when-not are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequence_listList materialised sequence stepsARead-onlyIdempotentInspect
The Sequence records the runtime actually executes, created when the campaign launches. Distinct from flow_get: the flow is the design, these are the live steps with their ids, delays and copy. Use the ids here with sequence_leads_at_step. Empty before the campaign launches, because the records are created at launch — so on a DRAFTED campaign read flow_get instead. The _id values here are what sequence_update patches, and that tool is only safe once the campaign is ACTIVE or PAUSED.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent profile, and the description adds genuinely new behavior: records are created at launch so the list is empty beforehand, and the ids returned are the patch handles for `sequence_update`, only safe when ACTIVE or PAUSED. That is lifecycle and safety context an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the definition, then the contrast with `flow_get`, then the empty-before-launch caveat and the `sequence_update` dependency. Every sentence carries information, though the dense backtick references and parenthetical warnings make it slightly heavier than needed.
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-param read tool with annotations and no output schema, nothing material is missing: lifecycle timing, sibling relationships, and the downstream use of returned ids 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 coverage is 100% and there is a single parameter whose meaning (campaign id, sourced from `campaign_list`/`campaign_create`) is fully documented in the schema. The description implies the campaign must be launched but adds no syntax or format detail beyond that 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?
States a specific resource (the materialised sequence steps the runtime executes) with a clear verb, and immediately contrasts itself with `flow_get`: "the flow is the design, these are the live steps with their ids, delays and copy." An agent can pick this tool over its closest 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?
Explicit when-to-use and when-not: use it after launch, and "on a DRAFTED campaign read `flow_get` instead." It also names downstream steps (`sequence_leads_at_step`, `sequence_update`) and the state constraint that makes `sequence_update` safe, giving a complete routing picture.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequence_step_statsPer-step performanceARead-onlyIdempotentInspect
Pending / completed / failed counts for every step of a campaign — the funnel view. Use it to find the step where leads stall or fail. Fast, and the right answer to "where are we losing people" on any campaign — prefer it over analytics_funnel, which walks every activity row and may not finish on a large campaign. Counts per step; for the leads behind one of them use sequence_leads_at_step.
| Name | Required | Description | Default |
|---|---|---|---|
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. | |
| sequenceId | No | Narrow to one step. Omit for the whole funnel. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description nonetheless adds real behavioral context the annotations can't: it is 'fast' while the alternative 'walks every activity row and may not finish on a large campaign' — a genuine cost/timeout trade-off that shapes tool choice.
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-loads what it returns, then the diagnostic use case, then the performance caveat, then the follow-up tool. Every sentence carries distinct information; the rhetorical quotes and em-dashes are stylistic, not 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 no output schema and no annotations gap, the description does need to convey the return shape, and 'counts per step' does that adequately for a 2-parameter read tool. It could be slightly more precise about whether steps are keyed by sequenceId and whether zero-activity steps are included, but nothing essential to 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 100% and both parameters are documented in-schema (campaignId sourced from campaign_list/campaign_create, sequenceId as the step filter). The description adds no further syntax, defaults, or edge cases for either parameter, so it sits at the baseline rather than above 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?
States a specific verb and resource — pending/completed/failed counts for every step of a campaign — and frames it as 'the funnel view'. That framing plus the explicit contrast with analytics_funnel and sequence_leads_at_step lets an agent separate it from the many campaign/analytics siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear selection rule: use this for 'where are we losing people', prefer it over the slower funnel alternative on large campaigns, and switch to sequence_leads_at_step to get the underlying leads. The only defect is that the named alternative `analytics_funnel` does not match the sibling tool `analytics_campaign_funnel`, which could send an agent looking for a tool that isn't there.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequence_updateEdit copy on existing stepsADestructiveIdempotentInspect
Patch fields on already-materialised sequence steps — the surgical way to fix a typo or swap copy on a campaign that is ALREADY RUNNING (ACTIVE or PAUSED), without re-saving the whole graph and re-evaluating every lead. Leads keep their position and their scheduled actions. Pass the step _id from sequence_list FOR THIS CAMPAIGN, plus only the fields to change — anything omitted is left alone. An id from another campaign is refused. Copy fields: message, subject, note (the connection-request note), shortNote, and the A/B variants bMessage, bSubject, bNote, bShortNote. Read the step back from sequence_list first to see which of those it actually has — an EMAIL step has subject, a CONNECT step has note, and only a step with abTestingEnabled uses the b* pair. TWO EDITS ARE NOT SURGICAL AND ARE EASY TO MAKE BY ACCIDENT. Sending days or calendarType RESCHEDULES every pending activity on that step — each waiting lead is pushed to that many days from now, which moves real send times; neither field is returned by sequence_list, so do not pass them unless the user asked to change the wait. And connectWithoutMessage: true silently CLEARS that step's note, so the connection request goes out with no text. To add, remove or reorder steps, rewrite the sequence with flow_set. Do NOT use this on a DRAFTED campaign: launching rebuilds every step from the saved flow graph, which this tool does not touch, so the edit is silently reverted to the original copy the moment the campaign launches. Check status with campaign_get first. To change a draft's copy, call flow_set again with the corrected steps.
| Name | Required | Description | Default |
|---|---|---|---|
| sequences | Yes | The step patches to apply. | |
| campaignId | Yes | Campaign id, from `campaign_list` or `campaign_create`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description goes well beyond them: it names two specific accidental-destruction paths (`days`/`calendarType` rescheduling every pending activity, `connectWithoutMessage: true` silently clearing the note) and the silent-revert behavior on drafts. That is exactly the mutation-risk context an agent cannot infer from 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?
Front-loaded with the core action and scope, and every paragraph carries actionable information. It is dense and long relative to the two-parameter surface, and the `days`/`calendarType` warning appears both in the description and the schema, so a little is redundant rather than 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, graph-touching mutation with no output schema, the description covers prerequisites, cross-campaign id refusal, per-step-type field availability, two accidental-destruction hazards, and the draft-reversion trap. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real semantic meaning: it enumerates the copy fields, explains which fields exist per step type (EMAIL has `subject`, CONNECT has `note`), ties `b*` variants to `abTestingEnabled`, and repeats the `days`/`calendarType` hazard. Minor duplication with the schema's own descriptions keeps it off a 5.
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 ('patch fields on already-materialised sequence steps') and immediately scopes it to surgical copy edits on running campaigns. It explicitly distinguishes itself from `flow_set` (structural rewrite) and `campaign_update`, so an agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions (check `status` with `campaign_get`; campaign must be ACTIVE or PAUSED), explicit exclusions (do NOT use on DRAFTED campaigns, with the reason — edits are reverted on launch), and explicit alternatives (`flow_set` for add/remove/reorder and for drafts). This is the full when/when-not/alternative triad.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
subaccount_listList agency sub-accountsARead-onlyIdempotentInspect
The active sub-accounts under your agency: id, name, email, plan and state. Owner-only — the backend refuses it for any other role. This is where a userId comes from. The seven tools that accept one — campaign_list, linkedin_account_list, email_account_list, analytics_campaign, analytics_reporting, tag_list, agent_duplicate — read that sub-account's data instead of yours, and an id from outside this list is refused. Never guess or construct a userId; take it from here, and tell the user whose account you are about to read. Only active sub-accounts holding a plan are returned: disabled, deleted and plan-less accounts are filtered out here rather than upstream, and excluded says how many were dropped. An account that is not listed cannot be passed as userId either. Distinct from team_members_list, which lists MANAGERs on your own account rather than separate accounts. Creating, disabling and licensing sub-accounts happens in the web app.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number. | |
| keyword | No | Filter by name. | |
| pageSize | No | Rows per page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint, idempotentHint, non-destructive), and the description adds genuinely new behavioral facts: owner-only authorization that the backend enforces, server-side filtering of disabled/deleted/plan-less accounts rather than upstream, and an `excluded` count reporting how many were dropped.
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 what is returned and the owner-only constraint, which are the two facts that matter most. It is dense but slightly redundant: 'Never guess or construct a userId' is restated by 'An account that is not listed cannot be passed as `userId` either', and the seven-tool enumeration is long though useful.
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 no output schema, the description usefully enumerates the returned fields and explains the `excluded` counter, which an agent would otherwise misread. It stops short of describing pagination metadata (totals/page counts) for a paginated list, leaving that inferred.
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% (page, keyword, pageSize are all documented), so the schema carries the parameter burden and baseline 3 applies. The description adds no syntax or interaction guidance for those parameters — notably it doesn't say how `keyword` interacts with the active-only filter or how pagination relates to the `excluded` count.
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 active sub-accounts under your agency) and immediately names the fields returned (id, name, email, plan, state). It is unmistakably distinct from `team_members_list`, which it explicitly contrasts as listing MANAGERs on your own account rather than separate accounts.
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 routing: this is the source of a `userId`, and it enumerates the seven tools that consume one. It also gives the negative case (an id from outside this list is refused, never guess one) and closes off out-of-scope operations by pointing creation/disabling/licensing to the web app.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tag_createCreate a tagAInspect
Create a tag. The interest value decides which bucket it feeds in reply-sentiment analytics. Two different jobs use tags: reply classification (Interested, Not Interested, Replied — reused across campaigns), and identifying one campaign's leads in campaign_update. For the second, create a short campaign-specific tag with interest: "NEUTRAL" rather than reusing an existing one.
| Name | Required | Description | Default |
|---|---|---|---|
| content | Yes | Tag label, kept short. For reply classification, something like "Booked a call". For a campaign tag, a shortened form of that campaign's own name — ask the user what to call it rather than inventing one. | |
| interest | Yes | POSITIVE, NEGATIVE or NEUTRAL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readonly, non-idempotent, non-destructive. The description adds meaningful behavioral context the annotations cannot: the interest value determines how the tag is bucketed in analytics, and tags are reused across campaigns for classification. It stops short of stating what happens on duplicate content or what the call returns (no output schema exists).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with purpose followed by the two-mode distinction and the one non-obvious rule. Little filler; the analytics-bucket sentence does real work. Slightly dense but nothing 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 two-parameter create tool with non-destructive annotations and no output schema, the description covers purpose, both usage modes, naming conventions via schema, and the meaning of the enum. The main omissions are duplicate-tag behavior and confirmation of what is returned.
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 earns above baseline by giving `interest` a purpose the schema never states — it decides which bucket the tag feeds in reply-sentiment analytics. Combined with the schema's own content guidance (short label, ask the user for campaign names), an agent knows how to fill both 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?
Opens with a specific verb+resource ("Create a tag") and immediately explains what the tool's output participates in (reply-sentiment bucket selection). It doesn't explicitly contrast itself with tag_update or tag_list, so sibling differentiation is indirect, but the creation intent 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?
Explicitly splits use into two jobs (reply classification vs. per-campaign lead identification) and tells the agent what to do in the second case: create a short campaign-specific tag with interest NEUTRAL rather than reusing an existing one. That is a real when/when-not instruction. No mention of checking tag_list first or of duplicate handling, so no perfect 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tag_deleteDelete a tagADestructiveInspect
Delete a tag. Any ASSIGN_TAG step referencing it stops working, so check your flows first. Leads carrying it lose that classification and it disappears from reply-sentiment reporting, which changes past numbers. Irreversible — show the user what carries it (tag_list reports the count) and get an explicit yes. Deleting a campaign's own identity tag makes that campaign's leads indistinguishable in lead_list. To rename or reclassify instead, use tag_update.
| Name | Required | Description | Default |
|---|---|---|---|
| tagId | Yes | Tag id, from `tag_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, but the description goes well beyond by naming concrete downstream damage: ASSIGN_TAG steps break, leads lose classification, reply-sentiment reporting retroactively changes past numbers, and deleting a campaign's identity tag makes leads indistinguishable in `lead_list`. It also states irreversibility plainly, which is the key behavioral fact an agent needs before invoking.
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 the action and its most dangerous side effect, then layers the softer consequences, the confirmation requirement, and the alternative. Every clause carries distinct information with no restatement of the name or title.
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, single-param tool with no output schema, the description supplies everything an agent needs: downstream breakage, retroactive reporting impact, irreversibility, the confirmation protocol, and the correct alternative for the non-destructive case.
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?
Only one parameter with 100% schema coverage, and the schema already says 'Tag id, from `tag_list`.' The description reinforces the `tag_list` source but adds no format, casing, or edge-case detail about the id itself, so baseline 3 is appropriate given the schema does the work.
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 precise verb+resource ('Delete a tag') and immediately scopes it against siblings by naming `tag_update` for rename/reclassify and `tag_list` for inspection. An agent can distinguish it from tag_update, tag_create, and tag_list without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the preconditions ('check your flows first', 'show the user what carries it ... get an explicit yes') and names the alternative tool with the condition that selects it ('To rename or reclassify instead, use `tag_update`'). Both when-to-use-with-caution and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tag_listList tagsARead-onlyIdempotentInspect
Tags used to classify leads and replies. Each carries an interest of POSITIVE, NEGATIVE or NEUTRAL, which drives reply-sentiment reporting. Tag ids are what ASSIGN_TAG steps reference. Tags do two unrelated jobs and conflating them causes real damage. The reusable ones listed here — Interested, Not Interested, Replied, Meeting Booked, Deal, Maybe — classify replies and are shared across campaigns. A campaign's own tag, set via campaign_update, instead identifies that campaign's leads and must be unique to it: two campaigns sharing one tag cannot have their leads told apart, here or in lead_list. So never pass a tag from this list as a campaign tag — mint a short campaign-specific one with tag_create (interest: "NEUTRAL").
| Name | Required | Description | Default |
|---|---|---|---|
| userId | No | Read a SUB-ACCOUNT instead of your own data. Accepted only from an agency owner, and only for an account inside your own agency: take the id from `subaccount_list` and never construct or guess one. An id outside that list is refused. Omit it to read your own data, and name the account to the user when you pass it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, but the description adds substantial context beyond them: what `interest` drives (reply-sentiment reporting), who consumes the ids (ASSIGN_TAG steps), and the concrete failure mode if a shared tag is used as a campaign tag ('two campaigns sharing one tag cannot have their leads told apart'). That is exactly the cross-tool behavioral consequence an agent cannot get from 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 content is on-topic and the strongest warning is placed mid-description, but the opening sentence describes the resource's semantics rather than the tool's action, and the final two sentences restate the same 'do not reuse these as campaign tags' warning twice. Five sentences for a single-parameter list tool is heavier than needed; the essential action could be front-loaded in one clause.
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 no output schema, the description still tells the agent what a tag carries (`interest` as POSITIVE/NEGATIVE/NEUTRAL, an id, a name) and how those ids are consumed downstream, which is enough to use the result correctly. It stops short of describing the full returned shape (e.g., whether campaign tags or counts appear), a minor gap for a read-only list.
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 `userId` parameter is documented at 100% schema coverage, including the sub-account scoping rules and the 'never guess an id' constraint, so the schema already does the heavy lifting. The description adds nothing about the parameter. Baseline 3 applies when the schema fully covers one param.
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 conveys that this tool surfaces the reusable reply-classification tags (Interested, Not Interested, Replied, etc.) and that each carries an `interest` value, with the phrase 'the reusable ones listed here' indicating a listing. It also clearly separates these tags from campaign-specific tags, which no sibling does. It never opens with a crisp verb+resource statement ('List all reusable tags'), so the core action is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when/when-not: use tags from this list for reply classification, and 'never pass a tag from this list as a campaign tag.' It names the concrete alternatives — `campaign_update`/`tag_create` for campaign tags, `lead_list` for the consequence of conflation, `ASSIGN_TAG` steps as consumers of these ids — so the agent knows exactly which tool to route to in each case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tag_updateUpdate a tagAIdempotentInspect
Rename a tag or change its sentiment classification. It edits the tag everywhere at once, including on leads already carrying it and in past reply-sentiment reporting — so changing interest rewrites history, it does not reclassify going forward only. To tag a lead use lead_update; to set a campaign's own tag use campaign_update. There is no tool to delete a tag.
| Name | Required | Description | Default |
|---|---|---|---|
| tagId | Yes | Tag id, from `tag_list`. | |
| content | No | Body text. | |
| interest | No | Sentiment bucket this tag feeds in reply analytics. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing blast radius: the edit applies everywhere at once, including on leads already carrying the tag and in past reply-sentiment reporting, so changing `interest` rewrites history rather than reclassifying going forward only. That is exactly the non-obvious side effect an agent needs before mutating.
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 the action, then blast radius, then sibling routing — good ordering with little waste. The final sentence about deletion does not earn its place because it is factually wrong given tag_delete 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 3-parameter mutation with full schema coverage and annotations declaring idempotent/non-destructive, the description covers the important unknowns: scope of effect and alternatives. Minor gaps remain on partial-update semantics and what the call returns (no 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 100%, so the baseline is 3; the description earns an extra point by explaining the retroactive effect of the `interest` parameter. It stops short of clarifying that 'rename' maps to the ambiguously-described `content` field ('Body text'), and does not say whether params are optional/partial updates.
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 ('Rename a tag or change its sentiment classification') and immediately differentiates itself from lead_update and campaign_update. An agent can tell exactly which entity this mutates 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?
Explicit routing: use lead_update to tag a lead, campaign_update for a campaign's own tag. That is strong when-to-use guidance. However, the closing claim 'There is no tool to delete a tag' is contradicted by the sibling tool list, which contains tag_delete, so one guidance sentence is actively misleading.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
task_listList tasksARead-onlyIdempotentInspect
Manual to-dos for your team, either across your whole account or for one lead. TASK steps in a campaign flow create these automatically. Work for a human, not sending steps: a pending campaign action is activity_list or lead_flow_state, and a dated nudge is reminder_list. Completing a task sends nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number. | |
| leadId | No | Only tasks attached to this lead. | |
| emailAccountId | No | Mailbox id, from `email_account_list`. | |
| linkedAccountId | No | LinkedIn account id, from `linkedin_account_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnlyHint, idempotentHint, and non-destructive, the safety profile is covered. The description adds useful context beyond that: tasks are human to-dos and are auto-created by TASK steps in a campaign flow, and 'completing a task sends nothing' clarifies that these are not outbound actions. It doesn't discuss listing order or pagination behavior, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the resource definition, followed by disambiguation and a behavioral note. Every sentence carries distinct information 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 read-only list tool with full schema coverage, annotations, and no output schema, this covers what the data is, where it comes from, how to scope it, and when to use a different tool instead. 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 description coverage is 100%, so page, leadId, emailAccountId, and linkedAccountId are already documented. The description only reinforces the leadId filter via 'or for one lead' and says nothing about the mailbox or LinkedIn account filters, so it adds marginal value over 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 defines the resource precisely as 'manual to-dos for your team' and states the scope (whole account or one lead). It explicitly distinguishes itself from three siblings that might otherwise be confused with tasks, so an agent knows exactly what this tool returns 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?
It gives explicit when-not-to-use guidance: 'a pending campaign action is activity_list or lead_flow_state, and a dated nudge is reminder_list.' This names the alternatives and the condition that routes to each, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
task_upsertCreate or update a taskAIdempotentInspect
Create a to-do, or update one by passing taskId. Set isCompleted: true to close it. An internal note-to-self with an owner; nothing is sent to the prospect and no campaign step is affected. For a timed personal nudge use reminder_create.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Free-text label for grouping. | |
| date | No | Due date, epoch milliseconds or ISO 8601. | |
| link | No | Related URL. | |
| title | Yes | What needs doing. | |
| leadId | No | Lead this relates to. | |
| taskId | No | Omit to create a new task. | |
| content | No | Detail or context. | |
| isCompleted | No | Mark as done. | |
| conversationId | No | Conversation id, from `conversation_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false and openWorld=false, so the safety profile is covered. The description nonetheless adds genuinely non-obvious impact context — 'nothing is sent to the prospect and no campaign step is affected' — which is exactly the kind of side-effect clarification an agent needs before writing. It stops short of saying what is returned after an upsert.
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 zero filler. The create/update mechanism is front-loaded, the closing action follows, and the disambiguation against `reminder_create` sits last where it is least needed for the primary call.
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 purpose, mode selection, completion semantics, side-effect scope and an alternative — enough to call the tool correctly despite nine parameters. The one real gap is that with no output schema, the description never says whether the created task's id is returned, which an agent would want for a follow-up update.
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 adds a bit more by framing `taskId` as the create-vs-update switch and `isCompleted: true` as the close action. Those restate schema descriptions but reinforce the semantics in the operative context where the agent will read them, earning a small bump over 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?
States a specific verb pair and resource ('Create a to-do, or update one') and immediately explains the discriminator between the two modes (passing `taskId`). The final sentence explicitly names the sibling tool it is not (`reminder_create`), so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use branches: omit `taskId` to create, pass it to update, set `isCompleted: true` to close. It also names the alternative for a timed personal nudge (`reminder_create`), which is the only plausible sibling confusion for a task tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
team_members_listList team membersARead-onlyIdempotentInspect
People with access to this account and their roles. Read-only — inviting and removing members is not exposed over MCP, and neither is changing a role. Team members are MANAGERs on your own account — people, not accounts. For the agency sub-accounts whose data you can read with a userId argument, use subaccount_list instead.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds genuine context beyond that: the absence of any MCP-exposed mutation path and the fact that members are MANAGERs on the caller's own account. It does not describe the return shape or ordering, which is the only remaining 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 short sentences, each carrying distinct information: what it returns, what is not available, and which sibling to use instead. The alternative is placed last, after the reader knows what this tool is.
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 tool with no output schema, the description covers identity, scope, safety, and alternatives well. The one omission is the returned record structure, which the description can only gesture at with 'and their roles' since no output schema exists to carry 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 tool takes zero parameters, so the baseline is 4. The description correctly says nothing about inputs, and the `userId` mention is clearly attributed to other tools rather than implying a parameter 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 the resource and its content precisely: people with access to this account and their roles. It also explicitly distinguishes itself from the sibling `subaccount_list` and clarifies that team members are people, not accounts, which removes the main ambiguity an agent would have.
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 routing rule: for agency sub-accounts read with a `userId` argument, use `subaccount_list` instead. It also closes off dead ends by stating that inviting, removing, and role changes are not exposed over MCP, so the agent will not search for nonexistent write tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
template_getGet a templateARead-onlyIdempotentInspect
Full body and subject of one saved template, so you can paste it into a sequence step or adapt it for a new campaign. Returns text. Nothing is applied to a campaign until you pass it to flow_set (any step) or sequence_update (copy on a running campaign).
| Name | Required | Description | Default |
|---|---|---|---|
| templateId | Yes | Template id, from `template_list`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds valuable behavioral context beyond that: it returns text and makes explicit that nothing is applied to a campaign until passed to flow_set or sequence_update.
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 tightly written sentences: the return content comes first, followed by the downstream-effect constraint. No filler, and 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?
No output schema exists, but the description discloses the return shape ('Returns text', body and subject), which is what an agent needs. Only minor gap is no mention of behavior when templateId is invalid or not found.
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?
Single required parameter with 100% schema description coverage ('Template id, from `template_list`'). The description adds no further parameter detail, which is acceptable given the schema already does the work — 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?
States a specific verb and resource ('Full body and subject of one saved template') and makes clear it is a single-item retrieval, distinguishing it from template_list and template_upsert. An agent immediately knows what it gets back.
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?
Explains the intended downstream usage — pasting into a sequence step or adapting for a new campaign — and names the two consumers, flow_set and sequence_update. Missing an explicit statement of when to use it versus template_list, though the schema's 'from `template_list`' hint partly covers that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
template_listList message templatesARead-onlyIdempotentInspect
Saved copy your team reuses across campaigns. Paste the body into a step when authoring a sequence. Snippets of copy, not sequence shapes: the prebuilt multi-step sequences flow_from_template applies are a different library, matched by name there. These do not attach to a campaign by themselves — read one with template_get and pass the text to flow_set.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations handle safety (readOnlyHint), the description adds valuable behavioral context by defining the nature of the items ('Snippets of copy, not sequence shapes') and how they function in a workflow, which is essential for accurate tool selection.
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 information, utilizing every sentence to define the tool's scope, purpose, and relationship to other tools. It is slightly verbose but perfectly structured for routing and contextualization.
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 lack of an output schema and the list nature of the tool, the description is highly complete by providing explicit mapping to related tools (`template_get`, `flow_set`) and defining what the result represents (copy vs. full flow).
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 zero parameters, the baseline score of 4 is appropriate. The description does not need to compensate for a lack of schema, and provides no unnecessary 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?
The description clearly identifies the resource as 'Saved copy your team reuses' and specifies that it contains 'Snippets of copy', distinguishing it from multi-step sequences and naming the relevant sibling tools (`flow_from_template`).
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 guidelines by explaining the context ('Paste the body into a step when authoring a sequence') and defining the alternative scope (full multi-step sequences are handled by `flow_from_template` and single templates by `template_get`).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
template_upsertCreate or update a templateADestructiveIdempotentInspect
Save reusable copy. Pass templateId to update an existing template rather than create a new one. A snippet in the library, nothing more: saving it does not put it in any campaign, which is flow_set, and it is not one of the prebuilt sequence shapes flow_from_template applies. Updating replaces the body, so read it with template_get first if you do not already have the full text.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Short label. | |
| message | Yes | Body. Supports {{firstName}}-style merge fields. | |
| subject | No | For email and InMail templates. | |
| templateId | No | Template id, from `template_list`. | |
| useCredits | No | InMail templates: allow spending InMail credits. | |
| assingedUsers | No | Restrict to these team member ids. Field name is spelled this way in the schema. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare mutation and destructive behavior, but the description adds important operational context: updating replaces the body and should be preceded by `template_get` if the full text is not already available. It also clarifies that saving does not inject the snippet into campaigns, which goes beyond the annotation block.
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 the create-vs-update condition, then follows with focused exclusions and safety guidance. Every sentence earns its place, with no redundant restatement 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?
For a 6-parameter upsert tool with full schema coverage and annotations, the description covers the important behavioral and routing details. The main remaining gap is that it does not describe the return value or whether the saved template is returned, but otherwise it is sufficiently 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 coverage is 100%, so the baseline is 3, but the description adds key meaning for `templateId`: its presence switches the tool from create to update. It also reinforces the need to read the existing body before replacing it, which is more than the schema's terse `Template id` 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 operation—saving a reusable template—and explicitly distinguishes create vs. update via `templateId`. It also separates the tool from siblings like `flow_set` and `flow_from_template`, so an agent can identify its role without opening other 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 explicit when-to-use guidance: pass `templateId` to update rather than create, use `template_get` first when updating without the full body, and do not confuse this with putting content into campaigns (`flow_set`) or applying prebuilt sequence shapes (`flow_from_template`).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unread_countsUnread countsARead-onlyIdempotentInspect
Badge counts for notifications, unread conversations, pending activities and open tasks. Counts only, as a cheap way to see whether anything needs attention. For the items themselves use notification_list, conversation_list, activity_list or task_list.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world behavior. The description adds useful context beyond annotations by clarifying that the result is counts only and is intended as a cheap attention check, though it does not describe the exact response shape.
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 with no wasted language. The core purpose is front-loaded, followed immediately by the alternative tools for item-level access.
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 aggregate tool with no output schema, the description is complete enough: it names the counted categories, clarifies that only counts are returned, and points to the correct list tools for 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?
The tool has zero parameters, so there are no parameter semantics to explain. The baseline for a parameterless tool is 4, and the description appropriately does not invent parameter 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 resource and output type: badge counts for notifications, unread conversations, pending activities, and open tasks. It clearly distinguishes this aggregate-count tool from the item-listing siblings by naming them 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?
It gives an explicit use case ('a cheap way to see whether anything needs attention') and directly routes the agent to the correct alternatives when actual items are needed: notification_list, conversation_list, activity_list, or task_list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiWho am IARead-onlyIdempotentInspect
The authenticated account: name, email, role, plan, entitlements and notification settings. Call this first in a new conversation — the plan tells you whether Pro-only steps (Email, Qualifier, AI Hook, Finder, Event invite) are available, and permissions gates several features. For a team-member key this reports the account OWNER, not the team member: the backend resolves such a key to the owner, because that is the account being acted on and the one holding the plan. Identity and entitlements only. It reports no campaign or lead data, and it cannot change anything — profile edits are account_settings_update. Read _derived before proposing any Pro or permission-gated step, because the refusal from a gated tool is real and has no workaround.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description still adds real substance beyond them: it cannot mutate anything, a team-member key surfaces the OWNER rather than the member, and refusals from gated tools are described as real with no workaround. The instruction to read `_derived` before proposing Pro steps is concrete behavioral guidance not present in 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?
Front-loaded with the return payload and the 'call this first' directive, and every sentence carries distinct information (scope, key resolution, gating, no-write boundary). It is dense — the final sentence about refusal workarounds restates the gating point — 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?
There is no output schema, so the description carries the burden of explaining returns and it does so explicitly (identity fields plus `_derived`). It also covers the two edge cases an agent would get wrong on its own: permission-gated steps and the team-member key resolving to the owner.
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?
Zero parameters, so the baseline of 4 applies. The description's only parameter-adjacent content is `_derived`, which is a response field rather than an input, but it is useful signal about what to inspect before acting.
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 ('The authenticated account') and enumerates exactly what it returns: name, email, role, plan, entitlements, notification settings. It explicitly bounds itself against siblings ('Identity and entitlements only. It reports no campaign or lead data'), so an agent can distinguish it from account_settings_update or analytics_account without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a hard directive — 'Call this first in a new conversation' — with the reason (the plan gates Pro-only steps). It names the alternative for writes ('profile edits are account_settings_update') and explains the team-member-key case up front, including why the backend resolves it to the owner.
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.
133 tool updates
- First observed
account_settings_update - First observed
activity_list - First observed
activity_skip - First observed
agent_delete - First observed
agent_duplicate - First observed
agent_get - First observed
agent_list - First observed
agent_logs - First observed
agent_query - First observed
agent_stats - First observed
agent_train - First observed
agent_upsert - First observed
analytics_account - First observed
analytics_campaign - First observed
analytics_campaign_funnel - First observed
analytics_reporting - First observed
analytics_trend - First observed
appointment_get - First observed
appointment_list - First observed
automation_duplicate - First observed
automation_get - First observed
automation_list - First observed
automation_upsert - First observed
blacklist_add - First observed
blacklist_add_bulk - First observed
blacklist_copy - First observed
blacklist_delete - First observed
blacklist_export - First observed
blacklist_list - First observed
campaign_activity_summary - First observed
campaign_add_prospects - First observed
campaign_create - First observed
campaign_create_ab_variant - First observed
campaign_delete - First observed
campaign_duplicate - First observed
campaign_export_stats - First observed
campaign_generate_ai_sequence - First observed
campaign_get - First observed
campaign_launch - First observed
campaign_list - First observed
campaign_logs - First observed
campaign_preview_message - First observed
campaign_send_test_email - First observed
campaign_set_source - First observed
campaign_set_status - First observed
campaign_update - First observed
campaign_upload_leads - First observed
conversation_get - First observed
conversation_list - First observed
conversation_mark_all_read - First observed
conversation_update - First observed
email_account_add_imap - First observed
email_account_get - First observed
email_account_list - First observed
email_account_oauth_url - First observed
email_account_stats - First observed
email_account_update - First observed
flow_audit - First observed
flow_from_template - First observed
flow_get - First observed
flow_history - First observed
flow_set - First observed
help_videos - First observed
holiday_add - First observed
holiday_delete - First observed
holiday_list - First observed
hyperise_images - First observed
kb_attach - First observed
kb_delete - First observed
kb_list - First observed
kb_upsert - First observed
lead_add - First observed
lead_blacklist - First observed
lead_delete - First observed
lead_export - First observed
lead_flow_state - First observed
lead_get - First observed
lead_list - First observed
lead_move - First observed
lead_note_add - First observed
lead_note_update - First observed
lead_notes_list - First observed
lead_update - First observed
linkedin_account_daily_stats - First observed
linkedin_account_get - First observed
linkedin_account_list - First observed
linkedin_account_refresh - First observed
linkedin_account_ssi - First observed
linkedin_account_stats - First observed
linkedin_account_update - First observed
message_delete - First observed
message_draft_ai_reply - First observed
message_send - First observed
notification_list - First observed
notification_mark_read - First observed
persona_create - First observed
persona_delete - First observed
persona_get - First observed
persona_list - First observed
persona_update - First observed
placeholder_add - First observed
placeholder_delete - First observed
placeholder_list - First observed
post_generate - First observed
post_list - First observed
post_schedule_get - First observed
post_schedule_set - First observed
post_schedule_settings - First observed
post_upsert - First observed
reference - First observed
reminder_create - First observed
reminder_delete - First observed
reminder_list - First observed
saved_reply_list - First observed
saved_reply_upsert - First observed
search_url_build - First observed
sequence_leads_at_step - First observed
sequence_list - First observed
sequence_step_stats - First observed
sequence_update - First observed
subaccount_list - First observed
tag_create - First observed
tag_delete - First observed
tag_list - First observed
tag_update - First observed
task_list - First observed
task_upsert - First observed
team_members_list - First observed
template_get - First observed
template_list - First observed
template_upsert - First observed
unread_counts - First observed
whoami
Publisher details
- Operator
- Linkedcamp · Publisher source
- Operator website
- https://linkedcamp.com
- Vendor relationship
- First-party
- Documentation
- https://docs.linkedcamp.com/mcp/overview
- Trust center
- https://www.linkedcamp.com/trust
- Restrictions
- Not applicable
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRemote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.MIT
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs115 npm58 PyPIMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1618 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.