Skip to main content
Glama

Server Details

MCP-native CRM: your assistant proposes updates, you approve them field by field.

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

TDQS

A3.9/5.0

Scored across 66 tools

Disambiguation3/5

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.

Naming Consistency5/5

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.

Tool Count2/5

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.

Completeness4/5

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 tools
add_account_contactLink contact to accountA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
roleYesDefaults: 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.
notesNoFree-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_idYesA uuid.
contact_idYesA uuid.
is_primary_championNoBoolean (true/false).

Output Schema

NameRequiredDescription
createdNo
account_contactNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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

An output schema exists, so return values need no explanation. 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
bodyYesMust not be empty.
touch_idNoA uuid.
account_idNoA uuid.
contact_idNoA uuid.
request_idNoRetry 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_idNoA uuid.

Output Schema

NameRequiredDescription
noteNo
accountNo

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, 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.

Purpose4/5

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.

Usage Guidelines4/5

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 templateA
Idempotent
Inspect

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.

NameRequiredDescriptionDefault
template_keyYesKey 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

NameRequiredDescription
appliedNo
createdNo
workspaceNo
did_you_meanNo
template_keyNo
available_templatesNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

An output schema exists, so return values need 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 meetingA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
reasonNoOptional reason — recorded on the audit log.
confirmNoPass true only after the user confirmed; without it the call performs nothing and returns what would happen.
meeting_idYesThe meeting's id, from propose_meeting or search_records.

Output Schema

NameRequiredDescription
noteNo
slotsNo
meetingNo
guidanceNo
cancelledNo
meeting_idNo
repairs_flaggedNo
requires_confirmNo

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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

An output schema exists, so return 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 subscriptionA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
idYesA uuid.
confirmNoBoolean (true/false).
canceled_atYesMust match /^\d{4}-\d{2}-\d{2}$/.
opportunity_idNoA uuid.
cancellation_reasonNoFree-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_categoryYesDefaults: 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

NameRequiredDescription
noteNo
accountNo
canceledNo
guidanceNo
subscriptionNo
requires_confirmNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description 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.

Purpose5/5

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.

Usage Guidelines4/5

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 updatesA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
confirmNoMust be true to execute; omitted or false commits nothing and returns a prompt to get the user's explicit approval first.
receiptYesThe receipt string returned by review_proposed_updates, passed back unchanged (it is bound to that review, this workspace and user, and expires).
idempotency_keyYesA UUID minted once per review (normally the returned review_id); reuse the same key to replay stored outcomes instead of executing again.
selected_proposal_idsYesThe 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

NameRequiredDescription
noteNo
summaryNo
outcomesNo
replayedNo
confirmedNo
review_idNo
review_commitNo
request_statusNo
selection_mismatchNo
frozen_selected_proposal_idsNo

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by 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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
nameNoOptional display name for the quote; stored on the quote header, null when omitted.
linesYesAt least one item.
notesNoOptional free-text notes stored on the quote header (terms, context); never read for pricing.
statusNoOne of: draft | sent.
account_idYesA uuid.
valid_untilNoMust match /^\d{4}-\d{2}-\d{2}$/.
discount_pctNoA number from 0 to 100.
opportunity_idNoA uuid.

Output Schema

NameRequiredDescription
noteNo
quoteNo
createdNo
guidanceNo
line_itemsNo
mixed_cadenceNo
missing_objectsNo
tier_validationsNo
annualized_total_centsNo
pricing_mode_validationsNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

With an output schema present, 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
dataYesNew 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_idNoA uuid.
request_idNoRetry 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_typeYesObject 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

NameRequiredDescription
noteNo
recordNo
resultNo
createdNo
object_typeNo
custom_field_definitionsNo

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose4/5

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

The description states a specific verb and resource: 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.

