Capable
Server Details
MCP-native CRM: your assistant proposes updates, you approve them field by field.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 57 tools
Descriptions are unusually explicit about boundaries (e.g. get_context vs search_records vs get_record, search_records vs run_report, propose_meeting vs reschedule_meeting vs cancel_meeting), so most tools are cleanly separable. A few clusters remain confusable: the onboarding flow (start_onboarding / show_workspace_setup / finalize_workspace_setup / apply_template), get_company_billing vs manage_company_billing, and the quote trio (create_quote / update_quote / set_opportunity_products).
Names are consistently snake_case with a verb_noun pattern (define_field, archive_object, create_record, update_pipeline), including a coherent define_/update_/archive_ family for schema objects. Minor deviation: several multi-action dispatcher tools use a generic manage_* prefix (manage_approvals, manage_members, manage_linkedin_conversation), which breaks the one-verb-one-action pattern.
57 tools is far above the 25+ 'heavy' threshold and is the server's main weakness. The breadth (schema admin, records, scheduling, quotes, subscriptions, reports, governance, billing, migration, onboarding) partly justifies it, but the surface is large enough that an agent faces real selection cost.
Coverage is exceptional: full record CRUD (create/get/search/update/soft-delete/restore), schema lifecycle (define/update/archive for fields, objects, pipelines, enums, rollups, automations), plus meeting, quote, subscription, reporting, approval, membership, billing, migration and onboarding workflows. The only acknowledged gaps are programs being define-only and notes lacking an explicit update path, both minor.
Available Tools
57 toolsadd_account_contactLink contact to accountADestructiveInspect
Link a contact to an account with a role from the workspace's account_contacts.role values (seed defaults: champion / economic_buyer / decision_maker / user / blocker / influencer / csm_primary). Use is_primary_champion=true to mark the single primary champion (at most one per account; setting it auto-clears any previous primary). Distinct from opportunity_contacts — account_contacts persist across the customer relationship even when no opportunity is open. Resolve account_id + contact_id with search_* first — never invent ids.
When to use: When you learn someone's role at a customer. Set is_primary_champion=true for the single most important advocate.
Example: Add Sarah Chen as the primary champion at Acme.
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | Defaults: champion | economic_buyer | decision_maker | user | blocker | influencer | csm_primary. A workspace admin may rename or add values — see the live set in propose_updates' workspace.enum_values, or an admin's describe_schema. | |
| notes | No | Free-text context for this link (e.g. how the person relates to the account), stored on the account_contacts row; re-linking without it clears any stored note. | |
| account_id | Yes | A uuid. | |
| contact_id | Yes | A uuid. | |
| is_primary_champion | No | Boolean (true/false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| created | No | |
| account_contact | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=false, so the safety profile is partly covered; the description adds genuinely new behavioral context by disclosing that setting is_primary_champion auto-clears any previous primary (at most one per account). That is exactly the kind of side effect an agent must know before calling. It does not discuss permission requirements or response shape, but those are lower value here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short blocks (core semantics, when-to-use, example) with the most decision-relevant facts front-loaded. Slight redundancy in restating the role default list that also appears in the schema, but no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter mutation tool with full schema coverage, an output schema, and annotations, the description supplies everything else an agent needs: when to invoke, id-resolution prereq, exclusivity side effect, and the sibling distinction. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description adds real meaning beyond the schema by enumerating the seed role values and explaining the exclusivity semantics of is_primary_champion. It stops short of describing notes handling in prose, which the schema already covers.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Link a contact to an account') and immediately differentiates from the sibling concept opportunity_contacts by explaining that account_contacts persist across the customer relationship. An agent can select it confidently without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' section plus a worked example ('Add Sarah Chen as the primary champion at Acme'), and a prerequisite telling the agent to resolve ids via search_* first rather than inventing them. It also names the near-sibling remove_account_contact implicitly through the inverse framing, and contrasts with opportunity_contacts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_noteAdd noteAInspect
Attach a free-form note to any record (account / contact / opportunity / touch). MUST link to at least one. Returns the created note.
When to use: Free-form context that doesn't fit a structured field. Notes are searchable and soft-deleted.
Example: Note on Acme: procurement team requires SOC2 by Q1 — we need a story ready.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Must not be empty. | |
| touch_id | No | A uuid. | |
| account_id | No | A uuid. | |
| contact_id | No | A uuid. | |
| request_id | No | Retry key: a client-generated UUID. Repeating a call with the same request_id and arguments within 24h replays the earlier result instead of creating a second note; it is never stored on the note. | |
| opportunity_id | No | A uuid. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| account | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring readOnly=false, destructive=false, the description adds genuinely new behavior: notes are searchable and soft-deleted (i.e. recoverable), and it returns the created note. It does not discuss the required link cardinality's effect on failure modes, but the added context is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded blocks: what it does, when to use it, and a worked example. No sentence is redundant, and the hard constraint ('MUST link to at least one') appears early where it will be read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be spelled out, and the schema fully documents every parameter including the request_id retry semantics. What remains — when to use, the linking constraint, and note lifecycle (searchable, soft-deleted) — is all present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds a constraint the schema does not express — that at least one of account_id/contact_id/opportunity_id/touch_id must be supplied — which is exactly the kind of semantic an agent would otherwise miss (the schema only requires 'body').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Attach a free-form note to any record'), enumerates the record types it can attach to, and states the return value. This distinguishes it clearly from create_record or log_touch, which write structured data rather than free-form context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'When to use: Free-form context that doesn't fit a structured field' gives an explicit selection criterion, reinforced by a concrete example. It does not name a specific sibling as the alternative for structured data (e.g. update_record), 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.
apply_templateApply schema templateAIdempotentInspect
Apply a curated schema template from this workspace's template registry — a pre-vetted bundle of objects, fields, pick-list values, pipelines, and starter views — in one step. Admin-only. Idempotent: keys that already exist are skipped, so re-applying (or applying overlapping templates) never duplicates. Pass the template's key — describe_schema's templates section lists every available 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 suggestion rather than an error. 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 — a starter template of objects, fields, pick-list values, pipelines, and starter views — instead of defining each piece by hand. Idempotent: re-applying only adds what's missing.
Example: We send priced quotes — set up the quoting template.
| Name | Required | Description | Default |
|---|---|---|---|
| template_key | Yes | Key of a curated template — one of describe_schema's `templates` keys (e.g. account_hierarchy, quoting); an unknown key returns the available templates instead. |
Output Schema
| Name | Required | Description |
|---|---|---|
| applied | No | |
| created | No | |
| workspace | No | |
| did_you_mean | No | |
| template_key | No | |
| available_templates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation writes (readOnlyHint=false, destructiveHint=false) and is idempotent (idempotentHint=true). The description usefully extends this with 'Admin-only,' the skip-existing behavior ('never duplicates'), and the unknown-key fallback returning available templates with a did-you-mean suggestion rather than an error. However, it also explains return contents even though a full output schema exists, so much of the added prose overlaps structured data rather than contributing new behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and impact, then when-to-use and an example. It is somewhat long and repeats the idempotency point twice ('keys that already exist are skipped' and 're-applying only adds what's missing'), and the explicit return-value sentence is redundant given the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single required parameter, full schema coverage, and an output schema, the definition covers everything needed: admin-only prerequisite, idempotency semantics, error/fallback behavior for bad keys, a pointer to describe_schema for discovering keys, and a usage example. Return values are correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema already states the key must be one of describe_schema's `templates` keys with an example. The description largely restates this (pass the template's key), adding only the unknown-key fallback behavior. Baseline 3 is appropriate when the schema already carries the parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Apply a curated schema template') and expands the resource concretely as a pre-vetted bundle of objects, fields, pick-list values, pipelines, and starter views. It distinguishes itself from the manual-construction siblings (define_object, define_field, define_pipeline) by framing the action as adopting a whole bundle 'instead of defining each piece by hand.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The explicit 'When to use' section names the condition (an admin adopting a whole curated bundle at once) and the alternative approach (defining each piece by hand), plus the prerequisite 'Admin-only.' An agent can route to this tool over the define_* siblings without inferring anything.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_fieldArchive fieldADestructiveInspect
Remove a custom field's DEFINITION by object_type + key. DESTRUCTIVE — call once to get a preview (the field's label and type), then again with confirm:true. The definition leaves the object's schema, describe_schema and every picker; values records already hold under that key are NOT deleted — they stay as harmless orphans no surface reads, and reappear if a field with the same key is defined again. Only admin-defined custom fields can be removed (a built-in field isn't one); an unknown key answers with the object's custom field keys. Returns the removed definition.
When to use: When an admin retires a custom field they no longer use. Preview first, then confirm; the definition goes, while values already stored under its key stay as orphans and return if the key is ever defined again.
Example: Remove the old 'region' custom field from accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The custom field's key (from describe_schema), not its label. | |
| confirm | No | Omit for a preview of what will be removed; pass true to remove the definition. | |
| object_type | Yes | Object key the field belongs to (built-in or custom, from describe_schema). |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | No | |
| note | No | |
| field | No | |
| archived | No | |
| object_type | No | |
| known_fields | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructiveHint annotation: discloses the mandatory two-step preview/confirm flow, that stored values are NOT deleted but become unread orphans that reappear if the key is redefined, that built-in fields can't be removed, and that an unknown key returns the object's custom field keys. This is exactly the non-obvious behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and the DESTRUCTIVE warning, then details consequences — good ordering. The "When to use" paragraph largely restates the first paragraph (preview then confirm, orphans returning), so a small amount of text is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with an output schema already covering the return value, the description supplies the destructive semantics, the two-step safety flow, the permission boundary, and the orphan-value behavior. Nothing an agent needs to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents key (not label), object_type, and the confirm preview semantics. The description reinforces the confirm flow but adds no syntax or format detail beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — "Remove a custom field's DEFINITION by object_type + key" — with the scope qualifier that only the definition (not values) is removed. This clearly distinguishes it from siblings like define_field, update_field, and archive_object.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit "When to use" (an admin retiring an unused custom field) plus the operational condition that it applies only to admin-defined fields, not built-ins. It stops short of naming sibling alternatives (e.g. update_field for renaming) or explicit when-not-to-use guidance, so it lands just below the top.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_objectArchive object typeADestructiveIdempotentInspect
Soft-delete (archive) a custom object type by key. Existing records are kept but the object disappears from the registry. Built-in objects can't be archived. Returns the archived object.
When to use: When an admin no longer needs a custom object. Existing records are kept; the object leaves the registry.
Example: We don't track Listings anymore — archive that object.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The custom object's stable key (from describe_schema). Built-in keys are refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| object | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description usefully adds what actually happens (records retained, object removed from registry), the built-in refusal constraint, and the return value, though it omits permission requirements and whether the archive can be reversed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The scoping behavior is front-loaded, which is good, but the key fact "Existing records are kept but the object disappears from the registry" is stated twice (in the opening sentence and again under "When to use"), costing space without adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and the description covers the retention semantics and built-in restriction. For a single-parameter mutation it is nearly complete, with only reversibility/permission details left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single well-documented 'key' parameter, so the schema already carries the parameter meaning. The description's 'by key' and 'built-in keys are refused' merely restate what the schema documents, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (soft-delete/archive) and resource (custom object type), scoped by key, and clearly distinguishes itself from sibling archive tools like archive_field and archive_pipeline. An agent can identify the target of the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ("When an admin no longer needs a custom object") and gives a concrete example. It doesn't name alternatives such as update_object or a restore path, so routing guidance is present but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_pipelineArchive pipelineADestructiveIdempotentInspect
Archive (soft-delete) a named pipeline by pipeline_key (or pipeline_id; id wins if both are given). Refused while live opportunities are still on it — reassign those deals to another pipeline first. Recoverable by an admin (soft-delete). The workspace default pipeline can't be archived. An unknown key/id returns the known pipelines instead of an error. Admin-only. Returns the archived pipeline.
When to use: When an admin no longer needs a named pipeline. Refused while deals are still on it — reassign those first; it stays recoverable by an admin.
Example: We're done with the Waitlist pipeline — archive it.
| Name | Required | Description | Default |
|---|---|---|---|
| pipeline_id | No | The pipeline to archive by id (uuid). id wins if both are given. | |
| pipeline_key | No | The pipeline to archive, by its stable key. Prefer this. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pipeline | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive/safe-write/idempotent, but the description adds substantial context beyond them: soft-delete recoverability by an admin, the live-opportunity refusal, the undefeatable default pipeline, the benign unknown-key behavior (returns known pipelines rather than erroring), admin-only auth requirement, and the return value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation and the key precedence, then prerequisites, in a logical order. It loses a point for restating the reassignment constraint twice (main body and 'When to use'), which is redundant given how compact the rest is.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations carrying the safety profile and an output schema covering the return value, the description still supplies everything else an agent needs: auth requirement, prerequisites, edge-case behavior, and recoverability. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema descriptions already state 'id wins if both are given' and 'Prefer this.' The description reinforces the key/id precedence but adds no format or syntax detail beyond what the schema provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Archive (soft-delete) a named pipeline') and precisely names the two identifier parameters. It is clearly distinguishable from sibling archive/delete tools (archive_field, archive_object, delete_record) and from update_pipeline.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to use' section states the condition ('an admin no longer needs a named pipeline') and the blocking precondition ('Refused while deals are still on it — reassign those first'). When-not guidance is explicit, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_meetingCancel meetingADestructiveInspect
Cancel a meeting — DESTRUCTIVE, 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 already 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; re-propose to start over.
Example: Cancel my pending meeting with Sara.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | Optional reason — recorded on the audit log. | |
| confirm | No | Pass true only after the user confirmed; without it the call performs nothing and returns what would happen. | |
| meeting_id | Yes | The meeting's id, from propose_meeting or search_records. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| slots | No | |
| meeting | No | |
| guidance | No | |
| cancelled | No | |
| meeting_id | No | |
| repairs_flagged | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description goes well beyond them: it discloses that the first call is a no-op preview returning {cancelled:false, requires_confirm:true}, that every host's tentative holds and any confirmed event are released, that a booked invitee receives a cancellation email, and that the action is irreversible. That is exactly the behavioral context a destructive tool needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded correctly with the destructive warning and two-step mechanic, but the two-step explanation, the cancellation-email fact, and the 're-propose to start over' advice are each stated twice (once in the lead paragraph, once under 'When to use'). The duplication inflates the text without adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the description is not obliged to detail return values, and it still names the final-state return. Combined with the side-effect inventory, the irreversibility warning, and the two-step protocol, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the per-parameter baseline is 3. The description adds protocol-level meaning the individual schema fields do not convey on their own — the ordering of the unconfirmed preview call before confirm:true, and the requirement to obtain user confirmation in between — which is more than a restatement of the 'confirm' field doc.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Cancel a meeting') and immediately scopes it against the family of meeting tools by describing the cancellation side effects and the 're-propose to start over' path. An agent can distinguish this from propose_meeting or reschedule_meeting without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'When to use: When plans change' plus the explicit two-step protocol (call without confirm, confirm with the user, call again) gives clear operational context. It does not explicitly name reschedule_meeting as the alternative when the user wants a different time, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_subscriptionCancel subscriptionADestructiveInspect
Cancel a subscription. Sets status='canceled', canceled_at, cancellation_category, cancellation_reason. Writes a subscription_events row of type 'canceled' with a negative mrr_delta. Trigger drops account.current_arr_cents. Returns a suggestion to set account.lifecycle_stage='churned' if this was the last active subscription. DESTRUCTIVE: confirm with the user first, then call again with confirm: true.
When to use: Customer cancellation. Always capture the cancellation_category for retention analysis.
Example: Acme cancelled — they consolidated to a competitor. Cancel the subscription effective today.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A uuid. | |
| confirm | No | Boolean (true/false). | |
| canceled_at | Yes | Must match /^\d{4}-\d{2}-\d{2}$/. | |
| opportunity_id | No | A uuid. | |
| cancellation_reason | No | Free-text reason in the customer's words, stored on the subscription and as the 'canceled' event's note; cancellation_category is the coded bucket. | |
| cancellation_category | Yes | Defaults: price | product_fit | competitor | no_decision | business_change | support | consolidation | other. A workspace admin may rename or add values — see the live set in propose_updates' workspace.enum_values, or an admin's describe_schema. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| account | No | |
| canceled | No | |
| guidance | No | |
| subscription | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint annotation, the description discloses exactly what is mutated (status, canceled_at, category, reason), the side effects (subscription_events row with negative mrr_delta, account.current_arr_cents drop), the returned churn suggestion, and the mandatory two-step confirm:true protocol. This is unusually rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the effects before the when-to-use and example, and every sentence carries weight. The closing Acme example is illustrative but slightly verbose, keeping it just under a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description nonetheless covers effects, prerequisites, the churn suggestion, and the confirm flow. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: it explains the confirm parameter's two-call pattern and reinforces why cancellation_category matters. It doesn't expand on opportunity_id or the category enum set beyond what the schema documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Cancel a subscription') and immediately details the concrete effects (status set, event row written, ARR dropped). It is clearly distinguishable from the sibling renew_subscription and doesn't restate the title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'When to use: Customer cancellation' gives a clear selection context, and the destructive confirm workflow plus the retention-analysis note add practical guidance. It does not explicitly name an alternative tool or state when NOT to cancel, 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.
commit_reviewed_updatesCommit reviewed updatesADestructiveIdempotentInspect
Commit the exact approved subset from review_proposed_updates through the base MCP contract. Pass the unchanged short-lived receipt, only proposal IDs the user explicitly approved, confirm:true, and a fresh UUID idempotency key (normally the returned review_id). The first confirmed call freezes the selection; retries with the same receipt and key return stored per-row outcomes without executing again. Receipt expiry blocks only a first commit; an exact retained replay remains available for the bounded ledger-retention window. If an expired review has no retained exact match, inspect the CRM before any fresh review. Each selected target write re-enters its complete Capable guard wrapper, so current policy, object, enum, role/scope, audit, telemetry, invalidation, and automation behavior still applies. A receipt proves the reviewed arguments are unchanged; each target tool still reads current CRM state at commit time. If a replay reports execution_in_progress, poll this exact receipt/key/selection again. If it reports execution_state_unknown, inspect CRM state first and never retry automatically or start a fresh review until the result is known; check its ledger only by replaying that exact receipt, key, and full selection.
When to use: After review_proposed_updates, when the user has explicitly selected the returned proposal IDs. Pass its unchanged receipt, those IDs, confirm:true, and a fresh UUID idempotency key — normally the returned review_id; reuse that exact UUID and full selection for retries so they replay the stored outcome without writing twice. Receipt expiry blocks a first commit, not an exact retained replay; if no exact retained match exists, inspect the CRM before any fresh review.
Example: Approve proposal IDs from that review and commit them.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to execute; omitted or false commits nothing and returns a prompt to get the user's explicit approval first. | |
| receipt | Yes | The receipt string returned by review_proposed_updates, passed back unchanged (it is bound to that review, this workspace and user, and expires). | |
| idempotency_key | Yes | A UUID minted once per review (normally the returned review_id); reuse the same key to replay stored outcomes instead of executing again. | |
| selected_proposal_ids | Yes | The review's proposal ids (its proposals[].id) the user explicitly approved — unique, each present in the receipt; the first confirmed call freezes this set. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| summary | No | |
| outcomes | No | |
| replayed | No | |
| confirmed | No | |
| review_id | No | |
| review_commit | No | |
| request_status | No | |
| selection_mismatch | No | |
| frozen_selected_proposal_ids | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it explains first-call freezing of the selection, replay returning stored per-row outcomes, ledger-retention bounds on retained replays, re-entry through full guard wrappers, and current CRM state being read at commit time. It adds explicit handling for execution_in_progress (poll) and execution_state_unknown (inspect CRM, never auto-retry), which no annotation conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and organized, but the 'When to use' paragraph largely restates the first paragraph's receipt-expiry, idempotency-key, and retry guidance verbatim, which is wasted space in an otherwise dense block of text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, yet the description still covers the non-obvious terminal and retry states an agent must act on. Given the destructive, idempotent nature of the commit, nothing needed to call it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds operational meaning: the idempotency key is normally the returned review_id and must be reused with the full selection for replay, confirm:true is the approval gate, and the selection is frozen by the first confirmed call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (commit) and resource (the exact approved subset from review_proposed_updates) and immediately names the sibling that produces the input (review_proposed_updates). An agent can distinguish this from review_proposed_updates/propose_updates without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' paragraph gives the trigger (after review_proposed_updates, user has selected proposal IDs), the required arguments, and the retry rule (reuse the exact UUID and full selection). It also states when-not paths: receipt expiry blocks only a first commit, and no fresh review until an unknown result is resolved.
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 on an account from a SELECTION of catalog products + quantities. You pick the products and the count for each (e.g. the metric value — the number of units the item scales on); the SERVER prices it — it snapshots each product's price from the catalog and computes every line total and the quote total. You never pass a price. Catalog products live on the product object: each prices from its unit_price_cents (an INTEGER number of cents) and its pricing_mode — per_unit multiplies by the quantity, flat charges once regardless of quantity, and a missing or unknown pricing_mode resolves to flat (a flat line with quantity > 1 is flagged so a mispriced catalog is never silent). Discounts are by PERCENT only (a per-line discount_pct on a line, and/or a quote-level discount_pct) — the server computes the discount cents; you never pass a money amount. Bundled items are expanded automatically (a discounted line discounts its bundled extras too). A quantity that falls outside a product's tier — or a discount above the workspace cap — is flagged (not blocked) so you can fix the selection. A quote is a pre-commit artifact: status is draft or sent (invoicing and contracts happen elsewhere). Returns the quote, its priced lines, and any flags.
When to use: When the user wants a priced quote for a customer. You pick the catalog items and how many of each; the server reads each item's price from the catalog and computes every line total and the quote total — you never pass a price. Bundled extras are added automatically; a count outside an item's range is flagged, not blocked. A quote is a pre-commit document (invoicing and contracts happen elsewhere).
Example: Quote Acme for 15 units of the standard plan plus onboarding.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional display name for the quote; stored on the quote header, null when omitted. | |
| lines | Yes | At least one item. | |
| notes | No | Optional free-text notes stored on the quote header (terms, context); never read for pricing. | |
| status | No | One of: draft | sent. | |
| account_id | Yes | A uuid. | |
| valid_until | No | Must match /^\d{4}-\d{2}-\d{2}$/. | |
| discount_pct | No | A number from 0 to 100. | |
| opportunity_id | No | A uuid. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| quote | No | |
| created | No | |
| guidance | No | |
| line_items | No | |
| mixed_cadence | No | |
| missing_objects | No | |
| tier_validations | No | |
| annualized_total_cents | No | |
| pricing_mode_validations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic mutation profile (not read-only, not destructive, not idempotent), so the description carries the real burden and does so well: the server snapshots catalog prices, the caller never passes money amounts, pricing_mode resolves per_unit/flat with missing mode defaulting to flat, bundles expand automatically, and out-of-tier quantities or over-cap discounts are flagged rather than blocked.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening paragraph is dense but well front-loaded. The problem is redundancy: the 'When to use' block restates the pricing/never-pass-a-price/bundling/flagging points nearly verbatim, so a meaningful share of the text does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and 100% schema coverage, the description only needs to cover behavior and it largely does: it explains the pricing model, discount rules, flagging, and the draft/sent lifecycle. Minor gaps remain (e.g., no mention of account/opportunity linkage requirements or permission needs), but nothing essential to correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds genuine semantics: discount_pct is percent-only with the server computing cents, quantity is an integer unit count, pricing_mode governs multiplication behavior, and a flat line with quantity > 1 is flagged. It does not add anything about name, notes, valid_until, or opportunity_id beyond the schema, keeping it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and resource ('Draft a quote on an account') plus the key mechanic that separates it from sibling mutations: the caller selects catalog products and quantities while the server prices them. It clearly frames the artifact as pre-commit (draft/sent), distinguishing it from invoicing or contract tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is an explicit 'When to use' section keyed to the user intent ('wants a priced quote for a customer') and a clear exclusion that invoicing and contracts happen elsewhere. However, it never names the closest siblings (update_quote, set_opportunity_products) or states when to prefer them, so routing between quote tools is still left partly to inference.
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 record of ANY object type. Pass object_type + a data object of the object's fields (relationship fields take the target record's id). Works for custom objects (partner, product, investor — records-backed) AND the built-in objects (account, contact, opportunity, subscription, task, signal, touch), where it routes to the same domain logic as the typed create tools. The caller becomes the owner of custom records unless owner_id is given. For custom records, set the object's display-name field (usually name, or the object's display_field) so the record is findable by name in the propose_updates matcher. For sequence, include ordered steps [{title,brief,channel,day_offset}] and request_id (UUID) in data to save a whole plan atomically; timing_mode is from_start or after_previous, offsets remain cumulative, and skip_weekends/pause_on_reply are optional. A sequence saves a plan; it never sends messages. For touch, request_id (UUID) plus occurred_at makes the activity retryable; sequence_action:{enrollment_id,step} records an outbound activity and advances that exact sequence step through governance. Its sequence_tracking result says updated, pending or unchanged; retry the same payload to finish a pending step update. Returns the created record (its full fresh state).
When to use: The generic create. Pass object_type + a data object of its fields. Routes built-in objects to the same domain logic as the folded typed create tools; custom objects are records-backed.
Example: Add a partner 'Globex' with tier gold.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | 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. | |
| owner_id | No | A uuid. | |
| request_id | No | Retry key: a client-generated UUID. Repeating a call with the same request_id and arguments within 24h replays the earlier result instead of creating a second record. For touch and sequence, put request_id inside data instead so the record itself stores it. | |
| object_type | Yes | Object key, e.g. account, contact, opportunity, task, touch, or a custom object's key; an unknown key returns the workspace's valid types instead of creating. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| record | No | |
| result | No | |
| created | No | |
| object_type | No | |
| custom_field_definitions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: caller becomes owner unless owner_id is given, request_id replay semantics within 24h, atomic sequence saving with timing_mode/skip_weekends behavior, and the explicit side-effect disclaimer 'A sequence saves a plan; it never sends messages.' It also documents the touch sequence_tracking result states and retry guidance — rich, non-obvious behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, but the middle is a dense run-on covering sequence/touch edge cases, and the 'When to use' paragraph restates the opening contract ('Pass object_type + a data object of its fields') almost verbatim. The short example is marginal. Length is defensible for the complexity, but there is avoidable redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists, return values needn't be spelled out, and the description still notes it returns the created record's full fresh state. Combined with the custom-vs-built-in routing, ownership, and sequence/touch specifics, coverage is strong; only minor gaps (error/validation behavior beyond the unknown-object_type note) remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: relationship fields take the target record's id, custom records need a display-name field, and the sequence/touch data payloads (ordered steps, timing_mode from_start/after_previous, request_id placement) are elaborated beyond the schema's generic data object.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource and scope: 'Create a record of ANY object type.' It explicitly distinguishes itself from the folded typed create tools (built-in objects route to the same domain logic) and from update_record/delete_record by framing itself as 'the generic create.' An agent can place it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a 'When to use' section and states the calling contract (object_type + data). It explains routing behavior for built-in vs custom objects but never names an explicit alternative or a when-not-to-use case (e.g. when to prefer a typed create sibling). Clear context, no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
define_automationDefine automation ruleADestructiveInspect
Create an automation rule: when trigger_event fires (record.written) and condition_spec matches, run action_tool with action_args (a {{placeholder}} template over the trigger facts). The action re-enters the governance chokepoint, so it still respects approvals + write-scope. Requires the workspace automation flag to actually fire. Returns the rule. An existing rule is edited with update_record / delete_record on object_type "automation" (its id and key come from describe_schema).
When to use: When an admin wants an action to fire automatically on a record write — e.g. flag big deals, create a follow-up task.
Example: When an opportunity over $100k is created, make a task for me to review it.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Display name for the rule. Its slug becomes the rule key, which must be unique in the workspace. | |
| action_args | No | Arguments for action_tool. String values may embed {{object_key}}, {{tool_name}}, {{record_id}} or {{account_id}}; a whole-string placeholder keeps the fact's raw type. | |
| action_tool | Yes | The registered tool to run, by name (e.g. create_record, add_note). Account-creating actions (create_account, migrate_crm, create_record of account) are refused. | |
| trigger_event | No | The event that fires the rule. Only "record.written" (any governed record write) exists today; it is the default. | |
| condition_spec | No | all (AND) / any (OR) lists of {field, op, value?} on object_key, tool_name, record_id, account_id; op eq/neq/gt/gte/lt/lte/contains/in/is_null/is_not_null. {} = every write. |
Output Schema
| Name | Required | Description |
|---|---|---|
| automation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (destructiveHint=true, openWorldHint=true, idempotentHint=false) cover the safety profile, and the description adds non-obvious behavior beyond them: the action re-enters the governance chokepoint and still respects approvals/write-scope, plus the workspace automation flag prerequisite. It stops short of describing failure modes (e.g. duplicate rule key, refused account-creating actions at runtime), so it is strong but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the dense core mechanics before the when-to-use and example. Efficient overall, though the 'When to use' plus example section restates the same use case twice, adding minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values ('Returns the rule') need no elaboration. The description covers purpose, eligibility, dependencies, and the edit path, leaving nothing an agent needs to invoke it correctly missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented in the schema, including placeholder syntax, condition operators, and the action_tool restrictions. The description largely summarizes that same content (governance re-entry, placeholder template), adding little parameter meaning beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create an automation rule') and immediately elaborates the trigger→condition→action model, which distinguishes it from sibling define_* tools like define_object, define_field, and define_pipeline. An agent can tell what this tool registers without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' clause with concrete examples (flag big deals, create a follow-up task) and a worked example. It also routes editing to the correct alternatives (update_record / delete_record on object_type 'automation'), naming where the id/key come from.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
define_enum_valueDefine field valueADestructiveIdempotentInspect
Add, relabel, recolor, reposition, archive or reorder the values of a built-in pick-list field (e.g. account.lifecycle_stage, opportunity.type, subscription.status, touch.type, task.priority — the fields describe_schema lists with values). A value_key that already exists is UPDATED in place: only the fields you send change (label, color, position, archived); its key and semantic role never change. A new key needs a label, and on a behavior-driving field a NEW value must pick a semantic_role. archived:true retires a value from new picks while stored data stays valid (archived:false restores it; nothing is deleted). Or send order alone — the field's COMPLETE value_key list, archived keys included — to set the whole order in one atomic call. Changes apply immediately. Returns the stored value, or the field's values in their new order.
When to use: When an admin wants a new, renamed, recolored, reordered or retired value for a field like lifecycle_stage, opportunity type, or touch type. New behavior-field values pick a semantic role; archiving is reversible.
Example: Add a 'pilot' lifecycle stage that means active_customer.
| Name | Required | Description | Default |
|---|---|---|---|
| color | No | Optional hex color for the value's chip, e.g. "#2563eb"; display only. Null clears the color; omitting it keeps an existing value's color. | |
| field | Yes | The enum field's key on that object, e.g. lifecycle_stage, type, status, priority; describe_schema lists each field's values. | |
| label | No | Display label. Required for a NEW value (its slug becomes the value_key unless value_key is set); on an existing value_key it relabels. Omit to leave a label as is. | |
| order | No | Reorder form: the field's COMPLETE value_key list in the wanted order (every current key exactly once, archived ones included — describe_schema lists them). Send it alone with object_type + field; a partial or unknown list is refused with the current keys. | |
| archived | No | true retires an existing value from new picks (stored data keeps it, reversible); false restores it. Omit to leave the state as is; a new value is never born archived. | |
| position | No | 0-based sort position among the field's values, lower first. A new value defaults to 0; omitting it keeps an existing value's position. To set the whole order, use `order` instead. | |
| value_key | No | Stable machine key (lowercase, underscores). Defaults to the slugified label; pass an existing key to relabel, recolor, reposition, archive or restore that value. | |
| object_type | Yes | Built-in object owning the enum field, e.g. account, opportunity, subscription, touch, task, lead. | |
| semantic_role | No | Meaning anchor, required only for a NEW value on a behavior-driving field: account.lifecycle_stage takes prospect / active_customer / at_risk / churned / dormant, opportunity.type takes new / post_sale, subscription.status takes live / inactive; the refusal names that field's allowed roles. Locked once a value exists. Omit or null for every other field. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| order | No | |
| values | No | |
| updated | No | |
| enum_value | No | |
| current_keys | No | |
| known_fields | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (readOnly=false, destructive=true, idempotent=true); the description goes well beyond by explaining in-place update semantics ('only the fields you send change'), that the key and semantic role are immutable, that archiving is reversible and 'nothing is deleted', that `order` is atomic, and that changes apply immediately. This is exactly the extra behavioral context the annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb/resource statement, then cleanly sectioned into update semantics, ordering, archiving, and a 'When to use' + 'Example' block. It is long for a tool description and overlaps noticeably with the already-rich schema text, which keeps it out of 5 territory.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, high-consequence mutation tool, the description covers the update-vs-create distinction, the semantic_role prerequisite, the atomic order contract, reversibility, and immediacy of effect. An output schema exists and the annotations carry the safety profile, so nothing an agent needs before invoking is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter descriptions are themselves very detailed (color null-clearing, complete order list, position-vs-order, semantic_role per field), so the prose largely restates the schema rather than adding syntax or format meaning. The one genuine addition is the worked example tying label+semantic_role together, which is why this sits at the baseline 3 rather than lower.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb set (add, relabel, recolor, reposition, archive, reorder) applied to a precisely scoped resource: the values of a built-in pick-list field, with concrete examples (account.lifecycle_stage, opportunity.type). An agent can distinguish this from sibling field tools like define_field or update_field without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to use' block gives clear triggering context (an admin wants a new, renamed, recolored, reordered or retired value) and repeats the semantic_role requirement for behavior fields. It also clarifies the order-vs-position split. It never names a sibling alternative (e.g. update_field, archive_field) or an exclusion, 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.
define_fieldDefine fieldAInspect
Add a custom field to any object that supports them (core objects with custom fields, or any custom object). field_type is one of text/number/date/select/multiselect/boolean/url, or 'relationship' (then pass target_object — stores the target record's id). select/multiselect need options. Returns the created field definition.
When to use: When an admin wants a new attribute on a core or custom object — text, number, date, choice, boolean, url, or a relationship.
Example: Add a 'square footage' number field to the Property object.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Display label. Its slug (lowercase, underscores) becomes the field key, which must be unique on the object. | |
| options | No | The allowed choices for a select or multiselect field, as labels; at least one is required. Ignored for other types. | |
| field_type | Yes | The field's storage type: text, number, date, select or multiselect (pass options), boolean, url, or relationship (a link to another object; pass target_object). | |
| object_type | Yes | Object key to add the field to — a built-in object that supports custom fields, or any custom object (see describe_schema). | |
| target_object | No | For field_type relationship: the object key (built-in or custom) whose record id this field stores. |
Output Schema
| Name | Required | Description |
|---|---|---|
| field | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the write profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false). The description adds useful conditional behavior — relationship requires target_object, select/multiselect need options — and notes it returns the created field definition. However it omits auth requirements, uniqueness/failure behavior, and idempotency nuance beyond the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then 'When to use' and a concrete example, which is good structure. The inline enumeration of every field_type value is somewhat redundant with the schema enum, a minor waste rather than a serious flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers field types, the relationship special case, options, a usage trigger, and a worked example. It is complete enough to call correctly, though it leaves creation constraints (slug uniqueness, permissions) implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each of the 5 parameters is already documented in the schema. The description restates field_type values and the target_object/options conditions, which only reinforces what the schema provides rather than adding new semantics. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Add a custom field') and scopes the target ('any object that supports them — core objects with custom fields, or any custom object'). An agent can distinguish it from update_field, archive_field, and define_object without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The explicit 'When to use' line names the trigger (an admin wants a new attribute on a core or custom object) and enumerates the field flavors. It gives clear context but names no alternative (e.g., update_field for modifying an existing field) and states no 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.
define_objectDefine object typeAInspect
Create a new custom object TYPE (e.g. Partner, Product, Investor) that you can then operate on via create_record/update_record/search_records. Admin-only. Anti-sprawl: if a similar object already 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/partner are stickers on a company/person, not objects). Anti-sprawl checks for near-duplicates first.
Example: We manage real estate — add a Property object.
| Name | Required | Description | Default |
|---|---|---|---|
| icon | No | A key from Capable's curated object-icon set (e.g. landmark, factory, handshake, flask); an unknown key is rejected with suggestions. Omit for the neutral default. | |
| blurb | No | One short sentence saying what records of this object represent; shown in describe_schema and Settings. | |
| label | Yes | Singular display name, e.g. Partner. Its slug (lowercase, underscores) becomes the object's stable key; a built-in's key is refused. | |
| plural | No | Plural display name for lists and the menu. Defaults to the label + "s". | |
| shared | No | true lets any non-viewer edit every record of this object; false (the default) lets only the record's owner, admins and managers edit it. | |
| confirm_new | No | Pass true to create even when a similar object exists; otherwise the anti-sprawl check returns the matches instead of creating. | |
| display_field | No | The data key holding a record's display name — a lowercase field key such as "name" or "fund_name"; defaults to "name". |
Output Schema
| Name | Required | Description |
|---|---|---|
| object | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, idempotent=false, destructive=false, openWorld=false. The description adds non-obvious behavior beyond that: admin-only authorization, the anti-sprawl check that returns matches instead of creating, the confirm_new override, and the returned object definition. These are exactly the traits annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then anti-sprawl, then a scoped 'When to use' section and a worked example. It is longer than minimal for a 7-param tool, and the inline example is somewhat redundant, but every section is organized and earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complexity is moderate, an output schema exists so return values need no elaboration, and the description still notes that it returns the created definition. Permissions, duplicate-handling, and the key naming side-effect ('slug becomes the stable key') are all covered, leaving no material gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the schema does the heavy lifting for label, plural, shared, icon, blurb, and confirm_new. The description adds real value for display_field by explaining its downstream consumers (entity matcher and cards), which the schema does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Create a new custom object TYPE') with concrete examples and names the sibling operations (create_record/update_record/search_records) that act on the result. It explicitly distinguishes object types from relationship concepts, so an agent can tell it apart from define_field, define_enum_value, and the record tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to use' block gives an explicit trigger (admin wants to track a genuinely new noun not covered by built-ins) and an explicit anti-case (it is not a relationship type; investor/partner are stickers). It also names the anti-sprawl behavior and the confirm_new override, 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.
define_pipelineDefine pipelineAInspect
Create an additional pipeline (a named stage sequence) for opportunities or a custom object. Omit stages to seed from the workspace's 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 that stage). Optionally pass default_for_types — the opportunity type value keys this pipeline should be the default for, so new deals of a mapped type start on it (a type can map to only one pipeline). Returns the created pipeline.
When to use: When a motion needs its own stage sequence — e.g. an investor raise separate from the customer pipeline. Optionally set which deal types default onto it.
Example: Create an investor pipeline: Intro, Pitch, Diligence, Committed, Invested.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Display name. Its slug (lowercase, underscores) becomes the stable pipeline_key, which must be unique in the workspace. | |
| stages | No | Ordered stages [{key,label,role,is_closed?,is_won?,requires?,requires_mode?}], role unqualified/qualifying/active/commit/won/lost; omit or [] copies the default pipeline's stages. | |
| applies_to | No | The object key this pipeline runs on (e.g. opportunity). Defaults to opportunity when omitted. | |
| default_for_types | No | The workspace's opportunity `type` VALUE KEYS this pipeline is the default for. New deals of a mapped type start on this pipeline. A type can map to only one pipeline (a double-claim is rejected); an unknown type key is rejected with the known keys. Registry data — not fixed type names. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pipeline | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a non-destructive, non-idempotent, closed-world write. The description adds real behavior beyond that: omitting stages seeds from the default pipeline, a type may map to only one pipeline (double-claims rejected), and it returns the created pipeline. It stops short of stating permissions, uniqueness failure handling, or reversibility.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the verb, then a compact 'When to use' and an example. It is dense but well-organized; the only mild redundancy is re-enumerating the stage fields in prose that the schema already spells out.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the return-value mention is a bonus rather than a necessity. The description covers creation semantics, default seeding, and type-mapping constraints, leaving only permissions and failure modes unaddressed for a rich 4-parameter write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (label, stages, applies_to, default_for_types) is already documented in the schema. The prose largely restates the stage object shape and role enum that the schema already provides, adding only marginal synthesis ('new deals of a mapped type start on it'). Baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Create an additional pipeline (a named stage sequence)') and scopes it to 'opportunities or a custom object'. This is clearly distinguishable from sibling write tools like update_pipeline and archive_pipeline, which modify or remove rather than create.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
An explicit 'When to use' clause names the scenario (a motion needing its own stage sequence, e.g. an investor raise separate from the customer pipeline) and is reinforced by a concrete example. It does not, however, name update_pipeline/archive_pipeline as the alternatives for an existing pipeline, so the routing 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.
define_programDefine programAInspect
Create a top-level program (a parallel workstream like Investor Relations or Partnerships, a peer of the built-in Revenue motion). applies_to lists the object keys it claims; membership_spec ({pipeline_keys?, stage_roles?, lifecycle_roles?, sub_status_roles?}) decides which records land in it. Programs are define-only from here: there is no update or archive verb for them yet (an admin edits them in Settings → Behavior; describe_schema lists them with their ids). Returns the created program.
When to use: When an admin runs a workstream alongside Revenue — Investor Relations, Partnerships — that should get its own lane.
Example: I'm also raising money — set up an Investor Relations program.
| Name | Required | Description | Default |
|---|---|---|---|
| label | Yes | Display name. Its slug becomes the program key, which can't be revenue or a built-in phase key (pre_sales, sales, customer_success). | |
| applies_to | Yes | Object keys this program can claim records of, e.g. ["investor"] or ["opportunity"]; at least one is required. | |
| membership_spec | No | {pipeline_keys?, stage_roles?, lifecycle_roles?, sub_status_roles?}, string arrays; present dimensions must all match, absent = any. Default {} claims every applies_to record. |
Output Schema
| Name | Required | Description |
|---|---|---|
| program | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the mutation lifecycle: programs are define-only, no update or archive verb exists, an admin edits them in Settings, and describe_schema lists them with ids. It also states the return value. This is exactly the kind of non-obvious behavioral context annotations can't convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then detail, then when-to-use and an example. The first paragraph is dense but every sentence earns its place; slightly long but no filler. Structure is scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (so return values needn't be detailed) and a nested membership_spec, the description covers the mutation safety profile, the no-update/archive constraint, where to edit later, and how to enumerate existing programs. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% so baseline is 3, but the description adds real semantic value – applies_to 'lists the object keys it claims' and membership_spec 'decides which records land in it', with the claim/match logic reinforced by the schema. The description reinforces rather than merely repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Create a top-level program") and immediately disambiguates by defining a program as a parallel workstream peer of the built-in Revenue motion, distinguishing it from sibling definition tools like define_pipeline and define_object. An agent can tell what it makes without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit "When to use" line with concrete triggers (IR, Partnerships running alongside Revenue) plus a worked example. It doesn't explicitly contrast against define_pipeline/define_object as alternatives, but the define-only framing in the body clarifies the boundary well.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
define_rollupDefine rollupADestructiveInspect
Create a derived-metric rollup that aggregates a custom source object onto a target field (e.g. usage_revenue = sum of usage records onto an account field). agg is sum/count/avg/min/max. The source must be a custom object; ARR/renewal fields are system-owned and can't be targets. Returns the created rollup. An existing rollup is edited with update_record / delete_record on object_type "rollup" (its id and key come from describe_schema).
When to use: When an admin wants a computed field — e.g. usage revenue summed from usage records onto the account.
Example: Roll up usage records into a usage_revenue field on the account.
| Name | Required | Description | Default |
|---|---|---|---|
| agg | Yes | Aggregation: sum, count, avg, min or max. Every kind except count needs agg_field. | |
| key | Yes | Stable name for the rollup, slugified to lowercase/underscores; unique per workspace. | |
| agg_field | No | The numeric source field key to aggregate; required unless agg is count (null then). For an account source only current_arr_cents. | |
| filter_spec | No | Optional numeric filters on source records, [{key, op, value}] with op one of eq/neq/gt/gte/lt/lte; key is a source data key, value a number (non-numeric clauses are skipped). Not supported when source_object is account. | |
| source_link | Yes | The relationship field key on the source whose value is the target record's id — it decides which source records roll up to each target. | |
| target_field | Yes | Field key on the target that stores the result (a custom field on a built-in target, a data key on a custom one); current_arr_cents and renewal_due_at are refused. | |
| source_object | Yes | Object whose records are aggregated: a custom object, or account (then agg_field may only be current_arr_cents). | |
| target_object | Yes | Object key whose records receive the value — a built-in one (account, contact, opportunity, subscription, touch, signal, task) or a custom object. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rollup | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false and readOnlyHint=false, so the safety profile is partly covered. The description adds real constraint context (system-owned ARR/renewal fields are refused as targets; source must be a custom object) and states that it returns the created rollup. However, it never explains the destructive/idempotency implications — e.g. what happens to existing target-field values or whether re-using an existing key overwrites or errors — which is the most consequential behavior for a non-idempotent, destructive-flagged creator.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded: purpose, then key constraints, then the edit/edit-path routing, then when-to-use and an example. The one blemish is redundancy — the usage-revenue example appears twice (in the first sentence and again in the 'Example' line) and the agg enum duplicates the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained (though it says 'Returns the created rollup' anyway), and the description covers creation intent, constraints, and the edit/delete path. The remaining gap is the non-idempotent lifecycle (what happens when the key already exists) and the source_object scope discrepancy with the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight parameters in detail; baseline is 3. The description's parameter content is mostly redundant ('agg is sum/count/avg/min/max' restates the enum), and it introduces a mild inaccuracy: 'The source must be a custom object' contradicts the schema, which explicitly allows source_object='account' with agg_field limited to current_arr_cents. It adds little meaning and slightly over-restricts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb+resource ('Create a derived-metric rollup that aggregates a custom source object onto a target field') plus a concrete formula-shaped example (usage_revenue = sum of usage records onto an account field), so the agent knows exactly what artifact is produced. It also distinguishes the create path from the edit path by naming update_record/delete_record for existing rollups.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is an explicit 'When to use' line (an admin wants a computed field) and explicit routing for the alternative case: 'An existing rollup is edited with update_record / delete_record on object_type "rollup" (its id and key come from describe_schema).' This is exactly the when-to-use / when-not-to-use / alternative-tool guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_recordDelete recordADestructiveInspect
Archive (soft-delete) a record by object_type + id. DESTRUCTIVE — call once to get a confirmation prompt, then again with confirm:true. Sets deleted_at (never a hard delete) for custom objects, saved reports (creator, manager, or admin), a whole quote (its line items cascade), AND contact plus the core leaf objects opportunity / task / signal / touch — so a mistaken or duplicate one can be removed. Contact history and account links are retained for restore. An ACCOUNT can be removed too (e.g. a junk import), but ONLY once it has no live records under it — an account with any open opportunity or any subscription is refused with the counts and the next step (close / re-point / mark-lost those first); its contacts, touches, notes, and tasks are kept as history and don't block. Subscription still doesn't remove this way (it has cancel_subscription) — change it via update_record. A single quote line item can't be deleted directly (change the line set with update_quote). Returns the archived record.
When to use: Archive a record (soft delete; pass confirm:true) — a custom-object record, a saved report, a contact, or a core leaf object (opportunity / task / signal / touch), e.g. a mistaken or duplicate record. Contact history and account links are retained for web restore. An account is removable too once nothing live sits under it (open deals / subscriptions refuse with the counts); subscription doesn't remove this way — cancel or change it via update_record.
Example: Delete that duplicate contact .
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A uuid. | |
| confirm | No | Boolean (true/false). | |
| object_type | Yes | Object key of the record to archive, e.g. contact, opportunity, task, touch, account, report, quote, a custom object's key, or rollup / automation (admin-only); subscription is refused. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| record | No | |
| result | No | |
| deleted | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description goes well beyond them: the two-call confirmation flow (first call returns a prompt, second with confirm:true), that it only sets deleted_at and never hard-deletes, cascade behavior for quote line items, what is retained for restore, and the refusal-with-counts behavior for accounts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded, but the 'When to use' paragraph largely restates the opening paragraph almost verbatim (soft-delete, confirm:true, contact history retained, account removal, subscription exception), so a meaningful share of the text is duplicated rather than additive.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, multi-object tool this covers the destructive mechanics, the confirmation handshake, cascade and retention behavior, and the refusal conditions; an output schema exists and the description still notes the return ('the archived record'), so nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning the schema lacks: the semantics of confirm (a deliberate second-call gate, not just 'Boolean (true/false)') and the object_type acceptance/refusal rules including the admin-only rollup/automation case and the refused subscription.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+keying scheme: 'Archive (soft-delete) a record by object_type + id.' It explicitly carves itself out from siblings by naming cancel_subscription, update_record, and update_quote as the correct paths for cases this tool refuses, so an agent can distinguish it without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Has a dedicated 'When to use' block plus explicit exclusions: subscription does not remove this way (use cancel_subscription/update_record), a single quote line item cannot be deleted (use update_quote), and an account is refused while live records exist with the next-step guidance. This is explicit when/when-not/alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_schemaDescribe workspace schemaARead-onlyInspect
Learn the complete shape of this CRM workspace in one call: its objects and their fields (built-in + custom), the valid values for each field (with each value's semantic role where it has one), how objects relate (the FK graph), the pipelines and their stages, the active motions, and the qualification framework (plus the programs, rollups, and automation rules). Call this to understand what objects, fields, values, relationships, pipelines, and motions a workspace has before reading or writing.
When to use: The transparency front door, open to every role: read this to learn a workspace's objects and fields (built-in + custom), the valid values for each field (with semantic roles), how objects relate, the pipelines and their stages, the active motions, and the qualification framework — before reading or writing. Changing the schema stays admin-only.
Example: What objects, fields, and valid values does my workspace have?
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| schema | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/destructive/openWorld, so the bar is lower. The description adds genuinely useful context: it is the 'transparency front door, open to every role,' while schema changes remain admin-only — an access-control distinction not present in the annotations. It does not explain output volume or cost, which is the only notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and sectioned, but the 'When to use' paragraph restates the entire contents list from the opening sentence almost verbatim, adding length without new information. The example question is useful; the duplication is waste that undercuts conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values needn't be spelled out, yet the description still maps what's discoverable (objects, fields, values, relationships, pipelines, motions, qualification). Combined with the access-control note and the pre-read/pre-write timing guidance, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so per the rubric the baseline is 4. The description correctly signals a parameterless, whole-workspace call ('in one call'), leaving no parameter ambiguity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (describe/learn) and resource (CRM workspace schema), then enumerates exactly what it returns: objects, fields (built-in + custom), valid values with semantic roles, FK relationships, pipelines/stages, motions, and qualification framework. An agent can distinguish this from schema-mutating siblings like define_object or update_field at a glance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' guidance: read this before reading or writing, and it notes that changing the schema stays admin-only. However, it never names the closest read-oriented alternatives (get_context, show_workspace_setup) so the agent must infer which descriptive tool to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_reportExport report (CSV)ARead-onlyInspect
Export one saved analysis's results as CSV through the single audited egress path. Pass report_id for a saved analysis or an inline ReportSpec; returns the CSV text + row count + filename. A dashboard is not one CSV: choose a linked panel's source analysis or an inline panel's spec. Every export is recorded (a report_runs row + an audit_log report.export event).
When to use: Export one saved analysis or an inline ReportSpec as CSV. A dashboard needs a panel chosen first; it is not exported as one table. Every export is logged for governance.
Example: Export the ARR-by-industry report as a CSV.
| Name | Required | Description | Default |
|---|---|---|---|
| report_id | No | A saved analysis's id (uuid) to export; give this or definition (report_id wins when both are passed). A dashboard or segment id is refused. | |
| definition | No | An inline ReportSpec for a single analysis (not a dashboard) to export without saving it; omit when passing report_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| csv | No | |
| format | No | |
| filename | No | |
| row_count | No | |
| truncated | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the annotations: the single audited egress path, the returned payload (CSV text + row count + filename), refusal of dashboard/segment ids, and the fact that every export writes a report_runs row and an audit_log event. That logging disclosure is slightly at odds with readOnlyHint=true, which keeps this from a clean 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core behavior and return format, and reasonably sized. The dedicated 'When to use' block largely restates the opening paragraph, which is mild redundancy rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full schema coverage, the description need not explain return values, and it still does so helpfully. Given the complex nested ReportSpec parameter and the read-only/audit nuance, one could ask for a bit more (e.g., limits/pagination semantics), leaving this just below complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents report_id, its precedence over definition, and the inline ReportSpec. The description adds only marginal framing ('give this or an inline ReportSpec'), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (export), resource (one saved analysis's results), and output format (CSV), plus the mechanism (audited egress path). This is clearly separable from siblings like run_report and schedule_report without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and a concrete when-not ('a dashboard is not one CSV') with redirect guidance (pick a linked panel's source analysis or an inline panel's spec). It does not name a sibling alternative by tool name, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finalize_workspace_setupFinalize workspace setupADestructiveIdempotentInspect
Commit onboarding answers into the workspace config. Any field omitted is left untouched. active_motions records the confirmed motion choice and auto-applies each chosen motion's template; feature_templates applies additional standalone add-on templates (opted into during the interview) AFTER the motion templates — an unknown feature key is skipped and named in the result, never a failure; answers records checklist items without a dedicated field. Returns the updated workspace.
When to use: Call at the end of the interview once the user has confirmed the choices. Records the confirmed motion(s), applies their starter templates, and commits the answers — anything omitted keeps its default.
Example: Looks good — save those settings.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The workspace's display name — answers the checklist's name item; until set it reads "<sign-up email domain> workspace". | |
| answers | No | Answers to checklist items with no dedicated field, keyed by the checklist key (e.g. quoting_catalog); merged into the saved onboarding answers. | |
| framework | No | Qualification framework whose fields are filled on opportunities; passing the current default (spiced) records it as a chosen answer. | |
| template_key | No | Key of one extra starter template to apply beyond the chosen motions, from start_onboarding's available_templates; an unknown key is refused. | |
| active_motions | No | The confirmed motion key(s) from start_onboarding's available_motions — saved as the workspace's active motions, each applying its matching template. | |
| pipeline_stages | No | The default pipeline's stages, in order: the list sets which stages exist and their labels. A stage whose key already exists keeps its role and entry requirements, and an omitted is_closed / is_won keeps its stored value unless the flag you do send contradicts it. | |
| framework_custom | No | Custom framework definition for framework 'custom', shaped {fields:[{key,label}]} — each key becomes a qualification field on opportunities. | |
| feature_templates | No | Keys of standalone add-on templates opted into during the interview (e.g. quoting), applied after the motion templates; unknown keys are skipped and named, never refused. | |
| expected_active_motions | No | Optional guard against saving over a newer choice: the active_motions you last read (state.active_motions from start_onboarding or show_workspace_setup; null when none was confirmed). If the saved motions no longer match, nothing is saved and the result returns updated:false with the current motions and workspace. |
Output Schema
| Name | Required | Description |
|---|---|---|
| updated | No | |
| guidance | No | |
| workspace | No | |
| workspace_url | No | |
| active_motions | No | |
| applied_template | No | |
| applied_templates | No | |
| skipped_feature_templates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing merge semantics ('any field omitted is left untouched'), the distinct failure modes (unknown feature key skipped and named vs. template key refused), and the expected_active_motions guard returning updated:false. This is meaningful behavioral context for a destructive, non-read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded, but the 'When to use' paragraph repeats the first paragraph's omission rule ('anything omitted keeps its default' vs 'any field omitted is left untouched'), and the example line is thin. Some redundancy blunts the structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given nine parameters, nested objects, and an output schema, the description covers the key semantics (omission behavior, template ordering, guard) and need not explain return values. The trigger context is present, though the destructive/overwrite implications for pipeline_stages could be spelled out more.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all nine parameters. The description's notes on active_motions, feature_templates ordering, and unknown-key handling largely restate the schema descriptions, adding only marginal value. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Commit onboarding answers into the workspace config,' which is more specific than a generic update. It reads as the onboarding-finalization step rather than a general workspace update, though it never explicitly contrasts with the update_workspace sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear trigger condition: 'Call at the end of the interview once the user has confirmed the choices.' However, it names no alternatives or exclusions (e.g., when to use update_workspace instead), so the when-not-to-use side 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.
find_timesFind meeting timesARead-onlyInspect
Find three meeting times on the host's calendar. Returns 3 slots labeled "1"/"2"/"3" chronologically, each with a pre-formatted rationale; nothing is held yet — propose_meeting places the holds. co_host_emails is for WORKSPACE MEMBERS only, never the invitee (use invitee_timezone); a non-member matching a known contact is dropped (dropped_co_hosts) — relay it. starts_at/ends_at are OPAQUE identifiers: never convert them or do timezone math; quote the rationale verbatim and refer to slots by label. Confirmed times are final: never call find_times again to validate, swap, commit or re-render them (propose_meeting rechecks availability before placing holds); 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. Modes: FRESH (duration + window); SWAP (current_slots + propose_label) re-picks ONE slot — wait for a yes; COMMIT (current_slots only) finalizes labels. On hosts that render cards reply in one or two sentences, don't list the slots; without a card, list them as bullets from each rationale. Busy overrides, shortfalls, card wording, signed_in_as: capable://guide/scheduling.
When to use: First step of booking a meeting: three labeled candidate slots with pre-formatted local times, nothing held yet. Narrow per call ("mornings only"); swap or commit slots with the same tool.
Example: Find three times for a 30-minute call with Sara next week — mornings only.
| Name | Required | Description | Default |
|---|---|---|---|
| window_end | Yes | ISO 8601 end of the search window. | |
| duration_min | Yes | Meeting duration in minutes (30, 45, 60, or 90). | |
| window_start | Yes | ISO 8601 start of the search window. | |
| current_slots | No | The 3 currently-committed slots with their labels. Pass with propose_label to swap one, or ALONE to commit a previously-accepted swap. Use the exact starts_at/ends_at values the previous call returned — never reformat them. | |
| propose_label | No | Which committed slot to re-pick (requires current_slots). Narrow window_start/window_end to the user's hint ("Friday morning" → that day 9–12). Do NOT use this to commit — committing is a separate call with current_slots only. | |
| co_host_emails | No | Emails of WORKSPACE MEMBERS who should also attend — everyone's calendars are intersected so the returned slots work for all hosts. WORKSPACE MEMBERS ONLY — never the external invitee: the invitee's availability is unknown by design (that's why you propose three times). If you know the invitee's timezone, pass invitee_timezone instead. | |
| invitee_timezone | No | IANA timezone of the invitee (e.g. "Europe/Berlin"). When set, every candidate must also fall inside 9–17 Mon–Fri in the invitee's local time. Translate from whatever the user says — a city ("Berlin" → "Europe/Berlin"), a country, an offset — and never infer it from an email domain. Omit when it doesn't matter. | |
| target_starts_at | No | Exact ISO start for the swap's new candidate (requires current_slots + propose_label). Validated against every constraint; on failure proposed_slot.new is null and target_failure_reason names why — it is never silently substituted. | |
| workday_end_hour | No | Latest acceptable hour of day, interpreted in each host's own timezone. When omitted, every host's saved availability end hour applies (default 17). Same rule as workday_start_hour: only for momentary narrowing ("mornings only" → 12). | |
| workday_start_hour | No | Earliest acceptable hour of day, interpreted in each host's own timezone. When omitted, every host's saved availability start hour applies (default 9). Pass explicitly ONLY when the user narrows the moment ("book mornings only", "after 2pm" → 14) — it overrides the saved hours for THIS search only and is never persisted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | No | |
| note | No | |
| hosts | No | |
| slots | No | |
| events | No | |
| shortfall | No | |
| timed_out | No | |
| duration_min | No | |
| signed_in_as | No | |
| host_timezone | No | |
| proposed_slot | No | |
| co_host_notice | No | |
| dropped_co_hosts | No | |
| invitee_timezone | No | |
| workday_end_hour | No | |
| workday_start_hour | No | |
| visualization_weeks | No | |
| cohost_busy_intervals | No | |
| availability_blackouts | No | |
| display_offset_minutes | No | |
| cohost_blackout_intervals | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety profile (readOnlyHint, idempotentHint=false, destructiveHint=false), and the description adds substantial context beyond that: nothing is held yet, co_host_emails is workspace-members-only with silent drops surfaced via dropped_co_hosts, starts_at/ends_at are opaque identifiers that must not be reformatted, and confirmed times are final. Card-vs-no-card reply behavior and the signed_in_as guide pointer further enrich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the holds/alternatives constraint are front-loaded, and the block is well-organized into modes, rendering rules, and a guide pointer. It is dense and long for a tool, with some overlap against the already-rich schema descriptions, but the length is largely justified by the three-mode workflow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, three-mode scheduling tool with an output schema, the description covers the full lifecycle: search, swap, commit, the finality of confirmed times, and the hand-off to propose_meeting. With the output schema handling return-shape details, nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself already documents the mode mechanics, the never-reformat rule, workday hour overrides, and target failure behavior. The description largely reinforces these constraints rather than adding new syntax or semantics, so the baseline 3 for full schema coverage is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (find three meeting times on the host's calendar) and precisely describes the output: three slots labeled "1"/"2"/"3", chronological, each with a rationale. It cleanly separates itself from propose_meeting ('places the holds') and from search/reschedule siblings, so an agent can route without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly defines when to call it (first step of booking), when NOT to call it ('never call find_times again to validate, swap, commit or re-render'), and names the alternative (propose_meeting). It also enumerates the three modes (FRESH/SWAP/COMMIT) with their triggering conditions and a worked 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.
get_company_billingReview company billingARead-onlyInspect
Review a company's billing state: free prospect, paid active account (state working) or free archived. Returns a server-calculated activation quote, annual capacity, approval requirement and links to live work blocking archive. Reading never activates a company. null means this workspace uses an existing pricing contract; its billing is unchanged.
When to use: Before activating or archiving a company, review its current billing state and price.
Example: What would activating this company cost?
| Name | Required | Description | Default |
|---|---|---|---|
| account_id | Yes | The account (company) id to review — a uuid from a previous read or search_records({object_type:"account"}). |
Output Schema
| Name | Required | Description |
|---|---|---|
| billing | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe-read profile (readOnlyHint=true, destructiveHint=false), so the bar is lower. The description nonetheless adds real behavioral value: 'Reading never activates a company' pre-empts a plausible side-effect fear, and it explains the null case (existing pricing contract, billing unchanged), which is not derivable from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then states, then the null caveat, then when-to-use and an example. Every sentence carries information, though the sentences are dense and the null clause is a slight interruption to the primary flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not strictly required, yet the description still summarizes the returned quote, capacity, approval flag and blockers. Combined with the read-only annotations, an agent has everything needed to call it correctly; only the sibling-routing gap keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `account_id` parameter is fully documented in the schema, including its provenance ('from a previous read or search_records'). The description adds no parameter detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Review a company's billing state') and enumerates the states it can report (free prospect, paid active, free archived), so the agent knows exactly what it returns. It does not, however, explicitly differentiate itself from the sibling `manage_company_billing`, which is the nearest alternative an agent might confuse it with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit 'When to use' trigger ('Before activating or archiving a company') plus a concrete example ('What would activating this company cost?'). It gives clear positive context but names no alternatives or when-not-to-use conditions, so it stops short of routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contextGet contextARead-onlyInspect
Single-call bounded context for reasoning about a record. Defaults to an ACCOUNT (pass account_id, or type='account' + id) — returns the account row (ARR + lifecycle + renewal), active/recently-canceled subscriptions, last 90 days of subscription_events, open opportunities by type, account_contacts (champion highlighted), recent touches/signals, open tasks (overdue first), and notes. For any OTHER record type (contact, opportunity, subscription, task, or a custom object) pass type + id to get the record plus its related records. Prefer this over individual search_* calls when the user asks 'tell me about ' or anything similarly broad. context_coverage reports each section as complete, truncated, unavailable, or unknown; missing/failed sections are not evidence of absence, and bounded lists must not be called exhaustive. For an exact LinkedIn profile match use type='contact' + linkedin_url; an ambiguous match returns candidates: ask the user which one, then pass that candidate's id as id with the same linkedin_url. Use type='linkedin_conversation' to list only your permitted LinkedIn conversations (who each is with, no message text), add id to explicitly read one, or add linkedin_thread_id from a LinkedIn messaging-thread page to open exactly that conversation. The gated type='linkedin_thread_identity' verifies an exact LinkedIn thread/header participant through your own active connection; it returns a public profile mapping only, with no messages or CRM records.
When to use: When the user asks anything broad about a record ('tell me about Acme', 'what's the state of this deal?'). Defaults to an account (pass account_id); pass type + id for contacts, opportunities, subscriptions, tasks, or custom objects. Prefer this over multiple search_* calls. Use structural contact links and recent touches for people context.
Example: Tell me everything about Acme.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The record's id — a uuid from a previous read/search. | |
| type | No | Record type: account (default), contact, opportunity, subscription, task, or a custom object key. | |
| account_id | No | Alias for {type:'account', id} — the account's uuid. | |
| linkedin_url | No | Exact LinkedIn profile URL; only with type='contact'. Never resolves by name. | |
| linkedin_member_id | No | With type='linkedin_thread_identity', or type='linkedin_conversation' plus linkedin_thread_id for an owner-only verified header match: exact case-sensitive internal member ID from the rendered one-to-one conversation header, matching ACoA followed by 35 letters, digits, underscores or hyphens. | |
| linkedin_thread_id | No | Exact opaque thread route segment from a linkedin.com/messaging/thread/<id>/ page, after one URI percent-decoding pass: at most 1024 characters matching [A-Za-z0-9_-]+ with up to two trailing equals signs. Preserve case and padding; never decode Base64 or URNs. With type='linkedin_conversation' it opens only your permitted conversation with exactly this thread id; with type='linkedin_thread_identity' it also needs linkedin_member_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| found | No | |
| reason | No | |
| context | No | |
| web_url | No | |
| context_coverage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, but the description goes well beyond them: it warns that context_coverage may mark sections complete/truncated/unavailable/unknown, that missing sections are not evidence of absence, that bounded lists must not be called exhaustive, and that the linkedin_thread_identity type is gated and returns only a public profile mapping. These are non-obvious behavioral caveats an agent would otherwise guess wrong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the default behavior, which is good, but the 'When to use' section largely restates the opening paragraph ('Defaults to an account' and 'Prefer this over search_*' both appear twice), and the LinkedIn branches make the block long. The content earns its place individually, but the duplication costs structure points.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, multi-mode, read-only tool with an output schema already covering return values, the description supplies the routing logic, the per-type behavior, the ambiguity-handling flow, and the coverage caveats. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all six parameters, but the description adds real semantic value: account_id as an alias for {type:'account', id}, that linkedin_url never resolves by name and returns candidates on ambiguity, and the multi-step flows for linkedin_conversation and linkedin_thread_identity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ('Single-call bounded context for reasoning about a record') and enumerates exactly what comes back for the default account case (account row with ARR/lifecycle/renewal, subscriptions, 90 days of subscription_events, open opportunities, contacts, touches, tasks, notes). It also clearly distinguishes itself from siblings by naming search_* as the alternative it replaces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use it ('When the user asks anything broad about a record'), names the alternative ('Prefer this over individual search_* calls'), and gives a concrete trigger example ('tell me everything about Acme'). Per-type routing (account_id vs type+id) and the LinkedIn special cases are also spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_helpGet product helpARead-onlyInspect
Answer a question ABOUT CAPABLE ITSELF — how-to, setup, or troubleshooting (e.g. 'how do I connect my assistant', 'why didn't this email become a contact', 'what can each role do', 'how do I build a report'). Searches Capable's curated, hand-verified help knowledge base and returns the matching articles verbatim, each with SOURCE citations. This is NOT for the user's CRM data (use get_context / search_records for that). GROUNDING RULE — answer ONLY from the returned articles and cite the article title; do NOT add product behavior from memory. If confident is false or no returned article actually answers the question, tell the user you don't have a verified answer and point them to hello@capable.run (email is the BACKUP — remind them that asking here is much quicker). Never guess how Capable works. When an article lists related topics you may offer them as follow-ups; pass article_key to fetch one specific article.
When to use: When the user asks how Capable ITSELF works — setup, how-to, or troubleshooting ('how do I connect my assistant', 'why didn't this email become a contact', 'what can each role do'). Searches Capable's curated, verified help articles and returns them WITH source citations. NOT for the user's CRM data (use get_context / search_records). Answer only from what it returns; if it's not confident, tell the user and point them to support rather than guessing.
Example: How do I set up a booking link in Capable?
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | The user's question about Capable itself, in their words (how-to, setup, troubleshooting); omit it and article_key to receive the help-topic catalog instead. | |
| article_key | No | Fetch one specific article by its key, as returned in articles[].key or related[].key; an unknown key falls back to searching it as a query. | |
| diagnostics | No | Opt in to read-only checks of your own saved connections, imports, agent grants, and permitted workspace recording setting. Returned checks are setup facts, not live provider health; cite them only for setup status. |
Output Schema
| Name | Required | Description |
|---|---|---|
| checks | No | |
| articles | No | |
| guidance | No | |
| confident | No | |
| support_email | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=true, destructiveHint=false), so the lower bar applies. The description adds substantial behavioral context beyond annotations: the grounding rule (answer only from returned articles, cite titles, never guess), the confidence/failure path (if confident is false, direct to hello@capable.run), and the article_key fallback behavior. Only the diagnostics semantics are lightly covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded and well-structured, but the description is quite long with redundancy: the opening paragraph's parenthetical examples are repeated almost verbatim in the 'When to use' block, which adds bulk without new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return format need not be explained; the description correctly focuses on what the agent must do (grounding rule, citation requirement, failure path, follow-up behavior). Given the number of sibling tools and the risk of CRM/help confusion, this is thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema documents all three parameters in detail. The description still adds meaningful semantics on top: article_key fetches a specific article and an unknown key falls back to searching it as a query, and the diagnostics parameter's read-only nature and setup-fact limits are reinforced.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opening sentence states a specific verb (Answer a question) and resource (Capable's own help knowledge base), with examples that make the scope unmistakable. It explicitly distinguishes itself from sibling tools get_context and search_records, which handle the user's CRM data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use section with concrete triggers ('how Capable ITSELF works — setup, how-to, or troubleshooting'), explicit exclusions (NOT for CRM data; use get_context/search_records instead), and an example. 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.
get_pipeline_summaryPipeline summaryARead-onlyInspect
Aggregate roll-up of the workspace's opportunities and revenue. Returns: opportunities broken down by type AND stage; the open pipeline segmented by lens (pipeline_by_lens), where lens membership is derived from each stage's role, not its label; each stage with its role (unqualified | qualifying | active | commit | won | lost) plus sales_boundary_stage (the first 'active'-role stage — the open-pipeline boundary); a revenue roll-up (total ARR, customer count, at-risk count); renewals due in the next 90 days (count + ARR at risk computed over EVERY renewal due, plus a list of up to 500 with coverage {status complete|truncated, returned, total} and truncated saying whether the list is a sample); and accounts in the explicit at-risk lifecycle stage. Optionally scope to ONE pipeline with pipeline_key (or pipeline_id): this filters ONLY the opportunity breakdowns (stages, pipeline_by_lens, pipeline_by_type_and_stage) to that pipeline — omit both for the workspace default pipeline + unassigned deals. The revenue roll-up, renewals, and at-risk accounts are always workspace-wide regardless of the pipeline filter. The additive forecast block carries per-person rows and the reporting-tree rollup, separate currencies, targets, human calls, and the exact deal ids behind every cell. Nothing predicts.
When to use: The Revenue sales pipeline — forecast, stage mix, renewals, ARR. It assumes a revenue pipeline, so it's only for workspaces that run a sales motion with real opportunities. Don't reach for it to answer a vague 'show me my data', and never before a workspace has chosen its motion — it has nothing to show then. Pass pipeline_key to scope the stage/type breakdowns to one named pipeline (revenue, renewals, and at-risk stay workspace-wide). The renewals-due count and ARR at risk cover every renewal; the list itself is capped at 500 and says so in its coverage.
Example: Give me a pipeline summary.
| Name | Required | Description | Default |
|---|---|---|---|
| pipeline_id | No | Scope the opportunity breakdowns to this pipeline by id (uuid). Prefer pipeline_key. | |
| pipeline_key | No | Scope the opportunity breakdowns to this pipeline by its stable KEY (see the `pipelines` section / describe_schema). Omit both for the default pipeline + unassigned deals (today's behavior). pipeline_id wins if both are given. | |
| forecast_period | No | Calendar forecast period in the workspace timezone; defaults to quarter. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| empty | No | |
| stages | No | |
| revenue | No | |
| forecast | No | |
| framework | No | |
| pipeline_by_lens | No | |
| total_opportunities | No | |
| sales_boundary_stage | No | |
| renewals_due_next_90_days | No | |
| pipeline_by_type_and_stage | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only/safe/idempotent=false, and the description goes well beyond them: it defines lens membership as derived from stage role not label, defines sales_boundary_stage, states that pipeline filtering touches only the opportunity breakdowns while revenue/renewals/at-risk stay workspace-wide, and discloses the 500-item renewal cap with coverage{complete|truncated} and truncation semantics. It even pre-empts a misuse ('Nothing predicts').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the return contents, which is good, but it is an unusually long, densely packed block that repeats the pipeline-filter scoping rule twice (main body and 'When to use'). The example 'Give me a pipeline summary.' adds no information. Functional but noticeably padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-param, high-complexity aggregate tool with an output schema, the description covers domain preconditions, filter semantics, result segmentation, and truncation behavior. An agent has everything needed to decide when to call it and how the filter changes the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real semantics the schema lacks: that the pipeline filter applies ONLY to the opportunity breakdowns while revenue/renewals/at-risk remain workspace-wide, and what omitting both keys yields (default pipeline + unassigned). Precedence of pipeline_id over pipeline_key is already in the schema, so the description's added value is partial rather than complete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence gives a specific verb+resource ('Aggregate roll-up of the workspace's opportunities and revenue') and the body enumerates exactly what is returned (stage/type breakdown, pipeline_by_lens, revenue roll-up, renewals, at-risk accounts). It is very clear what the tool produces. However, it never names or contrasts itself against adjacent read tools like run_report or export_report, so sibling differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is an explicit 'When to use' section with domain ('The Revenue sales pipeline'), a precondition ('never before a workspace has chosen its motion'), and a when-not ('Don't reach for it to answer a vague show me my data'). This is strong guidance. It stops short of naming the alternative tool to use for those rejected cases, so it is not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recordGet record by idARead-onlyInspect
Fetch the full detail of any record by id. type is an OPTIONAL hint — if it's omitted or doesn't match the id, the record is resolved by id anyway and returned with its true type (so you never need to guess the type right). A built-in object (account, contact, opportunity, subscription, lead, task, touch, signal, note, playbook, report, meeting_recording, meeting, target, forecast_call) or a custom object key (records-backed). Governance records — audit_log, pending_approval, report_run, policy — resolve by id too (admin-only; list them with search_records). A stale/unknown/malformed id returns {found:false} plus the search that finds the record fresh — never an error.
When to use: When you have an id and want the full record without searching. Works for built-in objects and custom-object records. Less common than search_* tools.
Example: Fetch opportunity .
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The record's id — a uuid from a previous read/search. | |
| type | No | Optional type hint: account | contact | opportunity | subscription | lead | task | touch | signal | note | playbook | report | meeting_recording | meeting | target | forecast_call, a custom object key, or a governance record (audit_log | pending_approval | report_run | policy; admin-only). | |
| include_archived | No | Boolean (true/false). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| type | No | |
| found | No | |
| record | No | |
| web_url | No | |
| custom_field_definitions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/destructive/openWorld annotations, the description discloses that `type` is a forgiving hint resolved against the true type, that admin-only governance records resolve by id, and critically that stale/unknown/malformed ids return {found:false} plus a fresh search rather than an error. These are substantial behavioral traits not present in structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then edge-case behavior, then usage guidance. The long parenthetical type enumeration is dense but earns its place by defining the valid `type` space; overall efficient with minimal waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value documentation is not required, yet the description still conveys the important {found:false} failure shape and the resolve-by-id guarantee. Nothing needed to call this tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), but the description adds real semantics beyond the schema: `type` is an optional hint that need not match, and the valid type space is enumerated. `include_archived` is left unexplained, so it does not fully cover all params.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and scope ('Fetch the full detail of any record by id'), and differentiates itself from siblings by noting it retrieves without searching and is 'less common than search_* tools'. An agent can distinguish it from search_records and update_record without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use: When you have an id and want the full record without searching' gives a clear triggering condition, and it routes governance-record listing to search_records. It stops short of naming a full alternative/negative case for each object type, 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.
log_touchLog touchAInspect
Record an activity (call / email / meeting / LinkedIn). MUST link to at least one of account_id, contact_id, opportunity_id (auto-resolve names with search_* before calling — never invent ids). Recorder- and scheduler-captured meetings file themselves as touches automatically — when the touch already exists, don't stop at "already logged": process it (its transcript when the call was recorded, the user's notes otherwise) and propose updates for approval (propose_updates with source_touch_id → review_proposed_updates). Returns the created row. Supply request_id (UUID) plus occurred_at for a durable retry. For a recorded outbound sequence step, include sequence_action:{enrollment_id,step}; the saved activity advances that exact step through the same governed update and returns sequence_tracking (updated, pending or unchanged). Retrying the same request repairs a pending update without another activity.
When to use: After any meaningful interaction. commit_reviewed_updates often applies this from an approved review.
Example: Log a 45-min discovery call with Sarah at Acme yesterday — covered pain, impact, decision criteria.
| Name | Required | Description | Default |
|---|---|---|---|
| type | Yes | Defaults: call | email | meeting | linkedin | other. A workspace admin may rename or add values — see the live set in propose_updates' workspace.enum_values, or an admin's describe_schema. | |
| source | No | Defaults: manual | transcript_paste | api | mcp | inbox_import | calendar_import | imported_csv | scheduler | recorder | reply_io | instantly. A workspace admin may rename or add values — see the live set in propose_updates' workspace.enum_values, or an admin's describe_schema. | |
| subject | No | Short title of the activity (an email's subject line, a meeting's title); searchable and part of the duplicate fingerprint. | |
| summary | No | Plain-text account of what happened or was discussed — the rep's notes for an unrecorded call; searchable together with the subject. | |
| direction | No | Defaults: inbound | outbound. A workspace admin may rename or add values — see the live set in propose_updates' workspace.enum_values, or an admin's describe_schema. | |
| account_id | No | A uuid. | |
| contact_id | No | A uuid. | |
| request_id | No | A uuid. | |
| occurred_at | No | An ISO 8601 datetime. | |
| participants | No | Email addresses of the people on the activity (sender or recipients, meeting attendees), stored as a flat list and matched by participant search. | |
| custom_fields | No | Values for the workspace's custom touch fields, keyed by field key (see describe_schema); the reserved capable_sequence_action key is refused — use sequence_action. | |
| opportunity_id | No | A uuid. | |
| sequence_action | No | Completes a sequence step: {enrollment_id: uuid, step: the person's current step}; needs request_id, contact_id, occurred_at, direction 'outbound' and the step's channel as type. | |
| duration_minutes | No | An integer ≥ 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| touch | No | |
| account | No | |
| sequence_tracking | No | |
| duplicate_suppressed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the basic write-safety profile (readOnly=false, idempotent=false, destructive=false). The description adds genuinely non-obvious behavior: auto-filed recorder/scheduler meetings, the request_id+occurred_at durable-retry contract, and the sequence_action side effect that advances an enrollment step and returns sequence_tracking. The retry note does not contradict idempotentHint=false, since durability depends on supplying request_id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and clear paragraph breaks for preconditions, duplicate handling, retry, and sequencing. It is dense and long, and the 'Example' line adds little an agent needs for invocation, but nearly every sentence carries operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter mutation tool with nested objects and an output schema already documenting the return, the description covers the remaining gaps an agent needs: required linkage, id resolution, duplicate/sequence side effects, and retry semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: why request_id exists (durable retry), the outbound/contact/occurred_at prerequisites for sequence_action, and the prohibition on the reserved capable_sequence_action custom-field key.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb (Record) and enumerated resource types (call/email/meeting/LinkedIn), and routes to distinct siblings (search_*, propose_updates, commit_reviewed_updates) so an agent can separate it from add_note, update_record, or propose_updates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('After any meaningful interaction'), explicit precondition (MUST link to at least one account/contact/opportunity), explicit anti-pattern ('never invent ids'), and a dedicated duplicate-handling path telling the agent not to stop at 'already logged' but to process and propose updates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_approvalsManage approval queueADestructiveInspect
Work the workspace's governance approval queue — the requests a require_approval policy captured instead of running. action:"list" returns pending requests plus recently decided ones, newest first, each with the captured tool, its arguments, a human target label, the requester, the policy reason, status and expiry (filter with status). action:"approve" records the decision and then RUNS the captured call as the original requester, reporting execution honestly: applied, failed (with the reason), expired, or uncertain (the decision stands but the outcome could not be verified — check the affected record before starting a new request). action:"deny" closes the request without running it; an optional note is stored with either decision. approve and deny need confirm:true — without it the call changes nothing and returns a preview naming the tool, target, requester and age. Admin-only. Two rules hold on every door: the person who requested an action can never decide it, and a require_approval policy on this tool itself blocks it rather than queueing it (the queue never queues its own operations).
When to use: When an admin wants to see what is waiting in the governance approval queue, or to approve or deny a captured request from the conversation instead of Settings → Governance. Approving runs the captured action and reports whether it applied.
Example: What's waiting for my approval? Approve the subscription cancellation.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | The request id to approve or deny (from a list call). Ignored by list. | |
| note | No | Optional decision note stored with an approve or deny. | |
| limit | No | list only: how many requests to return, newest first (default 50, max 200). | |
| action | Yes | list the queue, or approve / deny one request by id. One of: list | approve | deny. | |
| status | No | list only: return requests in exactly this status (pending, approved, executing, indeterminate, denied, expired, applied, failed); omit for every status. | |
| confirm | No | approve / deny: true carries the decision out; omitted or false returns the preview and changes nothing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | No | |
| action | No | |
| decided | No | |
| approval | No | |
| approvals | No | |
| execution | No | |
| approval_id | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructiveHint=true, readOnlyHint=false and non-idempotency. The description goes well beyond: it enumerates honest execution outcomes (applied, failed with reason, expired, uncertain-but-decision-stands), explains the confirm:true gate and no-op preview, discloses admin-only access, and states two invariants (no self-decision; the queue never queues its own operations). This is exactly the behavioral context the agent needs for a destructive, non-idempotent operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is front-loaded (purpose, then per-action semantics, then invariants, then usage and an example), and every clause carries load-bearing detail. It is nonetheless a dense, long single paragraph, and the trailing 'When to use'/'Example' lines partly restate the intro, costing some tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, multi-action, destructive tool this is complete: it covers permissions (admin-only), safety (confirm gate), execution semantics (applied/failed/expired/uncertain), decision constraints, and self-policy behavior. An output schema exists, so return-shape detail is correctly left out, and nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics the schema lacks: the confirm:true requirement implies 'without it the call changes nothing and returns a preview naming the tool, target, requester and age', id is ignored by list, note stores with either decision, and status scopes the list. That exceeds what the field descriptions convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific resource (the workspace's governance approval queue) and explains its origin (requests a require_approval policy captured instead of running). The three actions are individually defined — list returns pending plus recently decided requests; approve records the decision then runs the captured call as the requester; deny closes it without running. An agent can distinguish this from every sibling (e.g. cancel_subscription, manage_members) without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
A dedicated 'When to use' block states the trigger (an admin viewing or deciding queued requests from the conversation rather than Settings → Governance) and the effect (approving runs the captured action). It also gives two hard exclusions: the requester can never decide their own request, and a require_approval policy on this tool blocks rather than queues it. Alternative paths and negative conditions are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_company_billingChange company billing stateADestructiveIdempotentInspect
Activate a company, or request human approval for activation, after reviewing get_company_billing. Supply the exact quoted revision and price in the returned billing currency’s minor units (cents or öre); never guess them. AI/API activation additionally needs an administrator-granted automation budget even for workspace admins. Without that authority this creates a pending human approval request and does not activate or purchase capacity. Archive and restore require an authorized person to confirm in the company's web panel; this tool cannot perform them. Never invoke this merely to read, enrich, import or qualify a company. Annual capacity purchases are a separate billing-admin action.
When to use: Explicitly activate a reviewed company within an administrator-approved automation budget, or request human approval. Archive and restore require the company's web panel.
Example: Activate this company using the reviewed price, or request approval if needed.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | activate makes the company a paid active account or creates a pending human approval request. archive and restore cannot be performed by this tool; an authorized person must confirm them in the company's web panel. | |
| account_id | Yes | The account (company) id to change — the same uuid you passed to get_company_billing for the quote you are acting on. | |
| idempotency_key | Yes | Keep this same key when retrying the same approved action. | |
| expected_revision | Yes | The `revision` from the get_company_billing result you reviewed; if the workspace's account usage changed since, the action is refused and needs a fresh quote. | |
| approved_price_minor | Yes | The reviewed `activationPriceMinor` from get_company_billing, in the billing currency's minor units (cents or öre); activate is refused when the live price differs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | No | |
| account | No | |
| revision | No | |
| requestId | No | |
| approvalUrl | No | |
| workingCount | No | |
| approvalRequired | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare destructive/idempotent/not-readOnly; the description adds the real behavioral story: activation degrades to a pending human approval request when no administrator-granted automation budget exists, revision or price drift causes refusal, and archive/restore are impossible here. This is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and constraint, then a clean when-to-use block. It loses a point for the trailing example sentence ('Activate this company using the reviewed price, or request approval if needed'), which restates the body and earns nothing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, gated mutation with an output schema present, the description covers the decision path (budget vs. approval), the failure modes (stale revision, price mismatch), and the operations it refuses to perform. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by binding the parameters to an upstream call: the revision and price must be the exact quoted values from get_company_billing, in the billing currency's minor units, and must never be guessed. That workflow-level coupling is not obvious from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Activate a company ... request human approval for activation') and immediately distinguishes itself from the read-only sibling by requiring a prior get_company_billing review. It also carves out what it is not: archive/restore and annual capacity purchases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use section plus negative guidance ('Never invoke this merely to read, enrich, import or qualify a company') and named alternatives (web panel for archive/restore, separate billing-admin action for capacity). The preconditions — reviewed quote, automation budget — are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_linkedin_conversationManage a LinkedIn conversationADestructiveInspect
Manage one of the user's own LinkedIn conversations. A conversation syncs only while it is linked to a live CRM contact, and a shared contact never shares its messages. To start syncing, prepare_contact takes the displayed expected_revision and expected_connected_at, verifies the one-to-one person's LinkedIn profile and returns a ten-minute preview: plan 'create' saves them as a new contact; plan 'link' uses the contact that already has that exact profile, or the contact_id you choose. When the person cannot be verified, no contact is ever created — only a contact_id you choose can be reviewed, as a link with verified:false and no profile_url. After explicit confirmation of the plan and contact name, call save_contact with id + receipt + confirm:true (plus contact_id for a link); it links the contact, turns sync on, idempotent per receipt. If candidates come back, ask which contact is this person; never choose by name. enable/pause turns future imports on or off (enable needs a linked contact). link_contact changes only the private association; null unlinks and turns sync off. share/revoke changes a current teammate's access to imported messages. remove_history requires confirm:true, pauses imports and removes retained messages and teammate access; previously published CRM notes stay. Every control change requires those displayed revisions. prepare_note (message_id + contact_id + those revisions) returns a ten-minute preview of one shared CRM note; only after explicitly showing and confirming its body, destination and workspace visibility, call save_note with id + receipt + confirm:true (idempotent per receipt). Never infer consent from private message text. These controls never send LinkedIn messages.
When to use: Save or link the contact a private LinkedIn conversation syncs under, turn sync on or off, manage teammate access, or preview and publish one message as a shared CRM note.
Example: Save this person as a contact and sync our LinkedIn conversation.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The LinkedIn conversation id (uuid) from get_context(type='linkedin_conversation'); only the connection owner can act on it. | |
| action | Yes | One of enable, pause, remove_history, link_contact, share, revoke, prepare_note, save_note, prepare_contact or save_contact; pass only the fields that action uses. | |
| confirm | No | Must be true for save_note, save_contact and remove_history, only after the user explicitly confirmed; never infer it from private message text. | |
| receipt | No | The ten-minute preview receipt (uuid) returned by prepare_note or prepare_contact; save_note and save_contact replay idempotently for the same receipt. | |
| contact_id | No | A live workspace contact id: the link target for link_contact (null unlinks), the note destination for prepare_note, or the chosen contact for prepare_contact/save_contact. | |
| grantee_id | No | For share/revoke: the user id of the current workspace member (not yourself) whose access to this conversation's imported messages is granted or removed. | |
| message_id | No | For prepare_note: the id of one imported message in this conversation (from get_context's messages) to publish as a workspace-visible CRM note. | |
| expected_revision | No | The control's `revision` exactly as get_context displayed it (a decimal string); required for every action except save_note/save_contact, and a stale value is a conflict. | |
| expected_connected_at | No | The control's `connected_at` exactly as displayed (ISO timestamp, or null when absent); required alongside expected_revision, and a changed connection is a conflict. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| record | No | |
| contact | No | |
| created | No | |
| message | No | |
| preview | No | |
| updated | No | |
| prepared | No | |
| replayed | No | |
| candidates | No | |
| contact_review | No | |
| linked_contact | No | |
| contact_preview | No | |
| review_conflict | No | |
| contact_required | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring destructive/openWorld/non-idempotent, the description carries substantial extra weight: ten-minute preview expiry, idempotency per receipt, the confirm:true gate, revision/connected_at conflict semantics, the verified:false fallback with no profile_url, and the exact blast radius of remove_history (messages and teammate access removed, published CRM notes retained). That is far more than the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The length is defensible for a ten-action state machine, and purpose plus the 'When to use' line are front-loaded. However, the middle is a single dense run-on paragraph covering all ten actions with no grouping or bullets, which makes the action/precondition mapping harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the annotations cover the safety profile. The description still supplies everything else an agent needs: action inventory, required confirmations, preview/receipt lifecycle, conflict detection, and privacy guardrails ('never infer consent from private message text').
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-parameter workflow meaning the schema cannot express: which fields pair with which prepare/save step, that receipt replay is per-receipt idempotent, and that revisions must match what get_context displayed. It does not re-document individual field types, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names the resource and scope precisely ('manage one of the user's own LinkedIn conversations'), and the body spells out the ten distinct actions (contact linking, sync on/off, teammate access, note publishing). It clarifies the boundary ('These controls never send LinkedIn messages'), though it never names a sibling such as add_note to distinguish note publishing from generic note tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is an explicit 'When to use' clause enumerating the four use cases, plus a concrete example, and the narrative dictates the ordering constraints (prepare_contact before save_contact, explicit confirmation before save). It stops short of naming an alternative tool to use instead when the conversation is not the right target.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_membersManage workspace membersADestructiveInspect
Administer who is in the workspace. action:"list" returns every member (user_id, email, role, joined_at, manager_id, last_active_at) and every pending invite. action:"invite" invites an email address at a role (default member) — an existing member is refused, re-inviting an address renews its invite, and the sign-in email is sent best-effort (email_sent says whether it went). action:"resend_invite" renews a pending invite by invite_id; action:"revoke_invite" withdraws one. action:"set_role" changes a member's role (admin / manager / member / viewer; the last admin can't be demoted), action:"set_manager" sets or clears (null) who a member reports to (no self-reporting, no loops), and action:"remove" drops a member (never yourself, never the last admin; their records stay and the paid seat count follows). Every action but list and revoke_invite needs confirm:true — an invite is a membership at a role, so it previews like a role change: without confirm the call changes nothing and returns a preview naming the person and the exact change. Admin-only. Leaving or switching your OWN workspace stays in the browser: this connection is bound to one membership and cannot act on itself.
When to use: When an admin wants to see who is in the workspace, invite or re-invite someone, withdraw an invite, change a member's role or reporting line, or remove a member — from the conversation instead of Settings → People. Every invite and change to a person asks for confirm:true.
Example: Invite sara@brightside.example as a manager and make Jonas report to her.
| Name | Required | Description | Default |
|---|---|---|---|
| role | No | invite (default member) and set_role: admin, manager, member or viewer. | |
| No | invite: the address to invite (lower-cased and trimmed). | ||
| action | Yes | list, invite, resend_invite, revoke_invite, set_role, set_manager or remove. One of: list | invite | resend_invite | revoke_invite | set_role | set_manager | remove. | |
| confirm | No | invite / resend_invite / set_role / set_manager / remove: true carries the change out; omitted or false returns the preview and changes nothing. | |
| user_id | No | set_role / set_manager / remove: the member's user_id from a list call. | |
| invite_id | No | resend_invite / revoke_invite: the pending invite's id from a list call. | |
| manager_id | No | set_manager: the manager's user_id, or null to clear the reporting line. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| action | No | |
| invite | No | |
| member | No | |
| applied | No | |
| invites | No | |
| members | No | |
| email_sent | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, readOnlyHint=false) by disclosing the confirm:true preview contract, last-admin protection on set_role and remove, no-self-removal, no manager loops/self-reporting, records surviving removal with paid seat count following, best-effort invite email with `email_sent`, and admin-only access. These are exactly the mutation risks an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose before the action-by-action breakdown, and most sentences carry distinct behavioral detail. It is dense and repeats the confirm requirement three times ('Every action but list and revoke_invite needs confirm:true' plus the closing 'Every invite and change to a person asks for confirm:true'), which is mild redundancy in an otherwise efficient structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description even lists the list fields. For a 7-parameter, 7-action admin tool, the when/when-not, confirm contract, and per-action constraints are all present — nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning beyond the schema: it maps which actions require confirm, explains that a preview without confirm names the person and exact change, and clarifies role defaults and null-clearing for manager_id. This cross-action semantics isn't fully captured in the per-field schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Administer who is in the workspace') and then enumerates all seven actions (list, invite, resend_invite, revoke_invite, set_role, set_manager, remove) with their exact effects. An agent can distinguish this from sibling admin tools like manage_company_billing or manage_approvals without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to use' paragraph explicitly covers seeing members, inviting/re-inviting, withdrawing invites, changing roles/reporting lines, and removing — all 'from the conversation instead of Settings → People.' It also states a clear when-not: leaving or switching your OWN workspace stays in the browser because the connection is bound to one membership.
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
Import CSV exports from Salesforce, HubSpot, Attio, or another system as a workspace administrator. describe, preview, status and list use read authority; stage, start and run require write authority; explicit tool policies still apply. Start with describe for enabled destinations/fields; preview requires source, a stable sourceInstance, a batch name, files with sourceObject and source ID column, and explicit mappings/exclusions — it writes no CRM records. After the user reviews exact values and exclusions, stage the same preparation, then start the returned jobId for durable background execution. status or list inspect saved progress and every outcome (rows page with rowOffset/rowLimit, max 200). An identical source identity/payload is skipped; changed identities and email/domain collisions need manual resolution — never merge by name. Preserve relationships through referenceObject source IDs and explicitly map owners, stages, currencies, and amount units (money defaults to integer minor units; multiselect to JSON-array strings). Limits: 5000 rows, 2000000 CSV bytes, 3900000 request bytes, 5242880 normalized bytes; reuse the SAME sourceInstance later. run (legacy) advances at most 25 rows synchronously; start retries unsuccessful rows after an execution finishes; replay never duplicates an imported source identity. Per-record approval requirements block this importer, so resolve them first. Historical imports emit no automation events and start no enrichment; custom objects, workflows, attachments and unavailable source history need separate scoping. camelCase keys also accept snake_case aliases (source_instance, job_id, row_offset, row_limit; source_object, id_column on files; object_type, ignored_columns, reference_object, value_map, amount_unit in mappings); outputs are unchanged.
When to use: An administrator imports a Salesforce, HubSpot, Attio or CSV export with explicit mappings and resumable progress.
Example: Help me move our CRM data to Capable.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | A human-readable name for this import batch (1–120 characters), shown on the staged job and in list/status. | |
| files | No | Up to 20 exports as {name, sourceObject, csv, idColumn?}: csv is the raw CSV text with a header row; idColumn names the stable source-id column (auto-detected when omitted). | |
| jobId | No | The job id (uuid) returned by stage, list or status; required for start, run and status. | |
| action | Yes | describe (destinations/fields), preview (validate, no writes), stage (save a batch), start (background execution), run (≤25 rows now), status (one job, paged), list (all jobs). | |
| job_id | No | Alias of jobId. | |
| source | No | The exporting system — salesforce, hubspot, attio or csv; it selects the id-column and column-name conventions used to read the files. | |
| mappings | No | One per sourceObject: {sourceObject, objectType, fields: {column: {field, referenceObject?, valueMap?, amountUnit?}}, ignoredColumns, defaults?}; every column is mapped or ignored. | |
| rowLimit | No | For status: job rows per page (1–200, default 100). | |
| rowOffset | No | For status: job rows to skip (0–5000, default 0); advance by the returned rows.length while hasMoreRows is true. | |
| row_limit | No | Alias of rowLimit. | |
| row_offset | No | Alias of rowOffset. | |
| sourceInstance | No | A stable label for the customer's source CRM instance (1–200 chars); reuse the same value for every later export so source ids resolve to the same records. | |
| source_instance | No | Alias of sourceInstance. |
Output Schema
| Name | Required | Description |
|---|---|---|
| job | No | |
| jobs | No | |
| note | No | |
| error | No | |
| applied | No | |
| preview | No | |
| destinations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/destructive/idempotent/openWorld hints; the description adds far more: read-vs-write authority per action, hard limits (5000 rows, byte caps), skip-on-identical-identity and no-duplicate replay semantics, manual collision resolution, and that historical imports emit no automation events or enrichment. This is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the workflow, but the body is a dense semicolon-heavy block that restates some schema-level alias and enum detail. Given 7 actions and 13 parameters the length is partly justified, yet structure and readability suffer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation; the description still covers auth, limits, idempotency, ordering, caveats and alias handling. Nothing an agent needs to invoke it correctly appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: snake_case aliases for camelCase keys, money defaulting to integer minor units, multiselect serialized as JSON-array strings, and page-size behavior. These go beyond what the field descriptions state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (import) and resource (CRM CSV exports) with named sources (Salesforce, HubSpot, Attio, csv) and the administrator persona. No sibling tool does bulk import, so it is easily distinguished from create_record, commit_reviewed_updates, etc.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit 'When to use' line plus the full ordered workflow (describe → preview → stage → start, with status/list for inspection and run as legacy). It also names the conditions that block use (per-record approvals, custom objects, workflows, attachments) so the agent knows when NOT to reach for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_meetingPropose meetingAInspect
Create the meeting: places one tentative, opaque hold per (slot × host) on the host's calendar — reversible, invisible to the invitee, auto-released on expiry — and STAGES the invitee's pick-a-time email. This tool itself NEVER emails anyone. BEFORE calling, topic AND agenda MUST be confirmed with the user in chat (ONE confirmation: "Good to go, or want to tweak?") — the invitee reads both on the invite they receive after picking. Keep names OUT of the topic ("Intro call", not "Call with Sarah"); write the agenda in second person to the invitee. slots: exactly 3, passed back verbatim from find_times (opaque ISO identifiers — never reformat them); pass deliberately busy slots' starts_at in busy_override_starts so they are kept. co_host_emails is for WORKSPACE MEMBERS only (holds land on their calendars too); the invitee goes in invitee_email, CCs in additional_invitee_emails; a non-member matching a known contact is dropped (dropped_co_hosts) — relay it. Link account_id / contact_id / opportunity_id when known (resolve via search first; never invent ids). AFTER calling: it returns the meeting's full state, picker_url and staged_invite_preview. The user's go-ahead on the content was already the authorization to send, so in the SAME turn call send_meeting_invite — do NOT ask a second time and do NOT treat staging as a separate approval gate. Withhold the send ONLY if the user explicitly said to hold it (then show staged_invite_preview and wait) or in shareable mode (no invitee_email — hand over picker_url). Never send without a clear human go. Full choreography and signed_in_as: capable://guide/scheduling.
When to use: After find_times, once the user has okayed the topic + agenda. Holds land on every host's calendar and the invite is staged; the content okay is the go-ahead, so call send_meeting_invite in the same turn unless the user said to hold it.
Example: Set up the meeting with those three times — topic and agenda as we agreed.
| Name | Required | Description | Default |
|---|---|---|---|
| slots | Yes | Exactly 3 slots, byte-identical from find_times output. | |
| topic | Yes | Short subject — becomes the calendar invite title and the picker heading. E.g. "Intro call", "Portfolio review", "Partnership next steps". No participant names. | |
| agenda | Yes | Goes into the calendar event description; the invitee reads it. Second person, 2–4 sentences, no invitee name. | |
| account_id | No | Link the meeting to an account in your workspace. | |
| contact_id | No | Link the meeting to a contact (usually the invitee). | |
| window_end | No | Forward the window_end you gave find_times (ISO 8601) — stored with window_start as the meeting's search window for reschedule context. | |
| duration_min | Yes | Meeting duration in minutes — must match the find_times call. | |
| invitee_name | Yes | Primary invitee's full name. | |
| window_start | No | Forward the window_start you gave find_times (reschedule context). | |
| invitee_email | No | Primary invitee's email. OMIT for shareable mode — the picker URL comes back for the user to share manually, and the invitee enters their email when they pick. | |
| co_host_emails | No | WORKSPACE MEMBERS who co-host: holds land on their calendars too, and the confirmed event includes them. WORKSPACE MEMBERS ONLY — never the external invitee (the invitee goes in invitee_email / additional_invitee_emails, not here). A non-member address that matches a known workspace contact is dropped and the meeting is created without it. | |
| opportunity_id | No | Link the meeting to an opportunity. | |
| invitee_company | No | Primary invitee's company name, stored on the meeting; it appears in the host's booked notification and is matched by meeting search. | |
| expiration_hours | No | Hours before the held times auto-release if the invitee doesn't pick. Defaults to the host's saved default. | |
| busy_override_starts | No | ISO `starts_at` values (from `slots`) that the host DELIBERATELY chose over a busy time on their (or a co-host's) calendar — the find_times card flags these with `busy_override` after the host drops a slot onto a visible busy band. Pass them here ONLY after you've given the user a heads-up (a light note for the host's own busy; a STRONGER one — "only if you've cleared it with them" — for a co-host's). A start in this list is kept-while-busy (its hold is placed and honored at the invitee's confirm); a busy slot NOT in this list is a race and is dropped. Omit when no slot overrides a busy time. | |
| additional_invitee_emails | No | Secondary invitees — CC'd on the picker email and added to the calendar event; only the primary invitee picks. Requires invitee_email. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| slots | No | |
| meeting | No | |
| guidance | No | |
| proposed | No | |
| timed_out | No | |
| picker_url | No | |
| signed_in_as | No | |
| dropped_slots | No | |
| repairs_flagged | No | |
| dropped_co_hosts | No | |
| staged_invite_preview | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this non-readOnly, non-idempotent, open-world, non-destructive, but the description adds substantially beyond them: holds are tentative/opaque/reversible/auto-released on expiry, "this tool itself NEVER emails anyone," the drop-and-relay edge case for non-member co-hosts, and the authorization semantics (the content okay IS the go-ahead). Rich, non-redundant behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long for a description, but front-loaded with the highest-value facts (holds, never-emails, authorization) and each paragraph encodes a distinct rule rather than filler. The separate "When to use" block partially restates the opening, which is the main redundancy cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 16-parameter, multi-step scheduling tool the description covers sequencing (find_times → propose → same-turn send), edge cases (shareable mode, hold-it case, dropped co-hosts), and authorization. Output schema exists, so return values need not be described — the completeness bar is met.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents most parameters in detail; much of the description's param text (names out of topic, second-person agenda, workspace-members-only co-hosts, byte-identical slots) duplicates it. The additive value is the workflow guidance not in the schema: relay dropped_co_hosts, resolve ids via search first / never invent them, and the busy_override heads-up protocol.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Create the meeting") and immediately qualifies scope: places tentative, opaque, reversible holds per (slot × host) and STAGES the invitee's pick-a-time email. This clearly distinguishes it from find_times (upstream) and send_meeting_invite (the separate send step), which it explicitly warns never happens here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: "After find_times, once the user has okayed the topic + agenda." Gives the when-not/alternative path too: withhold the send only if the user said to hold it or in shareable mode. Nothing is left to inference, and the mandatory confirmation gate is spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
propose_updatesPropose updatesARead-onlyInspect
Flagship source-to-updates flow. Pass ANY source text — a transcript, an email, notes, or a freeform request describing changes — and get context to reason over: matched accounts/contacts/opportunities, the active workspace schema, and recent history for each matched record. USE THE CONTEXT to assemble ATOMIC proposed updates, then call review_proposed_updates with ALL of them for field-by-field approval (it returns a review receipt); after the user chooses, call commit_reviewed_updates with that receipt and only the selected proposal IDs. matched_entities ALREADY resolves the people/companies/deals in the source (with ids, state and recent history) — reference those ids directly; do NOT call get_context or the search_* tools to re-find records you already have here. Ignore junk candidate names (filler words, roles, the rep/vendor). When the source came from a STORED touch (a recorded meeting's transcript or a logged call read from Capable), ALSO pass source_touch_id: the touch's own linked account/contact/opportunity are pinned into matched_entities (pinned:true) and are the authoritative subject — trust them over name-matched rows when the two disagree, and use source_touch.participants' captured emails/names, never the transcript's spellings, when proposing new contacts. Do NOT call write tools yourself: that skips the user's approval. Never invent ids. For lowercase names or scripts without capitalization, supply candidate_names copied from the source. Entity matching is heuristic; entity_resolution reports unresolved and ambiguous candidates — resolve ambiguity before proposing a write. text may be omitted when source_touch_id names a touch with a stored transcript (returned in full as source_touch.transcript).
When to use: After any meaningful conversation, email, or note about a relationship. Pass the text in text.
Example: [paste a call transcript, email, or notes and ask] Pull out anything that needs to be updated in the CRM.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Any source text: a transcript, an email, meeting notes, or a freeform request. | |
| transcript | No | Deprecated alias for `text`, kept for the old transcript-only signature; used only when `text` is omitted — prefer `text`. | |
| source_type | No | What the source text is (transcript, email, note, request, other); defaults to transcript and is echoed back as source_type. | |
| candidate_names | No | Entity names copied from the source, especially lowercase or uncased-script names. These are match candidates, not authoritative identities; names absent from the source are ignored. | |
| source_touch_id | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| guidance | No | |
| workspace | No | |
| source_type | No | |
| source_touch | No | |
| source_length | No | |
| recent_history | No | |
| source_excerpt | No | |
| matched_entities | No | |
| entity_resolution | No | |
| matched_account_states | No | |
| extracted_candidate_names | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description reinforces and extends this: proposing is the read-only step, writes are gated behind review/commit. It discloses non-obvious behavior beyond annotations — that matched_entities already resolves and includes ids/state/history, that source_touch_id pins authoritative records (pinned:true) which should override name-matched rows, and that entity matching is heuristic with unresolved/ambiguous candidates reported by entity_resolution.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded with the core purpose and the workflow sequence, and most sentences carry distinct operational information (precedence rules, don't-re-find warnings, deprecation of the transcript alias). However it is a dense wall of text with heavy capitalization emphasis that could be tightened without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description still covers the full flow, downstream handoffs, edge cases (stored-touch transcripts, ungrounded ids), and the distinction between this tool and the write tools. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds genuine meaning beyond the schema: it explains source_touch_id's pinning/precedence semantics, why candidate_names should be supplied for lowercase/uncased-script names, and that text may be omitted when source_touch_id names a touch with a stored transcript (returned as source_touch.transcript).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource and scope up front: a 'source-to-updates flow' that takes ANY source text and returns reasoning context (matched accounts/contacts/opportunities, workspace schema, recent history). It clearly distinguishes itself from siblings review_proposed_updates, commit_reviewed_updates, get_context, and the search_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('After any meaningful conversation, email, or note about a relationship'), plus explicit when-not and alternatives: do NOT call get_context or search_* to re-find records already resolved, and do NOT call write tools yourself. It names the downstream sequence (review_proposed_updates with ALL proposals, then commit_reviewed_updates with the receipt and selected IDs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_meetingRecord meetingADestructiveInspect
Send the Capable notetaker bot to a video call. Pass meeting_url to start recording a call happening now, or match to find the rep's next upcoming calendar meeting by title/attendee and schedule the bot to join it. With neither, schedules the very next upcoming meeting that has a join link. The transcript auto-files onto the matching account/contact/opportunity when ready. The workspace admin must have Meeting recorder enabled; otherwise this refuses without scheduling or dispatching a bot.
When to use: Ad-hoc recording. Auto-record handles scheduled meetings on its own; use this to grab a live call by URL or book the user's next meeting with a specific customer.
Example: Record my next call with Acme.
| Name | Required | Description | Default |
|---|---|---|---|
| match | No | Case-insensitive text matched against the title, attendee emails or names of the rep's join-link meetings in the next 24 hours; the first match is booked. | |
| meeting_url | No | Join URL of a call happening now (Zoom, Google Meet, Teams or Webex) — the bot is sent to it immediately as an ad-hoc recording. |
Output Schema
| Name | Required | Description |
|---|---|---|
| recording | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, openWorldHint=true and idempotentHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: the transcript auto-files onto the matching account/contact/opportunity, and the tool refuses to schedule or dispatch if the workspace admin hasn't enabled Meeting recorder. It doesn't say whether a recording can be undone or what the bot does on failure, hence not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then covers inputs, side effects and the admin prerequisite, then closes with a short 'When to use' block and example. Every sentence carries information (mode selection, prerequisite, auto-filing) with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. The description covers the gate (Meeting recorder enabled), the side effect (transcript auto-filing), the three invocation modes and when to prefer ad-hoc over auto-record, which is everything an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds precedence semantics the schema does not: meeting_url takes a call happening now, match books the first matching join-link meeting in the next 24 hours, and supplying neither schedules the very next join-link meeting. That mode-selection logic is real added meaning over the per-parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('Send the Capable notetaker bot to a video call' / record a meeting) and clearly separates itself from adjacent siblings like stop_recording, propose_meeting and send_meeting_invite by describing dispatching a bot to a live or upcoming call. The purpose is unambiguous without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the routing condition: use for ad-hoc recording, auto-record covers scheduled meetings, and it explains the three input modes (meeting_url for a live call, match for a specific upcoming meeting, neither for the next meeting with a join link). It names the alternative mechanism (Auto-record) and gives a concrete example.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_account_contactUnlink contact from accountADestructiveInspect
Unlink a contact from an account (the contact and the account themselves are kept). Hard-deletes the M2M row — there's no historical value to preserving an ended role. DESTRUCTIVE: confirm with the user first, then call again with confirm: true.
When to use: When someone leaves the company or their role ends.
Example: Remove Mark from the Acme contact list — he's left the company.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Boolean (true/false). | |
| account_id | Yes | A uuid. | |
| contact_id | Yes | A uuid. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| removed | No | |
| account_id | No | |
| contact_id | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds materially: it is a hard delete with no undo/history, the linked entities survive, and critically it documents the two-step confirmation flow ('call again with confirm: true'). That confirmation protocol is not derivable from the annotations or schema and prevents an agent from firing a destructive call without user sign-off.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the destructive warning and the confirm protocol, then when-to-use, then an example. Every element is useful, though the example sentence partially restates the 'when to use' rationale rather than adding new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained; the description covers purpose, destructive semantics, the confirmation handshake, and usage timing. Nothing an agent needs to invoke this safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and account_id/contact_id are self-evident uuids, so baseline is 3. The description adds real meaning on the confirm parameter, explaining it is a two-phase safety gate rather than a plain boolean, which the schema's 'Boolean (true/false)' line does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Unlink a contact from an account') and immediately disambiguates scope: the contact and account records themselves are kept, only the M2M row goes. An agent can distinguish it from add_account_contact and from delete_record without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'When to use' line gives the triggering condition (someone leaves the company or their role ends) plus a concrete example. It does not explicitly name the alternative tool for the inverse/replacement case, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renew_subscriptionRenew subscriptionADestructiveInspect
Renew a subscription: advance current_term_started_at and current_term_ends_at forward by one billing cadence (or accept explicit dates), optionally update mrr_cents/seats/plan_name (for renewals with uplift). Writes a subscription_events row of type 'renewed'. Link to the closed-won renewal opportunity_id when available.
When to use: On close-win of a renewal opp. Handles term-date math by cadence.
Example: Renew Acme's Pro Annual subscription for another 12 months at the same MRR.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A uuid. | |
| notes | No | Free-text note stored on the 'renewed' subscription_events row (e.g. uplift terms); not written to the subscription itself. | |
| new_seats | No | Seat count after the renewal — omit to keep the current seats, or pass null to clear them; the 'renewed' event records the resulting seats. | |
| new_mrr_cents | No | An integer ≥ 0. | |
| new_plan_name | No | Plan name after the renewal (e.g. a tier change); omitted keeps the subscription's current plan_name. | |
| opportunity_id | No | A uuid. | |
| new_current_term_ends_at | No | Must match /^\d{4}-\d{2}-\d{2}$/. | |
| new_current_term_started_at | No | Must match /^\d{4}-\d{2}-\d{2}$/. |
Output Schema
| Name | Required | Description |
|---|---|---|
| account | No | |
| subscription | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: it writes a subscription_events row of type 'renewed', performs cadence-based term-date math, and notes the free-text note lands on the event row and not the subscription. It stops short of mentioning auth/permission requirements or failure modes, so a 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is front-loaded and broken into three short, purposeful parts (what it does, when to use, a concrete example). The example sentence is genuinely useful for an agent but slightly lengthens the definition, so it lands just below the tightest possible phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description covers purpose, trigger, term math, and param rationale. It omits edge cases such as what happens on an already-renewed or cancelled subscription, leaving a minor gap for a mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3. The description adds semantic rationale the schema lacks — that optional mrr_cents/seats/plan_name updates exist 'for renewals with uplift' and that opportunity_id should be linked 'when available' — which helps the agent decide whether to populate optional fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Renew a subscription') and immediately scopes the operation: advancing term dates by one cadence, optionally updating MRR/seats/plan, and writing a 'renewed' subscription_events row. This is specific enough that an agent can distinguish it from sibling cancel_subscription without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger ('When to use: On close-win of a renewal opp') and clarifies that term-date math is handled automatically by cadence. It does not name or contrast a competing sibling tool (e.g. cancel_subscription), so it stops short of full when-not/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reschedule_meetingReschedule meetingADestructiveIdempotentInspect
Move an ALREADY-CONFIRMED (booked) meeting to a new time, in place. The existing calendar event is patched to the new time — SAME event, SAME video call link, SAME attendees, same calendar invite (no new invite, no new link). The invitee gets a "your meeting moved to {new time}" email. This is the answer to "move my 2pm to Thursday" / "push the Acme call an hour."
Use this ONLY for a confirmed meeting. For a meeting still awaiting the invitee's pick (not yet booked), there's nothing to move — cancel it and propose new times instead (the tool returns a clear not_confirmed error in that case).
new_start is an ISO 8601 instant. Get a valid time from find_times first when you need to check the host's calendar — but you can also pass a specific time the user named. Duration is preserved from the current booking unless you pass new_duration_min. The new time is freebusy-checked against every host (the move is refused if a host is busy then); the host's own saved workday / buffers / minimum-notice are NOT re-applied — the host is the authority over their own meeting.
Confirm the new time with the user before calling (it edits a live calendar event and emails the invitee). Returns the meeting's full state + the new when-label + the video call link. Reschedule is host-driven only; the invitee doesn't re-pick.
When to use: Move an already-booked meeting to a new time without re-doing anything. The same calendar event is edited in place — same video call link, same attendees, same invite — and the invitee gets a "moved to {new time}" note. Only for confirmed meetings; for one still awaiting a pick, cancel and propose again instead. The new time is freebusy-checked against every host.
Example: Move my 2pm with Sara to Thursday at the same time.
| Name | Required | Description | Default |
|---|---|---|---|
| new_start | Yes | ISO 8601 start of the new time (e.g. a find_times slot's starts_at, or a specific time the user named). Must be in the future and different from the current start. | |
| meeting_id | Yes | The confirmed meeting's id, from search_records or get_record. | |
| new_duration_min | No | Optional new duration in minutes. Omit to keep the meeting's current length. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | |
| note | No | |
| slots | No | |
| meeting | No | |
| guidance | No | |
| meet_link | No | |
| timed_out | No | |
| meeting_id | No | |
| rescheduled | No | |
| new_when_label | No | |
| co_host_repair_needed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations: discloses that the same event/link/invite is preserved, that an invitee email is sent, that the new time is freebusy-checked against every host and refused if busy, that host workday/buffers/min-notice are NOT re-applied, and that the user should confirm first since it edits a live event. This gives an agent the full mutation side-effect picture consistent with destructiveHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and readable, but the closing 'When to use' block largely duplicates the opening paragraphs (same-event-in-place, invitee note, confirmed-only, freebusy check), so a meaningful chunk of text does not earn its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with an output schema, the description covers everything an agent needs: preconditions, side effects, validation behavior, and the routing decision versus siblings. Nothing relevant is left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: new_start is an ISO 8601 instant obtainable from find_times or a user-named time, and duration is preserved unless new_duration_min is passed. It doesn't restate the schema, it enriches the decision logic around the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Move an ALREADY-CONFIRMED (booked) meeting to a new time, in place', and immediately clarifies it patches the SAME event with the SAME link and attendees. This distinguishes it cleanly from cancel_meeting, propose_meeting, and find_times.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this ONLY for a confirmed meeting' and names the correct alternative path for unconfirmed meetings ('cancel it and propose new times instead'), plus the not_confirmed error behavior. It even supplies trigger phrasing ('move my 2pm to Thursday').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_recordRestore recordADestructiveIdempotentInspect
Bring back a soft-deleted contact or account by object_type + id — the undo of delete_record. A contact returns with its account links and its touch / note / task history intact (delete retains them); an account returns with its contacts, opportunities, subscriptions, touches, notes and tasks linked again (they kept their account_id). Only contact and account are restorable: the other objects have no undo (re-create them). Find a deleted record with get_record(include_archived:true) or the delete result's id. A record that is not deleted, or an id that names nothing in this workspace, is refused with the reason and nothing changes. Returns the restored record's full state with restored:true.
When to use: Undo a delete: bring back a soft-deleted contact (its account links and history come back with it) or account (its records link up again). Only these two objects restore; the same scope as delete_record decides who may.
Example: Restore the contact I deleted by mistake.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The deleted record's id — a uuid from the delete result or a get_record read with include_archived. A uuid. | |
| object_type | Yes | Which kind of deleted record to bring back: contact or account. One of: contact | account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | No | |
| restored | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation/safety profile (destructiveHint, idempotentHint, readOnlyHint=false); the description goes well beyond by disclosing the exact side effects (account links and touch/note/task history return intact because delete retains them; contacts/opportunities/subscriptions re-link via retained account_id), the refusal path for non-deleted or unknown ids ('refused with the reason and nothing changes'), and the auth scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and well-sectioned, but the 'When to use' paragraph substantially restates the opening paragraph (restorable objects, undo semantics), which is mild redundancy rather than waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return-shape detail is not required; the description nonetheless names the restored:true marker. With error semantics, side effects, id source, object restriction and permission scope all covered, nothing material is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, including that object_type is one of contact|account and that id is a uuid. The description reinforces the id source (delete result or get_record with include_archived) but adds no new syntax or format detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ('bring back a soft-deleted contact or account') and positions itself explicitly as 'the undo of delete_record', which cleanly separates it from delete_record, get_record and create_record in the sibling list. Scope is bounded to two object types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('Undo a delete'), names when NOT to use it ('the other objects have no undo (re-create them)'), and routes the agent to the prerequisite tool ('Find a deleted record with get_record(include_archived:true)'). It also states the permission scope is the same as delete_record.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_proposed_updatesReview proposed updatesARead-onlyInspect
Present atomic proposed CRM updates for field-by-field approval. Pass the proposals you generated; each commit.tool must be an allowlisted write tool and commit.args must match that tool's input schema. Record creates/updates go through the GENERIC verbs — create_record takes { object_type, data: { …fields } }; update_record takes { object_type, id, patch: { …fields } } with id the resolved record UUID from your matches; the activity/domain verbs take flat args. It validates each proposal independently and, on hosts that render cards, shows the same field-by-field review as a card; invalid rows are flagged. It commits NOTHING itself: it returns server-generated proposal IDs plus a short-lived receipt, and after explicit selection you call commit_reviewed_updates once with that unchanged receipt. A proposal can link only to a record that already exists: when a batch creates a new parent (an account or contact), review and commit those creates first, then propose the rows that link to them in a second review using the ids commit_reviewed_updates returns. Retire a converted lead in that review only when it references nothing created there, such as a new opportunity; otherwise in a third review once those ids exist, since a retired lead can't be edited. Too large to seal? Split it into smaller reviews. The card DISPLAYS each row from commit.args (the fields that will actually be written), so args must carry everything the user should see; target, title and field_changes are legacy presentation hints only. When the changes come from a stored conversation, carry its source_touch_id into this review.
When to use: Right after propose_updates, or whenever you've assembled atomic updates from a prompt: pass the proposals (each with the write tool + args to commit it) to validate them and receive a short-lived review receipt. Commits nothing itself.
Example: Show me those changes as a card so I can approve the ones I want.
| Name | Required | Description | Default |
|---|---|---|---|
| proposals | Yes | 1–50 atomic proposals, each {confidence 0–1, commit:{tool, args}} plus optional rationale and field_changes; kind, title and target are optional presentation hints derived from commit.tool/args when omitted. commit.args is exactly what gets written. | |
| source_touch_id | No | Stored conversation used to derive this batch. Preserve the source_touch_id returned by propose_updates. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | No | |
| receipt | No | |
| warnings | No | |
| proposals | No | |
| review_id | No | |
| expires_at | No | |
| valid_count | No | |
| invalid_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/destructive/openWorld, and the description adds real value beyond them: validation is independent per row, invalid rows are flagged, a short-lived receipt is returned, and the allowlist constraint on commit.tool is stated. It does not address rate limits or the exact error surface, so it falls short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and a labeled "When to use" and "Example", but the middle paragraph is dense and packs workflow edge cases together; "It commits NOTHING itself" is effectively repeated in the when-to-use section, which is mild redundancy rather than waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's workflow complexity and an existing output schema (which covers the return/receipt), the description covers the tricky sequencing (create-before-link, lead retirement, batch splitting) and validation behavior thoroughly. Minor gaps remain around error handling, but nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description goes further by explaining commit.args semantics that the schema leaves as open objects: create_record/update_record generic verb arg shapes ({object_type, data}/{object_type, id, patch}), the resolved-UUID requirement for id, and carrying source_touch_id from propose_updates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Present atomic proposed CRM updates for field-by-field approval") and immediately distinguishes itself from siblings, notably commit_reviewed_updates via "It commits NOTHING itself" and propose_updates via the when-to-use context. An agent can route to this tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit "When to use: Right after propose_updates, or whenever you've assembled atomic updates from a prompt" plus a detailed ordering protocol (creates first, then link-rows in a second review, retirement in a third, split large batches). The alternative commit_reviewed_updates is named with the condition (after explicit selection, with the unchanged receipt).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_reportRun reportARead-onlyInspect
Preview an ANALYSIS or dashboard and return its rows or grouped aggregates: counts, sums, averages, grouping, trends, charts, or a multi-column table the user may want to keep as a View. For a plain LIST of records (open tasks, deals in a stage) call search_records with filters instead — lighter, exact-value, and it never refuses a spec. Pass report_id for a saved analysis/dashboard, or definition for an inline ReportSpec (object + columns + filters + group_by + aggregations; omit viz and the best fit is derived) or a composition (kind:"composition" — each panel has EITHER an inline spec OR source_view_id). A living window is an in_period filter from the closed set (today … this_quarter, overdue, upcoming) — never an invented period name; a fixed window uses gte/lt on the date field. Money comes back in minor units with no manual FX applied; never label a raw or mixed-currency aggregate as a converted total. run_report only PREVIEWS — it never saves. To keep one, the user clicks "Save as view" on the card, or you call create_record with object_type:"report" and data:{name,definition}; never tell the user a View is saved until a save has succeeded. Zero rows is an empty result — say so. When the user is REFINING an analysis or dashboard they already saved, pass its id as source_view_id with the refined definition so the save lands OVER the existing item instead of a twin. E.g. touches by type: {object:"touch",group_by:{ref:{kind:"field",field:"type"}},aggregations:[{fn:"count",alias:"n"}]}. For the full authoring guide (viz recipes, filter logic, related_filters, matrices, rates, dashboards, dashboard filters) read capable://guide/reports.
When to use: Counts, sums, grouping, trends, charts or a keepable table over workspace data; a plain list of records (open tasks, deals in a stage) is search_records. It previews only — nothing is saved until the user saves it or you create_record(report).
Example: Report total ARR by industry for current customers.
| Name | Required | Description | Default |
|---|---|---|---|
| report_id | No | A saved analysis or dashboard's id (uuid), run with its stored definition; give this or definition — report_id wins when both are passed. | |
| definition | No | An inline ReportSpec (object, columns, filters, group_by, aggregations, viz) or a composition (dashboard) to preview; omit when passing report_id. | |
| source_view_id | No | Id (uuid) of the saved View this inline definition refines, so a save updates it in place instead of creating a twin; ignored with report_id. | |
| suggested_name | No | A name to seed the card's "Save as view" button, echoed as suggested_name; only meaningful with an inline definition (this call saves nothing). |
Output Schema
| Name | Required | Description |
|---|---|---|
| viz | No | |
| kind | No | |
| mode | No | |
| note | No | |
| rows | No | |
| spec | No | |
| empty | No | |
| title | No | |
| deltas | No | |
| layout | No | |
| object | No | |
| period | No | |
| columns | No | |
| widgets | No | |
| group_ref | No | |
| row_count | No | |
| truncated | No | |
| board_group | No | |
| aggregations | No | |
| group_bucket | No | |
| source_view_id | No | |
| suggested_name | No | |
| group_ref_secondary | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond annotations: it only PREVIEWS and never saves, zero rows is an empty result, money returns in minor units with no FX applied, and the save-over-twin behavior with source_view_id. These are behavioral traits the readOnlyHint annotation does not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: purpose and the search_records alternative come first, then parameter guidance, then the save caveat. Some sentences (e.g. the money/FX and the create_record save recipe) are long, but each earns its place by preventing a specific failure mode.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 4-param, 0-required, deeply nested schema and an output schema, the description covers the selection decision, both input modes, the preview-only contract, the save path, refining-saved-items, and points to a guide URI for the rest. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds real meaning: report_id vs definition precedence, the inline ReportSpec shape (object+columns+filters+group_by+aggregations, viz optional), the in_period closed period set, and source_view_id refinement semantics. Goes beyond the schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Preview) and resource (analysis/dashboard, rows or grouped aggregates), and explicitly distinguishes itself from search_records by routing plain lists there. An agent can tell this apart from search_records and create_record without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use vs the sibling: 'For a plain LIST of records ... call search_records with filters instead — lighter, exact-value, and it never refuses a spec.' Also covers refinement flow via source_view_id and the save path. Alternatives and exclusions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
schedule_reportSchedule reportADestructiveIdempotentInspect
Schedule one saved analysis to be emailed as a digest (CSV attached) to workspace members (a dashboard cannot be scheduled; choose or save one panel as an analysis first) on a daily / weekly / monthly cadence (UTC). One schedule per report — calling again updates it (every field is replaced, so re-pass conditions/recipients to keep them). day_of_week (0=Sun) applies to weekly; day_of_month (1-28) to monthly. Recipients default to you. Returns the schedule. CONDITIONS (email only when it's worth it): pass conditions to hold the digest unless the data warrants sending — an array (≤5) of { target, op, value }. target is "row_count" (the number of rows) or one of the report's aggregation aliases; op is one of gt|gte|lt|lte|eq|neq; value is a number. The digest sends when ANY condition is met, evaluated against that run's result (mode "any"); otherwise it's silently skipped that occurrence. E.g. email a "tasks overdue" report only when there are any: [{ target:"row_count", op:"gt", value:0 }]; or an aggregated report only when a measure alias "overdue_count" clears a threshold: [{ target:"overdue_count", op:"gte", value:5 }]. Omit conditions (or pass none) to always send — today's behavior.
When to use: Deliver one saved analysis on a schedule — 'email me this every Monday'. For a dashboard, choose or save one panel as an analysis first. Recipients are workspace members.
Example: Email the pipeline report to the sales team every Monday at 8am.
| Name | Required | Description | Default |
|---|---|---|---|
| hour | No | Hour of day to send, 0–23 in UTC (default 8). | |
| enabled | No | Whether the schedule is active (default true); pass false to keep the schedule but stop sending. | |
| frequency | Yes | Cadence of the digest: daily, weekly (with day_of_week) or monthly (with day_of_month); every run fires at `hour` UTC. | |
| report_id | Yes | The saved analysis to schedule, by id (uuid); one schedule per report, so calling again replaces it. Dashboards and segments are refused. | |
| conditions | No | Up to 5 {target, op, value} send conditions — target is "row_count" or an aggregation alias, op is gt|gte|lt|lte|eq|neq, value a number; omit to always send. | |
| recipients | No | Workspace member user ids (uuids) to email; defaults to just you, and any id that is not a member is refused. | |
| day_of_week | No | Weekly only: day to send, 0=Sunday … 6=Saturday; defaults to Monday when omitted. Ignored for daily and monthly. | |
| day_of_month | No | Monthly only: day to send, 1–28 (so every month has it); defaults to the 1st when omitted. Ignored for daily and weekly. |
Output Schema
| Name | Required | Description |
|---|---|---|
| schedule | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses the upsert/full-replacement semantics ('calling again updates it — every field is replaced, so re-pass conditions/recipients'), silent-skip behavior when conditions are unmet, refusal of non-member ids, all times in UTC, and that recipients default to the caller. This is exactly the context needed given destructiveHint=true plus idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every block earns its place, but the conditions logic is explained at length in prose and then restated in the schema, and the parenthetical asides accumulate. Slightly heavy, still navigable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter scheduling mutation with an output schema present, the description covers cadence/UTC behavior, replacement semantics, recipient restrictions, condition evaluation, and defaults. Return values need not be described since the output schema exists ('Returns the schedule' suffices).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 100% schema coverage, the description adds meaning the schema cannot: ANY-of-N condition semantics ('mode any'), that conditions are evaluated against that run's result, that target may be 'row_count' or a report aggregation alias, that day_of_week is 0=Sun and weekly-only, and worked examples for both condition forms.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb + resource (schedule one saved analysis for emailed digest) and immediately scopes it against the sibling notion of reports: dashboards cannot be scheduled, segments are refused. One schedule per report and the CSV-attachment behavior let an agent distinguish this from run_report/export_report without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to use' block gives a clear trigger ('email me this every Monday'), an explicit exclusion (dashboards; choose or save a panel as an analysis first), and a constraint (recipients must be workspace members). It does not name the sibling tools an agent might otherwise reach for (run_report, export_report), so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_recordsSearch recordsARead-onlyInspect
List/filter records of any object type. The right tool for a plain LIST — open tasks, deals in a stage, tasks for one person, contacts at an account — before run_report (counts, sums, grouping, trends, charts). Pass object_type and optional filters (field key → exact value; relationship fields filter by target id; e.g. object_type:"task" with filters:{status:"open"}, object_type:"opportunity" with filters:{stage:"proposal", open_only:true}). Optional free-text query searches by NAME/text on the built-in objects that support it (account, contact, opportunity, lead, task, touch, meeting); for activity (object_type:"touch") it ALSO searches stored EMAIL CONTENT and PARTICIPANT addresses (sender/recipient, attendees), so "sally@acme.com", "kayode" or "acme.com" finds the activity that reached that person. Keyset-paginated, default 20 rows (limit 1–100): pass next_cursor back as cursor. Order varies by object — most newest first, tasks by due date ascending (undated last). Every object type answers in ONE shape: the rows are the top-level records array beside count, object_type, next_cursor, has_more and search_coverage (a built-in object's nested result is retained one release, same rows). Works for custom AND built-in objects (routing to the typed search — its filter keys apply; query is ignored, with a note, where unsupported). For deals of a given TYPE use object_type:"opportunity" with filters:{type:"renewal", open_only:true}; the type as object_type (e.g. "renewal") auto-routes there. Opportunity rows carry each account's reply-recency (account_last_inbound_at / account_last_touch_at), so 'open renewals with no reply in N days' is one call. Unknown or unsupported filter keys/values are IGNORED (echoed in ignored_filters + a note) with search_coverage.status='unsupported_query': those rows DO NOT answer the original query — correct the inputs before claiming matches or none. search_coverage also distinguishes a complete result from one page; follow every next_cursor for an exhaustive answer. An unknown object_type returns the valid types. Unified work queue: object_type:'task', projection:'actions' — sequence steps included, reminder tasks deduplicated, exact counts plus paged rows; 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. Use each row's taskId/enrollmentId for writes, never its projection id. Nothing is sent.
When to use: Find records of any object (built-in, meeting, or custom). The right tool for a plain list — open tasks, deals in a stage — before reaching for run_report. Filter by field value; keyset-paginated, 20 rows by default; every object type answers with the rows in a top-level records array beside search_coverage. A free-text query searches by name on the objects that support it; for touches it also full-text-searches stored email CONTENT and matches a participant email ('find the emails about X', 'find the emails to sally@acme.com'; matches carry a highlighted snippet).
Example: Find the emails to sally@acme.com.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size, 1–100 (default 20). Out-of-range values are clamped. | |
| query | No | Free-text 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). | |
| cursor | No | Opaque keyset cursor: pass the previous page's next_cursor to fetch the next page; omit for the first page (a stale or invalid cursor restarts from page one). | |
| filters | No | Field key → exact scalar value (string / number / boolean). Non-scalar values can't be matched and are ignored with a note. | |
| projection | No | Read-only unified Actions queue, for object_type task. | |
| object_type | Yes | Object key to list — a built-in (account, contact, opportunity, task, touch, meeting, report…), a custom object's key, or an opportunity type key such as renewal (auto-routed). |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| count | No | |
| total | No | |
| counts | No | |
| result | No | |
| records | No | |
| has_more | No | |
| projection | No | |
| next_cursor | No | |
| object_type | No | |
| ignored_filters | No | |
| search_coverage | No | |
| custom_field_definitions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive, but the description goes well beyond them: keyset pagination with cursor semantics, default 20 rows, ordering variation by object (tasks by due date, undated last), ignored filters echoed in `ignored_filters` with search_coverage.status='unsupported_query', and the explicit warning that such rows do not answer the original query. It also states 'Nothing is sent', confirming no side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose line is front-loaded, but the body is a dense ~450-word block followed by a 'When to use' paragraph that restates the same facts (plain list before run_report, keyset pagination, 20 rows default, top-level `records` array, touch email search). Whole clauses are near-duplicated, forcing the reader to parse the same routing rule twice.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need not be explained, yet the description still covers the response shape, edge cases (unknown object_type returns valid types), the deprecated nested `result` retention, and exhaustive-answer guidance via next_cursor. For a 6-parameter, nested, multi-mode tool this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so 3 would be the baseline, but the description adds real meaning: relationship fields filter by target id, opportunity type keys auto-route from object_type, `query` semantics differ per object (name match vs touch email-body/participant match), and projection:'actions' carries its own filter vocabulary (scope/bucket/channel/source/day/time_zone). That is substantive semantics the schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope ('List/filter records of any object type') and immediately distinguishes itself from the sibling run_report by naming what run_report does (counts, sums, grouping, trends, charts). An agent can tell search_records apart from get_record and run_report without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to reach for this tool ('The right tool for a plain LIST — open tasks, deals in a stage') and when not to (before run_report for aggregates). The dedicated 'When to use' section plus worked conditions (custom vs built-in, deal-by-type routing, unified actions queue) leave little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_meeting_inviteSend meeting inviteADestructiveIdempotentInspect
Sends the picker email to the invitee. Normally called in the SAME turn as propose_meeting: once the user has okayed the topic + agenda, that content go-ahead IS the authorization to send — do not ask for a separate send confirmation. Call it on its own only when the user earlier said to hold the send and is now telling you to send it. Never send without a clear human go, and never on your own initiative. (A workspace governance policy may still require_approval on this tool; that path is independent and untouched.) Idempotent: an already-sent invite never re-sends. Errors clearly when the meeting isn't awaiting the invitee's pick, or when it was created in shareable mode (no invitee email — share the picker_url instead). Returns the meeting's full state.
When to use: Call right after propose_meeting in the same turn — the user's okay on the topic + agenda is the authorization, so don't ask twice. Wait only if the user said to hold the send. It sends directly, never on the model's own initiative; idempotent (a sent invite never re-sends).
Example: Okay, send Sara that invite now.
| Name | Required | Description | Default |
|---|---|---|---|
| meeting_id | Yes | The meeting's id, from propose_meeting or search_records. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sent | No | |
| slots | No | |
| meeting | No | |
| picker_url | No | |
| already_sent | No | |
| email_skipped | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint and destructiveHint, so the description's idempotency note is partly redundant. However, it adds behavioral context annotations do not carry: the authorization model (go-ahead IS the send authorization, no separate confirmation), the governance-policy approval path, and specific error conditions (meeting not awaiting the invitee's pick; shareable mode with no invitee email, use picker_url instead).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first paragraph front-loads the key behavior well, but the "When to use" paragraph restates much of it (same-turn rule, hold-the-send condition, never on own initiative, idempotency), creating redundancy rather than added value. The example is useful, but the repetition dilutes structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present (returns the meeting's full state) and rich annotations, the description is nearly complete. It covers authorization, idempotency, error paths, and the governance caveat. Minor gap: no explicit statement of required permissions beyond the governance note, but this is adequately covered for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with a single meeting_id parameter whose format and pattern are fully documented, so the schema does the heavy lifting. The description adds no syntax or format detail beyond naming the source (propose_meeting or search_records) indirectly. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Sends the picker email to the invitee") and implicitly distinguishes itself from propose_meeting, which is named as the prerequisite step. An agent can identify this as the send/finalize action in the meeting flow without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use rules: call in the SAME turn as propose_meeting after the user okays topic+agenda, call standalone only when the user earlier said to hold the send. It also states hard exclusions (never without a clear human go, never on the model's own initiative).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_exchange_ratesSet exchange ratesADestructiveIdempotentInspect
Set or remove the workspace's customer-authored manual exchange rates. One major unit of each input currency equals the supplied rate in the workspace default currency: with DKK as the default, {currency:"EUR",rate:7.46} means 1 EUR = 7.46 DKK. Upserts and removals in one call are atomic; an ambiguous request changes nothing. Capable never fetches or refreshes a rate, never rewrites stored amounts, and uses these facts only for fully-covered display aggregates. Admin-only. Returns the default currency and the complete current rate table.
When to use: When an admin wants aggregate money reads converted into the workspace default currency using rates the customer owns. Upsert and remove rates together; each rate means one unit of that currency equals the authored number of default-currency units. No rate feed or automatic update is involved.
Example: With DKK as our default, set 1 EUR to 7.46 DKK and remove the old USD rate.
| Name | Required | Description | Default |
|---|---|---|---|
| remove | No | Currency codes to remove. May be combined atomically with upsert; a currency cannot appear in both lists. | |
| upsert | No | Rates to add or replace. Omit the workspace default currency; its implicit rate is 1. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rates | No | |
| updated | No | |
| workspace | No | |
| invalid_rates | No | |
| default_currency | No | |
| duplicate_currencies | No | |
| supported_currencies | No | |
| unchanged_currencies | No | |
| conflicting_currencies | No | |
| unsupported_currencies | No | |
| default_currency_upserts | No | |
| requires_default_currency | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (destructiveHint=true, idempotentHint=true, readOnlyHint=false), the description discloses atomicity ('Upserts and removals in one call are atomic; an ambiguous request changes nothing'), that no rate is ever fetched or refreshed, that stored amounts are never rewritten, that rates affect only fully-covered display aggregates, and that the call is admin-only and returns the default currency plus the full rate table. This is unusually rich behavioral context that does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are correctly front-loaded, but the core rate-direction semantics are stated three times: in the intro paragraph, again in the 'When to use' block, and again in the example. Roughly a third of the text is redundant restatement rather than new information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given an output schema exists (so return values need not be explained, though they are), full schema coverage, and annotations covering safety and idempotency, nothing an agent needs to invoke this correctly is missing: direction of the rate, atomicity, admin requirement, and currency constraints are all present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds genuine meaning with a concrete worked example ('with DKK as the default, {currency:"EUR",rate:7.46} means 1 EUR = 7.46 DKK'), clarifying the direction of the rate that the schema's terse phrasing only implies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb pair and resource: 'Set or remove the workspace's customer-authored manual exchange rates.' No sibling tool touches exchange rates, so the agent can immediately distinguish this from the CRUD/meeting/report siblings in the list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
An explicit 'When to use' block scopes the tool to admins who want aggregate money reads converted into the workspace default currency with customer-owned rates. It states no rate feed or automatic update is involved, though it does not spell out a when-not-to-use condition or name an alternative tool (there is no obvious sibling alternative).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_opportunity_productsSet opportunity productsADestructiveIdempotentInspect
Set the products on an opportunity so its VALUE derives from them (replace-all). You pick a SELECTION of catalog products + a count for each; the SERVER prices it — it snapshots each product's price from the catalog, computes every line total, and writes the total into the opportunity's value (amount). You never pass a price. The list you pass becomes the WHOLE product set on the opportunity (the previous lines are replaced); pass an empty list to clear the products (the value follows to zero — no products, no value). Catalog products live on the product object: each prices from its unit_price_cents (an INTEGER number of cents) and its pricing_mode — per_unit multiplies by the count, flat charges once regardless of count (a flat line with count > 1 is flagged so a mispriced catalog is never silent). Discounts are by PERCENT only (a per-line discount_pct, and/or a top-level discount_pct for the whole opportunity) — the server computes the discount cents; you never pass a money amount. Bundled items are expanded automatically. A count outside a product's tier is flagged (not blocked). A discontinued catalog item can still be priced on an existing agreement by passing include_discontinued:true on its line (a boolean, not a price). Available once the 'opportunity_products' template is applied. Returns the opportunity's fresh state, its priced lines, and any flags.
When to use: When an opportunity's value should come from the products on it (available once the 'opportunity_products' template is applied). You pick the catalog items and how many of each; the server prices them and writes the total into the opportunity's value — you never pass a price. The list you pass replaces the whole product set; pass an empty list to clear it (the value follows to zero).
Example: Put 15 units of the standard plan on the Acme opportunity.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | The WHOLE product set (replace-all): [{product_id: product uuid, quantity: integer ≥ 0, discount_pct?: 0–100, include_discontinued?: boolean}]; [] clears every line. | |
| discount_pct | No | A number from 0 to 100. | |
| opportunity_id | Yes | A uuid. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| updated | No | |
| guidance | No | |
| line_items | No | |
| opportunity | No | |
| missing_objects | No | |
| tier_validations | No | |
| pricing_mode_validations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive=true and idempotent=true, and the description independently justifies both: it spells out that the previous lines are destroyed ('the list you pass becomes the WHOLE product set... previous lines are replaced') and that a repeated call with the same list is stable. It further discloses server-side pricing, snapshotting, discount computation, automatic bundle expansion, flag-not-block behavior for tier violations, and the include_discontinued escape hatch — all context the annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core facts are front-loaded, but the 'When to use' paragraph largely restates the opening paragraph verbatim ('you never pass a price', 'The list you pass replaces the whole product set; pass an empty list to clear it'). Heavy ALL-CAPS emphasis (VALUE, SELECTION, SERVER, WHOLE, PERCENT) adds length without adding information; a third of the text is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be enumerated, yet the description still notes that it returns fresh state, priced lines, and flags. Combined with the template prerequisite, pricing model, clearing behavior, and edge-case flags, an agent has everything needed to invoke this correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning: it establishes that no price is ever passed ('You never pass a price', 'a boolean, not a price'), that discounts are percent-only and server-computed, and what quantity/flag semantics mean at the line level. It stops short of documenting per-parameter formats already covered by the schema, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Set the products on an opportunity'), plus the key semantic consequence ('so its VALUE derives from them (replace-all)'). This distinguishes it from sibling mutation tools like update_record or update_quote, which would not replace the whole product set and reprice.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
A dedicated 'When to use' section gives the routing condition (value should come from products) and the prerequisite (the 'opportunity_products' template must be applied). It also covers the clear-case behavior (empty list clears). However, it never names competing siblings such as update_quote or create_quote, so the agent must infer that this tool is preferred over them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
show_workspace_setupShow workspace setupARead-onlyInspect
Show the workspace-setup step so the user can confirm the motion(s) you recommended, name the workspace, and save. On hosts that render interactive cards it can show a setup card with your message; the result also carries the current state and available motions, so the choice can be finished in text when no card is visible. Call this AFTER you've welcomed them, explained what a motion is, and shared your evidence-based read. Takes no arguments; commits via finalize_workspace_setup.
When to use: Call after welcoming the user, explaining what a motion is, and sharing the evidence-based read — so they can confirm the recommended motion(s), name the workspace, and save: in the setup card on hosts that render one, or in text.
Example: Show me my setup options to confirm.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| state | No | |
| can_edit | No | |
| guidance | No | |
| checklist | No | |
| workspace_id | No | |
| import_evidence | No | |
| available_motions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false; the description adds real value beyond that by disclosing host-dependent rendering (interactive card vs. text fallback) and that the result carries current state and available motions. It does not reconcile idempotentHint=false with a read-only 'show' operation, a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening paragraph is front-loaded and useful, but the 'When to use' block paraphrases it almost verbatim and the single-line example adds little, so roughly a third of the text is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description needn't enumerate return values, and it still notes that the result carries current state and motions. The workflow sequencing around welcome/explanation and the finalize handoff is covered, but the idempotency discrepancy and card-availability edge cases are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters, so the baseline is 4; the description confirms 'Takes no arguments' and explains that the interaction context (card vs. text) is the real input. No parameter semantics are needed beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (show the workspace-setup step) plus the intended outcome (confirm motions, name workspace, save), and explicitly contrasts itself with the committing sibling finalize_workspace_setup. An agent can distinguish it from update_workspace and start_onboarding without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit precondition ('Call this AFTER you've welcomed them, explained what a motion is, and shared your evidence-based read') and names the alternative for the commit path (finalize_workspace_setup). The 'When to use' section restates the same routing rule, 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.
start_onboardingStart onboarding interviewARead-onlyInspect
Returns the workspace-setup interview: import evidence to infer the workspace's motion(s) from, the available motions/templates, and the open questions for the active motion(s). Call with no arguments to see what's missing; once you have answers, call finalize_workspace_setup. On an EMPTY workspace with a connected mail/calendar account, the read itself never fetches anything: pass start_import:true once to queue the inbox + calendar import (a background job that writes contacts and touches), then call again without it to see what came back.
When to use: Run when a workspace is new — and anytime after, to revisit setup. It returns what the inbox import found so the motion(s) can be inferred (showing the evidence), confirmed with the user, and the chosen track's own questions walked. Every question is skippable. On an empty workspace with a connected mailbox, the read fetches nothing by itself: start_import:true, passed once, queues the inbox and calendar import.
Example: Help me set up my Capable workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| start_import | No | On an empty workspace, pass true once to fetch the connected inbox and calendar; the read itself never writes. Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| state | No | |
| guidance | No | |
| checklist | No | |
| workspace_id | No | |
| next_question | No | |
| get_started_url | No | |
| import_evidence | No | |
| available_motions | No | |
| available_templates | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds material context beyond the annotations: although readOnlyHint=true, the description discloses that start_import:true queues a background job that writes contacts and touches, and that the plain read never fetches anything. That reconciliation of a read-only hint with a side-effecting flag is exactly the kind of disclosure annotations can't carry. It stops short of saying how long the job takes or how completion is signalled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, but the empty-workspace/start_import behavior is restated three times (first paragraph, 'When to use' paragraph, and again in the schema description). The repetition inflates length without adding information, though the leading sentence remains well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no prose. The description covers the trigger, the follow-up tool, the one-shot import flag, and the skippability of questions. The only real gap is the unaddressed relationship to the show_workspace_setup sibling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents start_import, so the baseline is 3. The description still adds real semantics: that it should be passed 'once', that it queues a background inbox+calendar import rather than performing a synchronous fetch, and that a subsequent call without it reveals results.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Returns the workspace-setup interview' — and enumerates its payload (import evidence, motions/templates, open questions). It names the follow-up sibling finalize_workspace_setup, but never distinguishes itself from show_workspace_setup, the closest sibling by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'When to use: Run when a workspace is new — and anytime after, to revisit setup' gives an explicit trigger and explicitly routes the agent onward to finalize_workspace_setup once answers exist. It does not explain when to prefer this over show_workspace_setup, leaving one real ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_recordingStop recordingADestructiveInspect
Pull the notetaker bot out of a call and cancel the recording. Use when a rep asks not to record a meeting the bot was scheduled for, or to remove it mid-call.
When to use: When a rep doesn't want a scheduled meeting recorded, or wants the bot removed mid-call.
Example: Don't record my 3pm — pull the bot off it.
| Name | Required | Description | Default |
|---|---|---|---|
| recording_id | Yes | The meeting recording's id — from record_meeting's result, or search_records({object_type:'meeting_recording'}) / get_record. |
Output Schema
| Name | Required | Description |
|---|---|---|
| recording | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorldHint=true, lowering the bar. The description adds that the bot is physically removed and the recording cancelled, but it does not disclose consequences beyond the annotation (e.g., whether the captured audio is discarded or recoverable), so it adds only modest value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three separate blocks say the same thing: the opening sentence, the 'When to use' line, and the example all restate 'pull the bot / don't record.' The guidance is front-loaded and readable, but two of the three blocks do not earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering the safety profile, the definition is nearly complete for a single-parameter action tool. The remaining gap is the lack of explicit differentiation from cancel_meeting, but nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the recording_id parameter is well documented with its format and provenance (record_meeting result, search_records, get_record). The description adds no parameter detail and relies entirely on the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'pull the notetaker bot out of a call and cancel the recording,' which clearly communicates what the tool does. However, it never distinguishes itself from the nearby siblings record_meeting or cancel_meeting, so an agent must infer that this targets the recording (not the meeting) on its own.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to use' section gives an explicit trigger ('a rep doesn't want a scheduled meeting recorded, or wants the bot removed mid-call'), which is clear usage context. It offers no exclusions or named alternatives, and the guidance is essentially a restatement of the opening sentence rather than new routing information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_fieldUpdate fieldADestructiveIdempotentInspect
Patch a custom field by object_type + key — change its label or choice options. Returns the updated field definition.
When to use: When an admin wants to rename a custom field or change its choice options.
Example: Add 'reseller' to the partner_type field's options.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The custom field's key (from describe_schema), not its label. | |
| label | No | New display label. The key does not change. | |
| options | No | Replaces the whole choice list of a select/multiselect field, as labels; a choice field must keep at least one option. | |
| object_type | Yes | Object key the field belongs to (built-in or custom). |
Output Schema
| Name | Required | Description |
|---|---|---|
| field | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, and idempotentHint=true, so the safety profile is covered. The description adds the mutation scope ('change its label or choice options') and a return note, but discloses nothing beyond annotations about auth needs or what the destructive replacement actually affects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then a compact when-to-use line and a short example. Every sentence earns its place; only the explicit return note is mildly redundant given the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity 4-parameter mutation tool, the description covers purpose, usage, and an example, while annotations handle safety and the output schema handles the return value. Auth/permission requirements are the only notable omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented, including the key-vs-label distinction and the option-replacement semantics. The description's 'by object_type + key' only restates schema content, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (patch) and resource (custom field) plus the exact editable fields (label, choice options), identified by object_type + key. It's clear enough to distinguish from create-style siblings like define_field, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The explicit 'When to use' line gives a clear triggering context (admin renaming a field or changing its options) and an example. It lacks when-not guidance and does not route the agent to alternatives such as define_field or archive_field.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_objectUpdate object typeADestructiveIdempotentInspect
Rename or reconfigure a custom object type by key — change its label, plural, blurb, icon, shared-write mode, enabled flag, or display_field (the data key holding a record's display name; null resets to the 'name' default) — and/or set its sidebar-menu visibility (show_in_menu: navigation only — true pins the object into the web app's menu, false removes its menu row while the object stays fully usable everywhere else). A BUILT-IN object's identity is code-defined, so on a built-in key only two changes apply, alone or together: enabled and show_in_menu. enabled:false turns the object OFF for the whole workspace — its records vanish from every surface and the generic verbs refuse it until it's turned back on (nothing is deleted) — so it needs a preview call, then confirm:true; enabled:true turns it back on with no confirm. describe_schema's switchable says which objects have a switch (foundational objects and a feature's parts don't, and say so). Returns the updated object definition (a built-in or menu-only change returns the key + what changed).
When to use: When an admin wants to change a custom object's label, plural, blurb, icon, shared-write mode, or enabled flag — or its sidebar-menu visibility (show_in_menu, navigation only: the object stays fully usable off the menu). For a built-in object only enabled (off needs a confirm) and show_in_menu apply.
Example: Rename the Property object to Listing.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | The object's stable key (from describe_schema). On a built-in key only enabled and/or show_in_menu apply; any other change is refused. | |
| icon | No | A key from Capable's curated object-icon set (e.g. landmark, factory, handshake, flask); an unknown key is rejected with suggestions. Null clears back to the neutral default. | |
| blurb | No | New one-sentence description of the object; null clears it. | |
| label | No | New singular display name. The key does not change. | |
| plural | No | New plural display name for lists and the menu. | |
| shared | No | true lets any non-viewer edit every record of this object; false lets only the record's owner, admins and managers edit it. | |
| confirm | No | Required (true) to turn a BUILT-IN object off: the first enabled:false call answers with a preview instead. Not needed for anything else. | |
| enabled | No | false turns the object off — it leaves the schema and menu and the generic verbs refuse it, records kept; true turns it back on. On a built-in key, false needs confirm:true (the first call previews); custom objects switch as before. | |
| show_in_menu | No | Whether the object appears in the web app's sidebar menu — an explicit per-object override of the bounded default. NAVIGATION only: it never changes what you or the app can do with the object (that's `enabled`). Composes with the other args on a custom key; on a built-in key it composes only with enabled. | |
| display_field | No | The data key holding a record's display name (a lowercase field key); null resets to the "name" default. |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | No | |
| note | No | |
| label | No | |
| object | No | |
| updated | No | |
| requires_confirm | No | |
| records_affected_note | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations (readOnlyHint=false, destructiveHint=true, idempotentHint=true). It discloses that enabled:false is workspace-wide, hides records from every surface, causes generic verbs to refuse the object, deletes nothing, and requires a preview call followed by confirm:true on built-ins, while enabled:true needs no confirm. It also states built-in identity is code-defined and what the return value contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and organized into description / when-to-use / example, but the opening paragraph is a dense run-on with stacked em-dash asides, and the 'When to use' section largely repeats content already stated above and again in the schema field descriptions. Sentences earn their place individually, but the total is longer than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with an output schema present, the description covers everything an agent needs: key sourcing, built-in vs custom behavior, the confirm/preview flow, composability, and reversibility. Return values need not be explained since an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description still adds cross-parameter semantics the schema does not, notably the composability rule ('composes with the other args on a custom key; on a built-in key it composes only with enabled') and the show_in_menu-is-navigation-only vs enabled distinction. Much of the per-field text, however, restates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource+scope: 'Rename or reconfigure a custom object type by key', then enumerates every mutable aspect (label, plural, blurb, icon, shared-write, enabled, display_field, show_in_menu). This cleanly distinguishes it from siblings like update_field, update_pipeline, define_object and archive_object.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The explicit 'When to use' section plus the built-in-vs-custom restriction ('on a built-in key only two changes apply') and the preview-then-confirm requirement give strong when-to-use and when-not guidance. It points to describe_schema for the key and switchability, but does not name alternative tools for adjacent operations (e.g. field changes vs object changes), leaving a small gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_pipelineUpdate pipelineADestructiveIdempotentInspect
Update a pipeline by pipeline_key (or pipeline_id; id wins if both are given) — rename it (label), re-point it (applies_to), replace its stages (including each stage's ENTRY requirements — the field keys a deal must have filled to move into it), or set which opportunity types default to it (default_for_types). Existing stage keys stay stable; a stage that still has open deals can't be removed (reassign those deals first). Omit BOTH pipeline_key and pipeline_id to reshape the WORKSPACE DEFAULT pipeline — only stages apply there (the default has no label, applies_to, or type mapping). An unknown key/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 what each stage requires on entry, re-point it, or set which deal types default onto it — or reshape the workspace default pipeline's stages (omit the pipeline key to target the default).
Example: Don't let a deal reach Proposal until Metrics and an economic buyer are filled in.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Rename the pipeline. | |
| stages | No | Replace the stage list ([{key,label,role,is_closed?,is_won?,requires?,requires_mode?}], role one of unqualified/qualifying/active/commit/won/lost). Keep existing stage keys stable; a stage that still has open deals can't be removed. REPLACE-ALL: a stage you send without `requires` loses any requirements it had, so echo them back when you only mean to reorder or rename. | |
| applies_to | No | The object key this pipeline runs on (e.g. opportunity). Named pipelines only. | |
| pipeline_id | No | The pipeline to edit by id (uuid). Prefer pipeline_key; id wins if both are given. | |
| pipeline_key | No | The named pipeline to edit, by its stable key (from describe_schema's pipelines section). Omit BOTH pipeline_key and pipeline_id to edit the workspace default pipeline (only `stages` applies there). | |
| default_for_types | No | The opportunity `type` VALUE KEYS this pipeline is the default for — new deals of a mapped type start on it. A type maps to only one pipeline. Pass [] to clear the mapping. Named pipelines only; registry data, not fixed type names. |
Output Schema
| Name | Required | Description |
|---|---|---|
| pipeline | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations: stage keys stay stable, a stage with open deals can't be removed, unknown key/id returns known pipelines instead of erroring, admin-only authorization, and REPLACE-ALL stage semantics that silently drop requirements. The annotations only flag destructive/idempotent; the description explains the actual mutation hazards.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded, with the primary action, the default-pipeline special case, and the failure mode ordered sensibly. The trailing 'Example' sentence about a deal reaching Proposal is illustrative rather than operational and is the only slightly loose element.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, multi-field mutation tool it covers target selection, replace-all semantics, guardrails on stage removal, and the default-pipeline edge case, and it notes the return value. With an output schema present, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all six parameters in depth, including the id-wins precedence and requires/requires_mode interplay. The description largely restates this (e.g. 'id wins if both are given'), adding little parameter meaning the schema doesn't already carry, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Update) and resource (pipeline), then enumerates exactly what can change (rename, re-point, replace stages, set default types) and the special workspace-default case. An agent can distinguish this from define_pipeline or archive_pipeline without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Has an explicit 'When to use' block listing the concrete admin scenarios and the omit-the-key trick for the default pipeline. It does not, however, name sibling alternatives (define_pipeline, archive_pipeline) or state when NOT to use it, 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.
update_quoteUpdate quoteADestructiveIdempotentInspect
Update a quote: change its status (draft → sent → accepted / lost), link an opportunity, or replace its line items. When you pass lines, the SERVER re-prices from the catalog (you never pass a price) and replaces the whole line set; the quote total is recomputed. Catalog products live on the product object and price from unit_price_cents (integer CENTS) + pricing_mode — per_unit multiplies by quantity, flat charges once (missing/unknown pricing_mode resolves to flat; a flat line with quantity > 1 is flagged). Discounts are by PERCENT only (per-line discount_pct on a line and/or a quote-level discount_pct) and apply when you re-price (pass lines to change a discount). Status/opportunity-only edits don't re-price. Status is exactly draft, sent, accepted, or lost — a quote is a pre-commit artifact (invoicing and contracts happen elsewhere). Returns the updated quote, its priced lines, and any flags.
When to use: When a quote needs to change — move it from draft to sent, mark it accepted or lost, link an opportunity, or swap its items. Passing new items re-prices from the catalog and recomputes the total; you never pass a price.
Example: Mark Acme's quote as sent, and add 5 more units.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A uuid. | |
| name | No | New display name for the quote; replaces the stored header name. | |
| lines | No | At least one item. | |
| notes | No | New free-text notes for the quote header; replaces the stored notes and never affects pricing. | |
| status | No | One of: draft | sent | accepted | lost. | |
| valid_until | No | Must match /^\d{4}-\d{2}-\d{2}$/. | |
| discount_pct | No | A number from 0 to 100. | |
| opportunity_id | No | Opportunity to link the quote to (must exist in this workspace); null clears the link, omitting leaves it unchanged. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| quote | No | |
| updated | No | |
| guidance | No | |
| repriced | No | |
| line_items | No | |
| mixed_cadence | No | |
| missing_objects | No | |
| tier_validations | No | |
| annualized_total_cents | No | |
| pricing_mode_validations | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by disclosing that the SERVER re-prices from the catalog (client never passes a price), replaces the entire line set, recomputes the total, and that status/opportunity-only edits don't re-price. It also details pricing_mode resolution and that discounts are percent-only, all of which an agent needs to call this destructive-but-idempotent mutation correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded with the operation summary first, then behavioral detail, then when-to-use and example. It is long, and 'you never pass a price' is repeated across two sections, a minor redundancy that keeps it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation with a rich output schema and full annotation coverage, the description supplies everything needed: re-pricing behavior, discount mechanics, status enum semantics, and the return shape (quote, priced lines, flags). Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description substantially enriches semantics: it explains how `lines` are re-priced and that they replace the whole set, how `pricing_mode` (per_unit vs flat, unknown→flat) resolves, and that `discount_pct` applies only on re-price. This is meaningfully more than the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Update a quote') and enumerates the three distinct operations: status change, opportunity link, and line-item replacement. It clearly distinguishes this from create_quote and from downstream invoicing/contract work.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
A dedicated 'When to use' section names the triggering conditions (draft→sent, mark accepted/lost, link opportunity, swap items) and scopes the tool as a pre-commit artifact with invoicing/contracts happening elsewhere. An example anchors the usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_recordUpdate recordADestructiveIdempotentInspect
Patch fields on a record by id. Pass object_type + id + a patch object of the fields to change (a null value clears a custom field). Works for custom objects (shallow-merges into the record's data; owner-scoped unless the object is shared) AND the built-in objects with an update verb (account, contact, opportunity, subscription, task, touch — fix an activity's subject/summary/time/type — and report: refining a saved View the user already has is update_record(report, {id, patch:{definition}}), NOT a new one — only make a fresh View for a genuinely different perspective), where it routes to the same domain logic as the typed update tools. Returns the full updated record (fresh state). For a complete sequence plan, patch steps (retain saved ids), expected_revision (sequence mcp_revision), expected_steps [{id,revision}] for every live step, and request_id (UUID, reuse only for an identical retry). Steps save together; people still enrolled prevent changes to their timing, channels or order. Maintain verbs, each passed on its own: task subtasks replaces the whole checklist [{id?, title, done?}]; contact engaged:true confirms the person (a ratchet); opportunity board_rank:{before?, after?} orders a card in its current column; sequence_step position onto a neighbour's slot swaps the two (fenced while people are partway through).
When to use: Edit a record: pass object_type + id + a patch. Built-in objects route to the same domain logic as the folded typed update tools (e.g. advance a deal with {stage}, complete a task with {status:'done'}). Custom records are owner-scoped unless the object is shared. Retiring a converted lead (status 'converted', its account/contact/opportunity ids, converted_at and deleted_at) is the LAST step of lead conversion — see the lead conversion guide, an MCP resource at capable://guide/leads.
Example: Update opportunity : set stage to verbal.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A uuid. | |
| patch | Yes | 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). | |
| object_type | Yes | 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. | |
| expected_revision | No | Optional record revision from a reviewed update; a changed record is refused without writing. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| record | No | |
| result | No | |
| updated | No | |
| object_type | No | |
| custom_field_definitions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations: it discloses owner-scoping vs shared objects, null-clears-custom-field semantics, shallow-merge behavior, that the full updated record is returned, and rich per-verb semantics (engagement ratchet, board_rank, sequence_step swap fencing, subtasks replace). Annotations only give destructiveHint=true and idempotentHint=true; the description adds substantial behavioral context beyond them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and long, packing sequence-plan details, revision/step semantics and maintain verbs into one block. It is front-loaded with the core (patch fields by id), but several sentences are heavy run-ons that an agent must parse carefully, costing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a highly complex, nested, multi-verb mutation tool, the description covers the key behaviors and routes to the reference guide. An output schema exists so return values need not be explained. It is thorough, though the density makes some conditions (sequence fencing, revision handling) easy to miss.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: patch is a partial change (not replacement), null clears a custom field, and the object_type routing behavior. It adds value beyond the schema despite high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (patch fields on a record by id) and names the exact inputs (object_type + id + patch). It explicitly distinguishes routing behavior from siblings like create_record and the folded typed update tools, telling an agent exactly what this tool covers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to use' section gives concrete context (edit a record; advance a deal with {stage}; complete a task with {status:'done'}). It references the lead-conversion guide rather than giving explicit when-not-to-use or naming a competing sibling edit tool, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_workspaceUpdate workspace settingsADestructiveIdempotentInspect
Change the workspace's settings as a PATCH: every input is optional and only the settings you pass are touched — unsent settings keep their stored value, and a value that already matches is a no-op. Covers timezone (IANA), date_format, default_currency (refused while any manual exchange rate exists — remove them with set_exchange_rates first), currency_display, logo_url, deal_value_metric, auto_create_contacts, the meeting recorder (recorder_enabled + recorder_auto_scope; enabling connects every member's calendar), recorder_notice_enabled, allow_domain_join and flags.automation_enabled. The workspace NAME and qualification FRAMEWORK are not here: they are set through finalize_workspace_setup. The three posture switches — recorder_enabled, recorder_notice_enabled, allow_domain_join — need confirm:true whether turning on or off; without it the call returns a preview of every change and writes nothing. An invalid value or a refused change writes nothing and names the problem. Admin-only. Returns the full settings block (name, framework, timezone, date_format, default_currency, currency_display, logo_url, deal_value_metric, auto_create_contacts, recorder_enabled, recorder_auto_scope, recorder_notice_enabled, allow_domain_join, flags) plus changed, the settings that actually moved.
When to use: When an admin wants to change a workspace setting from the conversation — the time zone, date or money format, the default currency, the logo, how deal values normalize, whether ingestion mints contacts, the meeting recorder and its notice, domain join, or the automation flag. A patch: only what you pass changes; the posture switches ask for confirm:true.
Example: Set our timezone to Europe/Stockholm and the date format to DD/MM/YYYY.
| Name | Required | Description | Default |
|---|---|---|---|
| flags | No | Workspace capability flags, currently { automation_enabled }. | |
| confirm | No | true carries out a change to recorder_enabled, recorder_notice_enabled or allow_domain_join; omitted or false returns the preview and writes nothing. | |
| logo_url | No | Workspace logo as an http(s) URL; null clears it. | |
| timezone | No | IANA time zone name, e.g. Europe/Stockholm or America/New_York; an unknown zone is refused. | |
| date_format | No | Workspace-wide numeric date format; null restores Automatic (the pinned MM/DD/YYYY canon). | |
| currency_display | No | Money read style — symbol ($1,200) or code (USD 1,200); null restores the default symbol rendering. | |
| default_currency | No | ISO 4217 code (USD, EUR, GBP, SEK, DKK, NOK, JPY, KWD, BHD). Locked while any manual exchange rate exists because stored rates are denominated in it. | |
| recorder_enabled | No | The meeting recorder's one admin switch; on connects every member's calendar to the recorder. Posture change: needs confirm:true. | |
| allow_domain_join | No | Let colleagues on the workspace's organisational email domain join without an invite. Access posture: needs confirm:true. | |
| deal_value_metric | No | How product-derived deal values normalize onto a time basis; existing amounts are never rewritten. | |
| recorder_auto_scope | No | Which meetings the recorder joins by itself: external (customer calls, the default) or off (only a human's record_meeting). | |
| auto_create_contacts | No | Whether mail and calendar ingestion may mint NEW contacts; false stops minting while existing contacts keep getting activity. | |
| recorder_notice_enabled | No | Email external attendees about an hour before a recorded meeting with a one-click opt-out. Consent posture: needs confirm:true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| changed | No | |
| changes | No | |
| updated | No | |
| problems | No | |
| settings | No | |
| requires_confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive/idempotent/readOnly=false, and the description adds substantial context beyond them: pure PATCH semantics (unsent settings untouched, matching values are no-ops), the confirm:true preview gate on the three posture switches that writes nothing without it, atomic refusal on invalid/refused values, and admin-only authorization. This is exactly the behavioral detail an agent needs for a destructive mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the PATCH rule and the confirm gate, which are the highest-value facts. It runs long and the 'When to use' paragraph partially restates the opening enumeration, but the example and grouping are useful rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter destructive mutation with nested objects, the description covers semantics, gating, authorization, error behavior, and even the return shape plus `changed`. With an output schema present it needn't detail returns, yet does so briefly; nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description exceeds that by adding cross-tool workflow meaning the schema lacks: default_currency is refused while manual exchange rates exist (routed to set_exchange_rates), and enabling recorder_enabled connects every member's calendar. It also names the confirm-gated trio as a group, clarifying which single parameter gates which settings.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (change/PATCH workspace settings) and enumerates exactly which settings are covered, then explicitly carves out what is NOT here (name and qualification framework go through finalize_workspace_setup). An agent can distinguish it from its siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'When to use' section gives explicit conditions (admin changing a setting from the conversation) and names the alternative for the excluded fields (finalize_workspace_setup). It also states the prerequisite for default_currency changes: remove manual rates with set_exchange_rates first.
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 tool update
- Changed
manage_company_billing1 field changed- changed
Input schema / properties / action / descriptionPrevious value: -"activate (paid active account, or a pending approval), archive (stops paid usage, keeps history) or restore (a deleted company returns as prospect/archived, never active)."New value: +"activate makes the company a paid active account or creates a pending human approval request. archive and restore cannot be performed by this tool; an authorized person must confirm them in the company's web panel."
57 tool updates
- First observed
add_account_contact - First observed
add_note - First observed
apply_template - First observed
archive_field - First observed
archive_object - First observed
archive_pipeline - First observed
cancel_meeting - First observed
cancel_subscription - First observed
commit_reviewed_updates - First observed
create_quote - First observed
create_record - First observed
define_automation - First observed
define_enum_value - First observed
define_field - First observed
define_object - First observed
define_pipeline - First observed
define_program - First observed
define_rollup - First observed
delete_record - First observed
describe_schema - First observed
export_report - First observed
finalize_workspace_setup - First observed
find_times - First observed
get_company_billing - First observed
get_context - First observed
get_help - First observed
get_pipeline_summary - First observed
get_record - First observed
log_touch - First observed
manage_approvals - First observed
manage_company_billing - First observed
manage_linkedin_conversation - First observed
manage_members - First observed
migrate_crm - First observed
propose_meeting - First observed
propose_updates - First observed
record_meeting - First observed
remove_account_contact - First observed
renew_subscription - First observed
reschedule_meeting - First observed
restore_record - First observed
review_proposed_updates - First observed
run_report - First observed
schedule_report - First observed
search_records - First observed
send_meeting_invite - First observed
set_exchange_rates - First observed
set_opportunity_products - First observed
show_workspace_setup - First observed
start_onboarding - First observed
stop_recording - First observed
update_field - First observed
update_object - First observed
update_pipeline - First observed
update_quote - First observed
update_record - First observed
update_workspace
Publisher details
- Operator
- Capable
- Operator website
- https://capable.run · Publisher source
- Vendor relationship
- First-party
- Documentation
- https://crm.capable.run/developers · Publisher source
- Trust center
- https://capable.run/legal/privacy-policy · Publisher source
- Restrictions
- Requires a Capable account; connects with OAuth 2.1 (PKCE) and dynamic client registration, or a personal access token for clients without OAuth. Workspaces start on a 14-day free trial, then a paid plan. No custom OAuth app or admin approval needed.
Related MCP Connectors
CRM + visual automation builder AI agents can drive via MCP: contacts, tags, maps, email/SMS flows.
Native MCP access to CRM contacts, organizations, deals and tasks with user permissions.
AI CRO for Agencies and MSPs: full automatic CRM; multichannel tracking; draft follow-ups.
API-first CRM for LLMs - contacts, companies, deals and activities over a native MCP server.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceAn MCP-native CRM backend for AI agents, enabling customer, opportunity, note, follow-up, and pipeline health management through 15 MCP tools.-
- AlicenseNot gradedqualityBmaintenanceCRM AI - MCP server providing AI-powered tools and automation by MEOK AI Labs11 npm41 PyPIMIT
- FlicenseBqualityBmaintenanceEnables managing a small CRM of companies, contacts, deals, and activities through MCP tools, including creating and updating records, logging activities, searching across the CRM, and summarizing pipeline stages.15-
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to read and write CRM data—companies, contacts, opportunities, tasks, and interactions—through MCP, with OAuth and provenance tracking for every value.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.