Capable
Server Details
MCP-native CRM: your assistant proposes updates, you approve them field by field.
- Status
- Healthy
- Uptime
- 82.4% over 27 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 66 tools
The surface spans distinct domains, but several clusters are easy to confuse: get_context/get_record/search_records/run_report, the run/show/export/schedule_report family, and define_* vs update_* admin tools. Descriptions disambiguate well, but the sheer breadth makes selection errors plausible.
All tool names use snake_case and a predominantly verb_noun pattern (create_record, update_quote, manage_webhooks), with only mild variation between get/read/describe and manage/update. There is no mixed-case or chaotic naming.
66 tools is far above a practical agent tool surface and imposes heavy selection and cognitive load. The broad CRM/scheduling/billing/governance scope partly justifies the breadth, but the set remains too large.
Covers core CRM CRUD, soft delete/restore, schemas, pipelines, quotes, subscriptions, scheduling/meetings, reports/exports, imports, approvals, webhooks, billing and privacy workflows. Some gaps exist, such as define-only programs and actions requiring the web panel, but coverage is unusually complete.
Available Tools
66 toolsadd_account_contactLink contact to accountADestructiveInspect
Link a contact to an account with a role from the workspace's account_contacts.role values (seed defaults: champion / economic_buyer / decision_maker / user / blocker / influencer / csm_primary). Use is_primary_champion=true to mark the single primary champion (at most one per account; setting it auto-clears any previous primary). Distinct from opportunity_contacts — account_contacts persist across the customer relationship even when no opportunity is open. Resolve account_id + contact_id with search_* first — never invent ids.
When to use: When you learn someone's role at a customer. Set is_primary_champion=true for the single most important advocate.
Example: Add Sarah Chen as the primary champion at Acme.
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | Defaults: champion | economic_buyer | decision_maker | user | blocker | influencer | csm_primary. A workspace admin may rename or add values — see the live set in propose_updates' workspace.enum_values, or an admin's describe_schema. | |
| notes | No | Free-text context for this link (e.g. how the person relates to the account), stored on the account_contacts row; re-linking without it clears any stored note. | |
| account_id | Yes | A uuid. | |
| contact_id | Yes | A uuid. | |
| is_primary_champion | No | Boolean (true/false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| created | No | |
| account_contact | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and readOnlyHint=false, so the mutation profile is known. The description adds real behavioral value beyond that: the at-most-one primary champion invariant and that setting it auto-clears any previous primary. What it doesn't disclose is the destructive side of overwriting an existing link (e.g. what happens to a prior role/notes on re-link), which for a destructive-hinted tool would be worth one sentence.
Agents need to know what a tool does to the 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 side effect, then cleanly sectioned into 'When to use' and 'Example'. Slightly redundant where the seed role values are repeated verbatim from the role parameter's 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?
An output schema exists, so return values need no explanation. For a 5-param mutation the description covers the action, the uniqueness invariant, id resolution preconditions, terminology vs. opportunity_contacts, and a worked example — 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, but the description adds semantics the schema does not: it names the seed role vocabulary and explains the uniqueness/auto-clear rule for is_primary_champion, which is a constraint rather than a type. The role list is somewhat duplicated from the schema, which caps it below 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+resource ('Link a contact to an account with a role') and explicitly distinguishes itself from the opportunity_contacts concept, which is the most likely confusion point. An agent can tell what this creates and where it lives 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 'When to use: When you learn someone's role at a customer', plus the qualifier for is_primary_champion, plus a precondition ('Resolve account_id + contact_id with search_* first — never invent ids'). It also supplies a concrete example, 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.
add_noteAdd noteAInspect
Attach a free-form note to any record (account / contact / opportunity / touch). MUST link to at least one. Returns the created note.
When to use: Free-form context that doesn't fit a structured field. Notes are searchable and soft-deleted.
Example: Note on Acme: procurement team requires SOC2 by Q1 — we need a story ready.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Must not be empty. | |
| touch_id | No | A uuid. | |
| account_id | No | A uuid. | |
| contact_id | No | A uuid. | |
| request_id | No | Retry key: a client-generated UUID. Repeating a call with the same request_id and arguments within 24h replays the earlier result instead of creating a second note; it is never stored on the note. | |
| opportunity_id | No | A uuid. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| account | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, non-idempotent write, so the bar is lower. The description still adds useful lifecycle facts beyond them: notes are searchable and soft-deleted (i.e. recoverable), and the created note is returned. It omits any permission or visibility model for shared records.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the required-linkage constraint before the usage note and example, and every block carries information. The example sentence is somewhat long, but it concretely illustrates the expected free-form content, so it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations covering the safety profile and an output schema present, the description covers the remaining agent-relevant questions: required linkage, searchability, soft-delete semantics, and return behavior. Only secondary details (permissions/visibility, size or rate limits on the note body) are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds a genuine cross-parameter rule the schema does not encode: 'MUST link to at least one' of the four polymorphic id fields, each of which is documented only as 'A uuid.' It adds the cardinality constraint but no guidance on how the target type affects behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('Attach a free-form note to any record') plus the accepted target types (account/contact/opportunity/touch), the key linkage constraint, and the return value. It is clear enough to distinguish it from structured writers like create_record, but it never names a sibling it is not (e.g. log_touch), so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'When to use: Free-form context that doesn't fit a structured field' gives a clear positive selection criterion distinguishing it from structured-field mutations. It does not, however, state when NOT to use it or point at alternatives (log_touch, update_record) that an agent might otherwise reach for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_templateApply schema templateAIdempotentInspect
Apply a curated schema template from the workspace's registry — a pre-vetted bundle of objects, fields, pick-list values, pipelines and starter views — in one step (admin-only). Idempotent: existing keys are skipped, so re-applying or overlapping templates never duplicates. describe_schema's templates section lists every key with its label, blurb and what it provisions (object / field / pipeline / program counts); an unknown key returns the available templates with a did-you-mean. Returns what was created plus the workspace's refreshed enabled objects.
When to use: When an admin wants to adopt a whole curated bundle at once — objects, fields, pick-list values, pipelines and starter views — instead of defining each piece. Idempotent: re-applying only adds what's missing.
Example: We send priced quotes — set up the quoting template.
| Name | Required | Description | Default |
|---|---|---|---|
| template_key | Yes | Key of a curated template — one of describe_schema's `templates` keys (e.g. account_hierarchy, quoting); an unknown key returns the available templates instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
| applied | No | |
| created | No | |
| workspace | No | |
| did_you_mean | No | |
| template_key | No | |
| available_templates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (idempotentHint, destructiveHint=false), the description discloses admin-only authorization, the idempotency mechanism ('existing keys are skipped', so no duplication on overlap), unknown-key handling ('did-you-mean'), and the return payload. This is exactly the 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?
Well front-loaded and appropriately scoped, but idempotency is stated twice ('Idempotent: existing keys are skipped' and again in When-to-use as 're-applying only adds what's missing'), a minor redundancy in an otherwise tight 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?
An output schema exists, so return values need only a passing mention, which is given. Authorization, idempotency, error behavior, and the key-discovery path are all covered, leaving nothing an agent needs in order to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the terse schema baseline would be 3, but the description adds real navigation value: it tells the agent the key comes from describe_schema's `templates` section, gives examples (account_hierarchy, quoting), and states unknown-key behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Apply a curated schema template') and immediately characterizes the resource as 'a pre-vetted bundle of objects, fields, pick-list values, pipelines and starter views.' This clearly distinguishes it from the many define_*/archive_* siblings that operate on single pieces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 'When to use' section explicitly frames the case ('adopt a whole curated bundle at once ... instead of defining each piece'), routing the agent away from the granular define_* siblings. It also gives a concrete example (quoting).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_meetingCancel meetingADestructiveInspect
Cancel a meeting — DESTRUCTIVE and two-step: the first call (without confirm) changes nothing and returns what cancelling will do ({cancelled:false, requires_confirm:true}); confirm with the user, then call again with confirm:true. Releases every tentative hold, and the confirmed event if booked, from every host's calendar; a booked invitee gets a cancellation email. Cannot be undone — re-propose to start over. Returns the meeting's final state.
When to use: When plans change. Destructive and two-step: the first call changes nothing and says what cancelling will do; confirm with the user, then call again with confirm:true. A booked invitee gets a cancellation email.
Example: Cancel my pending meeting with Sara.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Optional reason — recorded on the audit log. | |
| confirm | No | Pass true only after the user confirmed; without it the call performs nothing and returns what would happen. | |
| meeting_id | Yes | The meeting's id, from propose_meeting or search_records. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| slots | No | |
| meeting | No | |
| guidance | No | |
| cancelled | No | |
| meeting_id | No | |
| repairs_flagged | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which already flag destructiveHint/idempotentHint/openWorldHint): it specifies that the first call is a no-op returning {cancelled:false, requires_confirm:true}, that every tentative hold and the booked event are released from every host's calendar, that a booked invitee receives a cancellation email, and that the action is irreversible.
Agents need to know what a tool does to the 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 critical destructive/two-step warning, but the same content is duplicated: the two-step process is explained in the opening paragraph and again under "When to use," and the cancellation-email behavior appears twice. The redundancy dilutes an otherwise well-structured 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?
An output schema exists, so return details need not be spelled out, and the description still covers the destructive profile, the confirmation protocol, the calendar side effects, and irreversibility. Nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents meeting_id, reason, and confirm's confirmation semantics. The description reinforces the two-step confirm workflow but largely repeats what the confirm field description already states, adding little new 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?
States a specific verb and resource ("Cancel a meeting") with an unambiguous scope, plus the destructive, two-step nature. An agent can immediately distinguish it from siblings like reschedule_meeting, propose_meeting, or record_meeting 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 ("When to use: When plans change") and a concrete workflow for the confirm step, plus the fallback guidance "re-propose to start over." However it never names alternatives explicitly (e.g., reschedule_meeting for changes that aren't cancellations), so routing relies on inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_subscriptionCancel subscriptionADestructiveInspect
Cancel a subscription. Sets status='canceled', canceled_at, cancellation_category, cancellation_reason. Writes a subscription_events row of type 'canceled' with a negative mrr_delta. Trigger drops account.current_arr_cents. Returns a suggestion to set account.lifecycle_stage='churned' if this was the last active subscription. DESTRUCTIVE: confirm with the user first, then call again with confirm: true.
When to use: Customer cancellation. Always capture the cancellation_category for retention analysis.
Example: Acme cancelled — they consolidated to a competitor. Cancel the subscription effective today.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A uuid. | |
| confirm | No | Boolean (true/false). | |
| canceled_at | Yes | Must match /^\d{4}-\d{2}-\d{2}$/. | |
| opportunity_id | No | A uuid. | |
| cancellation_reason | No | Free-text reason in the customer's words, stored on the subscription and as the 'canceled' event's note; cancellation_category is the coded bucket. | |
| cancellation_category | Yes | Defaults: price | product_fit | competitor | no_decision | business_change | support | consolidation | other. A workspace admin may rename or add values — see the live set in propose_updates' workspace.enum_values, or an admin's describe_schema. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| account | No | |
| canceled | No | |
| guidance | No | |
| subscription | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, but the description goes well beyond that: it specifies the exact field mutations, the audit event written, the ARR rollup impact, the returned lifecycle suggestion, and the two-step confirm protocol ('confirm with the user first, then call again with confirm: true'). This is precisely the context an agent needs to avoid an irreversible mistake.
Agents need to know what a tool does to the 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 side effects, then separates 'When to use' and an example. Nearly every sentence earns its place; the example adds marginal value over the when-to-use line, which keeps it just short of ideal 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?
For a destructive mutation with an output schema present, the description covers effects, confirmation protocol, required inputs, and follow-up guidance. 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, but the description adds real meaning: it explains why cancellation_category matters (retention analysis) and clarifies confirm's role as a two-phase confirmation gate, which the schema reduces to 'Boolean (true/false)'. It also implicitly disambiguates reason vs. category, though that distinction is already carried by the schema text.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Cancel a subscription') and immediately enumerates the exact state written (status='canceled', canceled_at, cancellation_category, cancellation_reason). The side-effect list (subscription_events row with negative mrr_delta, account.current_arr_cents drop) distinguishes it clearly from siblings like renew_subscription, update_record, or delete_record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'When to use: Customer cancellation' plus a worked example (Acme consolidating to a competitor) gives clear invocation context, and it directs the agent to always supply cancellation_category. It stops short of naming alternatives or when-not conditions (e.g., renew_subscription or restore_record), 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.
commit_reviewed_updatesCommit reviewed updatesADestructiveIdempotentInspect
Save only the explicitly approved review selection: unchanged receipt, approved proposal ids, confirm:true and UUID idempotency_key (normally review_id). First confirmation freezes selection; only the identical receipt/key/selection replays stored outcomes without execution. Expiry blocks first commits, not exact replays; no retained match requires CRM inspection before a fresh review. Current policy/role/scope/schema/revision/audit/automation guards apply. Select every prerequisite; dependency order applies, and failed/queued/unknown creates block dependents. Report saved/unsaved rows truthfully. For execution_in_progress poll unchanged; execution_state_unknown requires CRM inspection, never automatic write retries or fresh reviews. Success needs only a brief acknowledgement, no repeat review or save question.
When to use: After explicit app or chat approval; reuse the exact request to read stored results.
Example: Approve proposal IDs from that review and commit them.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to execute; omitted or false commits nothing and returns a prompt to get the user's explicit approval first. | |
| receipt | Yes | The receipt string returned by review_proposed_updates, passed back unchanged (it is bound to that review, this workspace and user, and expires). | |
| idempotency_key | Yes | A UUID minted once per review (normally the returned review_id); reuse the same key to replay stored outcomes instead of executing again. | |
| selected_proposal_ids | Yes | The review's proposal ids (its proposals[].id) the user explicitly approved — unique, each present in the receipt; the first confirmed call freezes this set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| summary | No | |
| outcomes | No | |
| replayed | No | |
| confirmed | No | |
| review_id | No | |
| review_commit | No | |
| request_status | No | |
| selection_mismatch | No | |
| frozen_selected_proposal_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by explaining that the first confirmation freezes the selection, that only an identical receipt/key/selection replays stored outcomes, and that expiry blocks first commits but not exact replays. It also discloses dependency ordering, guard application, and required handling for execution_in_progress versus execution_state_unknown.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core save action and behavior, then provides a 'When to use' section and example. The density is justified by the tool's complexity, though several semicolon-chained clauses and vague lines like 'Report saved/unsaved rows truthfully' reduce readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the destructive, idempotent commit nature of the tool, the description covers replay, expiry, idle/error states, dependency blocking, guards, and success acknowledgement. With an output schema and full input schema descriptions already present, this is 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 schema already documents all four parameters, including confirm, receipt, idempotency_key, and selected_proposal_ids. The description reinforces the approved-selection and idempotency semantics but adds little parameter-level detail beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Save only the explicitly approved review selection.' It distinguishes the operation from prose review and status tools by scoping the write to an already-approved receipt and selection, so an agent knows exactly what this commits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'When to use: After explicit app or chat approval' and 'reuse the exact request to read stored results.' It also rules out alternatives: no fresh reviews on execution_state_unknown and never automatic write retries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_quoteCreate quoteAInspect
Draft a quote for an account from catalog product IDs and quantities. The server snapshots catalog prices and computes lines/totals: never pass a price or money amount. Discounts are percentages (line and/or quote discount_pct); above-cap discounts are flagged. Products use unit_price_cents; per_unit multiplies by quantity, flat charges once, and missing/unknown pricing_mode means flat. A flat quantity >1 is flagged. Bundles expand automatically and inherit line discounts; out-of-tier quantities are flagged, not blocked. Returns the quote, priced lines and flags. Status draft/sent records a pre-commit artifact; invoicing and contracts happen elsewhere.
When to use: The user asks for a customer quotation.
Example: Quote Acme for 15 standard-plan units.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional display name for the quote; stored on the quote header, null when omitted. | |
| lines | Yes | At least one item. | |
| notes | No | Optional free-text notes stored on the quote header (terms, context); never read for pricing. | |
| status | No | One of: draft | sent. | |
| account_id | Yes | A uuid. | |
| valid_until | No | Must match /^\d{4}-\d{2}-\d{2}$/. | |
| discount_pct | No | A number from 0 to 100. | |
| opportunity_id | No | A uuid. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| quote | No | |
| created | No | |
| guidance | No | |
| line_items | No | |
| mixed_cadence | No | |
| missing_objects | No | |
| tier_validations | No | |
| annualized_total_cents | No | |
| pricing_mode_validations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly=false, destructive=false, idempotent=false), and the description substantially exceeds that. It discloses that the server snapshots catalog prices and computes totals, that out-of-cap discounts and out-of-tier bundle quantities are flagged rather than blocked, that bundles expand and inherit line discounts, and that status draft/sent records a pre-commit artifact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core constraint (never pass a price; server computes lines/totals) is front-loaded and most of the density is load-bearing pricing semantics. The pricing_mode clauses are somewhat compressed into run-on phrasing, costing a bit of readability, 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?
With an output schema present, the description needn't detail return values, yet it still summarizes them ('the quote, priced lines and flags'). For a non-idempotent mutation with 8 parameters and nested line objects, the description covers the behavioral and pricing rules an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds real semantics the schema lacks: it forbids passing money amounts, explains that discounts are percentages at both line and quote level, and clarifies pricing_mode behavior (per_unit multiplies, flat charges once, missing/unknown means flat). The only gap is that it never explains opportunity_id or valid_until, which the schema covers only shallowly.
Input schemas describe structure but not intent. Descriptions should explain 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 ('Draft a quote for an account') plus the input basis ('catalog product IDs and quantities'), and it explicitly bounds the scope by saying invoicing and contracts happen elsewhere. An agent can tell this apart from update_quote and from generic record creation 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?
There is an explicit 'When to use' line ('The user asks for a customer quotation') plus a concrete example, which is clear context for selection. It stops short of naming exclusions or the sibling to use for editing an existing quote (update_quote), so it is not a full when/when-not treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_recordCreate recordAInspect
Create a built-in or custom record with object_type + data; relationships take ids; built-ins use typed domain logic. Custom owners default to the caller; set display_field (usually name) for propose_updates matching. Sequence plans save atomically and never send. Touches record confirmed work; reuse captured source_touch_id or request_id + occurred_at. For lead/task, data.request_id (UUID) durably deduplicates retries; changed data conflicts. Task due: use due_at with the person's UTC offset and due_has_time:true for a stated time; a bare date is date-only. Returns the record. See data for sequence and activity fields.
When to use: Create built-in or custom records with object_type + data using the same domain logic.
Example: Add a partner 'Globex' with tier gold.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | New fields as key → value; relationships take target UUIDs; built-ins accept typed create fields. sequence: ordered steps [{title,brief,channel,day_offset}] + request_id UUID save the whole plan. timing_mode: from_start or after_previous; offsets stay cumulative; optional skip_weekends, pause_on_reply. Briefs accept CRM {{field}} tokens; preview with get_context(contact,sequence_brief). touch: source_touch_id reuses captured work, else request_id + occurred_at; sequence_action:{enrollment_id,step,outcome?,follow_up_on?} tracks confirmed work. Attempts and connection requests hold the step and require a follow-up date; not_now pauses; accepted/completed advance; retry pending tracking unchanged. | |
| owner_id | No | A uuid. | |
| request_id | No | Retry key: a client-generated UUID. Repeating a call with the same request_id and arguments within 24h replays the earlier result instead of creating a second record. For touch and sequence, put request_id inside data instead so the record itself stores it. | |
| object_type | Yes | Object key, e.g. account, contact, opportunity, task, touch, or a custom object's key; an unknown key returns the workspace's valid types instead of creating. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| record | No | |
| result | No | |
| created | No | |
| object_type | No | |
| custom_field_definitions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, destructive=false, openWorld=true, and idempotent=false. The description adds meaningful behavior beyond annotations: sequence plans save atomically and never send, touches require confirmed work or captured source_touch_id/request_id + occurred_at, lead/task retries dedupe via data.request_id while changed data conflicts, and the tool returns the record.
Agents need to know what a tool does to the 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 definition is front-loaded with the core create behavior and includes a 'When to use' section and an example. However, it is a dense wall of specialized clauses that partly duplicates the detailed schema, making it harder to scan than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex nested create tool, the description covers the main creation model, built-in versus custom behavior, sequence/touch edge cases, retry semantics, task due-date handling, and return behavior. With annotations and an output schema also present, an agent has enough context to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds useful semantics beyond the schema: custom owners default to the caller, display_field is usually name for propose_updates matching, task due_at should include the person’s UTC offset and due_has_time for stated times, and sequence/touch fields have special meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: create a built-in or custom record using object_type + data, with built-ins using typed domain logic. That distinguishes creation from update/delete, but it does not explicitly differentiate this tool from siblings such as log_touch, add_note, create_quote, or add_account_contact.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 'When to use' section mostly restates the purpose: create built-in or custom records with object_type + data. It gives field-level guidance for sequences, touches, and task due dates, but does not say when to choose this tool over update_record, log_touch, add_note, or other create siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
define_automationDefine automation ruleADestructiveInspect
Create an automation rule: when trigger_event fires (record.written) and condition_spec matches, run action_tool with action_args (a {{placeholder}} template over the trigger facts). The action re-enters the governance chokepoint, so it still respects approvals + write-scope. Requires the workspace automation flag to actually fire. Returns the rule. An existing rule is edited with update_record / delete_record on object_type "automation" (its id and key come from describe_schema).
When to use: When an admin wants an action to fire automatically on a record write — e.g. flag big deals, create a follow-up task.
Example: When an opportunity over $100k is created, make a task for me to review it.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Display name for the rule. Its slug becomes the rule key, which must be unique in the workspace. | |
| action_args | No | Arguments for action_tool. Text a person reads embeds {{record_name}} or {{account_name}}; ids and keys come from {{record_id}}, {{account_id}}, {{object_key}} or {{tool_name}}. A whole-string placeholder keeps the fact's raw type. | |
| action_tool | Yes | The registered tool to run, by name (e.g. create_record, add_note). Account-creating actions (create_account, migrate_crm, create_record of account) are refused. | |
| trigger_event | No | The event that fires the rule. Only "record.written" (any governed record write) exists today; it is the default. | |
| condition_spec | No | all (AND) / any (OR) lists of {field, op, value?} on object_key, tool_name, record_id, account_id; op eq/neq/gt/gte/lt/lte/contains/in/is_null/is_not_null. {} = every write. |
Output Schema
| Name | Required | Description |
|---|---|---|
| automation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, openWorldHint=true, idempotentHint=false), the description discloses that the action re-enters the governance chokepoint and still respects approvals and write scope, and that the workspace automation flag is required for the rule to actually fire. It does not say what happens on duplicate label/rule key or subsequent invocations, which matters given the non-idempotent 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?
Mechanics are front-loaded, followed by when-to-use, then an example — a clean triage order with no filler. Every sentence carries operational information (fire conditions, governance, flag prerequisite, edit path).
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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-param, nested-object, mutation tool with an output schema and full annotations, the description covers prerequisites, governance behavior, and the edit alternative. The gap is failure modes (duplicate key, refused account-creating action at runtime) which are only partly covered by the schema's action_tool 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 coverage is 100%, so the baseline is 3, but the description adds the cross-parameter semantics: condition_spec gates on trigger facts, action_args is a {{placeholder}} template over those same facts, and the whole pipeline runs through governance. That linkage between action_tool and action_args isn't fully conveyed by the per-field schema text alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a concrete verb+resource (create an automation rule) and immediately explains the trigger/condition/action composition, which no sibling tool offers. It also explicitly distinguishes itself from update_record/delete_record for editing an existing rule, so an agent can separate it from the CRUD 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?
A dedicated 'When to use' line names the scenario (admin wants an action to fire automatically on a record write) and gives a concrete example. It also routes the editing case to the alternatives (update_record / delete_record on object_type 'automation') and points at describe_schema for the id/key.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
define_enum_valueDefine field valueADestructiveIdempotentInspect
Admin-only add, relabel, recolor, position, archive or reorder of built-in pick-list values listed by describe_schema. An existing value_key patches only supplied label/color/position/archived fields; its key and semantic role never change. A new key needs a label and, for behavior-driving fields, a semantic_role. archived:true removes a value from new picks; stored data stays valid and archived:false restores it. Nothing is deleted. Send order alone with every value_key, including archived keys, for atomic reordering. Changes apply immediately. Returns the stored value or reordered values.
When to use: An admin changes a field's available pick-list choices.
Example: Add a 'pilot' lifecycle stage that means active_customer.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | Optional hex color for the value's chip, e.g. "#2563eb"; display only. Null clears the color; omitting it keeps an existing value's color. | |
| field | Yes | The enum field's key on that object, e.g. lifecycle_stage, type, status, priority; describe_schema lists each field's values. | |
| label | No | Display label. Required for a NEW value (its slug becomes the value_key unless value_key is set); on an existing value_key it relabels. Omit to leave a label as is. | |
| order | No | Reorder form: the field's COMPLETE value_key list in the wanted order (every current key once, archived included). Send alone with object_type + field; a partial or unknown list is refused with the current keys. | |
| archived | No | true retires an existing value from new picks (stored data keeps it, reversible); false restores it. Omit to leave the state as is; a new value is never born archived. | |
| position | No | 0-based sort position among the field's values, lower first. A new value defaults to 0; omitting it keeps an existing value's position. To set the whole order, use `order` instead. | |
| value_key | No | Stable machine key (lowercase, underscores). Defaults to the slugified label; pass an existing key to relabel, recolor, reposition, archive or restore that value. | |
| object_type | Yes | Built-in object owning the enum field, e.g. account, opportunity, subscription, touch, task, lead. | |
| semantic_role | No | Required only for a NEW value on a behavior-driving field: account.lifecycle_stage takes prospect / active_customer / at_risk / churned / dormant, opportunity.type new / post_sale, subscription.status live / inactive (a refusal names the allowed roles). Locked once the value exists; omit or null otherwise. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| order | No | |
| values | No | |
| updated | No | |
| enum_value | No | |
| current_keys | No | |
| known_fields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true; the description adds critical corrective context that nothing is deleted, that archived:true only removes a value from new picks while stored data stays valid and archived:false restores it, and that changes apply immediately. It also discloses the immutability constraint (an existing value_key's key and semantic role never change) and the atomicity rule for reordering, which annotations cannot express. It doesn't state permission mechanics beyond "admin-only" or failure modes for partial data, keeping it at 4.
Agents need to know what a tool does to the 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 operation set, then the patch/create rules, then archive semantics, then the reorder contract, and finally explicit when-to-use plus an example. Dense but every sentence carries a rule; only the return-value sentence is marginal given an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all four invocation shapes (create, patch, archive/restore, atomic reorder), the semantic_role gating for behavior-driving fields, reversibility, immediacy, and the absence of deletion. With 9 parameters and high-stakes mutation semantics, 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 3 is the floor, and the description genuinely adds cross-parameter semantics: patches apply only to supplied fields, a new key needs a label and (for behavior-driving fields) a semantic_role, and order must be sent alone with a complete value_key list including archived keys. This is coordinated-usage knowledge the schema does not convey on its own.
Input schemas describe structure but not intent. Descriptions should explain 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 set of verbs (add, relabel, recolor, position, archive, reorder) against a specific resource (built-in pick-list values), and grounds the resource by pointing at describe_schema as the source of those values. This clearly separates it from define_field/define_object/define_pipeline siblings that define the containers rather than the values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"When to use: An admin changes a field's available pick-list choices" plus a concrete example gives an agent a clear trigger, and the description distinguishes the patch form from the order form. It stops short of explicitly excluding sibling alternatives like define_field (which creates the field itself), so it's strong but not fully routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
define_fieldDefine fieldAInspect
Add a custom field to any object that supports them (core objects with custom fields, or any custom object). field_type is one of text/number/date/select/multiselect/boolean/url, or 'relationship' (then pass target_object — stores the target record's id). select/multiselect need options. Returns the created field definition.
When to use: When an admin wants a new attribute on a core or custom object — text, number, date, choice, boolean, url, or a relationship.
Example: Add a 'square footage' number field to the Property object.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Display label. Its slug (lowercase, underscores) becomes the field key, which must be unique on the object. | |
| options | No | The allowed choices for a select or multiselect field, as labels; at least one is required. Ignored for other types. | |
| field_type | Yes | The field's storage type: text, number, date, select or multiselect (pass options), boolean, url, or relationship (a link to another object; pass target_object). | |
| object_type | Yes | Object key to add the field to — a built-in object that supports custom fields, or any custom object (see describe_schema). | |
| target_object | No | For field_type relationship: the object key (built-in or custom) whose record id this field stores. |
Output Schema
| Name | Required | Description |
|---|---|---|
| field | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds real behavioral value beyond that: conditional parameter requirements (relationship needs target_object, select/multiselect need options) and the fact that it returns the created field definition.
Agents need to know what a tool does to the 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 'When to use', then a concrete example. Every section earns its place, though the block structure is slightly longer than strictly needed for a well-covered 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 a 5-parameter tool, an output schema present, and annotations covering safety, the description supplies the missing conditional logic and an example without needing to explain return values. An agent has everything required to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3. The description goes beyond the schema by surfacing the cross-parameter conditionals in one place (field_type='relationship' → pass target_object) and enumerating the allowed type values, which helps an agent pick valid combinations.
Input schemas describe structure but not intent. Descriptions should explain 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 a custom field') with scope qualifier ('any object that supports them — core objects with custom fields, or any custom object'). This cleanly distinguishes it from siblings like update_field, archive_field, and define_object.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
A dedicated 'When to use' line frames the trigger as 'an admin wants a new attribute on a core or custom object', which is clear operational context. It does not, however, explicitly contrast with update_field or say when not to add a field, so it stops short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
define_objectDefine object typeAInspect
Create a new custom object TYPE (e.g. Partner, Product, Investor) to operate on via create_record / update_record / search_records (admin-only). Anti-sprawl: if a similar object exists this returns a suggestion to reuse it — pass confirm_new:true to create anyway. display_field names the data key holding a record's display name (default 'name'); the entity matcher and cards use it. Returns the created object definition.
When to use: When an admin wants to track a kind of thing the built-in objects don't cover — a genuinely new noun, not a relationship type (investor or partner are stickers on a company or person). Anti-sprawl checks for near-duplicates first.
Example: We manage real estate — add a Property object.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | A key from Capable's curated object-icon set (e.g. landmark, factory, handshake, flask); an unknown key is rejected with suggestions. Omit for the neutral default. | |
| blurb | No | One short sentence saying what records of this object represent; shown in describe_schema and Settings. | |
| label | Yes | Singular display name, e.g. Partner. Its slug (lowercase, underscores) becomes the object's stable key; a built-in's key is refused. | |
| plural | No | Plural display name for lists and the menu. Defaults to the label + "s". | |
| shared | No | true lets any non-viewer edit every record of this object; false (the default) lets only the record's owner, admins and managers edit it. | |
| confirm_new | No | Pass true to create even when a similar object exists; otherwise the anti-sprawl check returns the matches instead of creating. | |
| display_field | No | The data key holding a record's display name — a lowercase field key such as "name" or "fund_name"; defaults to "name". |
Output Schema
| Name | Required | Description |
|---|---|---|
| object | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare a non-read-only, non-destructive, non-idempotent write), the description discloses that the call is admin-only, that the anti-sprawl check can return matches INSTEAD of creating, and that display_field drives the entity matcher and cards. These are outcome-changing behaviors an agent could not 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 the anti-sprawl behavior, then a when-to-use block and an example. Slightly penalized because anti-sprawl is stated twice (once inline, once in the when-to-use paragraph), which 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?
An output schema exists, so return values need not be spelled out (the summary line 'Returns the created object definition' suffices). For a 7-parameter admin mutation, the description covers authorization, side-effect behavior, and the confirm escape hatch — 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?
Schema coverage is already 100%, so the baseline is 3. The description goes slightly further by explaining downstream semantics — that display_field feeds the entity matcher and cards, and that confirm_new is the mechanism to override anti-sprawl — adding meaning beyond the schema's field-level text.
Input schemas describe structure but not intent. Descriptions should explain 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 a new custom object TYPE') with concrete examples (Partner, Product, Investor) and explicitly ties it to how the type is then used (create_record / update_record / search_records). This cleanly separates it from siblings like update_object, define_field, and define_pipeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Has a dedicated 'When to use' section stating the triggering condition (an admin tracking a kind of thing built-in objects don't cover), an exclusion (not a relationship type — investor/partner are stickers on a company or person), and the anti-sprawl escape hatch (confirm_new:true). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
define_pipelineDefine pipelineAInspect
Create an additional pipeline (a named stage sequence) for opportunities or a custom object. Omit stages to seed from the workspace default pipeline, or pass stages as [{key, label, role, is_closed?, is_won?, requires?, requires_mode?}] (role one of unqualified/qualifying/active/commit/won/lost; requires lists the field keys a deal must have filled to enter the stage). default_for_types names the opportunity type keys this pipeline is the default for, so new deals of a mapped type start on it (a type maps to one pipeline). Returns the created pipeline.
When to use: When a motion needs its own stage sequence — e.g. an investor raise separate from the customer pipeline. Optionally set which deal types default onto it.
Example: Create an investor pipeline: Intro, Pitch, Diligence, Committed, Invested.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Display name. Its slug (lowercase, underscores) becomes the stable pipeline_key, which must be unique in the workspace. | |
| stages | No | Ordered stages [{key,label,role,is_closed?,is_won?,requires?,requires_mode?}], role unqualified/qualifying/active/commit/won/lost; omit or [] copies the default pipeline's stages. | |
| applies_to | No | The object key this pipeline runs on (e.g. opportunity). Defaults to opportunity when omitted. | |
| default_for_types | No | Opportunity `type` value keys this pipeline is the default for: new deals of a mapped type start on it. A type maps to one pipeline (a double claim is rejected; an unknown key is rejected with the known keys). Registry value keys, not fixed type names. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pipeline | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only establish the safety profile (writable, non-destructive, non-idempotent, closed-world). The description goes further: omitted stages seed from the workspace default, a type maps to exactly one pipeline, double claims and unknown type keys are rejected, and the call returns the created pipeline. It does not mention the uniqueness requirement being an error at runtime beyond the label's slug note, but the creation-side behavior is well 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?
Front-loads the operation, then seeding behavior, then a labeled "When to use" and "Example" section. Slightly over-long because the inline stage object shape duplicates the schema's own description, which is redundant rather than harmful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the single "Returns the created pipeline" line suffices. For a 4-parameter create tool with rich annotations and a full schema, the definition covers purpose, seeding fallback, validation, and type mapping — only authentication/preconditions and alternative routing are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents label, stages, applies_to and default_for_types in depth. The description largely restates what the schema says (stage shape, role enum, requires gate, type-to-pipeline mapping), adding little syntax or semantics the agent could not read in 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 ("Create an additional pipeline") plus its scope (opportunities or a custom object), and the word "additional" plus "extra" cleanly separates it from update_pipeline/archive_pipeline in the sibling list. 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?
An explicit "When to use" section names the trigger condition — a motion that needs its own stage sequence, with an investor-raise-vs-customer-pipeline example. It does not name the adjacent alternatives (update_pipeline, archive_pipeline) or state when NOT to create a new pipeline, so the routing guidance is clear but not exclusionary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
define_programDefine programAInspect
Create a top-level program (a parallel workstream like Investor Relations or Partnerships, a peer of the built-in Revenue motion). applies_to lists the object keys it claims; membership_spec ({pipeline_keys?, stage_roles?, lifecycle_roles?, sub_status_roles?}) decides which records land in it. Programs are define-only from here: there is no update or archive verb for them yet (an admin edits them in Settings → Behavior; describe_schema lists them with their ids). Returns the created program.
When to use: When an admin runs a workstream alongside Revenue — Investor Relations, Partnerships — that should get its own lane.
Example: I'm also raising money — set up an Investor Relations program.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Display name. Its slug becomes the program key, which can't be revenue or a built-in phase key (pre_sales, sales, customer_success). | |
| applies_to | Yes | Object keys this program can claim records of, e.g. ["investor"] or ["opportunity"]; at least one is required. | |
| membership_spec | No | {pipeline_keys?, stage_roles?, lifecycle_roles?, sub_status_roles?}, string arrays; present dimensions must all match, absent = any. Default {} claims every applies_to record. |
Output Schema
| Name | Required | Description |
|---|---|---|
| program | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose mutation (readOnlyHint=false), non-destructive, non-idempotent, closed-world behavior. The description adds genuinely non-obvious context beyond that: the define-only lifecycle with no update/archive verb yet, and where edits must happen instead. It does not address duplicate-label behavior or key collisions beyond the schema's own note.
Agents need to know what a tool does to the 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 definition is front-loaded and the 'When to use' plus example are clearly separated. The opening sentence is long and dense with inline notation ({...}, applies_to), which slightly hurts scanability 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 an output schema present, the return value needn't be explained, and the annotations cover the safety profile. The description fills the remaining gaps on lifecycle, selection intent, and a worked example, leaving nothing an agent needs to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds conceptual meaning by explicitly relating the two key parameters: applies_to claims object keys while membership_spec decides which records land in the program. That division of responsibility is useful framing not obvious from the field list alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a top-level program') and immediately frames what a program is (a parallel workstream peer to the built-in Revenue motion). This cleanly distinguishes it from structural siblings like define_pipeline, define_object, and define_field, which also create top-level entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains an explicit 'When to use' clause naming the triggering scenario (an admin running a workstream alongside Revenue) plus a concrete example. It also pre-empts misuse by stating programs are define-only and that an admin edits them in Settings, so an agent won't hunt for an update/archive verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
define_rollupDefine rollupADestructiveInspect
Create a derived-metric rollup that aggregates a custom source object onto a target field (e.g. usage_revenue = sum of usage records onto an account field). agg is sum/count/avg/min/max. The source must be a custom object; ARR/renewal fields are system-owned and can't be targets. Returns the created rollup. An existing rollup is edited with update_record / delete_record on object_type "rollup" (its id and key come from describe_schema).
When to use: When an admin wants a computed field — e.g. usage revenue summed from usage records onto the account.
Example: Roll up usage records into a usage_revenue field on the account.
| Name | Required | Description | Default |
|---|---|---|---|
| agg | Yes | Aggregation: sum, count, avg, min or max. Every kind except count needs agg_field. | |
| key | Yes | Stable name for the rollup, slugified to lowercase/underscores; unique per workspace. | |
| agg_field | No | The numeric source field key to aggregate; required unless agg is count (null then). For an account source only current_arr_cents. | |
| filter_spec | No | Optional numeric filters on source records, [{key, op, value}] with op one of eq/neq/gt/gte/lt/lte; key is a source data key, value a number (non-numeric clauses are skipped). Not supported when source_object is account. | |
| source_link | Yes | The relationship field key on the source whose value is the target record's id — it decides which source records roll up to each target. | |
| target_field | Yes | Field key on the target that stores the result (a custom field on a built-in target, a data key on a custom one); current_arr_cents and renewal_due_at are refused. | |
| source_object | Yes | Object whose records are aggregated: a custom object, or account (then agg_field may only be current_arr_cents). | |
| target_object | Yes | Object key whose records receive the value — a built-in one (account, contact, opportunity, subscription, touch, signal, task) or a custom object. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rollup | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=false, and the description adds real constraint context beyond that: the source must be a custom object, ARR/renewal fields are system-owned and cannot be targets, and it returns the created rollup. It does not explain why the operation is destructive or whether an existing rollup with the same key is overwritten, which is the one gap against the destructive annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core definition and its constraints are front-loaded in the first three sentences, with the alternative-editing path and the example trailing as supporting detail. The 'When to use' line and the example restate ideas already introduced, so it is slightly longer than strictly necessary 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?
With an output schema present, the description needn't explain return values (though it notes 'Returns the created rollup'), and it covers the key domain constraints for an 8-parameter, 6-required tool. What remains unstated is the failure/conflict behavior implied by destructiveHint=true and 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?
Schema description coverage is 100%, so the schema already explains key, agg, agg_field, filter_spec, source_link, source_object and target_object in detail; the baseline is therefore 3. The description reinforces the source/target restrictions (custom object only, ARR/renewal refused) but adds no syntax or format information the schema lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb+resource ('Create a derived-metric rollup that aggregates a custom source object onto a target field') and immediately clarifies what that means with a concrete example (usage_revenue = sum of usage records). It also distinguishes itself from the generic create_record/update_record siblings by stating that editing an existing rollup goes through update_record/delete_record on object_type "rollup".
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 situation ('when an admin wants a computed field') and routes the agent away from this tool for the editing case, specifying the exact alternative path (update_record / delete_record on object_type "rollup", with id/key from describe_schema). The alternative and the condition that selects it are both stated, 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.
delete_recordDelete recordADestructiveInspect
Archive by object_type + id. DESTRUCTIVE: call for confirmation, then confirm:true. Sets deleted_at, never hard-deletes: custom objects, reports (creator/manager/admin), whole quotes (lines cascade), contacts, opportunities, tasks, signals and touches. Contact history/account links remain restorable. Accounts refuse while any open opportunity or subscription remains; returned counts guide closing, re-pointing or marking lost first. Contacts/touches/notes/tasks remain as history and do not block. Subscriptions use cancel_subscription or update_record; individual quote lines use update_quote to change the line set. Returns the archived record.
When to use: A mistaken or duplicate record should go (archive, soft delete).
Example: Delete that duplicate contact .
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A uuid. | |
| confirm | No | Boolean (true/false). | |
| object_type | Yes | Object key of the record to archive, e.g. contact, opportunity, task, touch, account, report, quote, a custom object's key, or rollup / automation / field / object / pipeline (admin-only; the id from describe_schema); subscription is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| record | No | |
| result | No | |
| deleted | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say destructiveHint=true; the description carries far more: a confirm-then-confirm:true flow, soft delete via deleted_at with no hard delete, quote-line cascade, restorable contact history/account links, and the blocking rule for accounts with open opportunities or subscriptions (with returned counts to guide remediation). It also enumerates exactly which object types remain as non-blocking history.
Agents need to know what a tool does to the 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 DESTRUCTIVE warning, then the consequences, then alternatives, then an explicit 'When to use' plus example. The middle sentences are dense and clipped, but nearly every clause carries operational 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 destructive, dependency-laden mutation it covers confirmation, reversibility, cascade behavior, blocking preconditions, and routing to alternatives. Return values are noted ('Returns the archived record') and an output schema exists, so nothing material is left for the agent 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 baseline is 3; the description earns above that by giving confirm a procedural meaning (ask the user, then set true) rather than the schema's bare 'Boolean (true/false)'. object_type's refusal case for subscription and the admin-only keys are also reinforced, though most enumerations duplicate 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 specific verb+resource+keying scheme: 'Archive by object_type + id,' immediately followed by the DESTRUCTIVE marker. It enumerates the supported object types and explicitly distinguishes itself from cancel_subscription and update_quote, so an agent can separate it from create_record/update_record/restore_record 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?
'When to use: A mistaken or duplicate record should go (archive, soft delete)' states the triggering condition directly. It also names the exclusions and their alternatives: subscriptions use cancel_subscription or update_record, individual quote lines use update_quote. That is explicit when/when-not/alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_schemaDescribe workspace schemaARead-onlyInspect
Read the complete workspace shape: built-in/custom objects and fields, valid values and semantic roles, relationships (FK graph), pipelines/stages, active motions, qualification framework, programs, rollups and automation rules. Every role can read; schema changes stay admin-only. Custom field/object and named pipeline definitions include the id accepted by update_record/delete_record with object_type field/object/pipeline.
When to use: Discover the workspace's model and valid keys before reading or writing.
Example: What objects, fields, and valid values does my workspace have?
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| schema | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered; the description adds genuinely new context beyond that – 'Every role can read; schema changes stay admin-only' and the fact that custom field/object/pipeline definitions carry the id consumed by update_record/delete_record. It says nothing about response size or pagination for what is clearly a large 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?
Front-loaded with the core statement, then a labeled 'When to use' and a labeled example – a clean, scannable structure. The long comma-separated resource enumeration is dense but each item conveys real scope, so it 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 an output schema present, the description needn't explain return values, and it already covers scope, read permissions, the discovery-before-write trigger, and id reuse across tools. The only omission is any hint about payload size or how to narrow what is described as a 'complete' workspace dump.
Complex tools with many parameters or behaviors need more documentation. 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 and the baseline applies. The only parameter-adjacent content is the note about ids accepted by update_record/delete_record with object_type, which is cross-tool context rather than input 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?
Names a specific verb (Read) and a richly enumerated resource set: objects, fields, valid values, FK graph, pipelines/stages, motions, qualification framework, programs, rollups, automation rules. That enumeration makes it unmistakable against siblings like get_context, show_workspace_setup, or get_pipeline_summary, which each cover only a slice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
An explicit 'When to use: Discover the workspace's model and valid keys before reading or writing' gives a clear trigger condition. It does not name a competing alternative (e.g. get_context or get_help) or state when NOT to call it, 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.
export_reportExport report (CSV)ARead-onlyInspect
Export one saved analysis's results as CSV through the single audited egress path. Pass report_id for a saved analysis or an inline ReportSpec; returns the CSV text + row count + filename. A dashboard is not one CSV: choose a linked panel's source analysis or an inline panel's spec. Every export is recorded (a report_runs row + an audit_log report.export event).
When to use: Export one saved analysis or an inline ReportSpec as CSV. A dashboard needs a panel chosen first; it is not exported as one table. Every export is logged for governance.
Example: Export the ARR-by-industry report as a CSV.
| Name | Required | Description | Default |
|---|---|---|---|
| report_id | No | A saved analysis's id (uuid) to export; give this or definition (report_id wins when both are passed). A dashboard or segment id is refused. | |
| definition | No | An inline ReportSpec for a single analysis (not a dashboard) to export without saving it — the same shape as the ReportSpec variant of run_report's definition; omit when passing report_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| csv | No | |
| format | No | |
| filename | No | |
| row_count | No | |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: discloses that exports traverse a single audited egress path and that each export writes a report_runs row plus an audit_log report.export event, and states the return payload (CSV text + row count + filename). It also discloses refusal behavior (dashboard or segment id rejected) rather than leaving it to error discovery.
Agents need to know what a tool does to the 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 operation and return shape, then parameters, then when-to-use. It is slightly repetitive: the 'When to use' paragraph restates 'one saved analysis or an inline ReportSpec as CSV' and the dashboard caveat already given in the opening paragraph, costing a little 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?
An output schema exists and the description still names the returned fields; the precedence between report_id and definition, the dashboard exclusion, and the audit side-effect are all covered. For a two-parameter export tool, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented in the schema, including the report_id-wins precedence rule and the 'dashboard or segment id is refused' constraint. The description adds only a restatement ('Pass report_id for a saved analysis or an inline ReportSpec'), 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?
Opens with a precise verb+resource+format: 'Export one saved analysis's results as CSV,' and adds scope ('through the single audited egress path'). The dashboard caveat ('a dashboard is not one CSV') further sharpens what the tool does and does not cover, so it is distinguishable from report-reading/listing 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?
Has an explicit 'When to use' section plus a when-not condition (a dashboard needs a panel chosen first; it is not exported as one table). It stops short of naming alternative siblings such as run_report, show_report, or schedule_report, so the agent must infer the boundary from the schema's cross-reference instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finalize_workspace_setupFinalize workspace setupADestructiveIdempotentInspect
Commit onboarding answers into the workspace config; omitted fields stay untouched. active_motions records the confirmed motion choice and applies each motion's template; feature_templates applies standalone add-on templates (opted into during the interview) after the motion templates — an unknown feature key is skipped and named, never a failure; answers records checklist items without a dedicated field. Returns the updated workspace.
When to use: Call at the end of the interview once the user has confirmed the choices. Records the confirmed motion(s), applies their starter templates, and commits the answers — anything omitted keeps its default.
Example: Looks good — save those settings.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The workspace's display name — answers the checklist's name item; until set it reads "<sign-up email domain> workspace". | |
| answers | No | Answers to checklist items with no dedicated field, keyed by the checklist key (e.g. quoting_catalog); merged into the saved onboarding answers. | |
| framework | No | Qualification framework whose fields are filled on opportunities; passing the current default (spiced) records it as a chosen answer. | |
| template_key | No | Key of one extra starter template to apply beyond the chosen motions, from start_onboarding's available_templates; an unknown key is refused. | |
| active_motions | No | The confirmed motion key(s) from start_onboarding's available_motions — saved as the workspace's active motions, each applying its matching template. | |
| pipeline_stages | No | The default pipeline's stages, in order (which stages exist and their labels). An existing key keeps its role and entry requirements; an omitted is_closed / is_won keeps its stored value unless the flag you do send contradicts it. | |
| framework_custom | No | Custom framework definition for framework 'custom', shaped {fields:[{key,label}]} — each key becomes a qualification field on opportunities. | |
| feature_templates | No | Keys of standalone add-on templates opted into during the interview (e.g. quoting), applied after the motion templates; unknown keys are skipped and named, never refused. | |
| expected_active_motions | No | Guard against saving over a newer choice: the active_motions you last read (state.active_motions from start_onboarding or show_workspace_setup; null when none). If the saved motions differ, nothing is saved and the result returns updated:false with the current motions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| updated | No | |
| guidance | No | |
| workspace | No | The workspace's state — the same shape start_onboarding returns as `state`. |
| workspace_url | No | |
| active_motions | No | |
| applied_template | No | |
| applied_templates | No | |
| skipped_feature_templates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true; the description adds genuinely non-obvious behavior: omitted fields stay untouched, unknown feature keys are skipped-and-named (never a failure), while an unknown template_key is refused, and expected_active_motions acts as a concurrency guard returning updated:false. It stops short of explaining what gets destroyed or auth requirements, 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-loads the core action, then behavior, then when-to-use and an example. Dense but each block earns its place; slightly long for a config-commit 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?
With 9 params, nested objects, an output schema (return values need not be explained), and annotations covering safety, the description supplies the key behavioral context an agent needs. Remaining gaps are minor edge cases rather than blockers.
Complex tools with many parameters or behaviors need more documentation. 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 3 is the baseline. The description exceeds it by disclosing ordering semantics (feature templates applied after motion templates) and the skip-vs-refuse distinction that the schema alone does not spell out.
Input schemas describe structure but not intent. Descriptions should explain 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 — "Commit onboarding answers into the workspace config" — and immediately clarifies per-field behavior (active_motions, feature_templates, answers). This lets an agent distinguish it from siblings like update_workspace or show_workspace_setup 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?
"When to use: Call at the end of the interview once the user has confirmed the choices" gives an explicit trigger condition. It does not name alternative siblings (e.g. update_workspace for later edits), so routing is clear but not fully contrastive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_timesFind meeting timesARead-onlyInspect
Find three chronologically labeled slots; nothing is held yet. Refer to slots by label. Quote each rationale verbatim; starts_at/ends_at are opaque: never reformat or do timezone math. co_host_emails is workspace members only, never invitees (use invitee_timezone); relay dropped_co_hosts. Confirmed times are final: never call find_times again to validate, swap, commit or re-render them; search again only if the user asks for different times or a real conflict is returned. Once times are chosen, confirm topic and agenda once, then call propose_meeting. propose_meeting rechecks availability before placing holds. Modes: FRESH searches; SWAP (current_slots + propose_label) re-picks one slot and awaits a yes; COMMIT (current_slots only) finalizes labels. With a card, reply briefly without listing slots; otherwise list rationale bullets. Overrides, shortfalls and signed_in_as: capable://guide/scheduling.
When to use: Find candidate meeting times.
Example: Find three 30-minute morning slots next week.
| Name | Required | Description | Default |
|---|---|---|---|
| window_end | Yes | ISO 8601 end of the search window. | |
| duration_min | Yes | Meeting duration in minutes (30, 45, 60, or 90). | |
| window_start | Yes | ISO 8601 start of the search window. | |
| current_slots | No | The 3 committed slots with their labels, exactly as the previous call returned them — never reformat them. With propose_label swaps one; alone commits a previously accepted swap. | |
| propose_label | No | Which committed slot to re-pick (requires current_slots); narrow the window to the user's hint ("Friday morning" → that day 9–12). Not for committing — commit with current_slots alone. | |
| co_host_emails | No | Workspace members who also attend; every host's calendar is intersected. Never the external invitee — their availability is unknown by design; pass invitee_timezone instead. | |
| invitee_timezone | No | IANA timezone of the invitee (e.g. "Europe/Berlin"); candidates must then also fall inside 9–17 Mon–Fri there. Translate a city, country or offset the user names; never infer it from an email domain. Omit when it doesn't matter. | |
| target_starts_at | No | Exact ISO start for the swap's new candidate (requires current_slots and propose_label). Checked against every constraint; on failure proposed_slot.new is null and target_failure_reason says why — it is never silently substituted. | |
| workday_end_hour | No | Latest hour of day in each host's own timezone. Omit to use the saved availability (default 17); pass only to narrow this search ("mornings only" → 12). | |
| workday_start_hour | No | Earliest hour of day in each host's own timezone. Omit to use each host's saved availability (default 9); pass only when the user narrows this search ("mornings only", "after 2pm" → 14). Never persisted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | |
| note | No | |
| hosts | No | |
| slots | No | |
| events | No | |
| shortfall | No | |
| timed_out | No | |
| duration_min | No | |
| signed_in_as | No | |
| host_timezone | No | |
| proposed_slot | No | |
| co_host_notice | No | |
| dropped_co_hosts | No | |
| invitee_timezone | No | |
| workday_end_hour | No | |
| workday_start_hour | No | |
| visualization_weeks | No | |
| cohost_busy_intervals | No | |
| availability_blackouts | No | |
| display_offset_minutes | No | |
| scheduling_constraints | No | |
| cohost_blackout_intervals | No | |
| calendar_context_available | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/openWorld/non-idempotent; the description supplies the behavior that matters: nothing is held yet, holds happen later in propose_meeting, dropped_co_hosts must be relayed, and starts_at/ends_at are opaque so no reformatting or timezone math. It also specifies output presentation (card vs. rationale bullets) even though an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the key constraint (nothing held, quote rationale verbatim) and every sentence carries an operational rule. It is telegraphic and dense — semicolon-chained clauses plus a guide pointer — which costs some readability, but there is little 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 10-parameter tool with modes, output schema, and destructive downstream steps, it covers state, sequencing, and the main failure path (real conflict → search again; overrides/shortfalls deferred to a guide). The deferral of override and shortfall handling to capable://guide/scheduling leaves a small gap, but 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 baseline is 3; the description still adds mode-level semantics not obvious from the schema — current_slots alone commits, current_slots+propose_label re-picks and awaits a yes, and co_host_emails excludes invitees in favor of invitee_timezone. Most remaining per-parameter detail (hour bounds, target_starts_at failure behavior) is already in the schema, so it does not reach the top band.
Input schemas describe structure but not intent. Descriptions should explain 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 with scope: "Find three chronologically labeled slots; nothing is held yet." The contrast with propose_meeting ("propose_meeting rechecks availability before placing holds") makes the boundary unambiguous, which matters given many scheduling siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing rules: use this for candidate times, call propose_meeting once times are chosen, and "never call find_times again to validate, swap, commit or re-render them; search again only if the user asks for different times or a real conflict is returned." It also defines the three invocation modes (FRESH / SWAP / COMMIT) and when each applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_billingReview company billingARead-onlyInspect
A company's billing state (prospect, working = paid active, or archived): activation quote, annual capacity, approval need, live work blocking archive. Never activates; null = existing pricing contract. No account_id: quiet = active accounts idle 90+ days, nothing open; a person archives at review_url.
When to use: Before activating or archiving a company, review its current billing state and price — or, without a company, list the active accounts that have gone quiet so a person can review them for archiving.
Example: Which accounts am I paying for that have gone quiet?
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | No | Company uuid. Omit for quiet accounts. |
Output Schema
| Name | Required | Description |
|---|---|---|
| quiet | No | |
| billing | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint=true, the description discloses that it never activates, that a null value means an existing pricing contract, that 'quiet' means active accounts idle 90+ days with nothing open, and that archiving is done by a person at review_url (human-in-the-loop). These are substantive behavioral facts 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?
Purpose is front-loaded and the description is split into purpose, when-to-use, and example. The first paragraph is a bit telegraphic ('approval need, live work blocking archive') and relies heavily on inline backtick terms, 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?
An output schema exists, so return-format detail is unnecessary. The description covers the non-obvious behavior for a single-param read tool: state semantics, the omit path, the quiet/human-review flow, and the read-only guarantee. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single optional account_id, so baseline is 3. The description earns above baseline by expanding what omitting the parameter does ('quiet' = active accounts idle 90+ days, nothing open, person acts at review_url), adding meaning beyond the schema's terse 'Omit for quiet accounts'.
Input schemas describe structure but not intent. Descriptions should explain 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 (a company's billing state) and enumerates the states (prospect, working=paid active, archived) plus the fields returned. 'Never activates' cleanly separates it from the sibling manage_company_billing mutation tool, so an agent can distinguish read vs write 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?
The 'When to use' block explicitly states the trigger ('before activating or archiving') and covers the no-account_id mode, with a concrete example. It doesn't explicitly name manage_company_billing as the write alternative, but the read/write split is strongly implied by 'Never activates'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contextGet contextARead-onlyInspect
Bounded record context with per-section coverage: complete, truncated, unavailable or unknown. A failed or missing section is not evidence of absence. Account context includes ARR, lifecycle, renewal, active/recent subscriptions with 90-day events, opportunities, contacts, touches, tasks and notes. Other type + id reads return the record and related data. LinkedIn profile/email matching uses exact verified identity: names never prove identity; conflicts stop linking. linkedin_conversation lists permitted conversations without message text; id or linkedin_thread_id reads one. linkedin_thread_identity verifies the thread/header member through your connection, returning only a public profile mapping. These reads share or sync nothing.
When to use: Broad record questions, before multiple searches. Use account_id or type + id; structural contact links and recent touches supply people context.
Example: Tell me everything about Acme.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The record's id — a uuid from a previous read/search. | |
| type | No | Record type: account (default), contact, opportunity, subscription, task, or a custom object key. | |
| account_id | No | Alias for {type:'account', id} — the account's uuid. | |
| linkedin_url | No | Exact LinkedIn profile URL, only with type='contact'. Never resolves by name. Exact duplicates return candidates: ask which, then repeat with that contact id. | |
| sequence_brief | No | With type=contact and id, preview CRM tokens in this brief. Returns personalization_fields and personalization (text, ready, issues). Resolve issues before use. Read-only. | |
| linkedin_member_id | No | Exact case-sensitive member id from the rendered one-to-one conversation header (ACoA plus 35 letters, digits, underscores or hyphens). With type='linkedin_thread_identity', or with type='linkedin_conversation' plus linkedin_thread_id for an owner-only verified header match. | |
| linkedin_thread_id | No | Exact thread route segment from a linkedin.com/messaging/thread/<id>/ page after one percent-decoding pass (at most 1024 chars of [A-Za-z0-9_-] plus up to two trailing '='; keep case and padding, never decode Base64 or URNs). With type='linkedin_conversation' it opens only your permitted conversation with exactly this thread; type='linkedin_thread_identity' also needs linkedin_member_id. | |
| match_linkedin_email | No | With type='contact' + linkedin_url and no profile match, check exact provider-reported emails on the verified profile. Read-only; reaches your connected LinkedIn provider; no name inference. linkedin.verified_email_match identifies one existing contact. create_record(contact) with linkedin_url + linkedin_match_id links only that reverified record; conflicts stop linking. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| found | No | |
| reason | No | |
| context | No | |
| web_url | No | |
| context_coverage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations establish readOnly/openWorld behavior, and the description adds crucial context: per-section coverage states, failed sections not implying absence, LinkedIn exact verified identity, conflicts stopping linking, conversations listed without message text, and no sharing/syncing. This is substantial behavioral detail beyond structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but structured, with semicolon-rich mode summaries and a clear example; most clauses carry useful behavioral detail. However, the 'When to use' guidance is placed after long mode descriptions rather than 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 complex 8-parameter, multi-mode read tool with an output schema and rich annotations, the description covers purpose, modes, coverage caveats, identity constraints, privacy, and usage. 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% and the parameter descriptions are already highly detailed, including linkedin_thread_id parsing and match_linkedin_email behavior. The tool description mainly restates high-level modes and adds little parameter-level semantics 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?
The description names the resource and return shape: 'Bounded record context with per-section coverage' and enumerates account context and other type+id reads. It covers multiple modes but never contrasts with sibling get_record, so an agent could still wonder when to use get_record instead.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 includes a dedicated 'When to use' line: broad record questions, before multiple searches, and says to use account_id or type+id. That gives clear context but no when-not guidance or explicit alternatives such as get_record/search_records.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_helpGet product helpARead-onlyInspect
Search verified Capable how-to/setup/troubleshooting articles verbatim with citations, or fetch article_key; offer related topics. Use get_context/search_records for CRM data. Answer ONLY from returned articles and cite titles; never guess product behavior from memory. If confident:false or no article answers, say no verified answer is available and offer hello@capable.run as backup. Call with diagnostics:true, before saying their mail or calendar isn't connected: both connect to Capable, apart from any connector this chat has. Checks saved connection/import/agent settings. Diagnostics show setup facts, not live provider health.
When to use: Questions about how Capable itself works, or checking saved connection status.
Example: How do I set up a booking link in Capable?
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | The user's question about Capable itself, in their words (how-to, setup, troubleshooting); omit it and article_key to receive the help-topic catalog instead. | |
| article_key | No | Fetch one specific article by its key, as returned in articles[].key or related[].key; an unknown key falls back to searching it as a query. | |
| diagnostics | No | Opt in to read-only checks of your own saved email and calendar connections, imports, agent grants, and permitted workspace recording setting. Returned checks are setup facts, not live provider health; cite them only for setup status. |
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | No | |
| articles | No | |
| guidance | No | |
| confident | No | |
| support_email | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, non-destructive), yet the description adds substantial behavior the annotations do not: verbatim search with citations required, the confident:false failure path, the hello@capable.run fallback, and the caveat that diagnostics report setup facts rather than live provider health. It also discloses the unknown-key fallback behavior. This is rich behavioral context beyond 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?
Purpose and the primary alternative routing are front-loaded in the first two sentences, and the example anchors intent well. The middle section is dense, packing citation rules, failure protocol, and diagnostics caveats into long compound sentences, so it reads as somewhat cluttered rather than crisply structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter help tool with an output schema available, this covers everything an agent needs: what it searches, when to call it, how to handle low confidence, what diagnostics does and does not prove, and which sibling to prefer for CRM questions. Return shape is delegated appropriately to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: article_key fetch vs. verbatim search, the interaction with diagnostics ('before saying their mail or calendar isn't connected'), and the scoping of diagnostics to saved settings only. It stops short of restating parameter formats, which is fine since the schema handles that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource pair: 'Search verified Capable how-to/setup/troubleshooting articles verbatim with citations, or fetch article_key.' It explicitly names the sibling alternatives (get_context/search_records) as being for CRM data, so the boundary is unambiguous 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 an explicit 'When to use' clause ('Questions about Capable itself works, or checking saved connection status'), an exclusion routing rule to get_context/search_records for CRM data, and a conditional trigger for diagnostics ('before saying their mail or calendar isn't connected'). 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.
get_pipeline_summaryPipeline summaryARead-onlyInspect
Summarize opportunities by type/stage and pipeline_by_lens using stage roles, not labels. Stages include role and sales_boundary_stage (first active stage). pipeline_key/pipeline_id scopes only opportunity breakdowns; omit both for the default pipeline plus unassigned deals. Revenue (ARR/customer/at-risk counts), renewals and at-risk accounts remain workspace-wide. Renewals cover the next 90 days: totals include EVERY renewal; the list caps at 500 and coverage/truncated identify a sample. Forecast includes per-person rows, reporting-tree rollups, separate currencies, targets, human calls and supporting deal IDs. Nothing predicts.
When to use: Sales pipeline, forecast, renewals or ARR in a sales workspace with opportunities; not vague data exploration or before motion setup.
Example: Summarize my pipeline.
| Name | Required | Description | Default |
|---|---|---|---|
| pipeline_id | No | Scope the opportunity breakdowns to this pipeline by id (uuid). Prefer pipeline_key. | |
| pipeline_key | No | Scope the opportunity breakdowns to this pipeline by its stable KEY (see the `pipelines` section / describe_schema). Omit both for the default pipeline + unassigned deals (today's behavior). pipeline_id wins if both are given. | |
| forecast_period | No | Calendar forecast period in the workspace timezone; defaults to quarter. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| empty | No | |
| stages | No | |
| revenue | No | |
| forecast | No | |
| framework | No | |
| pipeline_by_lens | No | |
| total_opportunities | No | |
| sales_boundary_stage | No | |
| renewals_due_next_90_days | No | |
| pipeline_by_type_and_stage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/non-destructive, but the description adds materially new behavior: pipeline scoping applies only to opportunity breakdowns while revenue/renewals/at-risk stay workspace-wide, renewals cover a 90-day window where totals include every renewal but the list caps at 500 with coverage/truncated flags identifying a sample. It also preempts a likely misread with "Nothing predicts" and details forecast composition (per-person rows, tree rollups, separate currencies, targets, human calls, supporting deal IDs).
Agents need to know what a tool does to the 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, scoping rules, metric semantics, when-to-use and an example are laid out in a front-loaded order with little filler. It is dense and slightly run-on, and the one-line example adds marginal value, but each sentence 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?
Given an output schema exists, the description need not enumerate return fields, yet it covers exactly the non-obvious behaviors an agent would otherwise get wrong: scoping asymmetry, the 90-day renewal window, the 500-item list cap with truncation signaling, and forecast row composition. Nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema baseline already documents all three parameters. The description still adds meaning beyond it by clarifying that pipeline_key/pipeline_id scope only the opportunity breakdowns, that omitting both yields the default pipeline plus unassigned deals, and that other metrics remain workspace-wide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb+resource and even the mechanism ("Summarize opportunities by type/stage and pipeline_by_lens using stage roles, not labels"), and it lists the concrete payload (revenue, renewals, forecast). It does not explicitly name the sibling it competes with (e.g., run_report or show_report), so an agent must infer the boundary from the "not vague data exploration" caveat.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 explicit "When to use" line gives both inclusion criteria (sales workspace with opportunities, forecast/renewals/ARR questions) and exclusions ("not vague data exploration or before motion setup"). It stops short of naming the alternative tool to pick when the conditions fail, which keeps it below a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recordGet record by idARead-onlyInspect
Fetch any record's full detail by id. type is an optional hint — if omitted or wrong, the record is resolved by id and returned with its true type, so you never need to guess the type right. Covers the built-in objects (account, contact, opportunity, subscription, lead, task, touch, signal, note, playbook, report, meeting_recording, meeting, target, forecast_call), custom object keys, and the admin-only governance records (audit_log, pending_approval, report_run, policy; list them with search_records). A stale, unknown or malformed id returns {found:false} plus the search that finds the record fresh — never an error.
When to use: When you have an id and want the full record without searching. Works for built-in objects and custom-object records. Less common than search_* tools.
Example: Fetch opportunity .
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The record's id — a uuid from a previous read/search. | |
| type | No | Optional type hint: account | contact | opportunity | subscription | lead | task | touch | signal | note | playbook | report | meeting_recording | meeting | target | forecast_call, a custom object key, or a governance record (audit_log | pending_approval | report_run | policy; admin-only). | |
| include_archived | No | Boolean (true/false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| type | No | |
| found | No | |
| record | No | |
| web_url | No | |
| provenance | No | |
| merged_from | No | |
| custom_field_definitions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, but the description adds genuinely non-obvious behavior: a wrong or omitted `type` self-corrects, and a stale/unknown/malformed id returns {found:false} with a recovery search rather than an error. It also flags that governance records are admin-only, which is auth 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?
The critical behavior (id is authoritative, type is optional) is front-loaded in the first two sentences, and the when-to-use/example tail is short. The long enumeration of built-in object types is the one part that could be trimmed without loss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description need not document return shape, and it instead covers the one return case that matters (not-found). For a simple 3-param read tool, an agent has everything needed to invoke it correctly and interpret failures.
Complex tools with many parameters or behaviors need more documentation. 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 goes beyond the schema by explaining that `type` is a mere hint whose inaccuracy is harmless, which changes how an agent should populate it. `include_archived` is left to the schema's bare 'Boolean (true/false)' note, 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 ('Fetch any record's full detail by id') and enumerates exactly which object families are covered, including custom keys and admin-only governance records. It also positions itself relative to siblings ('less common than search_* tools', 'list them with search_records'), 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?
A dedicated 'When to use' section plus the example 'Fetch opportunity <id>' gives clear context, and it names the competing approach (searching) explicitly. It stops short of stating when not to use it (e.g. bulk retrieval, or when only a summary is needed), so it lands at 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_review_statusGet review statusARead-onlyInspect
Read a review's shared status without approving or executing changes. Submitted returns the frozen selection and outcomes in commit_reviewed_updates' format. Pending awaits approval; superseded requires the latest review; expired proves no first commit inside the retained window. If unavailable or execution is uncertain, inspect CRM state before another save. Poll with backoff only while viewing a pending or executing review.
When to use: Synchronize a review after chat approval or correction, using its unchanged receipt. Reads status only.
Example: Have those reviewed changes been saved?
| Name | Required | Description | Default |
|---|---|---|---|
| receipt | Yes | Unchanged receipt returned by review_proposed_updates for the review to inspect. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| summary | No | |
| outcomes | No | |
| confirmed | No | |
| review_id | No | |
| review_status | No | |
| request_status | No | |
| superseded_by_review_id | No | |
| frozen_selected_proposal_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that: it defines the meaning of each resulting state (Submitted returns the frozen selection, Pending awaits approval, superseded requires the latest review, expired proves no first commit) and gives retry/polling semantics, which the annotations do not 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-loaded with the core action and the non-approval constraint, then organized into state meanings, a when-to-use line, and an example. It is dense and largely earns its space, though the phrasing across state meanings is terse enough to border on cryptic and the example sentence is marginal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shapes need not be explained, and the description nonetheless pre-explains the meaning of each status value plus retry guidance and a fallback when execution is uncertain. For a single-parameter read tool with full annotation coverage, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and there is a single parameter whose 'unchanged receipt' semantics are already documented in the schema. The description reinforces that the receipt must be unchanged and ties it back to review_proposed_updates, but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read a review's shared status') and immediately scopes it against siblings by saying 'without approving or executing changes', which contrasts with commit_reviewed_updates and review_proposed_updates. An agent can distinguish it from the other review 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?
The 'When to use' line gives an explicit trigger ('Synchronize a review after chat approval or correction, using its unchanged receipt'), and it adds a concrete alternative behavior ('inspect CRM state before another save') plus polling discipline ('Poll with backoff only while viewing a pending or executing review'). It stops short of naming the specific sibling tool to use instead for the fallback inspection, so it is clear but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_scheduling_settingsGet scheduling settingsARead-onlyInspect
Read your booking pages and exact shareable URLs, saved availability, and your calendar connection to Capable: status, provider (Google or Microsoft) and calendars. Includes updated_at versions needed for edits. Pages belong to you in this workspace; availability and calendar choices apply to your scheduling across workspaces. A draft URL cannot accept bookings. Read before changing settings; never invent a page ID, calendar ID or URL. See capable://guide/scheduling.
When to use: When the user asks about their booking links, hours or calendars; before changing scheduling settings; and before saying their calendar isn't connected: it connects to Capable, apart from any calendar connector this chat has.
Example: Show my booking links and the hours people can book.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| status | No | |
| calendars | No | |
| availability | No | |
| settings_url | No | |
| booking_pages | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the readOnly/destructive/idempotent profile, yet the description adds non-obvious behavior: pages are workspace-scoped while availability and calendar choices apply across workspaces, draft URLs cannot accept bookings, and updated_at versions are returned for edits. It also supplies a guardrail ('never invent a page ID, calendar ID or URL'), which is genuinely useful call-site context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what is read, then cleanly separates 'When to use' and 'Example'. The workspace-scope sentence is dense but earns its place; overall slightly long but well-structured and waste-free.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. Combined with scoping rules, when-to-use triggers, guardrails, and a guide reference, an agent has everything needed to select and call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No input parameters exist, so the baseline is 4. The mention of page IDs, calendar IDs, and URLs refers to data the tool surfaces for other tools rather than its own inputs, so it does not add parameter semantics here, but nothing is missing.
Input schemas describe structure but not intent. Descriptions should explain 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 (read) and enumerates the exact resources: booking pages with shareable URLs, saved availability, and the calendar connection (status, provider, calendars). This is clearly distinguishable from siblings like save_booking_page, update_availability, and update_scheduling_calendars.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 'When to use' section gives explicit triggers — user questions about booking links/hours/calendars, and before changing scheduling settings or declaring a calendar disconnected. It provides clear context but does not name the specific sibling tools (e.g., update_scheduling_calendars) it precedes, leaving the alternative unmapped by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_touchLog touchAInspect
Record a call, email, meeting or LinkedIn activity; link account_id, contact_id or opportunity_id (resolve IDs first). Check existing activity: source_touch_id reuses captured work and fills missing details; don't narrate routine duplicates. New work needs request_id + occurred_at for retries. sequence_action records an explicit step outcome; retry the same payload for pending tracking. Process captured meetings without another touch: propose_updates(source_touch_id) then review_proposed_updates.
When to use: After any meaningful interaction. commit_reviewed_updates often applies this from an approved review. Logging an email or call the system also collects? Pass its id (the Gmail message id, the call id) as external_id, so the sync and the agent land on one activity.
Example: Log a 45-min discovery call with Sarah at Acme yesterday — covered pain, impact, decision criteria.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Defaults: call | email | meeting | linkedin | sms | other. A workspace admin may rename or add values — see the live set in propose_updates' workspace.enum_values, or an admin's describe_schema. | |
| source | No | Defaults: manual | transcript_paste | api | mcp | inbox_import | calendar_import | imported_csv | scheduler | recorder | reply_io | instantly. A workspace admin may rename or add values — see the live set in propose_updates' workspace.enum_values, or an admin's describe_schema. | |
| subject | No | Short title of the activity (an email's subject line, a meeting's title); searchable and part of the duplicate fingerprint. | |
| summary | No | Plain-text account of what happened or was discussed — the rep's notes for an unrecorded call; searchable together with the subject. | |
| direction | No | Defaults: inbound | outbound. A workspace admin may rename or add values — see the live set in propose_updates' workspace.enum_values, or an admin's describe_schema. | |
| account_id | No | A uuid. | |
| contact_id | No | A uuid. | |
| request_id | No | A uuid. | |
| external_id | No | The activity's id in the system it came from (a Gmail message id, a dialer call id). An activity this workspace already holds under that id is returned instead of logged again (duplicate_suppressed), with only its blank details filled from this call. | |
| occurred_at | No | An ISO 8601 datetime. | |
| participants | No | Email addresses of the people on the activity (sender or recipients, meeting attendees), stored as a flat list and matched by participant search. | |
| custom_fields | No | Values for the workspace's custom touch fields, keyed by field key (see describe_schema); the reserved capable_sequence_action key is refused — use sequence_action. | |
| opportunity_id | No | A uuid. | |
| sequence_action | No | Requires outbound matching-channel evidence. Call attempts or LinkedIn requests hold the step and need follow_up_on; not_now pauses. Acceptance needs confirmation. Omitted outcome means completed. | |
| source_touch_id | No | Reuse captured activity; fill missing facts only. Conflicts need explicit correction. Use instead of request_id. | |
| duration_minutes | No | An integer ≥ 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| touch | No | |
| account | No | |
| sequence_tracking | No | |
| duplicate_suppressed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description explains duplicate suppression via external_id, retry requirements for new work, source_touch_id reuse behavior, sequence_action outcome semantics, and the reserved custom_fields key. These details materially affect how the agent should call the tool and avoid duplicate activity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and is appropriately sized for a 16-parameter nested tool, including a concise example. Some instructions are packed into dense semicolon chains, which slightly reduces scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 complex schema, nested objects, annotations, and existing output schema, the description covers the key usage paths, duplicate/retry behavior, and sibling routing needed to invoke the tool correctly. Nothing essential appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all parameters are already documented structurally. The description adds useful semantics for critical parameters such as external_id, source_touch_id, request_id/occurred_at retries, and sequence_action, though it does not explain every parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: record a call, email, meeting, or LinkedIn activity, with account/contact/opportunity linkage. It distinguishes clearly from propose_updates and commit_reviewed_updates in context, but does not explicitly differentiate itself from the sibling record_meeting tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use guidance ('After any meaningful interaction'), tells the agent to check existing activity before logging, and names alternatives/paths for captured meetings, approved reviews, synced external activity, and duplicate suppression. The conditions for using source_touch_id versus request_id are also stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_approvalsManage approval queueADestructiveInspect
Admin-only governance queue for requests held by policy/autonomy. list returns captured tool/args, target, requester, reason, review/source, status and expiry; filter by status. autonomy returns role/source levels and evidence over days (default90); configure via update_workspace.autonomy_by_role. approve records a decision and RUNS the captured call as its original requester; execution may be applied, failed, expired or uncertain. For an uncertain outcome, inspect the affected record before a new request. deny closes without running. Either decision stores an optional note and requires confirm:true after previewing tool, target, requester and age. Requesters cannot decide their own requests. A require_approval policy on this tool blocks it; queue operations never queue themselves.
When to use: An admin reviews held requests or evidence before changing autonomy.
Example: What's waiting for my approval?
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The request id to approve or deny (from a list call). Ignored by list. | |
| days | No | autonomy only: evidence window in days (default 90). | |
| note | No | Optional decision note stored with an approve or deny. | |
| limit | No | list only: how many requests to return, newest first (default 50, max 200). | |
| action | Yes | list the queue, approve / deny one request by id, or autonomy: the posture with its evidence. One of: list | approve | deny | autonomy. | |
| status | No | list only: return requests in exactly this status (pending, approved, executing, indeterminate, denied, expired, applied, failed); omit for every status. | |
| confirm | No | approve / deny: true carries the decision out; omitted or false returns the preview and changes nothing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | No | |
| action | No | |
| levels | No | |
| decided | No | |
| sources | No | |
| approval | No | |
| evidence | No | |
| approvals | No | |
| execution | No | |
| approval_id | No | |
| window_days | No | |
| autonomy_by_role | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: approve actually executes the captured call as the original requester, outcomes can be applied/failed/expired/uncertain, deny closes without executing, confirm:true is required after previewing, requesters cannot decide their own requests, and a require_approval policy on this tool blocks it while queue operations never queue themselves. These are exactly the safety facts the destructiveHint/readOnlyHint flags cannot convey, and nothing contradicts those 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?
One dense paragraph, but it is front-loaded (purpose first, then per-action semantics, then constraints, then when-to-use and example). Sentences earn their place, though the mid-paragraph shift into approve/deny mechanics could be split for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 a multi-action, destructive, execution-triggering tool end to end: allowed actions, decision prerequisites, execution side effects and their uncertain states, authorization limits, and self-recursion behavior. With an output schema and annotations already present, nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds decision-relevant meaning by explaining the two-phase confirm flow ('requires confirm:true after previewing tool, target, requester and age') and that an uncertain outcome requires inspecting the affected record first. Defaults for days/limit are left to the schema, which is fine.
Input schemas describe structure but not intent. Descriptions should explain 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 clause names the resource and scope precisely: an admin-only governance queue for requests held by policy/autonomy. Each action is then defined by what it does (list returns captured tool/args..., approve records a decision and runs the captured call, deny closes without running), which no sibling tool offers. An agent can distinguish this from review_proposed_updates, get_review_status, or update_workspace 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 to use: An admin reviews held requests or evidence before changing autonomy' plus a concrete example question routes the agent correctly, and it names update_workspace.autonomy_by_role as the place to configure rather than manage. It stops short of stating negative cases (e.g. non-admin callers, or queueing a request instead of deciding one), so it is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_company_billingChange company billing stateADestructiveIdempotentInspect
Activate a company, or request human approval for activation, after reviewing get_company_billing. Supply the exact quoted revision and price in the returned billing currency’s minor units (cents or öre); never guess them. AI/API activation additionally needs an administrator-granted automation budget even for workspace admins. Without that authority this creates a pending human approval request and does not activate or purchase capacity. Archive and restore require an authorized person to confirm in the company's web panel; this tool cannot perform them. Never invoke this merely to read, enrich, import or qualify a company. Annual capacity purchases are a separate billing-admin action.
When to use: Explicitly activate a reviewed company within an administrator-approved automation budget, or request human approval. Archive and restore require the company's web panel.
Example: Activate this company using the reviewed price, or request approval if needed.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | activate makes the company a paid active account or creates a pending human approval request. archive and restore cannot be performed by this tool; an authorized person must confirm them in the company's web panel. | |
| account_id | Yes | The account (company) id to change — the same uuid you passed to get_company_billing for the quote you are acting on. | |
| idempotency_key | Yes | Keep this same key when retrying the same approved action. | |
| expected_revision | Yes | The `revision` from the get_company_billing result you reviewed; if the workspace's account usage changed since, the action is refused and needs a fresh quote. | |
| approved_price_minor | Yes | The reviewed `activationPriceMinor` from get_company_billing, in the billing currency's minor units (cents or öre); activate is refused when the live price differs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | No | |
| account | No | |
| revision | No | |
| requestId | No | |
| approvalUrl | No | |
| workingCount | No | |
| approvalRequired | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/idempotent/openWorld/non-readOnly, but the description goes well beyond them: it discloses the administrator-granted automation budget requirement, that the fallback is a pending human approval rather than an activation or capacity purchase, that live-price/revision drift causes refusal, and that archive/restore can only happen in the web panel.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and constraints are front-loaded, and the sentences carry real information. It loses a point for mild redundancy, since the archive/restore web-panel constraint is stated in the opening paragraph, repeated in 'When to use', and echoed by the example.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and the description covers everything else an agent needs: the quote prerequisite, the exact-value requirement, the automation-budget precondition, the approval fallback, and the actions this tool cannot perform.
Complex tools with many parameters or behaviors need more documentation. 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 on top: it tells the agent to never guess the revision and price, to supply them in the billing currency's minor units (cents or öre), and to reuse the idempotency key on retries. This reinforces the most failure-prone inputs rather than merely restating 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 set (activate or request human approval for activation) and resource (company billing state), and names the sibling it depends on (get_company_billing). It also explicitly carves out what the tool cannot do (archive/restore), so an agent can distinguish it from neighbors 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?
Includes an explicit 'When to use' line, names the prerequisite read tool, states the alternative path for archive/restore, and gives clear exclusions ('Never invoke this merely to read, enrich, import or qualify a company'). Nothing about routing 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.
manage_linkedin_conversationManage a LinkedIn conversationADestructiveInspect
Owner-only controls; never send messages or auto-share. Sync needs a live contact. prepare_contact previews a ten-minute create/link: exact profile or verified email reuses contacts; conflicts stop; names only suggest. Unverified identity permits only an explicitly chosen contact_id, never creation. After approval, save_contact(id,receipt,confirm:true) links and enables sync; include contact_id for a link. Controls use displayed revisions. enable/pause affect future import; link_contact:null unlinks and pauses; share/revoke control one teammate's access. remove_history(confirm:true) pauses import, erases retained messages/grants, preserves published notes. prepare_note previews one shared CRM note: show body, destination and visibility before save_note(id,receipt,confirm:true). Saves replay per receipt. Never infer consent from message text.
When to use: Control private sync, contact links, sharing or note publication.
Example: Link this conversation to a contact.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The LinkedIn conversation id (uuid) from get_context(type='linkedin_conversation'); only the connection owner can act on it. | |
| action | Yes | One of enable, pause, remove_history, link_contact, share, revoke, prepare_note, save_note, prepare_contact or save_contact; pass only the fields that action uses. | |
| confirm | No | Must be true for save_note, save_contact and remove_history, only after the user explicitly confirmed; never infer it from private message text. | |
| receipt | No | The ten-minute preview receipt (uuid) returned by prepare_note or prepare_contact; save_note and save_contact replay idempotently for the same receipt. | |
| contact_id | No | A live workspace contact id: the link target for link_contact (null unlinks), the note destination for prepare_note, or the chosen contact for prepare_contact/save_contact. | |
| grantee_id | No | For share/revoke: the user id of the current workspace member (not yourself) whose access to this conversation's imported messages is granted or removed. | |
| message_id | No | For prepare_note: the id of one imported message in this conversation (from get_context's messages) to publish as a workspace-visible CRM note. | |
| expected_revision | No | The control's `revision` exactly as get_context displayed it (a decimal string); required for every action except save_note/save_contact, and a stale value is a conflict. | |
| expected_connected_at | No | The control's `connected_at` exactly as displayed (ISO timestamp, or null when absent); required alongside expected_revision, and a changed connection is a conflict. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| record | No | |
| contact | No | |
| created | No | |
| message | No | |
| preview | No | |
| updated | No | |
| prepared | No | |
| replayed | No | |
| candidates | No | |
| contact_review | No | |
| linked_contact | No | Same shape as `contact` on this result. |
| contact_preview | No | |
| review_conflict | No | |
| contact_required | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing owner-only access, ten-minute preview receipts, idempotent replay per receipt, conflict handling for stale revisions, and exactly what remove_history destroys and preserves. It also explains that link_contact:null unlinks and pauses, and that share/revoke affect one teammate's access. These details materially help an agent avoid unsafe or incorrect calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense and appropriately sized for a tool with ten actions, nine parameters, and destructive behavior. Every clause appears to carry operational meaning, but the semicolon-heavy middle is hard to scan and the structure could be clearer. It is front-loaded with the owner-only and no-send constraints, which is good.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return-value details are not required. The description covers the complex multi-action workflow, confirmation requirements, idempotency, stale-revision conflicts, and destructive scope. Nothing critical for correct invocation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description still adds cross-parameter workflow meaning: it shows save_contact(id,receipt,confirm:true), explains that contact_id is the link target or note destination, that link_contact:null unlinks, and that receipt replays idempotently. It also clarifies that expected_revision is required for every action except save_note/save_contact and that expected_connected_at must accompany it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly scopes the tool to owner-only controls on a LinkedIn conversation: sync, contact links, sharing, and CRM note publication. It lists the supported actions and their effects, so the resource and operations are identifiable. It stops short of naming sibling tools such as manage_linkedin_privacy or add_note, so differentiation is inferred rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage context: 'When to use: Control private sync, contact links, sharing or note publication' plus a concrete example. It also states a strong negative guideline: 'never send messages or auto-share' and 'Never infer consent from message text.' It does not explicitly route the agent away from sibling tools for adjacent tasks, so the alternative-selection guidance is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_linkedin_privacyReview and erase private LinkedIn dataADestructiveInspect
Owner-only LinkedIn review/erasure; no provider/sign-in changes. begin subject_context needs exact verified provider identity: covers all messages in its local conversations plus additional_message_ids. connection_review exports but cannot erase. Returns expiring owner download/counts/limits, no bodies. Human-review third-party data, other references and shared notes before disclosure/deletion: not semantic search or ready-to-send disclosure. status checks freshness. prepare_erasure(reviewed:true) selects exact IDs (max5000) and optional participant metadata. Show counts and ongoing suppression before explicit approval and commit_erasure(receipt,confirm:true); replay is idempotent. Changed/expired scope needs new review. Erasure fences reimport; metadata erasure suppresses future metadata. Unrelated history, shared notes and provider copies are separate. Never infer identity/consent from text.
When to use: Review a verified person's imported data rights request.
Example: Review this person's LinkedIn data.
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | One of: subject_context | connection_review. | |
| action | Yes | One of: begin | status | prepare_erasure | commit_erasure. | |
| case_id | No | For status/prepare_erasure: the unexpired case returned by begin. | |
| confirm | No | For commit_erasure: true only after explicit confirmation of the plan, including ongoing metadata suppression if chosen. | |
| receipt | No | For commit_erasure: the ten-minute erasure receipt returned by prepare_erasure. | |
| reviewed | No | For prepare_erasure: true after reviewing the download, identity, exact message selection and third-party data. | |
| message_ids | No | For prepare_erasure: exactly the reviewed local message ids to erase; empty only for metadata-only erasure. | |
| connection_id | No | For begin: your own LinkedIn connection id. | |
| subject_identity | No | Must not be empty. | |
| identity_verified | No | For subject_context: true only after verifying the person's exact provider identity. | |
| additional_message_ids | No | For subject_context: additional reviewed local messages in this connection referring to the person elsewhere. | |
| erase_participant_metadata | No | Boolean (true/false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| case | No | |
| note | No | |
| plan | No | |
| outcome | No | |
| download_url | No | |
| review_conflict | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-read-only, yet the description adds substantive behavior: expiring owner downloads and ten-minute receipts, counts/limits with no message bodies, max 5000 IDs, erasure fencing future reimports, metadata suppression, and explicit non-coverage (provider copies, shared notes, unrelated history). The 'replay is idempotent' statement is scoped to commit_erasure and sits alongside other non-idempotent actions, so it qualifies rather than contradicts 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?
The opening clause is well front-loaded ('Owner-only...; no provider/sign-in changes') and 'When to use' plus the example are cleanly separated. However, the body is a dense run-on of semicolon-joined fragments covering actions, scopes, limits and caveats in one block, which forces re-reading and would benefit from per-action structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 12-parameter, four-action destructive tool with an output schema, the description covers the full lifecycle: prerequisites, verification gates, review-before-erasure requirement, explicit confirmation, idempotent replay, and scope expiry. It also states what is not erased, which is exactly the residual risk an agent needs.
Complex tools with many parameters or behaviors need more documentation. 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 coverage, the baseline is 3, but the description adds meaning the schema does not: cross-parameter coupling (subject_context needs verified provider identity and covers local conversations plus additional_message_ids; commit_erasure needs both receipt and confirm), the 5000 selection cap, and the empty-array-is-metadata-only rule for message_ids. It stops short of covering every parameter (e.g., connection_id, erase_participant_metadata typing).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource set (owner-only LinkedIn review/erasure) and states scope boundaries ('no provider/sign-in changes'), so an agent knows this is a data-rights review/erasure workflow rather than a messaging tool. It does not explicitly name a sibling tool as the alternative, and 'connection_review' is a scope value rather than a routing target, so sibling differentiation is implicit at best.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear trigger ('Review a verified person's imported data rights request') and an explicit action order (begin -> status -> prepare_erasure -> commit_erasure), plus a routing hint that connection_review exports but cannot erase. It never states when NOT to use this tool or names a concrete alternative tool for the export-only path, so the exclusion side is incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_membersManage workspace membersADestructiveInspect
Admin-only membership controls. list returns members and pending invites. invite adds/renews an email invite (default member; existing members refused); email_sent reports best-effort delivery. resend_invite renews by invite_id; revoke_invite withdraws. set_role supports admin/manager/member/viewer, never demotes the last admin. set_manager sets/clears a manager, rejecting self-reporting and cycles. set_read_scope uses own/team/all/null (role default), optionally include_reports; cannot restrict admins. remove cannot target yourself or the last admin; records remain. Except list/revoke_invite, actions preview the person/change until confirm:true. This connection is bound to one membership; leave/switch your own workspace in the browser.
When to use: An admin manages membership, invitations or an individual's access.
Example: Invite sara@brightside.example as a manager.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | invite (default member) and set_role: admin, manager, member or viewer. | |
| No | invite: the address to invite (lower-cased and trimmed). | ||
| action | Yes | list, invite, resend_invite, revoke_invite, set_role, set_manager, set_read_scope or remove. One of: list | invite | resend_invite | revoke_invite | set_role | set_manager | set_read_scope | remove. | |
| confirm | No | invite / resend_invite / set_role / set_manager / remove: true carries the change out; omitted or false returns the preview and changes nothing. | |
| user_id | No | set_role / set_manager / remove: the member's user_id from a list call. | |
| invite_id | No | resend_invite / revoke_invite: the pending invite's id from a list call. | |
| manager_id | No | set_manager: the manager's user_id, or null to clear the reporting line. | |
| read_scope | No | set_read_scope: own, team, all, or null to follow the role's setting. | |
| include_reports | No | set_read_scope: also everyone reporting up to this member. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| action | No | |
| invite | No | |
| member | No | |
| applied | No | |
| invites | No | |
| members | No | |
| email_sent | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: list returns members and pending invites, invite refuses existing members, email delivery is best-effort, set_role never demotes the last admin, set_manager rejects self-reporting and cycles, set_read_scope cannot restrict admins, remove cannot target self or last admin, and destructive actions preview until confirm:true. These are meaningful mutation and constraint details for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but appropriately sized for a nine-parameter, multi-action administrative tool, and it front-loads the admin-only scope before enumerating action behavior. The semicolon-heavy action list is efficient but slightly reduces scanability, so it is strong rather than perfect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, destructive annotations, 100% schema coverage, and output schema, the description covers the essential admin restrictions, action semantics, confirmation preview behavior, and workspace-bound limitation. An agent has enough context to select and invoke the correct action without needing return-value details in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already defines all parameters; the description still adds action-level semantics such as invite defaulting to member, manager_id null clearing a reporting line, read_scope null following role defaults, and confirm returning a preview unless true. This is useful cross-parameter guidance, though much of it is also present in the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and verb set: admin-only membership controls, with each action named (list, invite, revoke, set_role, set_manager, set_read_scope, remove). It clearly distinguishes this as membership/invitation/access management rather than generic record or billing management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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: "When to use: An admin manages membership, invitations or an individual's access," plus an example invite. It does not explicitly compare alternatives or exclusions, but the admin-only scope and action list make the intended context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_time_blocksManage time blocksADestructiveIdempotentInspect
Manage personal Google/Outlook calendar blocks with no attendees; nothing is sent. Uses booking_calendar_id (get_scheduling_settings), or Outlook's default calendar; busy unless show_as is free. create needs title, starts_at, ends_at (max 24h apart) and a fresh request_id UUID; reuse it only to retry the same block. reminder_minutes sets popup lead time; omit for calendar defaults, or use 0 on a short reminder block. list uses from/to (default next 14 days, max 62). update needs block_id and changed fields; starts_at alone preserves duration. remove deletes the block: first call asks, then requires confirm:true. Only Capable-created blocks can change.
When to use: Block focus time, add reminders, or adjust your own blocks; use find_times for meetings with others.
Example: Block 9–11 tomorrow for writing.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | List window end; default 14 days after from. | |
| from | No | List window start; default now. | |
| notes | No | Event notes; null clears them. | |
| title | No | What the time is for; required for create. | |
| action | Yes | list, create, update or remove. | |
| confirm | No | Required true for remove; without it the call returns a confirmation prompt and deletes nothing. | |
| ends_at | No | ISO 8601 with offset; required for create. | |
| show_as | No | busy (default) keeps booking pages and find_times off this time; free leaves it open. | |
| block_id | No | From list or create; required for update and remove. | |
| starts_at | No | ISO 8601 with offset; required for create. | |
| time_zone | No | IANA zone to show the block in on Google, e.g. Europe/Stockholm; Outlook shows each viewer's own zone. | |
| request_id | No | Required for create. | |
| reminder_minutes | No | Popup lead time in minutes; null means the calendar's defaults. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | No | |
| from | No | |
| note | No | |
| block | No | |
| action | No | |
| blocks | No | |
| status | No | |
| removed | No | |
| block_id | No | |
| truncated | No | |
| calendar_id | No | |
| already_gone | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: remove is two-phase ('first call asks, then requires confirm:true' deletes nothing), only Capable-created blocks can be modified, create is capped at 24h, list caps at 62 days, and request_id reuse is limited to retrying the same block (consistent with idempotentHint=true). It does not describe the confirmation-prompt return shape or failure modes when editing a non-Capable block, so it falls short of the top score.
Agents need to know what a tool does to the 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 scope, then a compact per-action block of constraints, then 'When to use' and an example. Nearly every clause carries operational information, though the action paragraph is a dense run-on that could be split for faster scanning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, four-action tool with an output schema and annotations already present, the description covers the prerequisites (Capable-created blocks, confirm flow, request_id freshness, duration/range limits) an agent needs to call it correctly. Remaining gaps — per-action return contents and the confirmation-prompt payload — are partly covered by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-field semantics the schema lacks: create requires title/starts_at/ends_at with a max 24h span, request_id must be fresh and reused only for retries, update with starts_at alone preserves duration, and show_as defaults to busy gating booking pages and find_times. Minor params (time_zone, notes) are left 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?
States a concrete verb set (manage/create/update/list/remove) over a specific resource — personal Google/Outlook calendar blocks with no attendees — and immediately bounds the scope: 'nothing is sent.' It also names the sibling it is not (find_times for meetings with others), so the agent can distinguish it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to use' line gives positive triggers (block focus time, add reminders, adjust your own blocks) and an explicit alternative plus its condition ('use find_times for meetings with others'). A worked example ('Block 9–11 tomorrow for writing') further anchors invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_webhooksManage change webhooksADestructiveInspect
Admin-only change-feed webhooks. list shows status/last delivery. create starts signed JSON batches of read_changes metadata: object, record, verb and changed field names, never values; oldest first, after a minute. update patches URL, description or object_types (null=all). pause/resume stop/restart delivery; rotate_secret issues a new secret; test posts a ping now; delete removes the webhook. Creating, changing URL, rotating or deleting previews first and needs confirm:true. Failures retry with backoff, disabling after a day; list gives the reason and resume re-enables. Up to 10 per workspace; HTTPS public-host URLs only.
When to use: An admin connects another system to CRM changes without polling.
Example: Set up https://hooks.example.com/capable.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | create / update: the https URL to post to. | |
| action | Yes | list, create, update, pause, resume, rotate_secret, test or delete. One of: list | create | update | pause | resume | rotate_secret | test | delete. | |
| confirm | No | create, a url change, rotate_secret and delete apply only with confirm:true; without it the call previews. | |
| webhook_id | No | Every action but list and create: which webhook. | |
| description | No | create / update: what this webhook feeds (null clears it). | |
| object_types | No | create / update: only these objects (account, contact, opportunity, …, a custom object's key); null or omitted on create = every object. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| action | No | |
| secret | No | |
| applied | No | |
| webhook | No | |
| delivery | No | |
| webhooks | No | |
| requires_confirm | No | |
| signing_configured | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses admin-only access, signed JSON payload contents, oldest-first delivery after a minute, preview-and-confirm behavior for sensitive actions, retry/backoff behavior with disabling after a day, and the 10-per-workspace and HTTPS public-host constraints. These are concrete behavioral traits an agent needs before invoking destructive or open-world actions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loads the action summary before usage guidance and an example. It is appropriately sized for a multi-action administrative tool, though the sentence packing is heavy and the example adds limited value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complex action-based interface, full schema descriptions, annotations, and an output schema, the description covers the operational context, constraints, confirmation flow, and failure behavior needed to invoke the tool correctly. No critical invocation detail appears to be 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 every parameter thoroughly. The description reinforces key semantics such as confirm:true preview behavior and object_types null meaning all objects, but much of that is already present in the schema, so it does not substantially exceed the 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 resource and operation set: admin-only change-feed webhooks, with each action named (list, create, update, pause/resume, rotate_secret, test, delete). It also explains what the tool is for in business terms: letting an admin connect another system to CRM changes without polling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 usage context in the 'When to use' line and an example, which is enough to select the tool for webhook administration. It does not explicitly compare against alternatives such as read_changes or polling, 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.
merge_recordsMerge duplicate recordsADestructiveInspect
Merge duplicate contacts/accounts. Contact blanks fill without overwrites; links move (activities/tasks/notes/deals/rosters/enrollments/meetings/attachments/relationship fields). Email/phone/LinkedIn identities stay with the survivor. The archived duplicate points to it, so its id still resolves. Colliding rows (same activity or active sequence enrollment) stay in duplicate history and appear in collisions. Account merges require a workspace admin and active Core workspace; Core billing rules apply, without field filling. Preview first; only confirm:true changes data. Without keep_id/merge_id, list possible duplicates with the older record proposed to keep; record_id narrows the list.
When to use: Two records represent one person/company: merge to preserve history instead of deleting the twin.
Example: Merge these duplicate people; keep the one linked to the company.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Listing only: at most this many pairs (default 25). | |
| confirm | No | true merges; omitted or false previews. | |
| keep_id | No | The record that stays and keeps the history. | |
| merge_id | No | The duplicate that is folded in and archived. | |
| record_id | No | Listing only: possible duplicates of this record. People match by live email/phone/LinkedIn URL or name on one account; companies by domain/LinkedIn page/name. These are candidates, not proven identities. | |
| object_type | Yes | What the ids are. | |
| expected_keep_revision | No | The kept record's mcp_revision from the preview; the merge refuses if it moved. | |
| expected_merge_revision | No | The duplicate's mcp_revision from the preview; the merge refuses if it moved. |
Output Schema
| Name | Required | Description |
|---|---|---|
| kept | No | |
| note | No | |
| filled | No | |
| merged | No | |
| preview | No | |
| merged_id | No | |
| candidates | No | |
| collisions | No | |
| object_type | No | |
| identities_added | No | |
| requires_confirm | No | |
| transferred_links | No |
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 substantial context beyond them: blank fields fill without overwriting, links move, identities stay with the survivor, the archived duplicate redirects by id, colliding rows are retained in duplicate history and reported in collisions, account merges require workspace admin and active Core workspace, and Core billing rules apply. This is exactly the behavioral detail an agent needs for a destructive merge.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded: core merge behavior appears first, followed by a clear 'When to use' section and an example. Every sentence carries relevant operational detail for a destructive tool with eight parameters. It could be slightly tightened, but the length is justified by the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the destructive nature, eight parameters, 100% schema coverage, and an output schema, the description covers everything an agent needs: listing vs merging modes, preview/confirm semantics, collision handling, identity retention, prerequisite conditions for account merges, and the archived-duplicate redirect. No critical gaps remain.
Complex tools with many parameters or behaviors need more documentation. 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 adds value beyond the schema by explaining the default listing behavior when keep_id/merge_id are absent ('list possible duplicates with the older record proposed to keep') and how record_id narrows that list. It also clarifies that only confirm:true performs the merge. The schema already documents most parameter semantics, but the description supplements them usefully.
Input schemas describe structure but not intent. Descriptions should explain 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: 'Merge duplicate contacts/accounts.' It explicitly distinguishes merging from deleting ('merge to preserve history instead of deleting the twin') and clarifies the two supported object types. An agent can tell this apart from siblings like delete_record or update_record 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 provides an explicit 'When to use' section: 'Two records represent one person/company: merge to preserve history instead of deleting the twin.' It also states the alternative (deleting the twin) and describes the listing mode when keep_id/merge_id are omitted. The 'Preview first; only confirm:true changes data' guidance further clarifies safe invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
migrate_crmImport CRM exportsAInspect
Admin CRM import: describe → preview (no writes) → user reviews exact values/exclusions → stage the same preparation → start jobId in background. Explain preview.activationGuidance before starting; activation is reviewed separately and waiting rows remain saved for resume. Stage also returns guidance. Page status/list for every outcome. Identical source identity/payload is skipped; changed identities and email/domain collisions require manual resolution, never name merges. Resolve per-record approval requirements first: they block imports. Historical imports emit no automation events or enrichment. Custom objects, workflows, attachments and unavailable history need separate scoping. See inputs for authority, mappings, limits and retries. snake_case input aliases are accepted; outputs unchanged.
When to use: An administrator imports a Salesforce, HubSpot, Attio or CSV export with explicit mappings and resumable progress.
Example: Help me move our CRM data to Capable.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | A human-readable name for this import batch (1–120 characters), shown on the staged job and in list/status. | |
| files | No | Up to 20 exports as {name,sourceObject,csv,idColumn?}: raw CSV with header; idColumn is the stable source-id column (auto-detected if omitted). Batch limits: 5000 rows, 2000000 CSV bytes, 3900000 request bytes, 5242880 normalized bytes. | |
| jobId | No | The job id (uuid) returned by stage, list or status; required for start, run and status. | |
| action | Yes | describe (destinations/fields), preview (validate, no writes), status (one job, paged), list (jobs) use read authority. stage (save batch), start (background), run (legacy, ≤25 rows synchronously) require write authority. Explicit tool policies apply. start retries unsuccessful rows after execution finishes; replay never duplicates an imported source identity. | |
| job_id | No | Alias of jobId. | |
| source | No | The exporting system — salesforce, hubspot, attio or csv; it selects the id-column and column-name conventions used to read the files. | |
| mappings | No | Per sourceObject: {sourceObject,objectType,fields:{column:{field,referenceObject?,valueMap?,amountUnit?}},ignoredColumns,defaults?}; map or ignore every column. Preserve relationships via referenceObject source ids. Explicitly map owners, stages, currencies and amount units; money defaults to integer minor units, multiselect to JSON-array strings. | |
| rowLimit | No | For status: job rows per page (1–200, default 100). | |
| rowOffset | No | For status: job rows to skip (0–5000, default 0); advance by the returned rows.length while hasMoreRows is true. | |
| row_limit | No | Alias of rowLimit. | |
| row_offset | No | Alias of rowOffset. | |
| sourceInstance | No | A stable label for the customer's source CRM instance (1–200 chars); reuse the same value for every later export so source ids resolve to the same records. | |
| source_instance | No | Alias of sourceInstance. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | No | |
| jobs | No | |
| note | No | |
| error | No | |
| applied | No | |
| preview | No | |
| destinations | No | |
| activationGuidance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give readOnlyHint=false and destructiveHint=false; the description goes well beyond them: preview performs no writes, stage stores the identical preparation, identical source identity/payload is skipped, changed identities and email/domain collisions require manual resolution and 'never name merges', approvals block imports, historical imports emit no automation events or enrichment, and waiting rows persist for resume. It also discloses that start retries unsuccessful rows after execution without duplicating an already-imported source identity.
Agents need to know what a tool does to the 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 and nearly every clause carries real information (dedupe, collisions, approvals, unsupported objects, aliases), so it is not padded. However, distinct concerns are flattened into two long semicolon-chained paragraphs, making the workflow order and the caveats hard to scan; bullets or phase labels would have made it far more usable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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-action, 13-parameter bulk-mutation tool, the description covers the full lifecycle, safety posture, dedupe/collision policy, prerequisites, resumability, and what is out of scope. Limits, retries and authority are correctly delegated to the schema, and an output schema exists so return-value explanation is unnecessary.
Complex tools with many parameters or behaviors need more documentation. 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 per-action authority, row paging and mapping rules are already fully documented in the schema, so the baseline 3 applies. The description adds only a pointer ('See inputs for authority, mappings, limits and retries') and the fact that snake_case aliases are accepted, which is genuinely useful but thin given 13 parameters and two enums.
Input schemas describe structure but not intent. Descriptions should explain 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 'Admin CRM import' plus the explicit action pipeline (describe → preview → stage → start), and the example 'move our CRM data to Capable' makes the verb+resource concrete. It never states plainly that records get created in the destination CRM, and no sibling is named for contrast (e.g. create_record for single records), but no sibling could be confused with a bulk import, so differentiation is implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'When to use: An administrator imports a Salesforce, HubSpot, Attio or CSV export with explicit mappings and resumable progress' gives a clear triggering condition and actor. It also supplies ordering rules (resolve approvals first, preview before stage, explain activationGuidance before start) and exclusions ('Custom objects, workflows, attachments and unavailable history need separate scoping'). It stops short of naming what to use instead for those excluded cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_meetingPropose meetingAInspect
Place reversible, expiring, invitee-invisible calendar holds and STAGE the invitee email; this tool never emails anyone. First confirm topic AND agenda once with the user. Keep names out of the topic; address the invitee as you in the agenda. Pass exactly 3 find_times slots verbatim; list deliberate busy picks in busy_override_starts. co_host_emails is workspace members only; invitees use invitee_email/additional_invitee_emails. Relay dropped_co_hosts. Search for known account/contact/opportunity IDs; never invent them. Returns full state, picker_url and staged_invite_preview. A clear human go on content is authorization to send: call send_meeting_invite in the same turn, not a separate approval gate. Withhold only if explicitly told to hold, or without invitee_email (share picker_url). Never send without a human go. Details: capable://guide/scheduling.
When to use: After the user chooses times and approves the content.
Example: Set up our agreed meeting.
| Name | Required | Description | Default |
|---|---|---|---|
| slots | Yes | Exactly 3 slots, byte-identical from find_times output. | |
| topic | Yes | Short subject — becomes the calendar invite title and the picker heading. E.g. "Intro call", "Portfolio review", "Partnership next steps". No participant names. | |
| agenda | Yes | Goes into the calendar event description; the invitee reads it. Second person, 2–4 sentences, no invitee name. | |
| account_id | No | Link the meeting to an account in your workspace. | |
| contact_id | No | Link the meeting to a contact (usually the invitee). | |
| window_end | No | Forward the window_end you gave find_times (ISO 8601); stored with window_start for reschedule context. | |
| duration_min | Yes | Meeting duration in minutes — must match the find_times call. | |
| invitee_name | Yes | Primary invitee's full name. | |
| window_start | No | Forward the window_start you gave find_times (reschedule context). | |
| invitee_email | No | Primary invitee's email. OMIT for shareable mode — the picker URL comes back for the user to share manually, and the invitee enters their email when they pick. | |
| co_host_emails | No | Workspace members who co-host: holds land on their calendars and the confirmed event includes them. Never the external invitee (invitee_email / additional_invitee_emails); a non-member matching a known contact is dropped. | |
| opportunity_id | No | Link the meeting to an opportunity. | |
| invitee_company | No | Primary invitee's company name, stored on the meeting; it appears in the host's booked notification and is matched by meeting search. | |
| expiration_hours | No | Hours before the held times auto-release if the invitee doesn't pick. Defaults to the host's saved default. | |
| busy_override_starts | No | `starts_at` values from `slots` the host deliberately chose over a busy time on their own or a co-host's calendar (the find_times card marks these busy_override after the host drops a slot onto a visible busy band). Pass only after a heads-up to the user — a light note for the host's own busy time, a stronger one for a co-host's. A listed start keeps its hold while busy (placed and honored at the invitee's confirm); a busy slot not listed is dropped as a race. Omit when none overrides a busy time. | |
| additional_invitee_emails | No | Secondary invitees — CC'd on the picker email and added to the calendar event; only the primary invitee picks. Requires invitee_email. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| slots | No | |
| meeting | No | |
| guidance | No | |
| proposed | No | |
| timed_out | No | |
| picker_url | No | |
| signed_in_as | No | |
| dropped_slots | No | |
| repairs_flagged | No | |
| dropped_co_hosts | No | |
| staged_invite_preview | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses that holds are reversible, expiring, invitee-invisible, and never emailed; that the email is staged; that dropped co-hosts must be relayed; and that busy overrides behave differently from race-dropped busy slots. It also explains the authorization model: a clear human go on content authorizes sending via send_meeting_invite in the same turn. These are material behavioral traits not carried by the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded, stating the core behavior first and then workflow constraints, parameter pitfalls, return values, authorization, and a use-case note. Every sentence carries operational value for a 16-parameter scheduling tool. There is little or no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity, 16 parameters, and an output schema, the description covers the essential workflow, prerequisites, authorization boundary, co-host constraints, ID validation, and returned artifacts such as picker_url and staged_invite_preview. An agent has enough context to call this correctly and to know when to route to send_meeting_invite.
Complex tools with many parameters or behaviors need more documentation. 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 by requiring exactly three find_times slots verbatim, restricting co_host_emails to workspace members, directing invitees to invitee_email or additional_invitee_emails, and requiring search for known IDs rather than invention. It also explains why busy_override_starts exists and when to list a start. Some of this repeats schema descriptions, so it is strong but not fully 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?
The description states a specific verb and resource: it places reversible, expiring, invitee-invisible calendar holds and stages an invitee email without sending it. It explicitly distinguishes this from send_meeting_invite and from find_times by describing the exact stage-and-defer behavior. An agent can identify precisely 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?
It gives explicit timing: use after the user chooses times and approves the content, and first confirm topic and agenda once. It also names the follow-on alternative send_meeting_invite and the condition for calling it in the same turn, plus the exception for withholding when told to hold or when invitee_email is absent. This is unusually complete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_updatesPropose updatesARead-onlyInspect
Read matched records, schema and history; assemble ONE complete plan of records, people, links, activity and requested tasks, then call review_proposed_updates without preliminary confirmation. Use create keys and {$ref:key} links; never save parents for ids or call write tools directly. Ask once in app OR chat; corrections replace the pending plan via replaces_receipt. After saving, propose only new changes to returned records. Reuse matched_entities ids/state/history without re-fetching get_context/search_*; ignore junk and never invent ids. Resolve entity_resolution ambiguities before review. For stored work pass source_touch_id; pinned:true links outrank heuristic matches. Pass source candidate_names for lowercase/uncased names.
When to use: After any meaningful conversation, email, or note about a relationship. Pass the text in text.
Example: Extract CRM changes from these call notes.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Any source text: a transcript, an email, meeting notes, or a freeform request. | |
| transcript | No | Deprecated alias for `text`, kept for the old transcript-only signature; used only when `text` is omitted — prefer `text`. | |
| source_type | No | What the source text is (transcript, email, note, request, other); defaults to transcript and is echoed back as source_type. | |
| candidate_names | No | Entity names copied from the source, especially lowercase or uncased-script names. These are match candidates, not authoritative identities; names absent from the source are ignored. | |
| source_touch_id | No | Stored touch id for a recorded meeting or logged call; pins its linked records into the match. Use source_touch.participants for captured names/emails. Text is optional if this touch has a stored transcript, returned in full as source_touch.transcript. |
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | |
| workspace | No | |
| source_type | No | |
| source_touch | No | |
| source_length | No | |
| recent_history | No | |
| source_excerpt | No | |
| matched_entities | No | |
| entity_resolution | No | |
| matched_account_states | No | |
| extracted_candidate_names | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only and non-destructive annotations, it discloses important workflow behavior: the plan should be assembled once and sent to review without preliminary confirmation; corrections replace the pending plan via replaces_receipt; matched_entities data should be reused without re-fetching; junk should be ignored and ids never invented. It also explains source_touch_id pinning, that pinned links outrank heuristic matches, and that candidate_names are match candidates rather than authoritative identities.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core action is front-loaded, and nearly every sentence contains operational guidance, but the description is a dense run-on paragraph mixing workflow rules, ID conventions, matching heuristics, and usage triggers. It would be more effective if the 'When to use' guidance were moved forward and the technical instructions were separated into clearer clauses.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 complex planning workflow, the 100% schema coverage, the annotations, and the output schema, the description is largely complete: it covers the review handoff, pending-plan replacement, id reuse, ambiguity resolution, and source-touch pinning. It leaves some gaps around the exact boundary with commit_reviewed_updates and around what happens when there is nothing to propose.
Complex tools with many parameters or behaviors need more documentation. 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 is 3, but the description adds meaningful usage guidance for parameters: pass source text in `text`, use source_touch_id for stored work, and pass candidate_names for lowercase or uncased names. It does not describe the deprecated `transcript` alias, but the schema covers that detail.
Input schemas describe structure but not intent. Descriptions should explain 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: read matched records/schema/history, assemble one complete plan of records, people, links, activity, and requested tasks, then hand off to review_proposed_updates. It clearly distinguishes this from directly calling write tools and from the subsequent review step, so an agent can tell what this tool is for without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger ('After any meaningful conversation, email, or note about a relationship') and instructs the agent to pass text in `text`, plus says to call review_proposed_updates without preliminary confirmation. It also says to propose only new changes after saving and not to call write tools directly, but it never explicitly contrasts this with update_record or commit_reviewed_updates, leaving part of the routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_changesRead what changedARead-onlyInspect
The workspace's change feed, oldest first: each record created, updated, archived, restored or deleted on any object, with the names of the changed fields (never values), when, the actor and the basis of the values (person, reviewed, approved, collected, imported, automated). Fetch the records themselves with get_record. Pass next_cursor back as cursor; a first call starts at since (default the last 24 hours). A change appears a minute after it happened, so a cursor never skips one. 30 days are kept: a cursor older than oldest_cursor means read the records you track afresh, then continue.
When to use: An agent that keeps something in step with Capable, or needs to know what moved since it last looked, instead of polling searches or reports.
Example: What changed in the CRM since yesterday morning?
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Changes per page (default 100). | |
| since | No | Where a first read without a cursor starts (ISO datetime). | |
| cursor | No | next_cursor from the previous call. | |
| object_types | No | Only these objects (account, contact, opportunity, subscription, lead, task, touch, report, forecast_target, sequence, sequence_step, sequence_enrollment, or a custom object key). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| changes | No | |
| has_more | No | |
| next_cursor | No | |
| oldest_cursor | No | |
| retention_days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/non-destructive annotations: ordering (oldest first), field-names-not-values, ~1 minute propagation delay, 30-day retention, cursor never skips a change, and what to do when a cursor is older than oldest_cursor. Missing only details like page-size exhaustion behavior or whether deleted records include a tombstone identifier.
Agents need to know what a tool does to the 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 definition, then paging mechanics, retention, and a labeled 'When to use' plus example. Dense but every sentence carries operational meaning; only the trailing example question is optional garnish.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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-param, zero-required polling tool with an output schema, the description covers the full mental model an agent needs: what is in each entry, ordering, latency, retention window, cursor lifecycle, and the recovery path when a cursor is stale.
Complex tools with many parameters or behaviors need more documentation. 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 still adds real semantics by explaining that next_cursor is echoed back as cursor, that cursor takes precedence and a first call starts at since with a 24-hour default. It does not add anything about limit or object_types 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 resource (the workspace's change feed) with its scope and shape: records created/updated/archived/restored/deleted on any object, with field names but never values. Clearly differentiates from sibling readers like get_record and search_records, which it names for fetching records themselves.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
An explicit 'When to use' section targets the sync/change-detection case and excludes the alternative ('instead of polling searches or reports'). It also routes the agent to get_record for the actual record bodies, so the choice between the two sibling tools is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_meetingRecord meetingADestructiveInspect
Send the Capable notetaker bot to a video call. Pass meeting_url to start recording a call happening now, or match to find the rep's next upcoming calendar meeting by title/attendee and schedule the bot to join it. With neither, schedules the very next upcoming meeting that has a join link. The transcript auto-files onto the matching account/contact/opportunity when ready. The workspace admin must have Meeting recorder enabled; otherwise this refuses without scheduling or dispatching a bot.
When to use: Ad-hoc recording. Auto-record handles scheduled meetings on its own; use this to grab a live call by URL or book the user's next meeting with a specific customer.
Example: Record my next call with Acme.
| Name | Required | Description | Default |
|---|---|---|---|
| match | No | Case-insensitive text matched against the title, attendee emails or names of the rep's join-link meetings in the next 24 hours; the first match is booked. | |
| meeting_url | No | Join URL of a call happening now (Zoom, Google Meet, Teams or Webex) — the bot is sent to it immediately as an ad-hoc recording. |
Output Schema
| Name | Required | Description |
|---|---|---|
| recording | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses a hard prerequisite (workspace admin must have Meeting recorder enabled), the refusal mode ('refuses without scheduling or dispatching a bot'), and a side effect (transcript auto-files onto the matching account/contact/opportunity). It does not explain what the destructiveHint implies for this operation or any rate/quotas, so it stops short of 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?
Front-loaded with the core action, then parameter behavior, side effects, prerequisites, when-to-use, and an example in a clean layered structure. It is slightly long and the parameter-mode explanation overlaps with what the schema already documents, but every section carries 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?
An output schema exists so return values need no explanation, and the description still covers purpose, all three invocation modes, prerequisites, failure behavior, and side effects. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the combination semantics that the schema does not: what happens when neither parameter is supplied ('schedules the very next upcoming meeting that has a join link'). That interpretation of the parameter matrix goes beyond the per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('send the notetaker bot to a video call') and then distinguishes all three invocation modes: meeting_url for a live call, match for a named upcoming meeting, and neither for the next join-link meeting. An agent can separate this from siblings like send_meeting_invite or stop_recording 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 behavior ('Auto-record handles scheduled meetings on its own') and gives the condition that selects this tool ('use this to grab a live call by URL or book the user's next meeting'). The when-to-use block and worked example leave nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_account_contactUnlink contact from accountADestructiveInspect
Unlink a contact from an account (the contact and the account themselves are kept). Hard-deletes the M2M row — there's no historical value to preserving an ended role. DESTRUCTIVE: confirm with the user first, then call again with confirm: true.
When to use: When someone leaves the company or their role ends.
Example: Remove Mark from the Acme contact list — he's left the company.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Boolean (true/false). | |
| account_id | Yes | A uuid. | |
| contact_id | Yes | A uuid. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| removed | No | |
| account_id | No | |
| contact_id | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, yet the description adds genuinely new information: the M2M row is hard-deleted with no history retained, and invocation requires a two-step confirm-then-retry flow with confirm: true. That confirmation protocol is not visible anywhere in the annotations or schema and is critical to calling the tool correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the destructive warning and confirm protocol before the usage guidance and example, which is the right ordering for a destructive tool. The aside justifying why no history is kept ('there's no historical value...') is mild filler but does reinforce intent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover the safety profile, so the description only needs to cover intent and the confirmation flow, which it does fully. An agent has everything needed to call this safely without opening the 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, but the description adds real meaning to the confirm parameter by explaining the two-step safety protocol, which the schema's bare 'Boolean (true/false)' does not convey. account_id and contact_id semantics are still left 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?
States a specific verb+resource pair ('Unlink a contact from an account') and immediately disambiguates scope by clarifying that the contact and account records themselves are kept. This clearly separates it from the sibling add_account_contact and from delete_record, which an agent could otherwise confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'When to use' trigger (person leaves the company or their role ends) plus a concrete example. It does not name the inverse tool (add_account_contact) or state when not to use it, but the usage context is clear enough to act on.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renew_subscriptionRenew subscriptionADestructiveInspect
Renew a subscription: advance current_term_started_at and current_term_ends_at forward by one billing cadence (or accept explicit dates), optionally update mrr_cents/seats/plan_name (for renewals with uplift). Writes a subscription_events row of type 'renewed'. Link to the closed-won renewal opportunity_id when available.
When to use: On close-win of a renewal opp. Handles term-date math by cadence.
Example: Renew Acme's Pro Annual subscription for another 12 months at the same MRR.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A uuid. | |
| notes | No | Free-text note stored on the 'renewed' subscription_events row (e.g. uplift terms); not written to the subscription itself. | |
| new_seats | No | Seat count after the renewal — omit to keep the current seats, or pass null to clear them; the 'renewed' event records the resulting seats. | |
| new_mrr_cents | No | An integer ≥ 0. | |
| new_plan_name | No | Plan name after the renewal (e.g. a tier change); omitted keeps the subscription's current plan_name. | |
| opportunity_id | No | A uuid. | |
| new_current_term_ends_at | No | Must match /^\d{4}-\d{2}-\d{2}$/. | |
| new_current_term_started_at | No | Must match /^\d{4}-\d{2}-\d{2}$/. |
Output Schema
| Name | Required | Description |
|---|---|---|
| account | No | |
| subscription | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a destructive, non-idempotent write; the description adds genuinely useful side-effect detail — a 'renewed' subscription_events row is written, term math is derived from cadence, and opportunity_id linkage is recorded. The key unstated risk is that repeated invocations advance the term again (idempotentHint=false is never explained), which matters for a renewal 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?
Front-loaded with the core mechanic, then a 'When to use' line and a short example — all three sentences earn their place. The example is somewhat redundant with the mechanic sentence but is cheap and concrete.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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-param, 1-required mutation with an output schema, the description covers the operation, its side effects, the optional-override paths, and the triggering workflow. Return values need not be explained. Nothing essential for correct invocation is missing beyond the idempotency caveat.
Complex tools with many parameters or behaviors need more documentation. 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: the cadence-derived dates are the default and explicit new_current_term_* dates are an alternative path, and new_mrr_cents/new_seats/new_plan_name exist specifically for uplift renewals. It doesn't state whether explicit dates must be given as a pair.
Input schemas describe structure but not intent. Descriptions should explain 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 (renew) and resource (subscription) plus the concrete mechanics: advancing current_term_started_at/current_term_ends_at by one billing cadence, with optional mrr/seats/plan overrides. This clearly distinguishes it from cancel_subscription and the generic update_record siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger given: "When to use: On close-win of a renewal opp," reinforced by a worked example. It does not name an alternative for edge cases (e.g. use update_record for mid-term corrections, or cancel_subscription), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reschedule_meetingReschedule meetingADestructiveIdempotentInspect
Moves a booked meeting to a new time in place. The existing calendar event is patched, so the video call link, the attendees and the invite stay the same, and the invitee gets a "your meeting moved to {new time}" email; the invitee doesn't re-pick. The new time is freebusy-checked against every host and refused if one is busy; the host's saved workday, buffers and minimum notice are not re-applied, because the host is the authority over their own meeting. Duration carries over unless you pass new_duration_min. A meeting still awaiting the invitee's pick returns a not_confirmed error. Returns the meeting's full state, the new when-label and the video call link.
Get the new time from find_times when the host's calendar needs checking, and confirm it with the user before calling.
When to use: The user wants a confirmed meeting at a different time. For a meeting the invitee hasn't picked yet, cancel it and propose new times instead.
Example: Move my 2pm with Sara to Thursday at the same time.
| Name | Required | Description | Default |
|---|---|---|---|
| new_start | Yes | ISO 8601 start of the new time (e.g. a find_times slot's starts_at, or a specific time the user named). Must be in the future and different from the current start. | |
| meeting_id | Yes | The confirmed meeting's id, from search_records or get_record. | |
| new_duration_min | No | Optional new duration in minutes. Omit to keep the meeting's current length. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | |
| note | No | |
| slots | No | |
| meeting | No | |
| guidance | No | |
| meet_link | No | |
| timed_out | No | |
| meeting_id | No | |
| rescheduled | No | |
| new_when_label | No | |
| co_host_repair_needed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, idempotentHint=true), the description discloses rich behavior: the video link/attendees/invite are preserved, an invitee-facing 'meeting moved' email is sent, the new time is freebusy-checked against every host, and host workday/buffers/minimum-notice are deliberately NOT re-applied. It also documents the not_confirmed error for pending picks. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then behavior, then routing, then example. Information-dense and well-organized, though slightly long, with minor redundancy between 'invite stays the same' and 'the invitee doesn't re-pick'.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be documented, yet the description helpfully notes they include full meeting state, the when-label and the video link. Error behavior, prerequisites, and alternatives are all covered for a destructive-ish mutation 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 already documents all three parameters. The description still adds value by explaining new_duration_min's carry-over default ('Duration carries over unless you pass new_duration_min') and the freebusy validation applied to new_start, going beyond the schema's field-level notes.
Input schemas describe structure but not intent. Descriptions should explain 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: 'Moves a booked meeting to a new time in place', and clarifies the event is patched rather than recreated. This clearly distinguishes it from siblings like propose_meeting, send_meeting_invite, and cancel_meeting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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' section scopes it to confirmed meetings at a different time, and names the alternative for the unconfirmed case ('cancel it and propose new times instead'). It also routes the agent to find_times for the new slot and instructs confirming with the user before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_recordRestore recordADestructiveIdempotentInspect
Bring back a soft-deleted contact or account by object_type + id — the undo of delete_record. Both come back whole: a contact with its account links and touch / note / task history intact (delete retains them), an account with its contacts, opportunities, subscriptions, touches, notes and tasks linked again (they kept their account_id). Only contact and account restore (other objects are re-created). Find a deleted record with get_record(include_archived:true) or the delete result's id. A record that isn't deleted, or an unknown id, is refused with the reason and nothing changes; the same scope as delete_record decides who may restore. Returns the restored record's full state with restored:true.
When to use: The user deleted a contact or account by mistake and wants it back.
Example: Restore the contact I deleted by mistake.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The deleted record's id — a uuid from the delete result or a get_record read with include_archived. A uuid. | |
| object_type | Yes | Which kind of deleted record to bring back: contact or account. One of: contact | account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | No | |
| restored | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the mutation profile (readOnlyHint=false, destructiveHint=true, idempotentHint=true), and the description adds substantial context beyond them: exactly what is restored (account links, touch/note/task history, opportunities, subscriptions), that non-deleted or unknown ids are refused with a reason and no changes occur, that authorization mirrors delete_record's scope, and that the response carries restored: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?
Front-loads the verb, resource, and undo relationship, then layers behavior, then usage and an example — a sound progression. It runs long and the 'When to use' line partially restates the opening sentence, which is mild redundancy but not 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?
An output schema exists, so return-value explanation is optional, yet the description still notes the restored:true marker. Combined with the restore semantics, refusal behavior, and authorization scope, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents both params, so the baseline is 3. The description adds meaning beyond it by stating the id comes from the delete result or a get_record read with include_archived, and that only contact/account are valid restore targets while other objects are re-created.
Input schemas describe structure but not intent. Descriptions should explain 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 ('bring back a soft-deleted contact or account') and explicitly frames itself as 'the undo of delete_record', which distinguishes it from delete_record and archive_object in the sibling list. It also scopes the tool to two object types, so an agent knows immediately whether it applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'When to use' trigger (user deleted a contact/account by mistake), names the retrieval alternative for finding candidates (get_record with include_archived:true, or the delete result's id), and states the fallback that other objects are re-created rather than restored.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_proposed_updatesReview proposed updatesARead-onlyInspect
Present ONE complete review of companies, contacts, opportunities, links, activity and requested tasks. Saves nothing. Use allowlisted tools and canonical args; existing targets need resolved UUIDs. Link new rows with unique create keys and exact {$ref:key} relationship references; no extra approval rounds for ids. Returns proposal ids and a receipt for commit_reviewed_updates after one Save or explicit chat approval, including dependencies. Don't repeat a visible app's save question. Chat corrections submit the full revised plan with replaces_receipt; preserve source_touch_id. Invalid rows are marked; oversized plans refused. Never omit substantive values to fit. Names/values derive from canonical args; presentation hints are optional.
When to use: Show the complete request once; MCP Apps hosts render one review. Chat corrections replace it.
Example: Show me those changes as a card so I can review and save them.
| Name | Required | Description | Default |
|---|---|---|---|
| proposals | Yes | 1–50 atomic proposals, each {confidence 0–1, commit:{tool, args}} plus optional rationale and field_changes; kind, title and target are optional presentation hints derived from commit.tool/args when omitted. commit.args is exactly what gets written: create_record {object_type,data}, update_record {object_type,id,patch}, or flat domain args. A create's unique key may be referenced by exact {$ref:key} in supported relationship fields. | |
| source_touch_id | No | Stored conversation used to derive this batch. Preserve the source_touch_id returned by propose_updates. | |
| replaces_receipt | No | The exact receipt of the pending review being revised after a chat correction. Supersedes it atomically; never replace a review that has already been committed. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | No | |
| receipt | No | |
| warnings | No | |
| proposals | No | |
| review_id | No | |
| correction | No | A correction's rows against the review it replaces; each row then carries edit_kind (unchanged | edited | added). |
| expires_at | No | |
| valid_count | No | |
| invalid_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already say readOnlyHint/destructiveHint=false, and the description adds real behavioral context beyond them: invalid rows are marked, oversized plans are refused, replaces_receipt supersedes atomically, and source_touch_id must be preserved. It also discloses what is returned (proposal ids and a receipt) and that no extra approval rounds are needed, which is exactly the kind of context annotations can't convey. No contradiction with readOnlyHint since it explicitly says 'Saves nothing.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It front-loads the core purpose and includes a useful example, but the body is a dense run of jargon-heavy, semicolon-chained clauses ('Link new rows with unique create keys and exact {$ref:key} relationship references; no extra approval rounds for ids'). Informative but harder to parse than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 3-parameter tool with a nested proposal array, an output schema, and full annotations, the description covers purpose, constraints, and the review-then-commit lifecycle well. The only gap is that the dense delivery makes some of that coverage harder to extract, but nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics: exact {$ref:key} relationship references for new rows, resolved UUIDs required for existing targets, and the atomic-supersession meaning of replaces_receipt. It reinforces rather than duplicates the schema, though a few sentences (e.g. 'no extra approval rounds for ids') are hard to map to a specific 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 ('Present ONE complete review of companies, contacts, opportunities...') and immediately clarifies 'Saves nothing,' which separates it from write tools. It implies the relationship to commit_reviewed_updates, though the phrasing is heavily jargon-laden, so an agent gets the gist without a crisp one-line summary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
An explicit 'When to use' clause and an example steer the agent toward showing the request once before commit. It also names a concrete alternative behavior (chat corrections replace the review; don't repeat a visible app's save question), though it never states when NOT to call it beyond the implicit 'before commit' framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_reportRun reportARead-onlyInspect
Preview analysis/dashboard data for your own reading; shows the user nothing. To display it, call show_report. Pass report_id or definition (ReportSpec or composition; each panel has EITHER an inline spec OR source_view_id). Use ref objects, e.g. {kind:"related",path:"account.name"}. in_period uses only its closed set; fixed ranges use gte + lt/lte. Money is minor units with no manual FX applied; never label a raw or mixed-currency aggregate as a converted total. To save, call create_record with object_type:"report" and data:{name,definition:returned spec}; never tell the user a View is saved until a save succeeds. Say when zero rows match; fix returned definition errors. Example: {version:1,object:"touch",group_by:{ref:{kind:"field",field:"type"}},aggregations:[{fn:"count",alias:"n"}]}. Recipes: capable://guide/reports.
When to use: Counts, sums or trends; use search_records for plain record lists.
Example: Analyze ARR by industry.
| Name | Required | Description | Default |
|---|---|---|---|
| report_id | No | A saved analysis or dashboard's id (uuid), run with its stored definition; give this or definition — report_id wins when both are passed. | |
| definition | No | An inline ReportSpec (object, columns, filters, group_by, aggregations, viz) or a composition (dashboard) to preview; omit when passing report_id. | |
| source_view_id | No | Id (uuid) of the saved View this inline definition refines, so a save updates it in place instead of creating a twin; ignored with report_id. | |
| suggested_name | No | A name for a later save, echoed as suggested_name; only meaningful with an inline definition (this call saves nothing). |
Output Schema
| Name | Required | Description |
|---|---|---|
| viz | No | |
| kind | No | |
| mode | No | |
| note | No | |
| rows | No | |
| spec | No | |
| empty | No | |
| title | No | |
| deltas | No | |
| layout | No | |
| object | No | |
| period | No | |
| columns | No | |
| widgets | No | |
| group_ref | No | |
| row_count | No | |
| truncated | No | |
| board_group | No | |
| aggregations | No | |
| group_bucket | No | |
| source_view_id | No | |
| suggested_name | No | |
| group_ref_secondary | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/destructive, but the description adds substantial non-structured context: the call shows the user nothing, saves nothing, report_id wins over definition and source_view_id is ignored with report_id, zero-row results must be reported, definition errors must be fixed, and View saves must not be claimed before success. The money-in-minor-units / no-FX warning is a real behavioral constraint an agent would otherwise get wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the preview-vs-display distinction, and every sentence carries load (save path, currency rule, example, recipes link). It is dense and packs invocation, correctness and workflow guidance into one block, which slightly hurts scannability, but 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 tool with a 3-variant union schema and an output schema, the description covers everything an agent needs: how to invoke, precedence rules, that nothing is displayed or saved, the follow-up tool for display and for save, currency semantics, and the pointer to capable://guide/reports for recipes.
Complex tools with many parameters or behaviors need more documentation. 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%, yet the description still adds meaning beyond the schema: the report_id-vs-definition precedence, the panel rule that each has EITHER an inline spec OR source_view_id, ref object syntax ({kind:"related",path:"account.name"}), in_period being a closed set, and fixed ranges using gte + lt/lte. That is genuine disambiguation of the most error-prone parts of a large union type.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource and immediately pins the scope: 'Preview analysis/dashboard data for your own reading; shows the user nothing.' It explicitly distinguishes itself from the nearest sibling (show_report) for display and search_records for plain lists, 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 ('Counts, sums or trends'), names alternatives with their selecting conditions ('use search_records for plain record lists', 'To display it, call show_report', 'To save, call create_record with object_type:"report"'). When-not guidance is present and concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_booking_pageSave booking pageADestructiveIdempotentInspect
Create a private booking-page draft or edit one of your pages. Creation requires topic and a new request_id UUID; reuse the exact UUID and details on retry. Defaults: 30 minutes, 14 days, empty description. To edit, pass page_id and its expected_updated_at; only supplied fields change. Edits preserve the URL and publication state. This never publishes a draft or sends messages. Use set_booking_page_status when the user asks to publish.
When to use: Create a private draft or patch one of your pages. Reuse the creation request_id on retries; editing needs the page's current version. Publishing is a separate requested action.
Example: Create a draft 30-minute intro page with a two-week booking window.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Public meeting name; required when creating a draft. | |
| page_id | No | Existing page ID from get_scheduling_settings; omit for a new draft. | |
| request_id | No | Required for creation. A fresh UUID for this draft; reuse on retries. | |
| description | No | Public description; an empty string clears it. | |
| window_days | No | How many days ahead guests may book. | |
| duration_min | No | Meeting length in minutes. | |
| expected_updated_at | No | Unchanged updated_at from get_scheduling_settings or the last successful write. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| page | No | |
| updated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly=false, idempotentHint=true, destructiveHint=true), and the description adds substantial context beyond them: it never publishes a draft or sends messages, edits preserve URL and publication state, only supplied fields change, and request_id must be reused on retry to stay idempotent. These are exactly the behavioral facts an agent needs for a mutation 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?
Front-loaded and fact-dense in the first paragraph, but the 'When to use' paragraph largely restates the opening ('Create a private draft or patch one of your pages', retry idempotency, editing needs the current version), and the example adds little information. A meaningful fraction of the text does not earn 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?
An output schema exists, so return values need no explanation. Combined with 100%-covered parameter descriptions and explicit annotation-supported behavior, the definition gives an agent everything required to create a draft, retry safely, and patch an existing page correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics: defaults (30 minutes, 14 days, empty description), that an empty description string clears the field, and that expected_updated_at is the optimistic-concurrency token tying edits to a known version. It does not cover the duration_min enum constraint, which the schema 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+resource ('Create a private booking-page draft or edit one of your pages') and explicitly separates creation from editing, plus names the sibling that handles publishing (set_booking_page_status). An agent can distinguish it from other scheduling tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('Create a private draft or patch one of your pages'), the retry condition (reuse the exact request_id UUID), the edit precondition (expected_updated_at / current version), and an explicit exclusion routing publishing to set_booking_page_status. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_reportSchedule reportADestructiveIdempotentInspect
Schedule one saved analysis to be emailed as a digest (CSV attached) to workspace members on a daily / weekly / monthly cadence (UTC); a dashboard cannot be scheduled — choose or save one panel as an analysis first. One schedule per report: calling again replaces every field, so re-pass conditions and recipients to keep them. day_of_week (0=Sun) applies weekly, day_of_month (1–28) monthly; recipients default to you. conditions (email only when it's worth it: an array of ≤5 {target, op, value}) hold the digest unless the data warrants it: target is "row_count" or one of the report's aggregation aliases, op one of gt|gte|lt|lte|eq|neq, value a number; it sends when ANY condition is met, evaluated against that run's result (mode "any"), else that occurrence is silently skipped. Omit conditions to always send. Returns the schedule.
When to use: The user wants a saved analysis emailed on a schedule — 'email me this every Monday'.
Example: Email the pipeline report to the sales team every Monday at 8am.
| Name | Required | Description | Default |
|---|---|---|---|
| hour | No | Hour of day to send, 0–23 in UTC (default 8). | |
| enabled | No | Whether the schedule is active (default true); pass false to keep the schedule but stop sending. | |
| frequency | Yes | Cadence of the digest: daily, weekly (with day_of_week) or monthly (with day_of_month); every run fires at `hour` UTC. | |
| report_id | Yes | The saved analysis to schedule, by id (uuid); one schedule per report, so calling again replaces it. Dashboards and segments are refused. | |
| conditions | No | Up to 5 {target, op, value} send conditions — target is "row_count" or an aggregation alias, op is gt|gte|lt|lte|eq|neq, value a number; omit to always send. | |
| recipients | No | Workspace member user ids (uuids) to email; defaults to just you, and any id that is not a member is refused. | |
| day_of_week | No | Weekly only: day to send, 0=Sunday … 6=Saturday; defaults to Monday when omitted. Ignored for daily and monthly. | |
| day_of_month | No | Monthly only: day to send, 1–28 (so every month has it); defaults to the 1st when omitted. Ignored for daily and weekly. |
Output Schema
| Name | Required | Description |
|---|---|---|
| schedule | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that one schedule exists per report and re-calling replaces every field (consistent with idempotentHint=true and destructiveHint=true), that non-member recipients are refused, that skipped occurrences are silently dropped, and the ANY-condition send semantics. This is rich operational context 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?
Dense but front-loaded: the core behavior paragraph comes first, then 'When to use' and an example. Some redundancy with the schema (e.g. 'one schedule per report: calling again replaces every field') but the length is justified by the 8-parameter, nested-condition surface.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present (returns the schedule) and annotations covering safety, the description fills the remaining gaps: defaults, replace semantics, refusal conditions, and condition-evaluation behavior are all covered. 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, but the description adds real meaning: it explains that conditions fire when ANY is met, that type is 'any', that a failing run is silently skipped, that omitting conditions always sends, and clarifies day_of_week/day_of_month applicability beyond the schema's per-field notes.
Input schemas describe structure but not intent. Descriptions should explain 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 (schedule a saved analysis as an emailed digest) with clear scope: cadence, CSV attachment, UTC. It also distinguishes itself from the report-rendering siblings by noting that a dashboard cannot be scheduled and one panel must be saved as an analysis first.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Has an explicit 'When to use' line plus a concrete example ('Email the pipeline report to the sales team every Monday at 8am') and a hard exclusion (dashboards, not analyses). It does not cross-reference the sibling tools run_report/export_report/show_report, so routing between the report family 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.
search_recordsSearch recordsARead-onlyInspect
List/filter any object; built-ins use typed search filters. Returns records, count, object_type, next_cursor, has_more and search_coverage. Follow every page for exhaustive answers. Unsupported filters are ignored and echoed in ignored_filters with coverage status unsupported_query: these rows do not answer the question; fix inputs before claiming matches or none. Unknown types return valid types. Most objects sort newest first; tasks by due ascending, undated last. Opportunity rows include account_last_inbound_at/account_last_touch_at for reply-recency questions. Task projection:'actions' includes sequence steps, deduplicates reminders, and returns exact counts plus paged rows. Write using taskId/enrollmentId, never projection ids. Nothing is sent.
When to use: A plain list — open tasks, deals in a stage, contacts at an account — before run_report; email matches carry a highlighted snippet.
Example: Find the emails to sally@acme.com.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size, 1–100 (default 20). Out-of-range values are clamped. | |
| query | No | Free-text names on account, contact, opportunity, lead, task, touch and meeting; for touch/activity also email subject/summary, stored email body content, and participant addresses. Object types without free-text search ignore it (noted in the result). | |
| cursor | No | Opaque keyset cursor: pass the previous page's next_cursor to fetch the next page; omit for the first page (a stale or invalid cursor restarts from page one). | |
| filters | No | Field key → exact scalar (string/number/boolean); relationships use target ids. Built-in typed search keys apply. Example for opportunity: {stage:'proposal',open_only:true} or {type:'renewal',open_only:true}. Non-scalars and unsupported keys are ignored with a note. | |
| projection | No | Read-only unified Actions queue for object_type task, including sequence steps. Filters: scope mine/team/all (assignment, not book); bucket due/upcoming/paused/completed/all; channel email/call/linkedin/other; source task/sequence; sequence or owner UUID; day YYYY-MM-DD; time_zone IANA; timed_only. | |
| object_type | Yes | Object key to list — a built-in (account, contact, opportunity, task, touch, meeting, report…), a custom object's key, or an opportunity type key such as renewal (auto-routed). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | No | |
| total | No | |
| counts | No | |
| result | No | |
| records | No | |
| has_more | No | |
| projection | No | |
| next_cursor | No | |
| object_type | No | |
| ignored_filters | No | |
| search_coverage | No | |
| cursor_restarted | No | |
| custom_field_definitions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the readOnly/destructive annotations: discloses pagination via next_cursor/has_more, silent filter ignoring echoed in ignored_filters with unsupported_query coverage status, unknown object types returning valid types, per-object sort orders, and that nothing is sent (consistent with readOnlyHint=true). The unsupported_query warning is exactly the kind of failure-mode disclosure that prevents a wrong answer being reported as fact.
Agents need to know what a tool does to the 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 nearly every sentence carries operative information for a genuinely complex tool; the purpose leads and behavior follows. Minor deductions: the when-to-use section and example sit at the tail rather than up front, and several distinct topics (sorting, opportunity fields, projection) run together without visual separation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 6 parameters, nested filter objects, and a high-stakes silent-failure mode, the description covers routing, pagination, error semantics, ordering, and object-specific quirks. Return fields are restated even though an output schema exists, but that repetition is harmless and the coverage is 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 genuine meaning: projection 'actions' semantics for tasks (sequence steps, deduped reminders, exact counts plus paged rows), the write-with-taskId/enrollmentId caveat guarding against using projection ids as write targets, and how filters behave when unsupported. The limits parameter and cursor mechanics are left to the schema, which is fine.
Input schemas describe structure but not intent. Descriptions should explain 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: "List/filter any object" with built-in typed filters, and immediately distinguishes what it is not by routing report-shaped questions to run_report. An agent can tell it apart from get_record, run_report, and read_changes 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?
Explicit when-to-use clause ("a plain list — open tasks, deals in a stage, contacts at an account — before run_report") with the alternative named and the selecting condition. It also gives operational directives — follow every page, fix inputs before claiming matches or none — which prevent the most likely misuse of a paged, filter-silently-ignoring endpoint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_meeting_inviteSend meeting inviteADestructiveIdempotentInspect
Sends the picker email to the invitee. Normally called in the SAME turn as propose_meeting: the user's okay on the topic and agenda IS the authorization to send, so don't ask for a separate send confirmation. Call it on its own only when the user earlier said to hold the send and now says to send. Never send without a clear human go, and never on your own initiative (a workspace require_approval policy on this tool is independent and untouched). Idempotent: a sent invite never re-sends. Errors clearly when the meeting isn't awaiting the invitee's pick or was created in shareable mode (no invitee email — share the picker_url instead). Returns the meeting's full state.
When to use: Right after propose_meeting in the same turn — the user's okay on topic and agenda is the authorization, so don't ask twice. Wait only if the user said to hold the send. Sends directly, never on the model's own initiative; idempotent.
Example: Okay, send Sara that invite now.
| Name | Required | Description | Default |
|---|---|---|---|
| meeting_id | Yes | The meeting's id, from propose_meeting or search_records. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sent | No | |
| slots | No | |
| meeting | No | |
| picker_url | No | |
| already_sent | No | |
| email_skipped | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by naming the error conditions (meeting not awaiting the invitee's pick, shareable mode with no invitee email and the picker_url fallback), stating that the workspace require_approval policy is independent and untouched, and confirming the return of full meeting state. Idempotency is reinforced with concrete behavior rather than just repeating the 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?
The 'When to use' block restates the opening paragraph almost verbatim ('don't ask twice' / 'don't ask for a separate send confirmation'; 'never on the model's own initiative' appears twice). The core guidance is front-loaded and valuable, but a quarter of the text is redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be detailed, and the description still notes the full-state return. For a single-parameter, idempotent mutation tool, the authorization model, error paths, and sibling sequencing 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 the schema already documents meeting_id's origin (propose_meeting or search_records). The description adds no format, constraint, or sourcing 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 ('Sends the picker email to the invitee') and immediately distinguishes itself from the adjacent sibling propose_meeting by describing the two-step flow. An agent can tell what this does without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('Right after propose_meeting in the same turn'), when-not ('never on your own initiative'), the authorization model ('the user's okay on the topic and agenda IS the authorization'), and the one exception for a held send. Alternatives and conditions are fully spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_booking_page_statusPublish or pause booking pageADestructiveIdempotentInspect
Publish or pause your booking page when the user requests it. Publishing makes the URL accept bookings from anyone with the link, after checking timezone and calendar readiness. Pausing prevents new bookings; existing meetings and guest management links keep working. Read the page's current version first. No invitations or messages are sent.
When to use: Publish or pause your page when asked, using its current version. Publishing checks readiness; pausing keeps its URL and existing meetings.
Example: Publish my intro booking page and give me its link.
| Name | Required | Description | Default |
|---|---|---|---|
| page_id | Yes | Your page ID from get_scheduling_settings. | |
| published | Yes | true accepts new bookings; false pauses the page. | |
| expected_updated_at | Yes | Unchanged updated_at from get_scheduling_settings or the last successful write. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| page | No | |
| updated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=true, idempotentHint=true), and the description usefully adds what each mode does: publishing validates timezone/calendar readiness, pausing leaves existing meetings and guest links intact, and no invitations are sent. It does not explain the version conflict behavior (what happens if expected_updated_at is stale), which is the main 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 action and its effects, followed by a usage section and example. Slightly repetitive — the 'When to use' paragraph largely restates the opening two sentences — but nothing is wasteful enough to hurt.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full parameter coverage, the description needn't explain return values. It covers side effects, prerequisites and readiness checks well; behavior on concurrent/stale writes is the one under-addressed aspect.
Complex tools with many parameters or behaviors need more documentation. 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 fully documented by the schema. The description references 'its current version' but adds no syntax or edge-case detail (e.g., conflict/stale-version handling) beyond what the schema already provides, 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?
The description states a specific verb pair and resource ('Publish or pause your booking page') and immediately contrasts the two modes' effects. It is readily distinguishable from siblings like save_booking_page or get_scheduling_settings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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' section plus a prerequisite ('Read the page's current version first') and a concrete example. It does not name alternative tools (e.g., save_booking_page) or explicitly say when not to use this one, so it falls 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.
set_exchange_ratesSet exchange ratesADestructiveIdempotentInspect
Set/remove Fixed workspace FX rates (admin-only). Fixed overrides the daily ECB Automatic reference rate until changed; removing restores Automatic. Direction: 1 input-currency unit = rate in default currency (DKK default: {currency:"EUR",rate:7.46} means 1 EUR = 7.46 DKK). Reversed-looking rates or rates outside 0.8–1.25× the bank rate require confirm:true; without it nothing saves, and the response supplies the question/reference/suggested correction. Upserts and removals are atomic; ambiguous requests change nothing. Stored amounts never change; totals convert only if every currency has a rate. Returns default currency, Fixed rates, bank date and effective rates.
When to use: An admin chooses a budget/contract rate or returns a currency to Automatic.
Example: Fix 1 EUR at 7.46 DKK; reset USD.
| Name | Required | Description | Default |
|---|---|---|---|
| remove | No | Currency codes whose Fixed rate to remove, switching them back to Automatic. May be combined atomically with upsert; a currency cannot appear in both lists. | |
| upsert | No | Rates to add or replace. Omit the workspace default currency; its implicit rate is 1. | |
| confirm | No | true saves a questioned rate as entered, after the user has checked it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rates | No | |
| updated | No | |
| workspace | No | |
| bank_rates | No | |
| rate_checks | No | |
| rates_in_use | No | |
| invalid_rates | No | |
| default_currency | No | |
| requires_confirm | No | |
| duplicate_currencies | No | |
| supported_currencies | No | |
| unchanged_currencies | No | |
| conflicting_currencies | No | |
| unsupported_currencies | No | |
| default_currency_upserts | No | |
| requires_default_currency | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: explains that Fixed overrides the daily ECB Automatic rate, that removal restores Automatic, that upserts/removals are atomic and ambiguous requests change nothing, and that stored amounts never change while totals convert only if every currency has a rate — which correctly qualifies the destructiveHint. It also discloses the confirm gate and what the response supplies when confirmation is needed.
Agents need to know what a tool does to the 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, then direction, then confirmation behavior, then a 'When to use' and an 'Example' section. Dense with semicolons but every clause carries distinct operational information; slightly packed for a single opening 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 a 3-parameter admin mutation with an output schema, this covers everything an agent needs: the rate direction and currency set, the default-currency exclusion, atomicity, the confirmation loop, and downstream effects on totals. Return values are described but not relied upon since an 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 already 100%, so the baseline is 3, but the description adds real meaning: the rate direction with a worked example ({currency:'EUR',rate:7.46} = 1 EUR = 7.46 DKK), the interaction between upsert and remove, and the confirm workflow that the schema only gestures at. The 0.8–1.25× bank-rate threshold that triggers confirmation appears only 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 pair and resource: 'Set/remove Fixed workspace FX rates (admin-only)'. No sibling tool touches FX rates, and the Fixed-vs-Automatic distinction is stated immediately, so an agent can identify the tool unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
A dedicated 'When to use' line names both use cases: an admin choosing a budget/contract rate, and returning a currency to Automatic. It gives clear context but no explicit when-not or named alternative, though none of the sibling tools competes for this job.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_opportunity_productsSet opportunity productsADestructiveIdempotentInspect
Replace an opportunity's entire product set and derive its value. Pass catalog product IDs/quantities, never prices; [] clears all lines and sets value to zero. The server snapshots unit_price_cents and computes totals: per_unit multiplies by quantity, flat charges once (quantity >1 is flagged). Discounts are percentages via line/top-level discount_pct; the server computes money. Bundles expand automatically; out-of-tier quantities are flagged, not blocked. include_discontinued:true allows a discontinued item on an existing agreement. Returns the fresh opportunity, priced lines and flags.
When to use: Price a deal from selected products after applying the opportunity_products template.
Example: Put 15 standard-plan units on Acme’s deal.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | The WHOLE product set (replace-all): [{product_id: product uuid, quantity: integer ≥ 0, discount_pct?: 0–100, include_discontinued?: boolean}]; [] clears every line. | |
| discount_pct | No | A number from 0 to 100. | |
| opportunity_id | Yes | A uuid. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| updated | No | |
| guidance | No | |
| line_items | No | |
| opportunity | No | |
| missing_objects | No | |
| tier_validations | No | |
| pricing_mode_validations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond annotations: catalog IDs and quantities are required rather than prices, the server snapshots unit_price_cents, computes per-unit vs flat totals, treats discounts as percentages, expands bundles, and flags rather than blocks out-of-tier quantities. It also explains that include_discontinued permits a discontinued item only on an existing agreement. These details align with destructiveHint=true because the replace-all behavior and clearing semantics are explicit.
Agents need to know what a tool does to the 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 definition is front-loaded with the replace-all contract, then pricing/discount/bundle rules, then usage and an example. Every sentence carries operational meaning, and no line is wasted on restating annotations or schema 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?
This is a complex destructive pricing mutation, and the description covers the important edge cases: clearing lines, zeroing value, server-side price derivation, discounts, bundles, discontinued items, and returned opportunity/priced lines/flags. With annotations and an output schema also present, an agent has enough to invoke it safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds real semantic meaning: lines is the WHOLE product set, [] clears everything, product inputs are catalog IDs and quantities rather than prices, discount_pct is a percentage at line or top level, and include_discontinued has a specific agreement condition. It explains how quantities are interpreted for per_unit and flat pricing.
Input schemas describe structure but not intent. Descriptions should explain 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: 'Replace an opportunity's entire product set and derive its value.' It immediately clarifies replace-all semantics, including that [] clears all lines, so an agent can distinguish this from a partial update or quote-creation tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when-to-use trigger: price a deal from selected products after applying the opportunity_products template. The example reinforces this. It does not explicitly name when not to use it or name sibling alternatives, so it falls 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.
show_reportShow reportARead-onlyInspect
Display an analysis/dashboard as a card with "Save as view", or text rows when cards are unavailable. Uses run_report arguments/results: report_id for saved data, or definition for an inline ReportSpec/composition. For your own reading, use run_report. Showing saves nothing: the user saves from the card, or you call create_record with object_type:"report", data:{name,definition:returned spec} when asked. Never tell the user a View is saved until a save succeeds. For revisions pass source_view_id to update the existing View rather than create a twin. Say when zero rows match. Money is minor units, not automatically converted totals. Authoring: capable://guide/reports.
When to use: The user asks to see, chart or keep an analysis.
Example: Show ARR by industry.
| Name | Required | Description | Default |
|---|---|---|---|
| report_id | No | A saved analysis or dashboard's id (uuid), run with its stored definition; give this or definition — report_id wins when both are passed. | |
| definition | No | The inline ReportSpec or composition (dashboard) to show — the same shape as run_report's definition; omit when passing report_id. | |
| source_view_id | No | Id (uuid) of the saved View this inline definition refines, so a save updates it in place instead of creating a twin; ignored with report_id. | |
| suggested_name | No | A name to seed the card's "Save as view" button, echoed as suggested_name; only meaningful with an inline definition (this call saves nothing). |
Output Schema
| Name | Required | Description |
|---|---|---|
| viz | No | |
| kind | No | |
| mode | No | |
| note | No | |
| rows | No | |
| spec | No | |
| empty | No | |
| title | No | |
| object | No | |
| columns | No | |
| widgets | No | |
| row_count | No | |
| truncated | No | |
| source_view_id | No | |
| suggested_name | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly annotation, the description discloses critical behavior: showing saves nothing, saving happens from the card or through create_record, the agent must not claim a View is saved until save succeeds, source_view_id updates existing Views rather than creating twins, zero-row results must be stated, and money is in minor units. These are exactly the behavioral details an agent needs to avoid user-facing errors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well front-loaded: core purpose first, then argument mapping, save behavior, revision handling, zero-row caveat, money units, guide link, and a when-to-use/example block. Every sentence adds operational value and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that an output schema exists and annotations cover the read-only safety profile, the description supplies the remaining context an agent needs: how to choose between report_id and definition, what showing does and does not save, how revisions should be handled, zero-row reporting, and money-unit behavior.
Complex tools with many parameters or behaviors need more documentation. 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 schema documents all four parameters. The description still adds useful meaning by tying parameters to run_report arguments/results, clarifying report_id as saved data versus definition as inline ReportSpec/composition, and emphasizing source_view_id's role in updating an existing View rather than creating a duplicate.
Input schemas describe structure but not intent. Descriptions should explain 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: display an analysis/dashboard as a card, or text rows when cards are unavailable. It explicitly distinguishes itself from run_report and explains what data sources it accepts, 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?
It gives explicit when-to-use guidance ('The user asks to see, chart or keep an analysis'), names the alternative for the agent's own reading ('use run_report'), and explains the save path via the card or create_record. The example further clarifies intended use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_workspace_setupShow workspace setupARead-onlyInspect
Show the workspace-setup step so the user can confirm the motion(s) you recommended, name the workspace, and save. On hosts that render interactive cards it can show a setup card with your message; the result also carries the current state and available motions, so the choice can be finished in text when no card is visible. Takes no arguments; commits via finalize_workspace_setup.
When to use: Only after you have welcomed the user, explained what a motion is, and shared your evidence-based read.
Example: Show me my setup options to confirm.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| state | No | Same shape as start_onboarding's `state`. |
| can_edit | No | |
| guidance | No | |
| checklist | No | |
| workspace_id | No | |
| import_evidence | No | Same shape as start_onboarding's `import_evidence`. |
| available_motions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real context beyond annotations: host-dependent card rendering, a text fallback path because the result carries current state and available motions, and the fact that this tool does not commit — committing happens via finalize_workspace_setup. It does not address why idempotentHint is false for a read-only presentation step, leaving a small unexplained trait.
Agents need to know what a tool does to the 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 happens and the escape hatch, then the prerequisite, then an example. Slightly longer than needed — the card/text dual-path sentence is dense — but every sentence carries routing or behavioral information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema covering the return payload and annotations covering safety, the description fills the remaining gaps: sequencing preconditions, host variability, and the handoff to the finalize tool. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so the schema already settles everything; the description reinforces this with 'Takes no arguments,' which prevents an agent from hunting for inputs. Baseline 4 for a parameterless 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 action (show the workspace-setup step) plus its purpose (confirm recommended motions, name the workspace, save) and explicitly distinguishes the commit step by naming finalize_workspace_setup as the tool that actually writes. An agent can tell it apart from its write sibling without inspecting 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 prerequisite chain — only after welcoming the user, explaining what a motion is, and sharing an evidence-based read — and names the alternative/next tool (finalize_workspace_setup) for the commit. Includes a concrete example invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
start_onboardingStart useful customer workARead-onlyInspect
Returns saved choices, entry context and workspace evidence for one useful customer result. Follow guidance; use accessible existing data and keep the team's setup. A useful brief or draft does not require a CRM write. Optional workspace-setup questions remain available; admins confirm through finalize_workspace_setup. Only after the user explicitly chooses collection, pass start_import:true once, then read again. Blank and CSV choices do not authorize email collection.
When to use: Get a first useful result or resume customer work; team members reuse existing context. Setup remains optional.
Example: Prepare one real customer follow-up.
| Name | Required | Description | Default |
|---|---|---|---|
| start_import | No | True only with explicit permission to import the connected inbox and calendar. Default false; a plain read never starts collection. |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | No | |
| guidance | No | |
| checklist | No | |
| user_journey | No | |
| workspace_id | No | |
| entry_context | No | |
| next_question | No | |
| get_started_url | No | |
| import_evidence | No | |
| available_motions | No | |
| available_templates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past readOnlyHint by spelling out the side effect the annotation cannot express: collection only begins when start_import:true is passed once after explicit user choice, and blank/CSV choices do not authorize email collection. This is exactly the kind of consent-gating context an agent needs. It slightly sidesteps the tension between readOnlyHint=true and a flag that triggers inbox/calendar import, so the safety profile is not fully reconciled.
Agents need to know what a tool does to the 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 return content, which is the right order, but it is padded: 'useful customer result' / 'useful brief or draft' repeat the same vague adjective across sentences and the optional-setup point is restated twice. It could be roughly half its length without losing any instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return shape needn't be explained, and the description instead covers the two-step flow (call, then read again) and the consent gate for import. What is missing is any indication of what 'workspace evidence' contains or what to do if required setup is absent, which matters for a first-run entry point.
Complex tools with many parameters or behaviors need more documentation. 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 boolean is already documented; the description still adds real semantics beyond it — that it must be passed only after explicit consent, only once, and that a plain read never starts collection. It does not clarify whether the import runs asynchronously or how to detect completion, which is a meaningful remaining ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete return payload (saved choices, entry context, workspace evidence) for the start_onboarding entry point, which is far more than the name alone conveys. It also names finalize_workspace_setup as the admin-side sibling, giving differentiation. The phrase 'one useful customer result' is vague marketing framing rather than a precise scope statement, keeping it off 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?
An explicit 'When to use' line covers first-result and resume-work cases, and the description adds a clear exclusion ('a useful brief or draft does not require a CRM write') plus a routing rule to finalize_workspace_setup for admins. The remaining gap is that it never says when to prefer get_context or show_workspace_setup, both of which look adjacent in the sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_recordingStop recordingADestructiveInspect
Pull the notetaker bot out of a call and cancel the recording. Use when a rep asks not to record a meeting the bot was scheduled for, or to remove it mid-call.
When to use: When a rep doesn't want a scheduled meeting recorded, or wants the bot removed mid-call.
Example: Don't record my 3pm — pull the bot off it.
| Name | Required | Description | Default |
|---|---|---|---|
| recording_id | Yes | The meeting recording's id — from record_meeting's result, or search_records({object_type:'meeting_recording'}) / get_record. |
Output Schema
| Name | Required | Description |
|---|---|---|
| recording | No | The recording's full state — the same shape record_meeting returns as `recording`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, openWorldHint=true and idempotentHint=false, so the safety profile is largely covered by structured data. The description adds the scenario of mid-call removal, which is useful context, but it does not disclose what is destroyed (recording data, transcript), auth requirements, or reversibility beyond what annotations imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded, but the same usage guidance is stated three times: once in the opening sentence, again under 'When to use:', and a third time in the example ('Don't record my 3pm'). Two of the four sentences are near-verbatim duplicates and do not earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with rich annotations and an output schema, the description need not explain return values, and it adequately covers purpose and trigger conditions. Only minor gaps remain around what exactly is torn down and whether the action is reversible.
Complex tools with many parameters or behaviors need more documentation. 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 a single well-documented recording_id parameter, so the schema carries the parameter semantics. The description mentions no parameter at all and adds no syntax or sourcing detail beyond the schema's own note about record_meeting and search_records. 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 verb and resource: 'Pull the notetaker bot out of a call and cancel the recording.' That is unambiguous about the action. It does not explicitly differentiate itself from adjacent siblings like record_meeting or share_recording, so it falls short of the 5 criterion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is an explicit 'When to use' section covering the two scenarios (rep declines a scheduled recording, or wants the bot removed mid-call). It gives clear context but offers no when-not-to-use conditions and does not route to alternative tools for related operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_availabilityUpdate saved availabilityADestructiveIdempotentInspect
Change your saved scheduling hours, timezone, workdays, recurring blackouts, buffers or minimum notice. Applies across all your booking pages and meeting searches; existing meetings do not move. Only supplied fields change. Arrays replace the full saved array: read and preserve entries the user did not ask to remove. Hours are whole hours in the saved IANA timezone. For a one-off search constraint use find_times instead.
When to use: Patch your saved timezone, work hours, blackouts, buffers, notice, or proposal expiry after reading current settings. These preferences apply across your workspaces.
Example: Keep my current schedule, but leave 15 minutes after each meeting.
| Name | Required | Description | Default |
|---|---|---|---|
| timezone | No | IANA timezone, for example Europe/Stockholm. | |
| workdays | No | Full replacement list of available weekdays. | |
| blackouts | No | Full replacement list of recurring blocked hours. Omitted/empty days means every workday; [] clears all blackouts. | |
| buffer_after_min | No | Required minutes after a meeting. | |
| workday_end_hour | No | Local ending hour, 1–24; later than the start. | |
| buffer_before_min | No | Required minutes before a meeting. | |
| workday_start_hour | No | Local starting hour, 0–23. | |
| expected_updated_at | Yes | Latest preferences updated_at, or null only when the read returned null. Re-read after a conflict. | |
| minimum_notice_hours | No | Minimum hours from now before a new booking. | |
| default_expiration_hours | No | Lifetime of proposed meeting holds; does not expire a standing booking page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| updated | No | |
| availability | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint=true annotation, the description discloses the actual destructive mechanism ('Arrays replace the full saved array: read and preserve entries the user did not ask to remove') and reassures on scope ('existing meetings do not move', 'Only supplied fields change'). It explains what is destroyed, what is untouched, and where the change propagates (all booking pages, meeting searches, workspaces).
Agents need to know what a tool does to the 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 destructive-array warning, then alternative, then when-to-use and an example. Every sentence is load-bearing except for mild repetition between the opening field list, the 'When to use' line listing the same fields, and the near-duplicate scope statements about workspaces/booking pages.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations covering the safety profile, and 100% schema description coverage, the only thing an agent must know is the array-replacement hazard and the read-preserve workflow — both are stated explicitly. Nothing needed to invoke this 10-parameter patch tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema does not carry: 'Hours are whole hours in the saved IANA timezone' and the blanket 'Only supplied fields change / arrays replace the full saved array' rule that generalizes the per-field replacement notes. It does not add format detail for expected_updated_at beyond what the schema already 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?
Opens with a specific verb and resource ('Change your saved scheduling hours, timezone, workdays, recurring blackouts, buffers or minimum notice') and enumerates the mutable fields. It also distinguishes itself from siblings by name ('For a one-off search constraint use find_times instead') and from get_scheduling_settings via the read-first workflow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' section states the trigger condition ('Patch your saved ... after reading current settings'), names the alternative for a different need (find_times), and the schema documents the expected_updated_at conflict path. Nothing about when/when-not 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.
update_objectUpdate object typeADestructiveIdempotentInspect
Admin-only patch of a custom object's label, plural, blurb, icon, shared-write mode, enabled flag or display_field (null resets to name). show_in_menu changes navigation only; hiding a menu row leaves the object usable. Built-in keys accept only enabled and show_in_menu. enabled:false hides records across the workspace and makes generic verbs refuse the object until re-enabled; nothing is deleted. Preview first, then confirm:true to disable; enabling needs no confirmation. describe_schema.switchable identifies objects that allow switching; foundational objects and feature parts do not. Returns the definition, or key and changes for a built-in/menu-only update.
When to use: An admin reconfigures an object type or its menu visibility.
Example: Rename the Property object to Listing.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The object's stable key (from describe_schema). On a built-in key only enabled and/or show_in_menu apply; any other change is refused. | |
| icon | No | A key from Capable's curated object-icon set (e.g. landmark, factory, handshake, flask); an unknown key is rejected with suggestions. Null clears back to the neutral default. | |
| blurb | No | New one-sentence description of the object; null clears it. | |
| label | No | New singular display name. The key does not change. | |
| plural | No | New plural display name for lists and the menu. | |
| shared | No | true lets any non-viewer edit every record of this object; false lets only the record's owner, admins and managers edit it. | |
| confirm | No | Required (true) to turn a BUILT-IN object off: the first enabled:false call answers with a preview instead. Not needed for anything else. | |
| enabled | No | false turns the object off (it leaves the schema and menu and the generic verbs refuse it; records kept); true turns it back on. On a built-in key, false needs confirm:true after a preview call. | |
| show_in_menu | No | Whether the object appears in the web app's sidebar menu — an explicit per-object override of the bounded default. Navigation only: it never changes what the object can do (that is `enabled`). Composes with the other args on a custom key; on a built-in key only with enabled. | |
| display_field | No | The data key holding a record's display name (a lowercase field key); null resets to the "name" default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | No | |
| note | No | |
| label | No | |
| object | No | |
| updated | No | |
| requires_confirm | No | |
| records_affected_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond destructiveHint/idempotentHint: it states that enabled:false hides records but deletes nothing, that generic verbs refuse the object until re-enabled, that menu hiding is navigation-only, that custom vs built-in keys allow different field sets, and that disabling requires a preview then confirm:true while enabling does not. These are exactly the mutation consequences an agent cannot infer from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the mutation scope, then behavioral rules, then when-to-use and an example – a sensible order with no filler. It is dense with long compound sentences, but nearly every clause carries distinct operational 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 10-parameter destructive admin mutation, the description covers authorization (admin-only), side effects, the preview/confirm sequence, built-in-key limits, and even a brief return-value hint despite an output schema existing. 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 schema already documents every parameter including null-resets, confirm, and the built-in key restriction. The description restates much of that (display_field null resets to name, built-in keys accept only enabled/show_in_menu) but adds limited new per-parameter meaning, 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 specific verb+resource ('Admin-only patch of a custom object') and enumerates exactly which attributes can change, separating custom keys from built-in keys. The custom-vs-built-in split and the display_field/menu distinction make it unambiguous against siblings like define_object.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
An explicit 'When to use' line plus a concrete rename example give the agent a clear trigger, and describe_schema.switchable is named as the eligibility check. It stops short of explicitly routing to an alternative (e.g. define_object for creation, update_record for records), so it is strong but not complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_pipelineUpdate pipelineADestructiveIdempotentInspect
Update a pipeline by pipeline_key (or pipeline_id; id wins): rename it (label), re-point it (applies_to), replace its stages (including each stage's entry requirements) or set which opportunity types default to it (default_for_types). Existing stage keys stay stable; a stage with open deals can't be removed (reassign them first). Omit both key and id to reshape the WORKSPACE DEFAULT pipeline — only stages apply there. An unknown key or id returns the known pipelines instead of an error. Admin-only. Returns the updated pipeline.
When to use: When an admin wants to rename a pipeline, change its stages or their entry requirements, re-point it, or set which deal types default onto it; omit the pipeline key to reshape the workspace default pipeline's stages.
Example: Don't let a deal reach Proposal until Metrics and an economic buyer are filled in.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Rename the pipeline. | |
| stages | No | Replace the stage list ([{key,label,role,is_closed?,is_won?,requires?,requires_mode?}]). Keep existing keys stable; a stage with open deals can't be removed. Replace-all: a stage sent without `requires` loses its requirements, so echo them back when only renaming or reordering. | |
| applies_to | No | The object key this pipeline runs on (e.g. opportunity). Named pipelines only. | |
| pipeline_id | No | The pipeline to edit by id (uuid). Prefer pipeline_key; id wins if both are given. | |
| pipeline_key | No | The named pipeline to edit, by its stable key (from describe_schema's pipelines section). Omit BOTH pipeline_key and pipeline_id to edit the workspace default pipeline (only `stages` applies there). | |
| default_for_types | No | Opportunity `type` value keys this pipeline is the default for — new deals of a mapped type start on it; a type maps to one pipeline. Pass [] to clear. Named pipelines only; registry value keys, not fixed type names. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pipeline | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring destructiveHint=true and idempotentHint=true, the description adds real behavioral context: admin-only authorization, unknown key/id returning the known pipelines instead of erroring, existing stage keys staying stable, a stage with open deals being unremovable (reassign first), and the replace-all destruction rule where a stage sent without `requires` silently loses its requirements. This goes well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is densely front-loaded with operations, precedence, constraints, and error behavior. However, the 'When to use' sentence largely restates the operations already listed in that opening sentence, and the trailing example ('Don't let a deal reach Proposal until...') illustrates a gate without tying back to a specific parameter, so there is some 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?
Return values are covered by the output schema and the description's closing note. For a 6-parameter mutation tool it covers identification (key/id/default), all mutation targets, gates, authorization, idempotency implications, and failure behavior — nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the nested stage object (requires, requires_mode, role) is already fully documented in the schema, including the key/id precedence and the omit-both default behavior. The description largely restates these, so baseline 3 applies; it adds only light emphasis on precedence 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?
The description gives a precise verb+resource (update a pipeline) and enumerates the mutations it supports: rename (label), re-point (applies_to), replace stages/entry requirements, and set default_for_types. It clearly separates itself from define_pipeline and archive_pipeline by scope, but it never names a sibling explicitly, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is an explicit 'When to use' clause scoping it to admins renaming pipelines, changing stages/gates, re-pointing, or setting defaults, plus the condition for editing the workspace default pipeline. No alternatives (define_pipeline, archive_pipeline, get_pipeline_summary) are named, and there are no negative exclusions, so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_quoteUpdate quoteADestructiveIdempotentInspect
Update a quote: change its status (exactly draft → sent → accepted / lost), link an opportunity, or replace its line items. When you pass lines, the SERVER re-prices from the catalog and replaces the whole line set, recomputing the total — you never pass a price (catalog products price from unit_price_cents (integer cents) and pricing_mode on the product object; per_unit multiplies by quantity, flat charges once, a missing or unknown pricing_mode resolves to flat, a flat line with quantity > 1 is flagged). Discounts are percent only (per-line discount_pct and/or a quote-level discount_pct) and apply when you re-price, so pass lines to change a discount. Status- or opportunity-only edits don't re-price. A quote is a pre-commit artifact (invoicing and contracts happen elsewhere). Returns the updated quote, its priced lines and flags.
When to use: The user wants to change a quote that already exists.
Example: Mark Acme's quote as sent, and add 5 more units.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A uuid. | |
| name | No | New display name for the quote; replaces the stored header name. | |
| lines | No | At least one item. | |
| notes | No | New free-text notes for the quote header; replaces the stored notes and never affects pricing. | |
| status | No | One of: draft | sent | accepted | lost. | |
| valid_until | No | Must match /^\d{4}-\d{2}-\d{2}$/. | |
| discount_pct | No | A number from 0 to 100. | |
| opportunity_id | No | Opportunity to link the quote to (must exist in this workspace); null clears the link, omitting leaves it unchanged. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| quote | No | |
| updated | No | |
| guidance | No | |
| repriced | No | |
| line_items | No | |
| mixed_cadence | No | |
| missing_objects | No | |
| tier_validations | No | |
| annualized_total_cents | No | |
| pricing_mode_validations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by explaining that passing `lines` destroys and replaces the entire line set, that the server re-prices from the catalog, that prices are never supplied by the caller, and that status/opportunity-only edits skip repricing. It also scopes the artifact ('pre-commit; invoicing and contracts happen elsewhere') and describes the return 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?
Front-loads the three mutation modes and puts the when-to-use and example at the end, with no filler. The pricing rules arrive in dense parenthetical clauses that take close reading, which keeps it from being maximally clean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, side-effecting mutation with an output schema, the description covers what changes, what gets replaced, how pricing is derived, what is returned, and what the object is not for. 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 baseline is 3, but the description adds real semantics the schema cannot: discounts only take effect via a re-price, quote-level vs per-line discount_pct, and the catalog pricing_mode rules (per_unit/flat/missing→flat, flat+qty>1 flagged). It does not touch name/notes/valid_until handling, so not 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?
Opens with a specific verb+resource and enumerates the three distinct mutation modes (status, opportunity link, line replacement). This clearly separates it from create_quote and from generic update_record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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' line plus a concrete example (mark sent, add units) gives a clear context. It does not name a sibling alternative (e.g. create_quote for new quotes) or state exclusions, 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.
update_recordUpdate recordADestructiveIdempotentInspect
Patch object_type + id; returns the fresh record. Built-ins use typed domain logic; custom data is shallow-merged and owner-scoped unless shared. Update an existing View with report + patch:{definition}; create a View only for a different perspective. Touch patches correct subject/summary/time/type. Sequence plans save together with saved step ids, revisions and an identical-retry request_id; enrollment fences timing/channel/order changes. Maintenance fields each run alone: task subtasks replaces the checklist; contact engaged:true is a ratchet; opportunity board_rank orders its column; sequence_step position swaps neighbours, fenced while people are partway through. See patch for syntax; task due follows create_record.
When to use: Edit fields (stage, task status:'done'). Retire converted leads LAST: status:'converted', account/contact/opportunity ids, converted_at, deleted_at; see an MCP resource at capable://guide/leads.
Example: Update opportunity : set stage to verbal.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A uuid. | |
| patch | Yes | Changed fields only, key → value; at least one required. Null clears custom data or a built-in custom_fields key; custom data is shallow-merged. Sequence: steps (keep saved ids), expected_revision (sequence mcp_revision), expected_steps:[{id,revision}] for every live step, request_id UUID reused only for an identical retry. Maintenance, each alone: task subtasks:[{id?,title,done?}] replaces the entire checklist; contact engaged:true; opportunity board_rank:{before?,after?}; sequence_step position swaps with the neighbour occupying that slot. | |
| object_type | Yes | Object key of the record being patched, e.g. account, contact, task, report, a custom object's key, or rollup / automation / field (admin-only; the id from describe_schema); an unknown key returns the valid types and writes nothing. | |
| expected_revision | No | Optional record revision from a reviewed update, as the text a review sealed or the number a record read shows in mcp_revision; a changed record is refused without writing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| record | No | |
| result | No | |
| updated | No | |
| object_type | No | |
| custom_field_definitions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already say destructive/idempotent, but the description adds substantial behavior the agent could not otherwise know: built-ins use typed domain logic, custom data is shallow-merged and owner-scoped unless shared, sequence plans must be saved atomically with expected revisions and a reused request_id, enrollment fences timing/channel/order changes, maintenance fields must each run alone, and contact engaged:true is a ratchet. That is concrete, consequential context beyond the structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense but front-loaded poorly after the first sentence; the middle is a long run-on packing per-object-type rules, which is hard to scan and mixes syntax pointers ("See patch for syntax") with behavior. Every fact is arguably useful, but the packaging costs readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and the description covers mutation semantics, concurrency refusal, ordering, and admin-only object types. Remaining gap is minor: permissions/error paths beyond the unknown-key case are only implied.
Complex tools with many parameters or behaviors need more documentation. 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 meaning: null clears custom data, patch is changed-fields-only, and the semantics of sequencing fields (request_id reused only for an identical retry, expected_steps required for every live step, position swaps with the neighbour). Much overlaps the schema, but the operational rationale is extra.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: "Patch object_type + id; returns the fresh record." It distinguishes itself from create_record ("task due follows create_record") and from create for Views. The pile of domain-specific edge cases that follows dilutes focus slightly, but the core purpose is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Has an explicit "When to use" section (edit fields, retire converted leads last with exact field list), and explicitly routes the View case: "Update an existing View... create a View only for a different perspective." It also notes task due dates follow create_record. No real when-not guidance beyond those cases, but the alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_scheduling_calendarsUpdate scheduling calendarsADestructiveIdempotentInspect
Choose which of your connected calendars block availability and where new meetings are created. Read get_scheduling_settings for calendar IDs and the current version. Omitted fields stay unchanged; conflict_calendar_ids replaces the full list. The destination must be writable and is always included in conflict checks. Existing meetings stay on their original calendars. Does not connect accounts or grant permissions.
When to use: Choose which connected calendars block your time and which writable calendar receives bookings. Read current IDs and the version first; selections apply across your workspaces.
Example: Check both my work and personal calendars, and put bookings on my work calendar.
| Name | Required | Description | Default |
|---|---|---|---|
| booking_calendar_id | No | Writable destination calendar ID returned by get_scheduling_settings. | |
| expected_updated_at | Yes | Latest preferences updated_at, or null only when the read returned null. Re-read after a conflict. | |
| conflict_calendar_ids | No | Full replacement list of calendars that block booking times; destination is always included. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| updated | No | |
| calendars | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations (destructiveHint, idempotentHint, openWorldHint) by disclosing that omitted fields stay unchanged, that conflict_calendar_ids replaces the full list, that the destination must be writable and is always in conflict checks, and that existing meetings are not moved. This is exactly the mutation semantics an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and well organized into behavior, when-to-use, and example. The 'When to use' sentence largely restates the opening line ('which connected calendars block your time and which writable calendar receives bookings'), which is mild redundancy, but the rest 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?
An output schema exists so return values need not be explained, and the description still covers the optimistic-concurrency prerequisite (read the version first, re-read after conflict) and mutation semantics. Nothing material is missing for an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so the baseline is 3, but the description adds real semantics beyond the schema: omitted fields are preserved, conflict_calendar_ids is a full replacement rather than a merge, and the destination is implicitly always included. It does not add syntax detail beyond this, so it exceeds but does not max the 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 and resource ('Choose which of your connected calendars block availability and where new meetings are created'), and distinguishes itself from the sibling get_scheduling_settings by naming it as the read path for calendar IDs. An agent can tell what this does and how it differs from related tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Has an explicit 'When to use' block, names the prerequisite read (get_scheduling_settings for IDs and version), states scope ('selections apply across your workspaces'), and includes a when-not constraint ('Does not connect accounts or grant permissions'). Covers both selection and destination use cases with an example.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_workspaceUpdate workspace settingsADestructiveIdempotentInspect
Admin PATCH; omitted/unchanged fields stay. Name/framework: finalize_workspace_setup. default_currency is locked while Fixed rates exist (remove via set_exchange_rates). Recorder/notice/domain-join switches, read_scope_by_role (own | team | all per role; admins see all) and autonomy_by_role (manage_approvals action:"autonomy" shows the evidence) need confirm:true; otherwise preview. Returns settings and changed keys. lead_notifications (send alone): read returns rule/version, members, fields, status; configure uses expected_version (null if absent) and confirm:true. source_filter:null matches all new leads, else exact match. Recipients: owner, members (max20 IDs), or inbox (recipient_email). Empty IDs except members; null email except inbox. message_field_key:null omits message. Internal, default off, no backfill. /developers#website-enquiries.
When to use: An admin changes workspace preferences, access, automation or internal lead alerts.
Example: Set our timezone to Europe/Stockholm.
| Name | Required | Description | Default |
|---|---|---|---|
| flags | No | Workspace capability flags. | |
| confirm | No | Apply posture/notification changes; false or omitted previews without writing. | |
| logo_url | No | Workspace logo as an http(s) URL; null clears it. | |
| timezone | No | IANA timezone, e.g. Europe/Stockholm. | |
| date_format | No | Date format; null restores Automatic (MM/DD/YYYY). | |
| autonomy_by_role | No | Per role (admin, manager, member) and source (assistant: a direct write; conversation: a review of pasted text; call, email, meeting, linkedin, sms, other: a review of that stored conversation): commit (default) | review (assistant only: propose → review first) | queue (held for an admin). | |
| currency_display | No | Money display; null defaults to symbol. | |
| default_currency | No | Supported ISO 4217 code. Locked while Fixed exchange rates exist. | |
| recorder_enabled | No | Enable recording across member calendars; needs confirm:true. | |
| allow_domain_join | No | Allow organisational-domain colleagues to join without invitation; needs confirm:true. | |
| deal_value_metric | No | Product value time basis; does not rewrite existing amounts. | |
| lead_notifications | No | Read or replace the new-lead email rule; send alone. | |
| read_scope_by_role | No | Per role: own (their book), team (their reporting tree's) or all (default). A member's own setting wins. | |
| recorder_auto_scope | No | Automatic joins: external customer calls (default), or off (manual record_meeting only). | |
| auto_create_contacts | No | Allow new contacts from email/calendar ingestion; existing activity continues either way. | |
| recorder_notice_enabled | No | Email external attendees an hour before recording with opt-out; needs confirm:true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| changed | No | |
| changes | No | |
| updated | No | |
| problems | No | |
| settings | No | |
| requires_confirm | No | |
| lead_notifications | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring mutation, destructiveness, idempotency and internal scope, the description adds substantial behavior: omitted fields stay unchanged, most posture/notification changes need confirm:true or preview, default_currency is locked while Fixed rates exist, and lead_notifications supports read/configure with expected_version. It also discloses that settings changes are internal, default off, and have no backfill.
Agents need to know what a tool does to the 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 length is justified by the 16-parameter, nested tool surface, and most sentences carry non-redundant operational detail. Structure is slightly dense and telegraphic in places, especially the semicolon-heavy constraint block and the fragment 'Internal, default off, no backfill', but the key behavior is front-loaded and the example is 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?
Given the output schema and 100% schema descriptions, the definition supplies the missing behavioral context an agent needs: admin scope, PATCH semantics, preview/confirm rules, currency locking, lead-notification read/configure behavior, recipient constraints, and return summary. It is complete enough to invoke safely without repeating every schema field description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds important cross-parameter meaning beyond the schema: which settings require confirm:true, how lead_notifications read/configure works, expected_version semantics, source_filter matching, recipient constraints, and message_field_key:null behavior. It does not elaborate every top-level parameter, but it substantively clarifies the hardest nested and conditional 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 ('Admin PATCH' for workspace settings) and grounds it with 'When to use: An admin changes workspace preferences, access, automation or internal lead alerts.' It also distinguishes key sibling routes, such as using finalize_workspace_setup for name/framework and set_exchange_rates for currency changes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use statement and routes several subcases to alternatives: finalize_workspace_setup for name/framework, set_exchange_rates for removing Fixed rates, and manage_approvals for autonomy evidence. The preview-vs-confirm behavior is also clearly tied to the affected setting groups.
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.
9 tool updates
- Changed
create_record1 field changed- changed
Input schema / properties / data / descriptionPrevious value: -"The new record's fields as key → value (relationship fields take the target record's uuid); for a built-in object, the same fields its typed create accepts."New value: +"New fields as key → value; relationships take target UUIDs; built-ins accept typed create fields. sequence: ordered steps [{title,brief,channel,day_offset}] + request_id UUID save the whole plan. timing_mode: from_start or after_previous; offsets stay cumulative; optional skip_weekends, pause_on_reply. Briefs accept CRM {{field}} tokens; preview with get_context(contact,sequence_brief). touch: source_touch_id reuses captured work, else request_id + occurred_at; sequence_action:{enrollment_id,step,outcome?,follow_up_on?} tracks confirmed work. Attempts and connection requests hold the step and require a follow-up date; not_now pauses; accepted/completed advance; retry pending tracking unchanged."
- Changed
get_context2 fields changed- changed
Input schema / properties / linkedin_url / descriptionPrevious value: -"Exact LinkedIn profile URL; only with type='contact'. Never resolves by name."New value: +"Exact LinkedIn profile URL, only with type='contact'. Never resolves by name. Exact duplicates return candidates: ask which, then repeat with that contact id." - changed
Input schema / properties / match_linkedin_email / descriptionPrevious value: -"With type='contact' and linkedin_url, check exact provider-reported emails for an existing contact. Read-only, reaches your connected LinkedIn provider. No name inference."New value: +"With type='contact' + linkedin_url and no profile match, check exact provider-reported emails on the verified profile. Read-only; reaches your connected LinkedIn provider; no name inference. linkedin.verified_email_match identifies one existing contact. create_record(contact) with linkedin_url + linkedin_match_id links only that reverified record; conflicts stop linking."
- Changed
merge_records1 field changed- changed
Input schema / properties / record_id / descriptionPrevious value: -"Listing only: possible duplicates of this one record."New value: +"Listing only: possible duplicates of this record. People match by live email/phone/LinkedIn URL or name on one account; companies by domain/LinkedIn page/name. These are candidates, not proven identities."
- Changed
migrate_crm3 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"describe (destinations/fields), preview (validate, no writes), stage (save a batch), start (background execution), run (≤25 rows now), status (one job, paged), list (all jobs)."New value: +"describe (destinations/fields), preview (validate, no writes), status (one job, paged), list (jobs) use read authority. stage (save batch), start (background), run (legacy, ≤25 rows synchronously) require write authority. Explicit tool policies apply. start retries unsuccessful rows after execution finishes; replay never duplicates an imported source identity." - changed
Input schema / properties / files / descriptionPrevious value: -"Up to 20 exports as {name, sourceObject, csv, idColumn?}: csv is the raw CSV text with a header row; idColumn names the stable source-id column (auto-detected when omitted)."New value: +"Up to 20 exports as {name,sourceObject,csv,idColumn?}: raw CSV with header; idColumn is the stable source-id column (auto-detected if omitted). Batch limits: 5000 rows, 2000000 CSV bytes, 3900000 request bytes, 5242880 normalized bytes." - changed
Input schema / properties / mappings / descriptionPrevious value: -"One per sourceObject: {sourceObject, objectType, fields: {column: {field, referenceObject?, valueMap?, amountUnit?}}, ignoredColumns, defaults?}; every column is mapped or ignored."New value: +"Per sourceObject: {sourceObject,objectType,fields:{column:{field,referenceObject?,valueMap?,amountUnit?}},ignoredColumns,defaults?}; map or ignore every column. Preserve relationships via referenceObject source ids. Explicitly map owners, stages, currencies and amount units; money defaults to integer minor units, multiselect to JSON-array strings."
- Changed
propose_updates1 field changed- changed
Input schema / properties / source_touch_id / descriptionPrevious value: -"When the text is the transcript/summary of a stored touch (recorded meeting, logged call), its touch id — pins the touch's linked records into the match."New value: +"Stored touch id for a recorded meeting or logged call; pins its linked records into the match. Use source_touch.participants for captured names/emails. Text is optional if this touch has a stored transcript, returned in full as source_touch.transcript."
- Changed
review_proposed_updates1 field changed- changed
Input schema / properties / proposals / descriptionPrevious value: -"1–50 atomic proposals, each {confidence 0–1, commit:{tool, args}} plus optional rationale and field_changes; kind, title and target are optional presentation hints derived from commit.tool/args when omitted. commit.args is exactly what gets written."New value: +"1–50 atomic proposals, each {confidence 0–1, commit:{tool, args}} plus optional rationale and field_changes; kind, title and target are optional presentation hints derived from commit.tool/args when omitted. commit.args is exactly what gets written: create_record {object_type,data}, update_record {object_type,id,patch}, or flat domain args. A create's unique key may be referenced by exact {$ref:key} in supported relationship fields."
- Changed
search_records3 fields changed- changed
Input schema / properties / filters / descriptionPrevious value: -"Field key → exact scalar value (string / number / boolean). Non-scalar values can't be matched and are ignored with a note."New value: +"Field key → exact scalar (string/number/boolean); relationships use target ids. Built-in typed search keys apply. Example for opportunity: {stage:'proposal',open_only:true} or {type:'renewal',open_only:true}. Non-scalars and unsupported keys are ignored with a note." - changed
Input schema / properties / projection / descriptionPrevious value: -"Read-only unified Actions queue, for object_type task."New value: +"Read-only unified Actions queue for object_type task, including sequence steps. Filters: scope mine/team/all (assignment, not book); bucket due/upcoming/paused/completed/all; channel email/call/linkedin/other; source task/sequence; sequence or owner UUID; day YYYY-MM-DD; time_zone IANA; timed_only." - changed
Input schema / properties / query / descriptionPrevious value: -"Free-text search. Matches names + (for touch/activity) email subject/summary, stored email body content, and participant addresses. Object types without free-text search ignore it (noted in the result)."New value: +"Free-text names on account, contact, opportunity, lead, task, touch and meeting; for touch/activity also email subject/summary, stored email body content, and participant addresses. Object types without free-text search ignore it (noted in the result)."
- Changed
start_onboarding1 field changed- changed
Output schema / properties / user_journey / properties / agent / anyOfPrevious value: -[ - { - "enum": [ - "claude", - "chatgpt" - ], - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "enum": [ + "claude", + "chatgpt", + "copilot" + ], + "type": "string" + }, + { + "type": "null" + } +]
- Changed
update_record1 field changed- changed
Input schema / properties / patch / descriptionPrevious value: -"Only the fields to change, key → new value; at least one key is required, and null clears a custom-object field or a built-in object's custom_fields key (custom data is shallow-merged, not replaced)."New value: +"Changed fields only, key → value; at least one required. Null clears custom data or a built-in custom_fields key; custom data is shallow-merged. Sequence: steps (keep saved ids), expected_revision (sequence mcp_revision), expected_steps:[{id,revision}] for every live step, request_id UUID reused only for an identical retry. Maintenance, each alone: task subtasks:[{id?,title,done?}] replaces the entire checklist; contact engaged:true; opportunity board_rank:{before?,after?}; sequence_step position swaps with the neighbour occupying that slot."
2 tool updates
- Changed
manage_approvals8 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"list the queue, or approve / deny one request by id. One of: list | approve | deny."New value: +"list the queue, approve / deny one request by id, or autonomy: the posture with its evidence. One of: list | approve | deny | autonomy." - added
Input schema / properties / daysAdded value: +{ + "description": "autonomy only: evidence window in days (default 90).", + "type": [ + "number", + "string" + ] +} - changed
Output schema / properties / action / enumPrevious value: -[ - "list", - "approve", - "deny" -]New value: +[ + "list", + "approve", + "deny", + "autonomy" +] - added
Output schema / properties / autonomy_by_roleAdded value: +{ + "type": "object" +} - added
Output schema / properties / evidenceAdded value: +{ + "items": { + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / levelsAdded value: +{ + "type": "object" +} - added
Output schema / properties / sourcesAdded value: +{ + "type": "object" +} - added
Output schema / properties / window_daysAdded value: +{ + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Changed
update_workspace1 field changed- added
Input schema / properties / autonomy_by_roleAdded value: +{ + "additionalProperties": {}, + "description": "Per role (admin, manager, member) and source (assistant: a direct write; conversation: a review of pasted text; call, email, meeting, linkedin, sms, other: a review of that stored conversation): commit (default) | review (assistant only: propose → review first) | queue (held for an admin).", + "propertyNames": { + "type": "string" + }, + "type": "object" +}
1 tool update
- Added
manage_webhooks
1 tool update
- Changed
review_proposed_updates1 field changed- added
Output schema / properties / correctionAdded value: +{ + "description": "A correction's rows against the review it replaces; each row then carries edit_kind (unchanged | edited | added).", + "properties": { + "added": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "edited": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "removed": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "replaces_review_id": { + "format": "uuid", + "type": "string" + }, + "unchanged": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "replaces_review_id", + "unchanged", + "edited", + "added", + "removed" + ], + "type": "object" +}
1 tool update
- Changed
merge_records5 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Listing only: at most this many pairs (default 25).", + "maximum": 100, + "minimum": 1, + "type": "integer" +} - changed
Input schema / properties / object_type / descriptionPrevious value: -"What the two ids are."New value: +"What the ids are." - added
Input schema / properties / record_idAdded value: +{ + "description": "Listing only: possible duplicates of this one record.", + "format": "uuid", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "object_type", - "keep_id", - "merge_id" -]New value: +[ + "object_type" +] - added
Output schema / properties / candidatesAdded value: +{ + "items": { + "type": "object" + }, + "type": "array" +}
2 tool updates
- Changed
manage_members4 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"list, invite, resend_invite, revoke_invite, set_role, set_manager or remove. One of: list | invite | resend_invite | revoke_invite | set_role | set_manager | remove."New value: +"list, invite, resend_invite, revoke_invite, set_role, set_manager, set_read_scope or remove. One of: list | invite | resend_invite | revoke_invite | set_role | set_manager | set_read_scope | remove." - added
Input schema / properties / include_reportsAdded value: +{ + "description": "set_read_scope: also everyone reporting up to this member.", + "type": [ + "boolean", + "string", + "number" + ] +} - added
Input schema / properties / read_scopeAdded value: +{ + "anyOf": [ + { + "description": "One of: own | team | all.", + "type": "string" + }, + { + "type": "null" + } + ], + "description": "set_read_scope: own, team, all, or null to follow the role's setting." +} - changed
Output schema / properties / action / enumPrevious value: -[ - "list", - "invite", - "resend_invite", - "revoke_invite", - "set_role", - "set_manager", - "remove" -]New value: +[ + "list", + "invite", + "resend_invite", + "revoke_invite", + "set_role", + "set_manager", + "set_read_scope", + "remove" +]
- Changed
update_workspace1 field changed- added
Input schema / properties / read_scope_by_roleAdded value: +{ + "description": "Per role: own (their book), team (their reporting tree's) or all (default). A member's own setting wins.", + "properties": { + "manager": { + "description": "One of: own | team | all.", + "type": "string" + }, + "member": { + "description": "One of: own | team | all.", + "type": "string" + }, + "viewer": { + "description": "One of: own | team | all.", + "type": "string" + } + }, + "type": "object" +}
2 tool updates
- Changed
manage_time_blocks3 fields changed- added
Input schema / properties / confirmAdded value: +{ + "description": "Required true for remove; without it the call returns a confirmation prompt and deletes nothing.", + "type": "boolean" +} - added
Output schema / properties / block_idAdded value: +{ + "type": "string" +} - added
Output schema / properties / requires_confirmAdded value: +{ + "type": "boolean" +}
- Changed
search_records1 field changed- added
Output schema / properties / cursor_restartedAdded value: +{ + "type": "boolean" +}
3 tool updates
- Changed
get_record2 fields changed- added
Output schema / properties / merged_fromAdded value: +{ + "type": "string" +} - added
Output schema / properties / provenanceAdded value: +{ + "type": "object" +}
- Added
merge_records - Added
read_changes
24 tool updates
- Changed
add_account_contact2 fields changed- removed
Input schema / properties / is_primary_champion / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / is_primary_champion / typeAdded value: +[ + "boolean", + "string", + "number" +]
- Changed
cancel_subscription2 fields changed- removed
Input schema / properties / confirm / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / confirm / typeAdded value: +[ + "boolean", + "string", + "number" +]
- Changed
create_quote6 fields changed- removed
Input schema / properties / discount_pct / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / discount_pct / typeAdded value: +[ + "number", + "string" +] - removed
Input schema / properties / lines / items / properties / discount_pct / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / lines / items / properties / discount_pct / typeAdded value: +[ + "number", + "string" +] - removed
Input schema / properties / lines / items / properties / quantity / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / lines / items / properties / quantity / typeAdded value: +[ + "number", + "string" +]
- Changed
define_enum_value2 fields changed- removed
Input schema / properties / color / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / color / typeAdded value: +[ + "string", + "null" +]
- Changed
define_rollup2 fields changed- removed
Input schema / properties / agg_field / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / agg_field / typeAdded value: +[ + "string", + "null" +]
- Changed
delete_record2 fields changed- removed
Input schema / properties / confirm / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / confirm / typeAdded value: +[ + "boolean", + "string", + "number" +]
- Changed
get_context2 fields changed- removed
Input schema / properties / match_linkedin_email / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / match_linkedin_email / typeAdded value: +[ + "boolean", + "string", + "number" +]
- Changed
get_help2 fields changed- removed
Input schema / properties / diagnostics / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / diagnostics / typeAdded value: +[ + "boolean", + "string", + "number" +]
- Changed
get_record2 fields changed- removed
Input schema / properties / include_archived / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / include_archived / typeAdded value: +[ + "boolean", + "string", + "number" +]
- Changed
log_touch6 fields changed- removed
Input schema / properties / duration_minutes / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / duration_minutes / typeAdded value: +[ + "number", + "string" +] - added
Input schema / properties / external_idAdded value: +{ + "description": "The activity's id in the system it came from (a Gmail message id, a dialer call id). An activity this workspace already holds under that id is returned instead of logged again (duplicate_suppressed), with only its blank details filled from this call.", + "type": "string" +} - removed
Input schema / properties / sequence_action / properties / step / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / sequence_action / properties / step / typeAdded value: +[ + "number", + "string" +] - changed
Input schema / properties / type / descriptionPrevious value: -"Defaults: call | email | meeting | linkedin | other. A workspace admin may rename or add values — see the live set in propose_updates' workspace.enum_values, or an admin's describe_schema."New value: +"Defaults: call | email | meeting | linkedin | sms | other. A workspace admin may rename or add values — see the live set in propose_updates' workspace.enum_values, or an admin's describe_schema."
- Changed
manage_approvals4 fields changed- removed
Input schema / properties / confirm / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / confirm / typeAdded value: +[ + "boolean", + "string", + "number" +] - removed
Input schema / properties / limit / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / limit / typeAdded value: +[ + "number", + "string" +]
- Changed
manage_linkedin_privacy2 fields changed- removed
Input schema / properties / erase_participant_metadata / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / erase_participant_metadata / typeAdded value: +[ + "boolean", + "string", + "number" +]
- Changed
manage_members2 fields changed- removed
Input schema / properties / confirm / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / confirm / typeAdded value: +[ + "boolean", + "string", + "number" +]
- Changed
remove_account_contact2 fields changed- removed
Input schema / properties / confirm / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / confirm / typeAdded value: +[ + "boolean", + "string", + "number" +]
- Changed
renew_subscription3 fields changed- removed
Input schema / properties / new_mrr_cents / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / new_mrr_cents / typeAdded value: +[ + "number", + "string" +] - changed
Input schema / properties / new_seats / anyOfPrevious value: -[ - { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string" - } - ], - "description": "An integer ≥ 0." - }, - { - "type": "null" - } -]New value: +[ + { + "description": "An integer ≥ 0.", + "type": [ + "number", + "string" + ] + }, + { + "type": "null" + } +]
- Changed
run_report1 field changed- changed
Input schema / properties / definition / anyOfPrevious value: -[ - { - "properties": { - "dashboard_filters": { - "properties": { - "filters": { - "items": { - "properties": { - "object": { - "maxLength": 100, - "minLength": 1, - "type": "string" - }, - "op": { - "enum": [ - "eq", - "gte", - "lte", - "in_period" - ], - "type": "string" - }, - "ref": { - "description": "Same shape as a `columns` item of the ReportSpec variant (a column reference: kind field | custom | related).", - "type": "object" - }, - "value": { - "maxLength": 1000, - "minLength": 1, - "type": "string" - } - }, - "required": [ - "ref", - "value" - ], - "type": "object" - }, - "maxItems": 6, - "type": "array" - }, - "period": { - "properties": { - "default": { - "enum": [ - "today", - "yesterday", - "this_week", - "last_7_days", - "next_7_days", - "last_30_days", - "next_30_days", - "last_90_days", - "this_month", - "last_month", - "this_quarter", - "this_year", - "overdue", - "upcoming" - ], - "type": "string" - }, - "enabled": { - "const": true, - "type": "boolean" - } - }, - "required": [ - "enabled" - ], - "type": "object" - } - }, - "type": "object" - }, - "kind": { - "const": "composition", - "type": "string" - }, - "layout": { - "properties": { - "rows": { - "items": { - "properties": { - "widgetIds": { - "items": { - "minLength": 1, - "type": "string" - }, - "minItems": 1, - "type": "array" - } - }, - "required": [ - "widgetIds" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "rows" - ], - "type": "object" - }, - "title": { - "minLength": 1, - "type": "string" - }, - "version": { - "const": 1, - "type": "number" - }, - "widgets": { - "items": { - "properties": { - "id": { - "minLength": 1, - "type": "string" - }, - "pin_window": { - "type": "boolean" - }, - "source_view_id": { - "minLength": 1, - "type": "string" - }, - "spec": { - "description": "Inline ReportSpec for this panel — the same shape as the ReportSpec variant of this definition." - }, - "title": { - "minLength": 1, - "type": "string" - }, - "viz": { - "enum": [ - "table", - "bar", - "stat", - "trend", - "donut", - "board", - "matrix", - "funnel", - "column", - "area" - ], - "type": "string" - }, - "width": { - "anyOf": [ - { - "const": 2, - "type": "number" - }, - { - "const": 3, - "type": "number" - }, - { - "const": 4, - "type": "number" - }, - { - "const": 6, - "type": "number" - } - ] - } - }, - "required": [ - "id", - "title" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "version", - "kind", - "layout", - "widgets" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "segment", - "type": "string" - }, - "object": { - "minLength": 1, - "type": "string" - }, - "state": { - "properties": { - "conds": { - "items": { - "properties": { - "fieldKey": { - "maxLength": 80, - "minLength": 1, - "type": "string" - }, - "op": { - "enum": [ - "contains", - "eq", - "is_null", - "gte", - "lt", - "between", - "in_next", - "in_last", - "overdue", - "in", - "not_in" - ], - "type": "string" - }, - "value": { - "anyOf": [ - { - "maxLength": 120, - "type": "string" - }, - { - "items": { - "maxLength": 120, - "minLength": 1, - "type": "string" - }, - "maxItems": 50, - "minItems": 1, - "type": "array" - } - ] - } - }, - "required": [ - "fieldKey", - "op" - ], - "type": "object" - }, - "maxItems": 8, - "type": "array" - }, - "filters": { - "additionalProperties": { - "maxLength": 120, - "minLength": 1, - "type": "string" - }, - "propertyNames": { - "maxLength": 80, - "minLength": 1, - "type": "string" - }, - "type": "object" - }, - "match": { - "enum": [ - "all", - "any" - ], - "type": "string" - }, - "q": { - "maxLength": 200, - "minLength": 1, - "type": "string" - }, - "seg": { - "maxLength": 64, - "minLength": 1, - "type": "string" - }, - "sort": { - "maxLength": 64, - "minLength": 1, - "type": "string" - } - }, - "type": "object" - }, - "version": { - "const": 1, - "type": "number" - } - }, - "required": [ - "version", - "kind", - "object", - "state" - ], - "type": "object" - }, - { - "properties": { - "aggregations": { - "default": [], - "items": { - "properties": { - "alias": { - "minLength": 1, - "type": "string" - }, - "fn": { - "enum": [ - "count", - "count_distinct", - "sum", - "avg", - "min", - "max" - ], - "type": "string" - }, - "ref": { - "description": "Same shape as a `columns` item of the ReportSpec variant (a column reference: kind field | custom | related).", - "type": "object" - }, - "where": { - "items": { - "description": "Same shape as a `filters` item (field or custom refs with absolute operators).", - "type": "object" - }, - "maxItems": 3, - "type": "array" - } - }, - "required": [ - "fn", - "alias" - ], - "type": "object" - }, - "type": "array" - }, - "board_group": { - "description": "Same shape as a `columns` item of the ReportSpec variant (a column reference: kind field | custom | related).", - "type": "object" - }, - "columns": { - "default": [], - "items": { - "oneOf": [ - { - "properties": { - "field": { - "minLength": 1, - "type": "string" - }, - "kind": { - "const": "field", - "type": "string" - } - }, - "required": [ - "kind", - "field" - ], - "type": "object" - }, - { - "properties": { - "key": { - "minLength": 1, - "type": "string" - }, - "kind": { - "const": "custom", - "type": "string" - } - }, - "required": [ - "kind", - "key" - ], - "type": "object" - }, - { - "properties": { - "kind": { - "const": "related", - "type": "string" - }, - "path": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "kind", - "path" - ], - "type": "object" - } - ] - }, - "type": "array" - }, - "compare": { - "enum": [ - "previous_period" - ], - "type": "string" - }, - "derived": { - "items": { - "properties": { - "alias": { - "minLength": 1, - "type": "string" - }, - "denominator": { - "minLength": 1, - "type": "string" - }, - "format": { - "enum": [ - "percent", - "number" - ], - "type": "string" - }, - "kind": { - "const": "ratio", - "type": "string" - }, - "numerator": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "kind", - "numerator", - "denominator", - "alias" - ], - "type": "object" - }, - "maxItems": 3, - "type": "array" - }, - "filter_groups": { - "items": { - "properties": { - "filters": { - "items": { - "description": "Same shape as a `filters` item.", - "type": "object" - }, - "maxItems": 6, - "minItems": 1, - "type": "array" - }, - "mode": { - "enum": [ - "any", - "none" - ], - "type": "string" - } - }, - "required": [ - "mode", - "filters" - ], - "type": "object" - }, - "maxItems": 4, - "type": "array" - }, - "filters": { - "default": [], - "items": { - "properties": { - "op": { - "enum": [ - "eq", - "neq", - "gt", - "gte", - "lt", - "lte", - "contains", - "starts_with", - "in", - "not_in", - "has_any", - "in_period", - "is_null", - "is_not_null" - ], - "type": "string" - }, - "ref": { - "description": "Same shape as a `columns` item of the ReportSpec variant (a column reference: kind field | custom | related).", - "type": "object" - }, - "value": {} - }, - "required": [ - "ref", - "op" - ], - "type": "object" - }, - "type": "array" - }, - "group_by": { - "anyOf": [ - { - "properties": { - "bucket": { - "enum": [ - "day", - "week", - "month", - "quarter", - "year" - ], - "type": "string" - }, - "ref": { - "description": "Same shape as a `columns` item of the ReportSpec variant (a column reference: kind field | custom | related).", - "type": "object" - } - }, - "required": [ - "ref" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "group_by_secondary": { - "anyOf": [ - { - "description": "Same shape as `group_by`.", - "type": "object" - }, - { - "type": "null" - } - ] - }, - "limit": { - "default": 1000, - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "object": { - "minLength": 1, - "type": "string" - }, - "related_filters": { - "items": { - "properties": { - "filters": { - "default": [], - "items": { - "description": "Same shape as a `filters` item.", - "type": "object" - }, - "maxItems": 5, - "type": "array" - }, - "mode": { - "enum": [ - "with", - "without" - ], - "type": "string" - }, - "related": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "related", - "mode" - ], - "type": "object" - }, - "maxItems": 3, - "type": "array" - }, - "show_share": { - "type": "boolean" - }, - "sort": { - "anyOf": [ - { - "properties": { - "dir": { - "enum": [ - "asc", - "desc" - ], - "type": "string" - }, - "ref": { - "minLength": 1, - "type": "string" - } - }, - "required": [ - "ref", - "dir" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "version": { - "const": 1, - "type": "number" - }, - "viz": { - "enum": [ - "table", - "bar", - "stat", - "trend", - "donut", - "board", - "matrix", - "funnel", - "column", - "area" - ], - "type": "string" - } - }, - "required": [ - "version", - "object" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "dashboard_filters": { + "properties": { + "filters": { + "items": { + "properties": { + "object": { + "maxLength": 100, + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "eq", + "gte", + "lte", + "in_period" + ], + "type": "string" + }, + "ref": { + "description": "Same shape as a `columns` item of the ReportSpec variant (a column reference: kind field | custom | related).", + "type": "object" + }, + "value": { + "maxLength": 1000, + "minLength": 1, + "type": "string" + } + }, + "required": [ + "ref", + "value" + ], + "type": "object" + }, + "maxItems": 6, + "type": "array" + }, + "period": { + "properties": { + "default": { + "enum": [ + "today", + "yesterday", + "this_week", + "last_7_days", + "next_7_days", + "last_30_days", + "next_30_days", + "last_90_days", + "this_month", + "last_month", + "this_quarter", + "this_year", + "overdue", + "upcoming", + "tomorrow", + "next_working_day", + "next_5_working_days" + ], + "type": "string" + }, + "enabled": { + "const": true, + "type": "boolean" + } + }, + "required": [ + "enabled" + ], + "type": "object" + } + }, + "type": "object" + }, + "kind": { + "const": "composition", + "type": "string" + }, + "layout": { + "properties": { + "rows": { + "items": { + "properties": { + "widgetIds": { + "items": { + "minLength": 1, + "type": "string" + }, + "minItems": 1, + "type": "array" + } + }, + "required": [ + "widgetIds" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "rows" + ], + "type": "object" + }, + "title": { + "minLength": 1, + "type": "string" + }, + "version": { + "const": 1, + "type": "number" + }, + "widgets": { + "items": { + "properties": { + "id": { + "minLength": 1, + "type": "string" + }, + "pin_window": { + "type": "boolean" + }, + "source_view_id": { + "minLength": 1, + "type": "string" + }, + "spec": { + "description": "Inline ReportSpec for this panel — the same shape as the ReportSpec variant of this definition." + }, + "title": { + "minLength": 1, + "type": "string" + }, + "viz": { + "enum": [ + "table", + "bar", + "stat", + "trend", + "donut", + "board", + "matrix", + "funnel", + "column", + "area" + ], + "type": "string" + }, + "width": { + "anyOf": [ + { + "const": 2, + "type": "number" + }, + { + "const": 3, + "type": "number" + }, + { + "const": 4, + "type": "number" + }, + { + "const": 6, + "type": "number" + } + ] + } + }, + "required": [ + "id", + "title" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "version", + "kind", + "layout", + "widgets" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "segment", + "type": "string" + }, + "object": { + "minLength": 1, + "type": "string" + }, + "state": { + "properties": { + "conds": { + "items": { + "properties": { + "fieldKey": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "op": { + "enum": [ + "contains", + "eq", + "is_null", + "gte", + "lt", + "between", + "in_next", + "in_last", + "overdue", + "in", + "not_in" + ], + "type": "string" + }, + "value": { + "anyOf": [ + { + "maxLength": 120, + "type": "string" + }, + { + "items": { + "maxLength": 120, + "minLength": 1, + "type": "string" + }, + "maxItems": 50, + "minItems": 1, + "type": "array" + } + ] + } + }, + "required": [ + "fieldKey", + "op" + ], + "type": "object" + }, + "maxItems": 8, + "type": "array" + }, + "filters": { + "additionalProperties": { + "maxLength": 120, + "minLength": 1, + "type": "string" + }, + "propertyNames": { + "maxLength": 80, + "minLength": 1, + "type": "string" + }, + "type": "object" + }, + "match": { + "enum": [ + "all", + "any" + ], + "type": "string" + }, + "q": { + "maxLength": 200, + "minLength": 1, + "type": "string" + }, + "seg": { + "maxLength": 64, + "minLength": 1, + "type": "string" + }, + "sort": { + "maxLength": 64, + "minLength": 1, + "type": "string" + } + }, + "type": "object" + }, + "version": { + "const": 1, + "type": "number" + } + }, + "required": [ + "version", + "kind", + "object", + "state" + ], + "type": "object" + }, + { + "properties": { + "aggregations": { + "default": [], + "items": { + "properties": { + "alias": { + "minLength": 1, + "type": "string" + }, + "fn": { + "enum": [ + "count", + "count_distinct", + "sum", + "avg", + "min", + "max" + ], + "type": "string" + }, + "ref": { + "description": "Same shape as a `columns` item of the ReportSpec variant (a column reference: kind field | custom | related).", + "type": "object" + }, + "where": { + "items": { + "description": "Same shape as a `filters` item (field or custom refs with absolute operators).", + "type": "object" + }, + "maxItems": 3, + "type": "array" + } + }, + "required": [ + "fn", + "alias" + ], + "type": "object" + }, + "type": "array" + }, + "board_group": { + "description": "Same shape as a `columns` item of the ReportSpec variant (a column reference: kind field | custom | related).", + "type": "object" + }, + "columns": { + "default": [], + "items": { + "oneOf": [ + { + "properties": { + "field": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "field", + "type": "string" + } + }, + "required": [ + "kind", + "field" + ], + "type": "object" + }, + { + "properties": { + "key": { + "minLength": 1, + "type": "string" + }, + "kind": { + "const": "custom", + "type": "string" + } + }, + "required": [ + "kind", + "key" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "const": "related", + "type": "string" + }, + "path": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "kind", + "path" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "compare": { + "enum": [ + "previous_period" + ], + "type": "string" + }, + "derived": { + "items": { + "properties": { + "alias": { + "minLength": 1, + "type": "string" + }, + "denominator": { + "minLength": 1, + "type": "string" + }, + "format": { + "enum": [ + "percent", + "number" + ], + "type": "string" + }, + "kind": { + "const": "ratio", + "type": "string" + }, + "numerator": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "kind", + "numerator", + "denominator", + "alias" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" + }, + "filter_groups": { + "items": { + "properties": { + "filters": { + "items": { + "description": "Same shape as a `filters` item.", + "type": "object" + }, + "maxItems": 6, + "minItems": 1, + "type": "array" + }, + "mode": { + "enum": [ + "any", + "none" + ], + "type": "string" + } + }, + "required": [ + "mode", + "filters" + ], + "type": "object" + }, + "maxItems": 4, + "type": "array" + }, + "filters": { + "default": [], + "items": { + "properties": { + "op": { + "enum": [ + "eq", + "neq", + "gt", + "gte", + "lt", + "lte", + "contains", + "starts_with", + "in", + "not_in", + "has_any", + "in_period", + "is_null", + "is_not_null" + ], + "type": "string" + }, + "ref": { + "description": "Same shape as a `columns` item of the ReportSpec variant (a column reference: kind field | custom | related).", + "type": "object" + }, + "value": {} + }, + "required": [ + "ref", + "op" + ], + "type": "object" + }, + "type": "array" + }, + "group_by": { + "anyOf": [ + { + "properties": { + "bucket": { + "enum": [ + "day", + "week", + "month", + "quarter", + "year" + ], + "type": "string" + }, + "ref": { + "description": "Same shape as a `columns` item of the ReportSpec variant (a column reference: kind field | custom | related).", + "type": "object" + } + }, + "required": [ + "ref" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "group_by_secondary": { + "anyOf": [ + { + "description": "Same shape as `group_by`.", + "type": "object" + }, + { + "type": "null" + } + ] + }, + "limit": { + "default": 1000, + "exclusiveMinimum": 0, + "maximum": 9007199254740991, + "type": "integer" + }, + "object": { + "minLength": 1, + "type": "string" + }, + "related_filters": { + "items": { + "properties": { + "filters": { + "default": [], + "items": { + "description": "Same shape as a `filters` item.", + "type": "object" + }, + "maxItems": 5, + "type": "array" + }, + "mode": { + "enum": [ + "with", + "without" + ], + "type": "string" + }, + "related": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "related", + "mode" + ], + "type": "object" + }, + "maxItems": 3, + "type": "array" + }, + "show_share": { + "type": "boolean" + }, + "sort": { + "anyOf": [ + { + "properties": { + "dir": { + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + "ref": { + "minLength": 1, + "type": "string" + } + }, + "required": [ + "ref", + "dir" + ], + "type": "object" + }, + { + "type": "null" + } + ] + }, + "version": { + "const": 1, + "type": "number" + }, + "viz": { + "enum": [ + "table", + "bar", + "stat", + "trend", + "donut", + "board", + "matrix", + "funnel", + "column", + "area" + ], + "type": "string" + } + }, + "required": [ + "version", + "object" + ], + "type": "object" + } +]
- Changed
search_records2 fields changed- removed
Input schema / properties / limit / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / limit / typeAdded value: +[ + "number", + "string" +]
- Changed
set_exchange_rates4 fields changed- removed
Input schema / properties / confirm / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / confirm / typeAdded value: +[ + "boolean", + "string", + "number" +] - removed
Input schema / properties / upsert / items / properties / rate / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / upsert / items / properties / rate / typeAdded value: +[ + "number", + "string" +]
- Changed
set_opportunity_products8 fields changed- removed
Input schema / properties / discount_pct / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / discount_pct / typeAdded value: +[ + "number", + "string" +] - removed
Input schema / properties / lines / items / properties / discount_pct / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / lines / items / properties / discount_pct / typeAdded value: +[ + "number", + "string" +] - removed
Input schema / properties / lines / items / properties / include_discontinued / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / lines / items / properties / include_discontinued / typeAdded value: +[ + "boolean", + "string", + "number" +] - removed
Input schema / properties / lines / items / properties / quantity / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / lines / items / properties / quantity / typeAdded value: +[ + "number", + "string" +]
- Changed
share_recording6 fields changed- removed
Input schema / properties / confirm / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / confirm / typeAdded value: +[ + "boolean", + "string", + "number" +] - removed
Input schema / properties / expires_in_days / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / expires_in_days / typeAdded value: +[ + "number", + "string" +] - removed
Input schema / properties / include_transcript / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / include_transcript / typeAdded value: +[ + "boolean", + "string", + "number" +]
- Changed
update_object6 fields changed- removed
Input schema / properties / blurb / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / blurb / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / display_field / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / display_field / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / icon / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / icon / typeAdded value: +[ + "string", + "null" +]
- Changed
update_quote6 fields changed- removed
Input schema / properties / discount_pct / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / discount_pct / typeAdded value: +[ + "number", + "string" +] - removed
Input schema / properties / lines / items / properties / discount_pct / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / lines / items / properties / discount_pct / typeAdded value: +[ + "number", + "string" +] - removed
Input schema / properties / lines / items / properties / quantity / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "string" - } -] - added
Input schema / properties / lines / items / properties / quantity / typeAdded value: +[ + "number", + "string" +]
- Changed
update_record1 field changed- changed
Input schema / properties / patch / descriptionPrevious value: -"Only the fields to change, key → new value; at least one key is required, and null clears a custom-object field (custom data is shallow-merged, not replaced)."New value: +"Only the fields to change, key → new value; at least one key is required, and null clears a custom-object field or a built-in object's custom_fields key (custom data is shallow-merged, not replaced)."
- Changed
update_workspace14 fields changed- removed
Input schema / properties / allow_domain_join / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / allow_domain_join / typeAdded value: +[ + "boolean", + "string", + "number" +] - removed
Input schema / properties / auto_create_contacts / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / auto_create_contacts / typeAdded value: +[ + "boolean", + "string", + "number" +] - removed
Input schema / properties / confirm / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / confirm / typeAdded value: +[ + "boolean", + "string", + "number" +] - removed
Input schema / properties / flags / properties / automation_enabled / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / flags / properties / automation_enabled / typeAdded value: +[ + "boolean", + "string", + "number" +] - removed
Input schema / properties / logo_url / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Input schema / properties / logo_url / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / recorder_enabled / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / recorder_enabled / typeAdded value: +[ + "boolean", + "string", + "number" +] - removed
Input schema / properties / recorder_notice_enabled / anyOfRemoved value: -[ - { - "type": "boolean" - }, - { - "type": "string" - }, - { - "type": "number" - } -] - added
Input schema / properties / recorder_notice_enabled / typeAdded value: +[ + "boolean", + "string", + "number" +]
1 tool update
- Changed
manage_time_blocks1 field changed- changed
Input schema / properties / time_zone / descriptionPrevious value: -"IANA zone to show the block in, e.g. Europe/Stockholm."New value: +"IANA zone to show the block in on Google, e.g. Europe/Stockholm; Outlook shows each viewer's own zone."
1 tool update
- Changed
define_automation1 field changed- changed
Input schema / properties / action_args / descriptionPrevious value: -"Arguments for action_tool. String values may embed {{object_key}}, {{tool_name}}, {{record_id}} or {{account_id}}; a whole-string placeholder keeps the fact's raw type."New value: +"Arguments for action_tool. Text a person reads embeds {{record_name}} or {{account_name}}; ids and keys come from {{record_id}}, {{account_id}}, {{object_key}} or {{tool_name}}. A whole-string placeholder keeps the fact's raw type."
6 tool updates
- Removed
archive_field - Removed
archive_object - Removed
archive_pipeline - Changed
delete_record1 field changed- changed
Input schema / properties / object_type / descriptionPrevious value: -"Object key of the record to archive, e.g. contact, opportunity, task, touch, account, report, quote, a custom object's key, or rollup / automation (admin-only); subscription is refused."New value: +"Object key of the record to archive, e.g. contact, opportunity, task, touch, account, report, quote, a custom object's key, or rollup / automation / field / object / pipeline (admin-only; the id from describe_schema); subscription is refused."
- Removed
update_field - Changed
update_record1 field changed- changed
Input schema / properties / object_type / descriptionPrevious value: -"Object key of the record being patched, e.g. account, contact, task, report, a custom object's key, or rollup / automation (admin-only; the id from describe_schema); an unknown key returns the valid types and writes nothing."New value: +"Object key of the record being patched, e.g. account, contact, task, report, a custom object's key, or rollup / automation / field (admin-only; the id from describe_schema); an unknown key returns the valid types and writes nothing."
Publisher details
- Operator
- Capable
- Operator website
- https://capable.run · Publisher source
- Vendor relationship
- First-party
- Documentation
- https://crm.capable.run/developers · Publisher source
- Trust center
- https://capable.run/legal/privacy-policy · Publisher source
- Restrictions
- Requires a Capable account; connects with OAuth 2.1 (PKCE) and dynamic client registration, or a personal access token for clients without OAuth. Workspaces start on a 14-day free trial, then a paid plan. No custom OAuth app or admin approval needed.
Related MCP Connectors
A CRM you talk to: leads, deals and a pipeline board inside ChatGPT, Grok and other MCP clients.
CRM + visual automation builder AI agents can drive via MCP: contacts, tags, maps, email/SMS flows.
Native MCP access to CRM contacts, organizations, deals and tasks with user permissions.
AI CRO for Agencies and MSPs: full automatic CRM; multichannel tracking; draft follow-ups.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP-native CRM backend for AI agents, enabling customer, opportunity, note, follow-up, and pipeline health management through 15 MCP tools.-
- AlicenseNot gradedqualityBmaintenanceCRM AI - MCP server providing AI-powered tools and automation by MEOK AI Labs2 npm63 PyPIMIT
- FlicenseBqualityBmaintenanceEnables managing a small CRM of companies, contacts, deals, and activities through MCP tools, including creating and updating records, logging activities, searching across the CRM, and summarizing pipeline stages.15-
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to read and write CRM data—companies, contacts, opportunities, tasks, and interactions—through MCP, with OAuth and provenance tracking for every value.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.