Usage Guidelines2/5

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 ruleA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
labelYesDisplay name for the rule. Its slug becomes the rule key, which must be unique in the workspace.
action_argsNoArguments 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_toolYesThe 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_eventNoThe event that fires the rule. Only "record.written" (any governed record write) exists today; it is the default.
condition_specNoall (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

NameRequiredDescription
automationNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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 valueA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
colorNoOptional hex color for the value's chip, e.g. "#2563eb"; display only. Null clears the color; omitting it keeps an existing value's color.
fieldYesThe enum field's key on that object, e.g. lifecycle_stage, type, status, priority; describe_schema lists each field's values.
labelNoDisplay 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.
orderNoReorder 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.
archivedNotrue 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.
positionNo0-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_keyNoStable machine key (lowercase, underscores). Defaults to the slugified label; pass an existing key to relabel, recolor, reposition, archive or restore that value.
object_typeYesBuilt-in object owning the enum field, e.g. account, opportunity, subscription, touch, task, lead.
semantic_roleNoRequired 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

NameRequiredDescription
noteNo
orderNo
valuesNo
updatedNo
enum_valueNo
current_keysNo
known_fieldsNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
labelYesDisplay label. Its slug (lowercase, underscores) becomes the field key, which must be unique on the object.
optionsNoThe allowed choices for a select or multiselect field, as labels; at least one is required. Ignored for other types.
field_typeYesThe 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_typeYesObject key to add the field to — a built-in object that supports custom fields, or any custom object (see describe_schema).
target_objectNoFor field_type relationship: the object key (built-in or custom) whose record id this field stores.

Output Schema

NameRequiredDescription
fieldNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
iconNoA 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.
blurbNoOne short sentence saying what records of this object represent; shown in describe_schema and Settings.
labelYesSingular display name, e.g. Partner. Its slug (lowercase, underscores) becomes the object's stable key; a built-in's key is refused.
pluralNoPlural display name for lists and the menu. Defaults to the label + "s".
sharedNotrue 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_newNoPass true to create even when a similar object exists; otherwise the anti-sprawl check returns the matches instead of creating.
display_fieldNoThe data key holding a record's display name — a lowercase field key such as "name" or "fund_name"; defaults to "name".

Output Schema

NameRequiredDescription
objectNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

An output schema exists, so return values need not be 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.

Parameters4/5

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.

Purpose5/5

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

States a specific verb and resource ('Create 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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
labelYesDisplay name. Its slug (lowercase, underscores) becomes the stable pipeline_key, which must be unique in the workspace.
stagesNoOrdered 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_toNoThe object key this pipeline runs on (e.g. opportunity). Defaults to opportunity when omitted.
default_for_typesNoOpportunity `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

NameRequiredDescription
pipelineNo

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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

An output schema exists, so 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 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.

Purpose5/5

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

States a specific verb and resource ("Create 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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
labelYesDisplay name. Its slug becomes the program key, which can't be revenue or a built-in phase key (pre_sales, sales, customer_success).
applies_toYesObject keys this program can claim records of, e.g. ["investor"] or ["opportunity"]; at least one is required.
membership_specNo{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

NameRequiredDescription
programNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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

With an output schema present, 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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 rollupA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
aggYesAggregation: sum, count, avg, min or max. Every kind except count needs agg_field.
keyYesStable name for the rollup, slugified to lowercase/underscores; unique per workspace.
agg_fieldNoThe numeric source field key to aggregate; required unless agg is count (null then). For an account source only current_arr_cents.
filter_specNoOptional 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_linkYesThe 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_fieldYesField 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_objectYesObject whose records are aggregated: a custom object, or account (then agg_field may only be current_arr_cents).
target_objectYesObject key whose records receive the value — a built-in one (account, contact, opportunity, subscription, touch, signal, task) or a custom object.

Output Schema

NameRequiredDescription
rollupNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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

With an output schema present, the description needn't explain return 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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already 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.

Purpose5/5

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.

Usage Guidelines5/5

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 recordA
Destructive
Inspect

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 .

NameRequiredDescriptionDefault
idYesA uuid.
confirmNoBoolean (true/false).
object_typeYesObject 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

NameRequiredDescription
noteNo
recordNo
resultNo
deletedNo
requires_confirmNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description 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.

Purpose5/5

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.

Usage Guidelines5/5

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 schemaA
Read-only
Inspect

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?

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
schemaNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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

With an output schema present, the description needn't explain return 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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)A
Read-only
Inspect

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.

NameRequiredDescriptionDefault
report_idNoA 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.
definitionNoAn 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

NameRequiredDescription
csvNo
formatNo
filenameNo
row_countNo
truncatedNo

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 setupA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
nameNoThe workspace's display name — answers the checklist's name item; until set it reads "<sign-up email domain> workspace".
answersNoAnswers to checklist items with no dedicated field, keyed by the checklist key (e.g. quoting_catalog); merged into the saved onboarding answers.
frameworkNoQualification framework whose fields are filled on opportunities; passing the current default (spiced) records it as a chosen answer.
template_keyNoKey of one extra starter template to apply beyond the chosen motions, from start_onboarding's available_templates; an unknown key is refused.
active_motionsNoThe confirmed motion key(s) from start_onboarding's available_motions — saved as the workspace's active motions, each applying its matching template.
pipeline_stagesNoThe 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_customNoCustom framework definition for framework 'custom', shaped {fields:[{key,label}]} — each key becomes a qualification field on opportunities.
feature_templatesNoKeys 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_motionsNoGuard 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

NameRequiredDescription
updatedNo
guidanceNo
workspaceNoThe workspace's state — the same shape start_onboarding returns as `state`.
workspace_urlNo
active_motionsNo
applied_templateNo
applied_templatesNo
skipped_feature_templatesNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 timesA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
window_endYesISO 8601 end of the search window.
duration_minYesMeeting duration in minutes (30, 45, 60, or 90).
window_startYesISO 8601 start of the search window.
current_slotsNoThe 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_labelNoWhich 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_emailsNoWorkspace 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_timezoneNoIANA 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_atNoExact 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_hourNoLatest 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_hourNoEarliest 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

NameRequiredDescription
modeNo
noteNo
hostsNo
slotsNo
eventsNo
shortfallNo
timed_outNo
duration_minNo
signed_in_asNo
host_timezoneNo
proposed_slotNo
co_host_noticeNo
dropped_co_hostsNo
invitee_timezoneNo
workday_end_hourNo
workday_start_hourNo
visualization_weeksNo
cohost_busy_intervalsNo
availability_blackoutsNo
display_offset_minutesNo
scheduling_constraintsNo
cohost_blackout_intervalsNo
calendar_context_availableNo

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; 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.

Purpose5/5

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

States a specific verb and resource with scope: "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.

Usage Guidelines5/5

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 billingA
Read-only
Inspect

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?

NameRequiredDescriptionDefault
account_idNoCompany uuid. Omit for quiet accounts.

Output Schema

NameRequiredDescription
quietNo
billingNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

An output schema exists, so return-format 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 contextA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
idNoThe record's id — a uuid from a previous read/search.
typeNoRecord type: account (default), contact, opportunity, subscription, task, or a custom object key.
account_idNoAlias for {type:'account', id} — the account's uuid.
linkedin_urlNoExact LinkedIn profile URL, only with type='contact'. Never resolves by name. Exact duplicates return candidates: ask which, then repeat with that contact id.
sequence_briefNoWith 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_idNoExact 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_idNoExact 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_emailNoWith 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

NameRequiredDescription
noteNo
foundNo
reasonNo
contextNo
web_urlNo
context_coverageNo

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 helpA
Read-only
Inspect

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?

NameRequiredDescriptionDefault
queryNoThe 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_keyNoFetch 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.
diagnosticsNoOpt 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

NameRequiredDescription
checksNo
articlesNo
guidanceNo
confidentNo
support_emailNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

For a zero-required-parameter 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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 summaryA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
pipeline_idNoScope the opportunity breakdowns to this pipeline by id (uuid). Prefer pipeline_key.
pipeline_keyNoScope 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_periodNoCalendar forecast period in the workspace timezone; defaults to quarter.

Output Schema

NameRequiredDescription
noteNo
emptyNo
stagesNo
revenueNo
forecastNo
frameworkNo
pipeline_by_lensNo
total_opportunitiesNo
sales_boundary_stageNo
renewals_due_next_90_daysNo
pipeline_by_type_and_stageNo

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

Given an output schema exists, 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.

Parameters4/5

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.

Purpose4/5

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

The opening sentence names a specific verb+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.

Usage Guidelines4/5

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 idA
Read-only
Inspect

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 .

NameRequiredDescriptionDefault
idYesThe record's id — a uuid from a previous read/search.
typeNoOptional 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_archivedNoBoolean (true/false).

Output Schema

NameRequiredDescription
noteNo
typeNo
foundNo
recordNo
web_urlNo
provenanceNo
merged_fromNo
custom_field_definitionsNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

With an output schema present 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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; 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.

Purpose5/5

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.

Usage Guidelines4/5

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 statusA
Read-only
Inspect

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?

NameRequiredDescriptionDefault
receiptYesUnchanged receipt returned by review_proposed_updates for the review to inspect.

Output Schema

NameRequiredDescription
noteNo
summaryNo
outcomesNo
confirmedNo
review_idNo
review_statusNo
request_statusNo
superseded_by_review_idNo
frozen_selected_proposal_idsNo

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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

An output schema exists, so return 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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb and resource ('Read 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.

Usage Guidelines4/5

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 settingsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
noteNo
statusNo
calendarsNo
availabilityNo
settings_urlNo
booking_pagesNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

An output schema exists, so return values need no explanation. Combined with 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
typeYesDefaults: 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.
sourceNoDefaults: 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.
subjectNoShort title of the activity (an email's subject line, a meeting's title); searchable and part of the duplicate fingerprint.
summaryNoPlain-text account of what happened or was discussed — the rep's notes for an unrecorded call; searchable together with the subject.
directionNoDefaults: 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_idNoA uuid.
contact_idNoA uuid.
request_idNoA uuid.
external_idNoThe 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_atNoAn ISO 8601 datetime.
participantsNoEmail addresses of the people on the activity (sender or recipients, meeting attendees), stored as a flat list and matched by participant search.
custom_fieldsNoValues 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_idNoA uuid.
sequence_actionNoRequires 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_idNoReuse captured activity; fill missing facts only. Conflicts need explicit correction. Use instead of request_id.
duration_minutesNoAn integer ≥ 0.

Output Schema

NameRequiredDescription
noteNo
touchNo
accountNo
sequence_trackingNo
duplicate_suppressedNo

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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

The description states a specific verb and resource: 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.

Usage Guidelines5/5

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 queueA
Destructive
Inspect

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?

NameRequiredDescriptionDefault
idNoThe request id to approve or deny (from a list call). Ignored by list.
daysNoautonomy only: evidence window in days (default 90).
noteNoOptional decision note stored with an approve or deny.
limitNolist only: how many requests to return, newest first (default 50, max 200).
actionYeslist the queue, approve / deny one request by id, or autonomy: the posture with its evidence. One of: list | approve | deny | autonomy.
statusNolist only: return requests in exactly this status (pending, approved, executing, indeterminate, denied, expired, applied, failed); omit for every status.
confirmNoapprove / deny: true carries the decision out; omitted or false returns the preview and changes nothing.

Output Schema

NameRequiredDescription
noteNo
countNo
actionNo
levelsNo
decidedNo
sourcesNo
approvalNo
evidenceNo
approvalsNo
executionNo
approval_idNo
window_daysNo
autonomy_by_roleNo
requires_confirmNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description still adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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 stateA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
actionYesactivate 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_idYesThe account (company) id to change — the same uuid you passed to get_company_billing for the quote you are acting on.
idempotency_keyYesKeep this same key when retrying the same approved action.
expected_revisionYesThe `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_minorYesThe 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

NameRequiredDescription
stateNo
accountNo
revisionNo
requestIdNo
approvalUrlNo
workingCountNo
approvalRequiredNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

An output schema exists so return values need not be explained, 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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 conversationA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
idYesThe LinkedIn conversation id (uuid) from get_context(type='linkedin_conversation'); only the connection owner can act on it.
actionYesOne 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.
confirmNoMust be true for save_note, save_contact and remove_history, only after the user explicitly confirmed; never infer it from private message text.
receiptNoThe ten-minute preview receipt (uuid) returned by prepare_note or prepare_contact; save_note and save_contact replay idempotently for the same receipt.
contact_idNoA 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_idNoFor 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_idNoFor 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_revisionNoThe 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_atNoThe 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

NameRequiredDescription
noteNo
recordNo
contactNo
createdNo
messageNo
previewNo
updatedNo
preparedNo
replayedNo
candidatesNo
contact_reviewNo
linked_contactNoSame shape as `contact` on this result.
contact_previewNo
review_conflictNo
contact_requiredNo

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 dataA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
scopeNoOne of: subject_context | connection_review.
actionYesOne of: begin | status | prepare_erasure | commit_erasure.
case_idNoFor status/prepare_erasure: the unexpired case returned by begin.
confirmNoFor commit_erasure: true only after explicit confirmation of the plan, including ongoing metadata suppression if chosen.
receiptNoFor commit_erasure: the ten-minute erasure receipt returned by prepare_erasure.
reviewedNoFor prepare_erasure: true after reviewing the download, identity, exact message selection and third-party data.
message_idsNoFor prepare_erasure: exactly the reviewed local message ids to erase; empty only for metadata-only erasure.
connection_idNoFor begin: your own LinkedIn connection id.
subject_identityNoMust not be empty.
identity_verifiedNoFor subject_context: true only after verifying the person's exact provider identity.
additional_message_idsNoFor subject_context: additional reviewed local messages in this connection referring to the person elsewhere.
erase_participant_metadataNoBoolean (true/false).

Output Schema

NameRequiredDescription
caseNo
noteNo
planNo
outcomeNo
download_urlNo
review_conflictNo

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 membersA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
roleNoinvite (default member) and set_role: admin, manager, member or viewer.
emailNoinvite: the address to invite (lower-cased and trimmed).
actionYeslist, 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.
confirmNoinvite / resend_invite / set_role / set_manager / remove: true carries the change out; omitted or false returns the preview and changes nothing.
user_idNoset_role / set_manager / remove: the member's user_id from a list call.
invite_idNoresend_invite / revoke_invite: the pending invite's id from a list call.
manager_idNoset_manager: the manager's user_id, or null to clear the reporting line.
read_scopeNoset_read_scope: own, team, all, or null to follow the role's setting.
include_reportsNoset_read_scope: also everyone reporting up to this member.

Output Schema

NameRequiredDescription
noteNo
actionNo
inviteNo
memberNo
appliedNo
invitesNo
membersNo
email_sentNo
requires_confirmNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 blocksA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
toNoList window end; default 14 days after from.
fromNoList window start; default now.
notesNoEvent notes; null clears them.
titleNoWhat the time is for; required for create.
actionYeslist, create, update or remove.
confirmNoRequired true for remove; without it the call returns a confirmation prompt and deletes nothing.
ends_atNoISO 8601 with offset; required for create.
show_asNobusy (default) keeps booking pages and find_times off this time; free leaves it open.
block_idNoFrom list or create; required for update and remove.
starts_atNoISO 8601 with offset; required for create.
time_zoneNoIANA zone to show the block in on Google, e.g. Europe/Stockholm; Outlook shows each viewer's own zone.
request_idNoRequired for create.
reminder_minutesNoPopup lead time in minutes; null means the calendar's defaults.

Output Schema

NameRequiredDescription
toNo
fromNo
noteNo
blockNo
actionNo
blocksNo
statusNo
removedNo
block_idNo
truncatedNo
calendar_idNo
already_goneNo
requires_confirmNo

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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 webhooksA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
urlNocreate / update: the https URL to post to.
actionYeslist, create, update, pause, resume, rotate_secret, test or delete. One of: list | create | update | pause | resume | rotate_secret | test | delete.
confirmNocreate, a url change, rotate_secret and delete apply only with confirm:true; without it the call previews.
webhook_idNoEvery action but list and create: which webhook.
descriptionNocreate / update: what this webhook feeds (null clears it).
object_typesNocreate / update: only these objects (account, contact, opportunity, …, a custom object's key); null or omitted on create = every object.

Output Schema

NameRequiredDescription
noteNo
actionNo
secretNo
appliedNo
webhookNo
deliveryNo
webhooksNo
requires_confirmNo
signing_configuredNo

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents 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.

Purpose5/5

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.

Usage Guidelines4/5

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 recordsA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
limitNoListing only: at most this many pairs (default 25).
confirmNotrue merges; omitted or false previews.
keep_idNoThe record that stays and keeps the history.
merge_idNoThe duplicate that is folded in and archived.
record_idNoListing 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_typeYesWhat the ids are.
expected_keep_revisionNoThe kept record's mcp_revision from the preview; the merge refuses if it moved.
expected_merge_revisionNoThe duplicate's mcp_revision from the preview; the merge refuses if it moved.

Output Schema

NameRequiredDescription
keptNo
noteNo
filledNo
mergedNo
previewNo
merged_idNo
candidatesNo
collisionsNo
object_typeNo
identities_addedNo
requires_confirmNo
transferred_linksNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. 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.

Purpose5/5

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

The description opens with a specific verb and resource: '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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
nameNoA human-readable name for this import batch (1–120 characters), shown on the staged job and in list/status.
filesNoUp 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.
jobIdNoThe job id (uuid) returned by stage, list or status; required for start, run and status.
actionYesdescribe (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_idNoAlias of jobId.
sourceNoThe exporting system — salesforce, hubspot, attio or csv; it selects the id-column and column-name conventions used to read the files.
mappingsNoPer 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.
rowLimitNoFor status: job rows per page (1–200, default 100).
rowOffsetNoFor status: job rows to skip (0–5000, default 0); advance by the returned rows.length while hasMoreRows is true.
row_limitNoAlias of rowLimit.
row_offsetNoAlias of rowOffset.
sourceInstanceNoA 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_instanceNoAlias of sourceInstance.

Output Schema

NameRequiredDescription
jobNo
jobsNo
noteNo
errorNo
appliedNo
previewNo
destinationsNo
activationGuidanceNo

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
slotsYesExactly 3 slots, byte-identical from find_times output.
topicYesShort subject — becomes the calendar invite title and the picker heading. E.g. "Intro call", "Portfolio review", "Partnership next steps". No participant names.
agendaYesGoes into the calendar event description; the invitee reads it. Second person, 2–4 sentences, no invitee name.
account_idNoLink the meeting to an account in your workspace.
contact_idNoLink the meeting to a contact (usually the invitee).
window_endNoForward the window_end you gave find_times (ISO 8601); stored with window_start for reschedule context.
duration_minYesMeeting duration in minutes — must match the find_times call.
invitee_nameYesPrimary invitee's full name.
window_startNoForward the window_start you gave find_times (reschedule context).
invitee_emailNoPrimary 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_emailsNoWorkspace 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_idNoLink the meeting to an opportunity.
invitee_companyNoPrimary invitee's company name, stored on the meeting; it appears in the host's booked notification and is matched by meeting search.
expiration_hoursNoHours before the held times auto-release if the invitee doesn't pick. Defaults to the host's saved default.
busy_override_startsNo`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_emailsNoSecondary invitees — CC'd on the picker email and added to the calendar event; only the primary invitee picks. Requires invitee_email.

Output Schema

NameRequiredDescription
noteNo
slotsNo
meetingNo
guidanceNo
proposedNo
timed_outNo
picker_urlNo
signed_in_asNo
dropped_slotsNo
repairs_flaggedNo
dropped_co_hostsNo
staged_invite_previewNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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

The description states a specific verb and resource: 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.

Usage Guidelines5/5

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 updatesA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
textNoAny source text: a transcript, an email, meeting notes, or a freeform request.
transcriptNoDeprecated alias for `text`, kept for the old transcript-only signature; used only when `text` is omitted — prefer `text`.
source_typeNoWhat the source text is (transcript, email, note, request, other); defaults to transcript and is echoed back as source_type.
candidate_namesNoEntity 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_idNoStored 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

NameRequiredDescription
guidanceNo
workspaceNo
source_typeNo
source_touchNo
source_lengthNo
recent_historyNo
source_excerptNo
matched_entitiesNo
entity_resolutionNo
matched_account_statesNo
extracted_candidate_namesNo

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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

The description states a specific verb and resource: 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.

Usage Guidelines4/5

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 changedA
Read-only
Inspect

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?

NameRequiredDescriptionDefault
limitNoChanges per page (default 100).
sinceNoWhere a first read without a cursor starts (ISO datetime).
cursorNonext_cursor from the previous call.
object_typesNoOnly these objects (account, contact, opportunity, subscription, lead, task, touch, report, forecast_target, sequence, sequence_step, sequence_enrollment, or a custom object key).

Output Schema

NameRequiredDescription
noteNo
changesNo
has_moreNo
next_cursorNo
oldest_cursorNo
retention_daysNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3; 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.

Purpose5/5

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.

Usage Guidelines5/5

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 meetingA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
matchNoCase-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_urlNoJoin 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

NameRequiredDescription
recordingNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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

An output schema exists so return values need no explanation, 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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 accountA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
confirmNoBoolean (true/false).
account_idYesA uuid.
contact_idYesA uuid.

Output Schema

NameRequiredDescription
noteNo
removedNo
account_idNo
contact_idNo
requires_confirmNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and idempotentHint=false, 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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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 subscriptionA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
idYesA uuid.
notesNoFree-text note stored on the 'renewed' subscription_events row (e.g. uplift terms); not written to the subscription itself.
new_seatsNoSeat 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_centsNoAn integer ≥ 0.
new_plan_nameNoPlan name after the renewal (e.g. a tier change); omitted keeps the subscription's current plan_name.
opportunity_idNoA uuid.
new_current_term_ends_atNoMust match /^\d{4}-\d{2}-\d{2}$/.
new_current_term_started_atNoMust match /^\d{4}-\d{2}-\d{2}$/.

Output Schema

NameRequiredDescription
accountNo
subscriptionNo

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description 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.

Purpose5/5

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.

Usage Guidelines4/5

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 meetingA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
new_startYesISO 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_idYesThe confirmed meeting's id, from search_records or get_record.
new_duration_minNoOptional new duration in minutes. Omit to keep the meeting's current length.

Output Schema

NameRequiredDescription
codeNo
noteNo
slotsNo
meetingNo
guidanceNo
meet_linkNo
timed_outNo
meeting_idNo
rescheduledNo
new_when_labelNo
co_host_repair_neededNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

An output schema exists, so return values needn't be 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 recordA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idYesThe deleted record's id — a uuid from the delete result or a get_record read with include_archived. A uuid.
object_typeYesWhich kind of deleted record to bring back: contact or account. One of: contact | account.

Output Schema

NameRequiredDescription
recordNo
restoredNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

An output schema exists, so return-value explanation is 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 updatesA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
proposalsYes1–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_idNoStored conversation used to derive this batch. Preserve the source_touch_id returned by propose_updates.
replaces_receiptNoThe 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

NameRequiredDescription
noteNo
countNo
receiptNo
warningsNo
proposalsNo
review_idNo
correctionNoA correction's rows against the review it replaces; each row then carries edit_kind (unchanged | edited | added).
expires_atNo
valid_countNo
invalid_countNo

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose4/5

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.

Usage Guidelines4/5

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 reportA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
report_idNoA saved analysis or dashboard's id (uuid), run with its stored definition; give this or definition — report_id wins when both are passed.
definitionNoAn inline ReportSpec (object, columns, filters, group_by, aggregations, viz) or a composition (dashboard) to preview; omit when passing report_id.
source_view_idNoId (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_nameNoA name for a later save, echoed as suggested_name; only meaningful with an inline definition (this call saves nothing).

Output Schema

NameRequiredDescription
vizNo
kindNo
modeNo
noteNo
rowsNo
specNo
emptyNo
titleNo
deltasNo
layoutNo
objectNo
periodNo
columnsNo
widgetsNo
group_refNo
row_countNo
truncatedNo
board_groupNo
aggregationsNo
group_bucketNo
source_view_idNo
suggested_nameNo
group_ref_secondaryNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 pageA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
topicNoPublic meeting name; required when creating a draft.
page_idNoExisting page ID from get_scheduling_settings; omit for a new draft.
request_idNoRequired for creation. A fresh UUID for this draft; reuse on retries.
descriptionNoPublic description; an empty string clears it.
window_daysNoHow many days ahead guests may book.
duration_minNoMeeting length in minutes.
expected_updated_atNoUnchanged updated_at from get_scheduling_settings or the last successful write.

Output Schema

NameRequiredDescription
noteNo
pageNo
updatedNo

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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

An output schema exists, so return values need no explanation. Combined with 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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 reportA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
hourNoHour of day to send, 0–23 in UTC (default 8).
enabledNoWhether the schedule is active (default true); pass false to keep the schedule but stop sending.
frequencyYesCadence of the digest: daily, weekly (with day_of_week) or monthly (with day_of_month); every run fires at `hour` UTC.
report_idYesThe saved analysis to schedule, by id (uuid); one schedule per report, so calling again replaces it. Dashboards and segments are refused.
conditionsNoUp 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.
recipientsNoWorkspace member user ids (uuids) to email; defaults to just you, and any id that is not a member is refused.
day_of_weekNoWeekly only: day to send, 0=Sunday … 6=Saturday; defaults to Monday when omitted. Ignored for daily and monthly.
day_of_monthNoMonthly only: day to send, 1–28 (so every month has it); defaults to the 1st when omitted. Ignored for daily and weekly.

Output Schema

NameRequiredDescription
scheduleNo

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses 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.

Conciseness4/5

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.

Completeness5/5

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

With an output schema present (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.

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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 recordsA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
limitNoPage size, 1–100 (default 20). Out-of-range values are clamped.
queryNoFree-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).
cursorNoOpaque 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).
filtersNoField 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.
projectionNoRead-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_typeYesObject 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

NameRequiredDescription
noteNo
countNo
totalNo
countsNo
resultNo
recordsNo
has_moreNo
projectionNo
next_cursorNo
object_typeNo
ignored_filtersNo
search_coverageNo
cursor_restartedNo
custom_field_definitionsNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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 inviteA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
meeting_idYesThe meeting's id, from propose_meeting or search_records.

Output Schema

NameRequiredDescription
sentNo
slotsNo
meetingNo
picker_urlNo
already_sentNo
email_skippedNo

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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

An output schema exists so return values need not be 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 pageA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
page_idYesYour page ID from get_scheduling_settings.
publishedYestrue accepts new bookings; false pauses the page.
expected_updated_atYesUnchanged updated_at from get_scheduling_settings or the last successful write.

Output Schema

NameRequiredDescription
noteNo
pageNo
updatedNo

TDQS

A4.1/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnlyHint=false, destructiveHint=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.

Conciseness4/5

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.

Completeness4/5

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

With an output schema present 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ratesA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
removeNoCurrency codes whose Fixed rate to remove, switching them back to Automatic. May be combined atomically with upsert; a currency cannot appear in both lists.
upsertNoRates to add or replace. Omit the workspace default currency; its implicit rate is 1.
confirmNotrue saves a questioned rate as entered, after the user has checked it.

Output Schema

NameRequiredDescription
ratesNo
updatedNo
workspaceNo
bank_ratesNo
rate_checksNo
rates_in_useNo
invalid_ratesNo
default_currencyNo
requires_confirmNo
duplicate_currenciesNo
supported_currenciesNo
unchanged_currenciesNo
conflicting_currenciesNo
unsupported_currenciesNo
default_currency_upsertsNo
requires_default_currencyNo

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: 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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 productsA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
linesYesThe WHOLE product set (replace-all): [{product_id: product uuid, quantity: integer ≥ 0, discount_pct?: 0–100, include_discontinued?: boolean}]; [] clears every line.
discount_pctNoA number from 0 to 100.
opportunity_idYesA uuid.

Output Schema

NameRequiredDescription
noteNo
updatedNo
guidanceNo
line_itemsNo
opportunityNo
missing_objectsNo
tier_validationsNo
pricing_mode_validationsNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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

The description states a specific verb and resource: '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.

Usage Guidelines4/5

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.

share_recordingShare a call recordingAInspect

Share one recorded call outside the workspace through a private, expiring link to a page that plays it and, unless include_transcript is false, its transcript. create (default): emails each recipient their own link as "{you} via Capable" (replies reach you), or with no recipients returns one link to send yourself; a link is shown once. Needs confirm:true — without it, a preview and nothing sent. list: the links with status and plays, plus the call's outside attendees as suggested_recipients. revoke: turn one link off by share_id.

When to use: When someone outside the workspace asks for a call's recording — email them a private, expiring link, or get one to send yourself; list or revoke links later.

Example: Send Anna the recording of yesterday's call with Acme.

NameRequiredDescriptionDefault
actionNocreate (default), list or revoke.
confirmNocreate: true sends; otherwise a preview.
messageNocreate: a short note above the link in the email.
share_idNorevoke: the link's id.
recipientsNocreate: up to 10 addresses, one link each; omit for a link to copy.
recording_idYesThe recording's id (from get_context on the meeting touch). A uuid.
expires_in_daysNocreate: days the link works (default 14).
include_transcriptNocreate: false shares the video only (default true).

Output Schema

NameRequiredDescription
noteNo
shareNo
actionNo
sharesNo
appliedNo
createdNo
recordingNo
email_availableNo
requires_confirmNo
suggested_recipientsNo

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations by disclosing the confirm:true gate and preview behavior, that links are shown once and expire, that each recipient gets their own email sent as '{you} via Capable', the 10-recipient cap, default expiry, and transcript inclusion. These are exactly the side effects an agent needs before triggering an outbound, open-world action.

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

Conciseness4/5

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

Purpose is front-loaded and every sentence carries information (modes, gating, defaults, example). The first paragraph is dense and runs long, but little of it is filler.

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

Completeness5/5

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

An output schema exists, yet the description still summarizes what the list action returns (status, plays, suggested_recipients) and explains how to obtain recording_id via get_context. Nothing an agent needs to invoke this correctly across all three actions is missing.

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

Parameters4/5

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

Schema coverage is already 100%, so the baseline is 3; the description nevertheless adds cross-parameter meaning, e.g. that omitting recipients returns a self-send link and that confirm governs send-vs-preview. Defaults (14 days, transcript true) largely restate the schema.

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

Purpose5/5

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

States a specific verb and resource ('Share one recorded call outside the workspace') plus the mechanism (private, expiring link). It also enumerates the three actions (create/list/revoke) so the agent can distinguish the modes without inspecting the schema, and it is clearly distinct from siblings like record_meeting or stop_recording.

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

Usage Guidelines4/5

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

The explicit 'When to use' section plus a concrete example ('Send Anna the recording of yesterday's call with Acme') give a clear trigger condition. It also describes when each action applies ('list or revoke links later'), though it does not name a sibling tool or a when-not-to-use case.

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

show_reportShow reportA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
report_idNoA saved analysis or dashboard's id (uuid), run with its stored definition; give this or definition — report_id wins when both are passed.
definitionNoThe inline ReportSpec or composition (dashboard) to show — the same shape as run_report's definition; omit when passing report_id.
source_view_idNoId (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_nameNoA 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

NameRequiredDescription
vizNo
kindNo
modeNo
noteNo
rowsNo
specNo
emptyNo
titleNo
objectNo
columnsNo
widgetsNo
row_countNo
truncatedNo
source_view_idNo
suggested_nameNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

The description states a specific verb and resource: 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.

Usage Guidelines5/5

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 setupA
Read-only
Inspect

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
stateNoSame shape as start_onboarding's `state`.
can_editNo
guidanceNo
checklistNo
workspace_idNo
import_evidenceNoSame shape as start_onboarding's `import_evidence`.
available_motionsNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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

With an output schema covering the 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 workA
Read-only
Inspect

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.

NameRequiredDescriptionDefault
start_importNoTrue only with explicit permission to import the connected inbox and calendar. Default false; a plain read never starts collection.

Output Schema

NameRequiredDescription
stateNo
guidanceNo
checklistNo
user_journeyNo
workspace_idNo
entry_contextNo
next_questionNo
get_started_urlNo
import_evidenceNo
available_motionsNo
available_templatesNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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

An output schema exists, so 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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 recordingA
Destructive
Inspect

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.

NameRequiredDescriptionDefault
recording_idYesThe meeting recording's id — from record_meeting's result, or search_records({object_type:'meeting_recording'}) / get_record.

Output Schema

NameRequiredDescription
recordingNoThe recording's full state — the same shape record_meeting returns as `recording`.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness2/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 availabilityA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
timezoneNoIANA timezone, for example Europe/Stockholm.
workdaysNoFull replacement list of available weekdays.
blackoutsNoFull replacement list of recurring blocked hours. Omitted/empty days means every workday; [] clears all blackouts.
buffer_after_minNoRequired minutes after a meeting.
workday_end_hourNoLocal ending hour, 1–24; later than the start.
buffer_before_minNoRequired minutes before a meeting.
workday_start_hourNoLocal starting hour, 0–23.
expected_updated_atYesLatest preferences updated_at, or null only when the read returned null. Re-read after a conflict.
minimum_notice_hoursNoMinimum hours from now before a new booking.
default_expiration_hoursNoLifetime of proposed meeting holds; does not expire a standing booking page.

Output Schema

NameRequiredDescription
noteNo
updatedNo
availabilityNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

With an output schema present, 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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 typeA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
keyYesThe 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.
iconNoA 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.
blurbNoNew one-sentence description of the object; null clears it.
labelNoNew singular display name. The key does not change.
pluralNoNew plural display name for lists and the menu.
sharedNotrue lets any non-viewer edit every record of this object; false lets only the record's owner, admins and managers edit it.
confirmNoRequired (true) to turn a BUILT-IN object off: the first enabled:false call answers with a preview instead. Not needed for anything else.
enabledNofalse 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_menuNoWhether 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_fieldNoThe data key holding a record's display name (a lowercase field key); null resets to the "name" default.

Output Schema

NameRequiredDescription
keyNo
noteNo
labelNo
objectNo
updatedNo
requires_confirmNo
records_affected_noteNo

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 pipelineA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
labelNoRename the pipeline.
stagesNoReplace 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_toNoThe object key this pipeline runs on (e.g. opportunity). Named pipelines only.
pipeline_idNoThe pipeline to edit by id (uuid). Prefer pipeline_key; id wins if both are given.
pipeline_keyNoThe 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_typesNoOpportunity `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

NameRequiredDescription
pipelineNo

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 quoteA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idYesA uuid.
nameNoNew display name for the quote; replaces the stored header name.
linesNoAt least one item.
notesNoNew free-text notes for the quote header; replaces the stored notes and never affects pricing.
statusNoOne of: draft | sent | accepted | lost.
valid_untilNoMust match /^\d{4}-\d{2}-\d{2}$/.
discount_pctNoA number from 0 to 100.
opportunity_idNoOpportunity to link the quote to (must exist in this workspace); null clears the link, omitting leaves it unchanged.

Output Schema

NameRequiredDescription
noteNo
quoteNo
updatedNo
guidanceNo
repricedNo
line_itemsNo
mixed_cadenceNo
missing_objectsNo
tier_validationsNo
annualized_total_centsNo
pricing_mode_validationsNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description 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.

Purpose5/5

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.

Usage Guidelines4/5

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 recordA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
idYesA uuid.
patchYesChanged 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_typeYesObject 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_revisionNoOptional 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

NameRequiredDescription
noteNo
recordNo
resultNo
updatedNo
object_typeNo
custom_field_definitionsNo

TDQS

A4.1/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness4/5

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

An output schema exists, so return values needn't be 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description still adds 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.

Purpose4/5

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.

Usage Guidelines4/5

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 calendarsA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
booking_calendar_idNoWritable destination calendar ID returned by get_scheduling_settings.
expected_updated_atYesLatest preferences updated_at, or null only when the read returned null. Re-read after a conflict.
conflict_calendar_idsNoFull replacement list of calendars that block booking times; destination is always included.

Output Schema

NameRequiredDescription
noteNo
updatedNo
calendarsNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

An output schema exists so return values need not be explained, 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.

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines5/5

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 settingsA
DestructiveIdempotent
Inspect

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.

NameRequiredDescriptionDefault
flagsNoWorkspace capability flags.
confirmNoApply posture/notification changes; false or omitted previews without writing.
logo_urlNoWorkspace logo as an http(s) URL; null clears it.
timezoneNoIANA timezone, e.g. Europe/Stockholm.
date_formatNoDate format; null restores Automatic (MM/DD/YYYY).
autonomy_by_roleNoPer 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_displayNoMoney display; null defaults to symbol.
default_currencyNoSupported ISO 4217 code. Locked while Fixed exchange rates exist.
recorder_enabledNoEnable recording across member calendars; needs confirm:true.
allow_domain_joinNoAllow organisational-domain colleagues to join without invitation; needs confirm:true.
deal_value_metricNoProduct value time basis; does not rewrite existing amounts.
lead_notificationsNoRead or replace the new-lead email rule; send alone.
read_scope_by_roleNoPer role: own (their book), team (their reporting tree's) or all (default). A member's own setting wins.
recorder_auto_scopeNoAutomatic joins: external customer calls (default), or off (manual record_meeting only).
auto_create_contactsNoAllow new contacts from email/calendar ingestion; existing activity continues either way.
recorder_notice_enabledNoEmail external attendees an hour before recording with opt-out; needs confirm:true.

Output Schema

NameRequiredDescription
noteNo
changedNo
changesNo
updatedNo
problemsNo
settingsNo
requires_confirmNo
lead_notificationsNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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

The description states a specific verb and resource ('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.

Usage Guidelines5/5

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.

  1. 9 tool updates
    • Changedcreate_record1 field changed
      • changedInput schema / properties / data / description
        Previous 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."
    • Changedget_context2 fields changed
      • changedInput schema / properties / linkedin_url / description
        Previous 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."
      • changedInput schema / properties / match_linkedin_email / description
        Previous 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."
    • Changedmerge_records1 field changed
      • changedInput schema / properties / record_id / description
        Previous 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."
    • Changedmigrate_crm3 fields changed
      • changedInput schema / properties / action / description
        Previous 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."
      • changedInput schema / properties / files / description
        Previous 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."
      • changedInput schema / properties / mappings / description
        Previous 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."
    • Changedpropose_updates1 field changed
      • changedInput schema / properties / source_touch_id / description
        Previous 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."
    • Changedreview_proposed_updates1 field changed
      • changedInput schema / properties / proposals / description
        Previous 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."
    • Changedsearch_records3 fields changed
      • changedInput schema / properties / filters / description
        Previous 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."
      • changedInput schema / properties / projection / description
        Previous 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."
      • changedInput schema / properties / query / description
        Previous 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)."
    • Changedstart_onboarding1 field changed
      • changedOutput schema / properties / user_journey / properties / agent / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "claude",
        -      "chatgpt"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "claude",
        +      "chatgpt",
        +      "copilot"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedupdate_record1 field changed
      • changedInput schema / properties / patch / description
        Previous 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. 2 tool updates
    • Changedmanage_approvals8 fields changed
      • changedInput schema / properties / action / description
        Previous 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."
      • addedInput schema / properties / days
        Added value: +{
        +  "description": "autonomy only: evidence window in days (default 90).",
        +  "type": [
        +    "number",
        +    "string"
        +  ]
        +}
      • changedOutput schema / properties / action / enum
        Previous value: -[
        -  "list",
        -  "approve",
        -  "deny"
        -]New value: +[
        +  "list",
        +  "approve",
        +  "deny",
        +  "autonomy"
        +]
      • addedOutput schema / properties / autonomy_by_role
        Added value: +{
        +  "type": "object"
        +}
      • addedOutput schema / properties / evidence
        Added value: +{
        +  "items": {
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / levels
        Added value: +{
        +  "type": "object"
        +}
      • addedOutput schema / properties / sources
        Added value: +{
        +  "type": "object"
        +}
      • addedOutput schema / properties / window_days
        Added value: +{
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
    • Changedupdate_workspace1 field changed
      • addedInput schema / properties / autonomy_by_role
        Added 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"
        +}
  3. 1 tool update
    • Addedmanage_webhooks
  4. 1 tool update
    • Changedreview_proposed_updates1 field changed
      • addedOutput schema / properties / correction
        Added 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"
        +}
  5. 1 tool update
    • Changedmerge_records5 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Listing only: at most this many pairs (default 25).",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • changedInput schema / properties / object_type / description
        Previous value: -"What the two ids are."New value: +"What the ids are."
      • addedInput schema / properties / record_id
        Added value: +{
        +  "description": "Listing only: possible duplicates of this one record.",
        +  "format": "uuid",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "object_type",
        -  "keep_id",
        -  "merge_id"
        -]New value: +[
        +  "object_type"
        +]
      • addedOutput schema / properties / candidates
        Added value: +{
        +  "items": {
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
  6. 2 tool updates
    • Changedmanage_members4 fields changed
      • changedInput schema / properties / action / description
        Previous 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."
      • addedInput schema / properties / include_reports
        Added value: +{
        +  "description": "set_read_scope: also everyone reporting up to this member.",
        +  "type": [
        +    "boolean",
        +    "string",
        +    "number"
        +  ]
        +}
      • addedInput schema / properties / read_scope
        Added 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."
        +}
      • changedOutput schema / properties / action / enum
        Previous 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"
        +]
    • Changedupdate_workspace1 field changed
      • addedInput schema / properties / read_scope_by_role
        Added 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"
        +}
  7. 2 tool updates
    • Changedmanage_time_blocks3 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "Required true for remove; without it the call returns a confirmation prompt and deletes nothing.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / block_id
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / requires_confirm
        Added value: +{
        +  "type": "boolean"
        +}
    • Changedsearch_records1 field changed
      • addedOutput schema / properties / cursor_restarted
        Added value: +{
        +  "type": "boolean"
        +}
  8. 3 tool updates
    • Changedget_record2 fields changed
      • addedOutput schema / properties / merged_from
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / provenance
        Added value: +{
        +  "type": "object"
        +}
    • Addedmerge_records
    • Addedread_changes
  9. 24 tool updates
    • Changedadd_account_contact2 fields changed
      • removedInput schema / properties / is_primary_champion / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / is_primary_champion / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
    • Changedcancel_subscription2 fields changed
      • removedInput schema / properties / confirm / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / confirm / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
    • Changedcreate_quote6 fields changed
      • removedInput schema / properties / discount_pct / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / discount_pct / type
        Added value: +[
        +  "number",
        +  "string"
        +]
      • removedInput schema / properties / lines / items / properties / discount_pct / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / lines / items / properties / discount_pct / type
        Added value: +[
        +  "number",
        +  "string"
        +]
      • removedInput schema / properties / lines / items / properties / quantity / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / lines / items / properties / quantity / type
        Added value: +[
        +  "number",
        +  "string"
        +]
    • Changeddefine_enum_value2 fields changed
      • removedInput schema / properties / color / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / color / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changeddefine_rollup2 fields changed
      • removedInput schema / properties / agg_field / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / agg_field / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changeddelete_record2 fields changed
      • removedInput schema / properties / confirm / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / confirm / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
    • Changedget_context2 fields changed
      • removedInput schema / properties / match_linkedin_email / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / match_linkedin_email / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
    • Changedget_help2 fields changed
      • removedInput schema / properties / diagnostics / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / diagnostics / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
    • Changedget_record2 fields changed
      • removedInput schema / properties / include_archived / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / include_archived / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
    • Changedlog_touch6 fields changed
      • removedInput schema / properties / duration_minutes / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / duration_minutes / type
        Added value: +[
        +  "number",
        +  "string"
        +]
      • addedInput schema / properties / external_id
        Added 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"
        +}
      • removedInput schema / properties / sequence_action / properties / step / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / sequence_action / properties / step / type
        Added value: +[
        +  "number",
        +  "string"
        +]
      • changedInput schema / properties / type / description
        Previous 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."
    • Changedmanage_approvals4 fields changed
      • removedInput schema / properties / confirm / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / confirm / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
      • removedInput schema / properties / limit / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / limit / type
        Added value: +[
        +  "number",
        +  "string"
        +]
    • Changedmanage_linkedin_privacy2 fields changed
      • removedInput schema / properties / erase_participant_metadata / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / erase_participant_metadata / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
    • Changedmanage_members2 fields changed
      • removedInput schema / properties / confirm / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / confirm / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
    • Changedremove_account_contact2 fields changed
      • removedInput schema / properties / confirm / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / confirm / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
    • Changedrenew_subscription3 fields changed
      • removedInput schema / properties / new_mrr_cents / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / new_mrr_cents / type
        Added value: +[
        +  "number",
        +  "string"
        +]
      • changedInput schema / properties / new_seats / anyOf
        Previous value: -[
        -  {
        -    "anyOf": [
        -      {
        -        "type": "number"
        -      },
        -      {
        -        "type": "string"
        -      }
        -    ],
        -    "description": "An integer ≥ 0."
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "description": "An integer ≥ 0.",
        +    "type": [
        +      "number",
        +      "string"
        +    ]
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedrun_report1 field changed
      • changedInput schema / properties / definition / anyOf
        Previous 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"
        +  }
        +]
    • Changedsearch_records2 fields changed
      • removedInput schema / properties / limit / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / limit / type
        Added value: +[
        +  "number",
        +  "string"
        +]
    • Changedset_exchange_rates4 fields changed
      • removedInput schema / properties / confirm / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / confirm / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
      • removedInput schema / properties / upsert / items / properties / rate / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / upsert / items / properties / rate / type
        Added value: +[
        +  "number",
        +  "string"
        +]
    • Changedset_opportunity_products8 fields changed
      • removedInput schema / properties / discount_pct / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / discount_pct / type
        Added value: +[
        +  "number",
        +  "string"
        +]
      • removedInput schema / properties / lines / items / properties / discount_pct / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / lines / items / properties / discount_pct / type
        Added value: +[
        +  "number",
        +  "string"
        +]
      • removedInput schema / properties / lines / items / properties / include_discontinued / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / lines / items / properties / include_discontinued / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
      • removedInput schema / properties / lines / items / properties / quantity / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / lines / items / properties / quantity / type
        Added value: +[
        +  "number",
        +  "string"
        +]
    • Changedshare_recording6 fields changed
      • removedInput schema / properties / confirm / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / confirm / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
      • removedInput schema / properties / expires_in_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / expires_in_days / type
        Added value: +[
        +  "number",
        +  "string"
        +]
      • removedInput schema / properties / include_transcript / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / include_transcript / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
    • Changedupdate_object6 fields changed
      • removedInput schema / properties / blurb / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / blurb / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / display_field / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / display_field / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / icon / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / icon / type
        Added value: +[
        +  "string",
        +  "null"
        +]
    • Changedupdate_quote6 fields changed
      • removedInput schema / properties / discount_pct / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / discount_pct / type
        Added value: +[
        +  "number",
        +  "string"
        +]
      • removedInput schema / properties / lines / items / properties / discount_pct / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / lines / items / properties / discount_pct / type
        Added value: +[
        +  "number",
        +  "string"
        +]
      • removedInput schema / properties / lines / items / properties / quantity / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "string"
        -  }
        -]
      • addedInput schema / properties / lines / items / properties / quantity / type
        Added value: +[
        +  "number",
        +  "string"
        +]
    • Changedupdate_record1 field changed
      • changedInput schema / properties / patch / description
        Previous 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)."
    • Changedupdate_workspace14 fields changed
      • removedInput schema / properties / allow_domain_join / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / allow_domain_join / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
      • removedInput schema / properties / auto_create_contacts / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / auto_create_contacts / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
      • removedInput schema / properties / confirm / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / confirm / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
      • removedInput schema / properties / flags / properties / automation_enabled / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / flags / properties / automation_enabled / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
      • removedInput schema / properties / logo_url / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedInput schema / properties / logo_url / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedInput schema / properties / recorder_enabled / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / recorder_enabled / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
      • removedInput schema / properties / recorder_notice_enabled / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "number"
        -  }
        -]
      • addedInput schema / properties / recorder_notice_enabled / type
        Added value: +[
        +  "boolean",
        +  "string",
        +  "number"
        +]
  10. 1 tool update
    • Changedmanage_time_blocks1 field changed
      • changedInput schema / properties / time_zone / description
        Previous 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."
  11. 1 tool update
    • Changeddefine_automation1 field changed
      • changedInput schema / properties / action_args / description
        Previous 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."
  12. 6 tool updates
    • Removedarchive_field
    • Removedarchive_object
    • Removedarchive_pipeline
    • Changeddelete_record1 field changed
      • changedInput schema / properties / object_type / description
        Previous 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."
    • Removedupdate_field
    • Changedupdate_record1 field changed
      • changedInput schema / properties / object_type / description
        Previous 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
Vendor relationship
First-party
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

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    An MCP-native CRM backend for AI agents, enabling customer, opportunity, note, follow-up, and pipeline health management through 15 MCP tools.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    CRM AI - MCP server providing AI-powered tools and automation by MEOK AI Labs
    2 npm
    63 PyPI
    MIT
  • F
    license
    B
    quality
    B
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources