Groundbase
Server Details
CRM for one-person businesses. Sends texts and email through your own accounts, runs campaigns and workflows, issues invoices. OAuth or API key.
- Status
- Healthy
- Uptime
- 98.6% over 43 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 59 tools
The dominant list/manage split gives most tools a clear read-vs-write boundary, so an agent can usually pick correctly. A few families still blur: invoices_list vs invoices_manage vs invoice_items_manage vs invoice_payments_manage vs invoice_settings, and campaigns_manage (which itself has a `list` action) vs campaigns_analytics, plus resend_manage being read-only despite the name.
Nearly everything follows a noun + suffix pattern (contacts_list/contacts_manage, deals_list/deals_manage, tasks_list/tasks_manage), which is predictable. Deviations exist: verb-style names (email_read, email_send, email_thread_update, meetings_book, workflows_run_now), verb-less names (invoice_settings, phone_status, sending_settings), and the awkward voicemail_drops_drop.
59 tools is well past the heavy threshold, and while the domain (CRM + invoicing + campaigns + scheduling + telephony) is genuinely broad, many list/manage pairs could be consolidated into a single action-parameterized tool per resource. The surface is large enough that discovery and correct selection become a real burden.
Coverage is unusually comprehensive: contacts, companies, deals, pipelines, tasks, notes, custom fields, tags, templates, campaigns, forms, quotes, invoices, time tracking, documents, webhooks, suppressions and voicemail drops all have read and write paths. Gaps are minor (no attachment/file handling, no import/export, some admin operations deferred to the app), which agents can work around.
Available Tools
59 toolsactivity_listList activityARead-onlyIdempotentInspect
Recent activity, newest first: texts, calls, emails, notes, deal stage changes, task completions. Optionally scoped to one contact, company or deal.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 50. A full page may mean more. | |
| dealId | No | ||
| offset | No | For the next page. | |
| companyId | No | ||
| contactId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety and repeatability are covered structurally. The description adds the result ordering ('newest first') and the composite nature of the feed, but says nothing about pagination behavior, result size caps, latency, or what happens when multiple scope filters are combined.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero redundancy: the first front-loads what the feed contains and its ordering, the second supplies the scoping constraint. Nothing is repeated from the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter read-only list tool with no output schema, the description covers content, ordering, and scoping well enough to call it correctly. The remaining gap is paging guidance (only hinted at inside the schema's limit/offset descriptions) and explicit sibling routing, which would matter given the many per-type list tools nearby.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 40%: dealId, companyId, and contactId have no schema descriptions at all, and the description is what supplies their meaning as scoping filters for exactly one of those entities. The limit and offset parameters are already documented in the schema, so no credit is needed there, but the description carries the undocumented three.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (activity feed) with the enumeration of item types (texts, calls, emails, notes, deal stage changes, task completions) and sort order (newest first), which makes it clearly an aggregated cross-type feed rather than a single-type list. It does not explicitly name the sibling per-type lists (calls_list, notes_list, sms_list, tasks_list) it competes with, so differentiation is inferable rather than spelled out.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'Optionally scoped to one contact, company or deal' implies a usage pattern (narrow the feed by entity), but there is no explicit statement of when to choose this over a per-type list like calls_list or notes_list. An agent must infer the choice from the word 'activity' alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
addresses_manageManage addressesADestructiveInspect
Postal addresses on a contact or company (contactId or companyId). list, create, update (omitted fields unchanged), delete (confirm first). A contact or company fetched by id already includes its addresses.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Used by: create, update. | |
| label | No | Used by: create, update. e.g. 'home', 'office'. | |
| notes | No | Used by: create, update. | |
| action | Yes | ||
| street | No | Used by: create, update. | |
| country | No | Used by: create, update. | |
| province | No | Used by: create, update. State, province or region. | |
| addressId | No | Required for: update, delete. | |
| companyId | No | Used by: list, create, update, delete. | |
| contactId | No | Used by: list, create, update, delete. | |
| is_primary | No | Used by: create, update. Make this the primary address (demotes the old one). | |
| postal_code | No | Used by: create, update. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-read-only behavior; the description adds useful behavior beyond them by noting partial-update semantics and a confirmation step before delete. It does not discuss permissions, permanence, or response behavior, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the resource and parent scope, then actions and important operational notes. No redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter CRUD tool with rich schema and destructive annotations, the description covers the key invocation context: parent entity, actions, partial updates, delete confirmation, and avoiding redundant list calls. It could be slightly more complete about return behavior or required identifiers, but no output schema exists to carry that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (92%), so the schema carries most parameter detail. The description still adds meaning by indicating the parent entity is a contact or company via contactId/companyId and by explaining that update omits unchanged 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 names the resource (postal addresses on a contact or company) and enumerates the four operations. It is clear enough to distinguish from generic contact/company management, but it does not explicitly name sibling tools or contrast itself with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It supplies concrete usage rules: update leaves omitted fields unchanged, delete requires confirmation, and a contact/company fetched by id already includes addresses, which discourages redundant list calls. It stops short of naming alternative tools or fully spelling out when to choose this over contacts_manage/companies_manage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
billing_profiles_manageManage billing profilesADestructiveInspect
Billing details on a contact or company (currency, terms, billing email, tax id). list (or contactId / companyId for one), save (create on exactly one, or edit by id), delete.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: delete; optional for: save. Edit this profile. | |
| notes | No | ||
| taxId | No | ||
| action | Yes | ||
| currency | No | ISO 4217. | |
| companyId | No | Used by: list, save. | |
| contactId | No | Used by: list, save. | |
| taxExempt | No | ||
| billingEmail | No | Where invoices and receipts go, if not the contact's own address. | |
| billingAddress | No | ||
| paymentTermsDays | No | 0 = due on receipt. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, so the safety profile is partly carried structurally. The description adds the useful constraint that save creates only on exactly one of contact/company and that id drives edit vs. delete, but it says nothing about irreversibility of delete, side effects on related invoices, or permission requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very compact and front-loaded: a one-clause resource definition followed by a per-action breakdown. The telegraphic style ('list (or contactId / companyId for one)') is terse to the point of being clipped, which slightly hurts readability but wastes no space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, 11-parameter, no-output-schema management tool, the description is only minimally sufficient. It covers action semantics and a few fields, but an agent still lacks guidance on destructive delete consequences and on most of the optional payload fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 55%, and the description only names four of the eleven fields (currency, terms, billing email, tax id) at a high level. Undocumented-or-thinly-documented fields such as notes, taxExempt, and billingAddress receive no clarification in the description, so it neither compensates for the coverage gap nor adds much beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource ('billing details on a contact or company') and enumerates the three operations (list, save, delete) with the fields involved (currency, terms, billing email, tax id). It is clear what the tool does, though it never differentiates itself from nearby siblings like invoice_settings or invoices_manage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 per-action selection guidance: list (optionally scoped by contactId/companyId for a single profile), save (create on exactly one of contact/company, or edit by id), delete. That resolves the main ambiguity for an action-enum tool, though there are no explicit exclusions or pointers to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calls_listList callsARead-onlyIdempotentInspect
List call history (direction, duration, voicemail transcripts), or pass id to fetch one call with its recording details.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Call id. Returns that one call. | |
| limit | No | Default 100. A full page may mean more. | |
| contactId | No | ||
| voicemailOnly | No | Only calls that left a voicemail. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and non-openWorld, so safety behavior is covered. The description adds that a single-call fetch includes recording details and that listings surface transcripts, which is useful content context, but says nothing about ordering, pagination beyond the schema's limit hint, or volume characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the list mode front-loaded and the alternate mode after it. No filler, nothing repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with full annotation coverage and no output schema, the description covers both modes and the notable returned content. The one meaningful omission is the `contactId` filter, which an agent would have to infer from the bare parameter name.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the schema already documents `id`, `limit`, and `voicemailOnly`; the description reinforces `id` and voicemail transcript retrieval but adds no syntax or format detail. Critically, `contactId` is undocumented in both schema and description, leaving a real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource ("List call history") and enumerates the fields it returns (direction, duration, voicemail transcripts), plus the dual mode of fetching a single call by id. It is clearly distinguishable from most siblings by resource, though it does not explicitly contrast with adjacent list tools like voicemail_drops_list or activity_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?
The two modes are stated (list vs. fetch one by `id`), which implies when each applies, but there is no explicit guidance on when to prefer this over sibling listing tools, no prerequisites, and no statement of what happens with no arguments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_analyticsCampaign analyticsARead-onlyIdempotentInspect
Stats for one campaign (recipients, sent, delivered, unique opens/clicks, bounces, unsubscribes, replies, failures). With recipients: true, returns per-recipient rows instead, optionally filtered by status.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| limit | No | Recipients: default 100. | |
| status | No | Recipients filter. | |
| recipients | No | Return per-recipient status rows. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as a safe, read-only, idempotent, non-destructive operation. The description adds useful behavioral context by listing the aggregate metrics returned and explaining the alternate per-recipient mode, though it does not mention auth requirements, rate limits, or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the primary purpose and followed by the key mode switch. Every sentence earns its place with no redundant or vague language.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only analytics tool with no output schema, the description sufficiently lists the returned metrics and explains the per-recipient mode. Minor gaps remain, such as not explicitly describing the `id` parameter or the `limit` behavior, but the core information needed to call the tool correctly is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so most parameters are documented in the schema. The description adds meaning beyond the schema by clarifying that `recipients: true` changes the result shape to per-recipient rows and that `status` filters only in that mode, which the individual schema descriptions do not make explicit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that this tool returns analytics for a single campaign and enumerates the metrics (sent, delivered, opens, clicks, bounces, etc.). It does not explicitly name or distinguish itself from the sibling `campaigns_manage` tool, but the read-only analytics scope is evident from the wording and 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?
The description explains a key mode switch: setting `recipients: true` returns per-recipient rows instead of aggregate stats. However, it provides no explicit guidance on when to use this tool versus alternatives like `campaigns_manage`, nor any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
campaigns_manageManage campaignsADestructiveInspect
Email/SMS campaigns and newsletters. Actions: list (kind=newsletter for newsletters), get, create (draft; template_id starts a newsletter from newsletter_templates), update, delete, duplicate, test_send, send_now, schedule, pause, resume, stop, add_recipients, preview_audience, newsletter_templates. send_now/schedule/resume message real people: confirm first.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | list: name search. | |
| id | No | Campaign id; needed for all but list, create, preview_audience. | |
| to | No | test_send recipient. | |
| kind | No | list filter: newsletters, or everything else. | |
| name | No | ||
| role | No | newsletter_templates: another industry's set (e.g. real estate, mortgage, insurance). Default: the user's own. | |
| limit | No | ||
| steps | No | Drip steps (send_mode 'drip'): [{ delay_seconds, content_json, exit_on?, channel? }]. Step 0 sends at start; each later step sends delay_seconds after that recipient's previous actual send. exit_on { reply?, open?, click?, meeting?, status? } skips the rest for a contact who did that. channel overrides the campaign channel for the step. | |
| action | Yes | ||
| status | No | list filter. | |
| channel | No | ||
| content | No | Single send. Email: { subject, preheader?, from_name?, from_email?, reply_to?, blocks: [{ type, props }] }; block types text {html}, header {html, level 1-3}, image {src, alt, width}, button {text, url, bgColor?}, divider {color?}, spacer {height}. from_email: a domain verified in Resend (resend_manage domains). reply_to: a mailbox connected in Groundbase, so drip reply-exit sees replies. SMS: { body, media_urls? }. Merge tags like {{first_name}}, {{cf.<key>}} work in any string. Newsletter: content.kind 'newsletter' (one email, sent once). Extra blocks: section_header {title}; agent_card {photoUrl, name, title, phone, email, website, brokerage, note}; listing_card {imageUrl, status, price, address, beds, baths, sqft, url, buttonText}; market_stats {title, stats:[{label,value,change}], footnote}; quote {quote, author, role, avatarUrl}; footer {businessName, businessAddress, tagline, unsubText}. Refused until the footer has a business name and mailing address and no [bracketed] or $— placeholder is left; the refusal names the first. | |
| audience | No | duplicate: copy goes only to people the (sent, email) campaign reached who did not open it. | |
| send_mode | No | ||
| contact_ids | No | add_recipients: up to 500. | |
| template_id | No | create: start a newsletter from this template (newsletter_templates). name defaults to the template name. | |
| scheduled_at | No | Unix seconds. | |
| enrolment_mode | No | 'once' (default) fixes its audience at start. 'ongoing' keeps sending until stop and takes new entrants (re-checked every 5 min). | |
| sending_window | No | { days: [0-6, 0=Sunday], start_hour: 0-23, end_hour: 1-24 (exclusive), timezone?: IANA or 'auto' (account tz) }. Sends due outside the window wait for the next open hour. null = no restriction. | |
| audience_filter | No | { all: [rules], any?: [rules], include_contacts?: [ids] }. all ANDs, any ORs. Rules: {type:"all_contacts"}; {type:"tag",op:"has"|"has_not",value:name}; {type:"behavior",event:"campaign_sent"|"campaign_opened"|"campaign_clicked"|"campaign_replied"|"campaign_bounced",campaign_id,within_days?,inverse?}; {type:"custom_field",field:key,op:"equals"|"not_equals"|"contains"|"gt"|"lt",value}; {type:"last_contacted",op:"gt"|"lt",days}; {type:"status",op?:"is_not",value:[names|"none"]}. include_contacts alone = exactly those people. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, and idempotentHint=false. The description adds material context beyond that: send_now/schedule/resume message real people and require confirmation, create is draft-only, and content is refused until the footer has a business name/address with no placeholders.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Given 15 actions and 20 parameters, the description is compact and front-loads the resource and action list. It is dense but every clause carries action or safety information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, 20-param, nested mega-tool with no output schema, the description covers all actions and critical behavioral warnings. The detailed input schema handles most parameter meaning, though delete semantics and return values are not described.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75% and the schema itself is richly documented, including nested content, steps, audience_filter, and sending_window. The description adds a few action-specific hints (kind=newsletter, template_id) but does not serve as primary parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource ('Email/SMS campaigns and newsletters') and enumerates all 15 actions, giving an agent a precise picture of scope. It never names the sibling campaigns_analytics or templates_manage, so sibling differentiation is only implicit through the action 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?
Action-level guidance is present: 'list (kind=newsletter for newsletters)', 'create (draft; template_id starts a newsletter...)', and a confirmation warning for send_now/schedule/resume. It does not explicitly say when to use this tool versus campaigns_analytics or templates_manage, but the context for each action is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
companies_listList companiesARead-onlyIdempotentInspect
Search companies, or pass id to fetch one in full (employees, deals, addresses, custom fields).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Company id. Returns that one company. | |
| limit | No | Default 50. | |
| offset | No | ||
| search | No | Matches name and website. | |
| deleted | No | List recently deleted companies instead (to restore). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds valuable behavioral detail beyond that: the id-mode returns the company 'in full' including employees, deals, addresses, and custom fields, which tells the agent what data volume/composition to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero waste, front-loading the primary search use case and then the id variant. Every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing what a full fetch contains. Pagination defaults and the exact shape of the list response are left to the schema, which is acceptable, but a note on partial vs. full fields for list mode would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple 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 80%, so the baseline is 3; however the description adds meaning beyond the schema's terse 'Returns that one company' by enumerating the nested data included in id-mode fetches. The `search` and `deleted` params are left to the schema, which is fine at this coverage level.
Input schemas describe structure but not intent. Descriptions should explain 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 (search companies) and explicitly describes the two modes: filtered listing vs. single-company fetch by id. It doesn't mention the companies_manage sibling for write operations, so differentiation is left to the naming convention rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clearly says to pass `id` for a full single record and mentions the `deleted` path for restore scenarios, giving concrete usage contexts. It stops short of naming alternatives such as companies_manage for mutations, so no explicit when-not guidance exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
companies_manageManage companiesADestructiveInspect
Change companies. create (name required; tags by name), update (omitted fields unchanged), delete (soft; confirm first), restore (ids from companies_list deleted).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: update, delete. | |
| ids | No | restore: deleted ids. | |
| city | No | Used by: create, update. | |
| name | No | Required for: create; optional for: update. | |
| tags | No | ||
| notes | No | Used by: create, update. | |
| state | No | Used by: create, update. State or province. | |
| action | Yes | ||
| country | No | Used by: create, update. | |
| website | No | Used by: create, update. Include https://. | |
| industry | No | Used by: create, update. | |
| deletedAt | No | restore: a deleted_at (undoes that whole delete). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotation hints, the description reveals that deletes are soft, that update is partial rather than replacement, and that restore consumes a deletedAt/ids from the list tool. These are meaningful behavioral details an agent needs before invoking a destructiveHint=true tool, and they do 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?
The description is short and front-loaded, with the action list immediately following the purpose and each action carrying only its critical constraint. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter mutation tool with no output schema, the description plus rich schema descriptions and annotations cover the essential action semantics well. It could say more about response behavior or permissions, but the core invocation requirements are 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 high at 83%, and the schema already maps each parameter to actions, so a baseline of 3 is appropriate. The description adds semantic value by clarifying create-specific requirements, partial-update semantics, and the source of restore ids.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource and enumerates the four actions (create, update, delete, restore), so the operation is unambiguous. It distinguishes itself from the read-only sibling only in the restore sentence, referencing companies_list, so sibling differentiation is partial rather than fully explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives per-action conditions: create requires name, update leaves omitted fields unchanged, delete is soft and should be confirmed first, and restore uses deleted ids from companies_list. This is strong action-level guidance, though it does not broadly direct agents to companies_list for lookup before update or delete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_listList contactsARead-onlyIdempotentInspect
Search and filter contacts (tag, status, company, unsubscribed, sort), or id for one in full (tags, addresses, custom fields, recent activity). deleted: to restore. duplicates: to merge.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | One contact by id. | |
| tag | No | Only contacts with this tag (name or id). | |
| sort | No | recent = last contacted. Default name. | |
| limit | No | Default 50. | |
| offset | No | ||
| search | No | Matches name, email, phone. | |
| status | No | Status name or id, or none. | |
| deleted | No | List recently deleted contacts instead. | |
| companyId | No | Only contacts at this company. | |
| duplicates | No | Groups sharing an email or phone instead. | |
| unsubscribed | No | Opted out of any / email / sms, or none. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, idempotent, non-destructive behavior, so the description only needs to add nuance. It usefully explains that `id` returns full details including tags, addresses, custom fields, and recent activity, and that `deleted`/`duplicates` serve restore/merge workflows.
Agents need to know what a tool does to the 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 extremely compact and front-loaded, covering the main search/filter use, the single-contact mode, and the two special result modes in one dense but readable passage. There is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter, read-only listing tool with no output schema, the description covers the important modes and clarifies what `id` returns. It omits pagination defaults and return shape details, but those are largely handled by the schema and annotations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 91%, so the schema already documents most parameters. The description adds meaning beyond the schema by grouping the filter dimensions and clarifying that `id` returns an enriched contact view and that `deleted` and `duplicates` change the result mode.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: search/filter contacts, with special modes for a single `id`, `deleted`, and `duplicates`. It does not explicitly name or contrast with the sibling `contacts_manage`, but the listing/read scope is clear from the wording.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 concrete usage conditions: use `id` for one full contact, `deleted` to restore, and `duplicates` to merge. It does not explicitly state when not to use this tool or name an alternative sibling, but the mode guidance is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
contacts_manageManage contactsADestructiveInspect
Change contacts. create (firstName required; tags by name), update (omitted fields unchanged), delete (soft; confirm first), merge (keepId + mergeIds: duplicates folded in, then deleted; confirm), restore (ids from contacts_list deleted), bulk_update (ids + set {city, source, position, companyId, status} and/or customField).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: update, delete. | |
| ids | No | Required for: bulk_update; optional for: restore. restore: deleted ids. | |
| set | No | bulk_update: { city?, source?, position?, companyId?, status? }. | |
| tags | No | Tag names; missing ones are created. | |
| No | Used by: create, update. | ||
| notes | No | Used by: create, update. | |
| phone | No | Used by: create, update. Normalised to E.164. | |
| action | Yes | ||
| keepId | No | merge: the contact that stays. | |
| status | No | Used by: create, update. Status name; default if omitted. | |
| lastName | No | Used by: create, update. | |
| mergeIds | No | merge: the duplicates folded into it. | |
| position | No | Used by: create, update. Job title. | |
| companyId | No | Used by: create, update. | |
| deletedAt | No | restore: a deleted_at (undoes that whole delete). | |
| firstName | No | Required for: create; optional for: update. | |
| customField | No | bulk_update: { key (field id or key), value }. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotency; the description adds real value beyond that by disclosing that delete is a soft delete, that merge folds duplicates in and then deletes the merged ids, and that both require confirmation. That is exactly the behavior context an agent needs before mutating data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence, front-loaded with the overall purpose, then action-by-action clauses. No filler; every clause carries a rule or constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter, nested-object dispatcher with no output schema, the description covers the action model and the highest-risk semantics (delete/merge confirmation, soft delete, restore source). It's close to complete; only a note on return format or per-action failure behavior would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple 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 94%, so the schema already documents nearly every parameter. The description mostly restates schema facts (firstName required for create, tags by name, keepId/mergeIds roles, set fields) rather than adding syntax or edge-case meaning, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Change contacts') and then concretely delineates each of the six actions. It references the sibling contacts_list contextually ('ids from contacts_list deleted'), but never draws a clean line between managing versus listing — a small gap against a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives actionable conditions per action: confirm before delete, confirm before merge, restore using ids from contacts_list deleted. It tells the agent how to pick an action but doesn't state any when-not to use, or route to siblings like contacts_list/tags_manage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
custom_fields_listList custom fieldsARead-onlyIdempotentInspect
List custom field definitions: field_key (used in {{cf.<field_key>}}), name, type, options, entity_type. mergeTags: true lists every merge tag usable in texts, emails and workflows ({{first_name}}, {{cf.}}…); unknown tags render empty.
| Name | Required | Description | Default |
|---|---|---|---|
| mergeTags | No | List merge tags instead. | |
| entityType | No | Omit for all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds genuine behavioral context beyond that: it names the exact fields each entry contains and warns that "unknown tags render empty," flagging a silent-failure mode an agent would otherwise miss.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler. The core listing behavior is front-loaded, and the secondary mergeTags mode is clearly signposted by name so an agent can branch immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, zero-required, read-only list tool with full schema coverage and no output schema, the description supplies everything needed: what each entry looks like, what the alternate mode returns, and the fallback behavior for unmatched tags.
Complex tools with many parameters or behaviors need more documentation. Simple 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 on mergeTags by explaining what merge tags are, giving concrete syntax examples ({{first_name}}, {{cf.<key>}}) and describing the consequence of an unknown tag. entityType is left to the schema's "Omit for all," which is adequate.
Input schemas describe structure but not intent. Descriptions should explain 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 ("List custom field definitions") and enumerates the returned fields (field_key, name, type, options, entity_type), which is more than the title restates. It does not explicitly contrast with the sibling custom_fields_manage, but the read-only "list" framing makes the split reasonably inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: it describes the two output modes (definitions vs. merge tags) and when mergeTags applies ("usable in texts, emails and workflows"), but there is no explicit statement of when to choose this tool over custom_fields_manage or any other list tool. The agent must infer the read-only listing role.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
custom_fields_manageManage custom fieldsADestructiveInspect
Custom fields on contacts, companies or deals. create (field_key becomes {{cf.}}), update, delete (its values go too; confirm first), set_value (one record's value).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: update, delete. | |
| name | No | Required for: create; optional for: update. Label, e.g. "Loan amount". | |
| type | No | ||
| value | No | ||
| action | Yes | ||
| options | No | Used by: create, update. Required for type select. | |
| entityId | No | ||
| fieldKey | No | Required for: set_value; optional for: create. snake_case, max 60 chars. | |
| position | No | Lower sorts first. | |
| entityType | No | Required for: create, set_value. |
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 the crucial detail that deleting a field also destroys its stored values, plus an explicit confirmation instruction. The {{cf.<key>}} template syntax on create is genuinely non-obvious context. It stops short of covering permissions or idempotency of set_value, so not a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence with parentheticals per action — no filler, and the entity scope is front-loaded. It is compact enough that the parenthetical caveats are the only slight readability 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 10-parameter mutation tool with no output schema, the description covers the destructive path and the create template semantics, while required-parameter mapping per action is fully handled by the schema. It does not describe what set_value returns or whether updates to type affect existing values, which would be the remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%; the schema itself labels id, name, fieldKey, options, entityType and position as to which actions need them. The description adds meaning only for fieldKey (becomes {{cf.<key>}}) and value (one record's value). Parameters like type, entityId and value have no description text in either place, so it adds marginal value over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource (custom fields on contacts, companies, deals) and enumerates the four operations (create, update, delete, set_value), which cleanly separates it from the sibling read tool custom_fields_list. The lead is a noun phrase rather than a verb, so it is slightly less crisp than an ideal verb+resource statement, but the action list removes ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives per-action guidance: delete says 'confirm first', create explains the field_key placeholder, and set_value is scoped to 'one record's value'. It never states the inverse (use custom_fields_list to read fields), but the action enumeration makes the split with the list sibling inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dashboard_summaryDashboard summaryARead-onlyIdempotentInspect
KPI summary: contact count, open and won deals with totals, messages sent/received, plus a 30-day series. pipeline: true for open deals per stage (count and value).
| Name | Required | Description | Default |
|---|---|---|---|
| pipeline | No | Per-stage open deals instead. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuine value not present in structured fields by disclosing the computed payload (counts, deal totals, message counts, 30-day series) for a tool with no output schema. It omits account scoping and whether the 30-day window is configurable or relative to now.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the 'KPI summary' label so the agent sees the tool's nature immediately. The telegraphic, comma-spliced style and the unspecified '30-day series' cost a point but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only tool with rich annotations and no output schema, the description does the main remaining job: telling the agent what numbers come back. Gaps are minor but real—what the 30-day series measures, and whether results are scoped to the whole account or a workspace/user.
Complex tools with many parameters or behaviors need more documentation. Simple 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 single `pipeline` parameter is already documented as 'Per-stage open deals instead.'. The description adds only a mild clarification that per-stage results include both count and value. That is a small increment over the schema, consistent with the baseline 3 for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (a KPI dashboard summary) and enumerates the exact metrics returned: contact count, open/won deals with totals, messages sent/received, and a 30-day series. That is specific enough to separate it from the *_list siblings, which return records rather than aggregates. It stops short of explicitly contrasting itself with a sibling such as deals_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?
There is no statement of when to call this versus the many list tools (contacts_list, deals_list, sms_list) that could supply the same underlying data in raw form. The only conditional guidance is the 'pipeline: true' note, which describes a mode switch rather than tool selection. An agent must infer from 'summary' that this is the overview/aggregation entry point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deals_listList dealsARead-onlyIdempotentInspect
List deals with stage, value, contact and company, or pass id to fetch one deal with its notes and tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | One deal. | |
| limit | No | ||
| offset | No | ||
| search | No | Title, contact or company. | |
| deleted | No | Recently deleted (to restore). | |
| stageId | No | From deal_stages_list. | |
| companyId | No | ||
| contactId | No | ||
| pipelineId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so safety is covered. The description adds one real behavioral fact beyond that — that id-mode expands the payload to include notes and tasks — but says nothing about pagination limits, default page size, or ordering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with two clauses, each carrying distinct information (list mode vs. id mode). No filler, no restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter read tool with no output schema, the description covers the mode switch but not result shape, pagination behavior, or whether filters combine conjunctively. Adequate to call it, not complete enough to predict what comes back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 44%, so the description needs to carry weight. It clarifies the most consequential parameter (`id` switches from list to detail mode with nested notes/tasks) and hints at stage/contact/company filtering, but leaves limit, offset, pipelineId, companyId, contactId and deleted entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (deals), and importantly discloses a second mode: passing `id` returns a single deal with notes and tasks. That dual-mode description lets an agent distinguish the read path from deals_manage, though it never names the sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives one concrete routing rule ('pass `id` to fetch one deal'), which is genuinely useful. But there is no guidance on when to use this versus deals_manage, or how to combine filters, so usage is only partially implied rather than spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deals_manageManage dealsADestructiveInspect
Change deals. create (title and stageId from deal_stages_list), update (stageId moves it; omitted fields unchanged), delete (soft; confirm first), restore (ids from deals_list deleted).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: update, delete. | |
| ids | No | restore: deleted ids. | |
| notes | No | Used by: create, update. | |
| title | No | Required for: create; optional for: update. | |
| action | Yes | ||
| closeAt | No | Used by: create, update. Expected close date, YYYY-MM-DD or ISO 8601. | |
| stageId | No | Required for: create; optional for: update. | |
| companyId | No | Used by: create, update. | |
| contactId | No | Used by: create, update. | |
| deletedAt | No | restore: a deleted_at (undoes that whole delete). | |
| lostReason | No | ||
| valueCents | No | Used by: create, update. In the account's default currency (deals have no currency of their own). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false; the description adds real substance beyond them: delete is a soft delete, update leaves omitted fields unchanged, stageId assignment moves the deal between stages, and restore via deletedAt undoes an entire prior delete. Remaining gaps are permissions requirements and pagination/return behavior for create.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence organized by action, with the highest-risk operation (delete) flagged inline rather than buried. No filler, and the action list is front-loaded right after the verb.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter destructive mutation tool with no output schema, the description covers action selection and the delete/restore lifecycle well but omits what create returns (the new id), whether delete accepts only a single id, and never mentions lostReason or valueCents semantics. Adequate, not 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 83%, so the schema already documents most parameters including their action applicability. The description adds only marginal semantics ('stageId moves it', 'ids from deals_list deleted') and says nothing about lostReason or the currency implication of valueCents.
Input schemas describe structure but not intent. Descriptions should explain 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 broad verb ('Change deals') but immediately enumerates the four supported operations (create/update/delete/restore), which pins the resource down. It also distinguishes itself from siblings by naming deal_stages_list as the source of stageId and deals_list as the source of restore ids, so the agent knows this is the write counterpart to those readers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action carries a short usage cue: create needs title and stageId from deal_stages_list, restore takes ids from deals_list deleted, delete is soft and should be confirmed first. That is clear per-action context, though there is no explicit 'do not use this for X, use sibling Y instead' exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deal_stages_listList deal stagesARead-onlyIdempotentInspect
List pipelines, their stages (stage pipeline_id) and contact statuses. Call before creating or moving a deal.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so safety is covered. The description adds the useful behavioral fact that the returned data includes the pipeline_id linkage on stages and that this is a prerequisite call before deal creation or movement — real context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, and the content description is front-loaded ahead of the call-to-action guidance. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates what comes back (pipelines, stages, contact statuses) and when to call it, which is enough to invoke correctly. A brief note on response shape or ordering would push it higher, but nothing essential is missing for a zero-parameter read 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?
The tool takes no parameters, so the schema-coverage baseline of 4 applies; there is nothing for the description to disambiguate. The parenthetical '(stage pipeline_id)' hints at the structural relationship in the payload but is not a parameter concern.
Input schemas describe structure but not intent. Descriptions should explain 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 enumerates the resources returned: pipelines, their stages, and contact statuses. It is clear what the tool returns, though the parenthetical '(stage pipeline_id)' is terse and it does not explicitly differentiate itself from the sibling deal_stages_manage or deals_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?
'Call before creating or moving a deal' gives a concrete triggering condition that an agent can act on without inference. It stops short of naming the alternative tool (deal_stages_manage) or stating when not to call it, so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deal_stages_manageManage deal stagesADestructiveInspect
Pipeline stages. create (isWon / isLost mark the end stages), update (by id, or order: every stage id left to right), delete (deals in it need reassignTo; never the last stage; confirm first).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: delete; optional for: update. | |
| name | No | Required for: create; optional for: update. | |
| color | No | Used by: create, update. Hex, e.g. "#0EA5E9". | |
| isWon | No | ||
| order | No | Every stage id, in order. | |
| action | Yes | ||
| isLost | No | ||
| position | No | Zero-based order. | |
| pipelineId | No | ||
| reassignTo | No | delete: the stage its deals move to. | |
| probability | No | Used by: create, update. Win %, for the forecast. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, and the description reinforces this with real operational constraints beyond them: delete cannot remove the last stage, deals in a deleted stage must be reassigned via reassignTo, and the caller should confirm first. It stops short of saying whether reordering via `order` rewrites every stage at once or what permissions are required.
Agents need to know what a tool does to the 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 action clauses in one sentence, front-loaded with the resource and no filler. The telegraphic fragments ('never the last stage; confirm first') trade a little readability for density but every clause carries an operational fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 11-parameter destructive mutation tool with no output schema, the description covers the risky paths (delete constraints, reassignment) well but omits how `pipelineId` scopes the operation and how `order` interacts with `position`. An agent could still pick the wrong reordering parameter without opening the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 64%, and the description does add meaning the schema lacks for isWon/isLost ('mark the end stages') and clarifies that `order` takes every stage id left to right. However, it leaves the relationship among `order`, `position`, and `pipelineId` unexplained, and parameters like `probability` and `color` are covered only by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening 'Pipeline stages' plus the create/update/delete action list states a specific resource and verb set, so an agent knows this mutates stage configuration rather than reading it. It never names the sibling deal_stages_list, so the read-vs-manage distinction is only implied by the 'manage' suffix.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action carries a condition: create uses isWon/isLost to mark end stages, update goes 'by id, or `order`: every stage id left to right', and delete requires reassignTo and 'confirm first'. That is concrete when-to-do-what guidance, though it never points to deal_stages_list for read-only lookups or deals_manage for the deals being reassigned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
documents_manageManage documentsADestructiveInspect
Documents sent for signing. list (status/contactId), get (id: signers + history), templates (saved forms and their signer roles), send (a template; emails each signer, confirm first), remind (email whoever is due to sign; confirm first), void (cancel a waiting one for good). Statuses: sent = waiting, completed = signed by all, declined, voided.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | get / remind / void: the document id. | |
| title | No | send: defaults to the template name. | |
| action | Yes | ||
| reason | No | void: why (kept in the history). | |
| status | No | list: sent | completed | declined | voided | |
| message | No | send: shown in the email; defaults to the template's. | |
| ordered | No | send: sign one after another in role order (the user last). | |
| signers | No | send, several roles: { role, contactId } or { role, name, email }. | |
| signerId | No | remind: just this signer. | |
| contactId | No | list: documents this contact was sent. send: who signs (one signer role). | |
| templateId | No | send: the template. With one signer role pass contactId; with several pass signers. A role marked is_sender is the user and fills itself. Contacts need an email. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive=true, openWorld=true, idempotent=false, and readOnly=false. The description adds valuable behavioral context: send emails each signer, remind emails whoever is due, void cancels for good, and send/remind require confirmation first. It does not discuss permissions or rate limits, but it meaningfully extends the annotation profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, opening with the resource scope and then packing each action into a short parenthetical. No sentence is wasted, and the action list remains 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?
For a six-action, eleven-parameter tool, the description covers all actions and important status semantics. It is somewhat thinner on return values and pagination, but it gives enough context for correct invocation given the schema's high coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 91%, and the description adds action-parameter mapping plus status meanings such as sent=waiting and completed=signed by all. It reinforces which parameters belong to which action, though it does not add syntax details beyond the already rich schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource precisely as documents sent for signing and enumerates every action (list, get, templates, send, remind, void). This gives an agent a clear verb-plus-resource picture and the action vocabulary needed to select the tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action is paired with its operational purpose: list by status/contactId, get signers and history, templates for saved forms, send to email signers, remind due signers, and void a waiting document. It does not explicitly compare against sibling tools such as templates_manage or state when not to use this tool, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_readRead emailARead-onlyIdempotentInspect
Read email. threads (the inbox list, filter by folder / search / account), thread (threadKey: its messages; messageId: one full body), accounts (the mailboxes and send-as addresses email_send can use). Reading does not mark anything read.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 25, max 100. | |
| action | Yes | ||
| before | No | For older conversations: the `next_before` from the previous answer. | |
| folder | No | Default: all. | |
| search | No | Matches subject, sender and message text. | |
| account | No | Mailbox id from email_accounts_list. Default: all. | |
| messageId | No | Fetches that message's body (slower; only when the snippet is not enough). | |
| threadKey | No | The `thread_id` from email_list_threads. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, and non-destructive, so the bar is lower. The description still adds a genuinely useful trait beyond them: 'Reading does not mark anything read,' which tells the agent there is no read-status side effect. It stops short of describing result shape or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Terse and front-loaded: the core verb leads and the three action clauses follow in a single compact span with no filler. The dense parenthetical phrasing is slightly cryptic on first read but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 parameters, no output schema, and one required field, the description covers what each action does and the key non-side-effect trait. Because there is no output schema, the return shape (thread list fields, pagination cursor `next_before`) is only partially conveyed through the schema's `before` description, leaving a small 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 88%, so baseline is 3, but the description earns more by mapping each enum value of `action` to a distinct meaning and clarifying that `messageId` returns one full body versus `threadKey` returning the thread's messages. The action values themselves carry no per-value description in the schema, so this is real added value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the verb (read) and resource (email), then enumerates the three concrete actions with their scopes: threads = inbox list, thread = a thread's messages or one full body, accounts = mailboxes and send-as addresses. This lets an agent distinguish the tool from email_send and email_thread_update without opening the schema. It does not explicitly name a competing sibling for read-like operations, which keeps it just below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when each action is appropriate (threads for listing, thread for a conversation, accounts for send-as addresses) and the schema adds 'only when the snippet is not enough' for messageId. However, there are no explicit when-not rules or named alternatives among the read siblings, so usage must be inferred from the action enumeration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_sendSend an emailAInspect
Send a real email from the user's connected mailbox (default: the oldest one). Give bodyHtml and/or bodyText. Pass contactId so merge tags resolve and the email threads to that contact. At most 50 recipients (to+cc+bcc); a list is a campaign. One-to-one mail ignores the campaign suppression list. Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| cc | No | ||
| to | Yes | Address or comma-separated list. | |
| bcc | No | ||
| subject | Yes | ||
| bodyHtml | No | ||
| bodyText | No | ||
| fromName | No | ||
| accountId | No | Sending mailbox, from email_accounts_list. | |
| contactId | No | ||
| fromEmail | No | Send-as alias registered on that mailbox; others are refused (INVALID_FROM). | |
| trackOpens | No | Adds an open-tracking pixel (approximate). | |
| scheduledSendAt | No | Future ISO 8601 time to send at. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: this sends a real external message, defaults to the oldest connected mailbox, has a hard 50-recipient ceiling, and one-to-one mail bypasses the campaign suppression list — a behavior an agent would otherwise get wrong. The instruction to confirm with the user before sending is exactly the safety context the annotations (destructiveHint=false) do not supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five short sentences, each carrying a distinct constraint (mailbox default, body pairing, contactId effect, recipient cap, suppression bypass, confirmation). The most consequential facts — real send and user confirmation — are not buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter outbound-send tool with no output schema, the description covers the decisions that matter: which mailbox, how to supply the body, recipient limits, and confirmation. It does not say what is returned (message id) or how scheduling interacts with the confirmation requirement, a minor gap given 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?
With schema coverage at 42%, the description compensates by explaining that bodyHtml and bodyText are alternatives, that contactId drives merge-tag resolution and threading, and that to/cc/bcc share a 50-address budget. It leaves fromName and the cc/bcc/subject fields undocumented beyond their names, so the compensation is strong but not 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?
States a specific verb and resource ('Send a real email') plus the sending context ('from the user's connected mailbox, default: the oldest one'), which an agent could not infer from the name. The line 'a list is a campaign' draws the boundary against campaign-style sending in the sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete preconditions: supply bodyHtml and/or bodyText, pass contactId for merge tags and threading, stay within 50 recipients, and confirm with the user first. It signals that a recipient list becomes a campaign rather than naming campaigns_manage as the alternative, so routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_thread_updateUpdate an email threadBIdempotentInspect
Mark an email conversation read or unread, or move it to inbox, sent or archive.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | move: where it goes ("inbox" also un-archives). | |
| isRead | No | mark: true = read, false = unread. | |
| threadKey | Yes | The `thread_id` from the thread list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds the useful behavioral detail that this is a state toggle/refile rather than a content edit, but it omits what happens when both fields are supplied, whether a move is reversible, and what a successful response looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no filler, and the two capabilities are front-loaded. It is slightly compressed in that the two modes ('mark' vs 'move') are fused into one clause rather than separated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation with full schema coverage and no output schema, the description covers the essential behavior. It still leaves gaps an agent would want: behavior when no optional field is provided, and confirmation of what the tool returns after the update.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter already carries its own description including the enum meanings and the 'inbox also un-archives' note. The description mirrors those concepts at a high level but contributes no syntax, defaults, or interaction rules beyond the schema, which is the baseline-3 case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (an email thread/conversation) and two concrete operations (mark read/unread, move to a folder), so the agent knows exactly what state changes are possible. It does not, however, contrast itself with the nearby email_read sibling, so sibling differentiation is left to the 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?
Usage is only implied by the operation list: an agent can infer 'call this to flip read state or refile a thread.' There is no explicit when-not guidance, no statement that it acts on an existing thread identified by threadKey, and no pointer to email_read for retrieving content instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forms_manageManage formsADestructiveInspect
Lead-capture forms with a public link; each submission creates or updates a contact. action: list | templates | get (id) | create (name?, templateId?) | update (id + changes) | delete (id; the link stops working; confirm) | submissions (id; latest 200).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Form id. | |
| name | No | ||
| tags | No | Tag names put on each new lead (max 10). Replaces the list. | |
| intro | No | ||
| style | No | Colours "#rrggbb". {} = default look. Replaces the style. | |
| title | No | ||
| action | Yes | ||
| fields | No | [{ key, label, type: text|email|phone|textarea|select|address|date|checkbox|hidden|section, required?, options? (select), default? (hidden), text? (section) }]. Keys name, first_name, last_name, email, phone fill the contact. hidden = ?<key>= on the link. Replaces the list. | |
| createTask | No | Also make a follow-up task per submission. | |
| templateId | No | From action templates. | |
| redirectUrl | No | After submit, go here ("" = successMessage). | |
| submitLabel | No | ||
| successMessage | 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 partly pre-supplied. The description still adds genuine value beyond them: forms are publicly linked, submissions write to contacts, delete breaks the public link and requires confirmation, and submissions returns only the latest 200 — a real behavioral constraint not encoded anywhere else. It doesn't say what 'update' does to unspecified fields or what permissions are needed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-liner plus a compact action grammar with zero filler; every clause carries information. The terse 'create (name?, templateId?)' / 'update (id + changes)' notation is efficient but slightly ambiguous about which of the 13 fields 'changes' covers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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, no-output-schema, destructive tool, the description covers action routing, the write side effect on contacts, the delete consequence and the submissions cap. Remaining gaps (return shapes for list/get, required field structure, pagination) are modest but present given no output schema exists to cover them.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Description maps parameters to actions (id for get/delete/submissions, name+templateId for create, id+changes for update), which the schema does not do on its own. At 54% schema coverage, several params (tags, fields, style, createTask, redirectUrl) rely on schema text, and the description gives no additional meaning for them, so it stops at a solid 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (lead-capture forms), the key mechanism (public link) and the side effect (each submission creates or updates a contact), then enumerates every action verb. An agent can immediately tell this apart from siblings like campaigns_manage or contacts_manage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 action grammar doubles as usage guidance: 'templates' is implicitly the source of templateId, 'get' vs 'submissions' vs 'list' are distinguished by argument, and delete carries an explicit warning ('the link stops working; confirm'). It doesn't name alternatives or state exclusions, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inbound_webhooks_manageManage inbound webhooksADestructiveInspect
Inbound webhooks: URLs other services POST to so Groundbase creates contacts, deals, tasks etc. action list | get | create | update | delete. create returns the full URL with its token ONCE (tell the user; it cannot be shown again). delete stops the URL accepting posts immediately; confirm first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | For get/update/delete. | |
| name | No | Required on create. | |
| action | Yes | ||
| isActive | No | Update only; false pauses receiving. | |
| description | No | ||
| ipAllowlist | No | CIDRs. Empty = any IP. | |
| mappingJson | No | For mappingMode "mapped": { "actions": [{ "event": "contact.find_or_create" (or another native event), "fields": { "<groundbase_field>": "<path.in.payload>" }, "static": { "<groundbase_field>": <literal> } }] }. Paths are dotted with optional indices ("lead.contact[0].email"); missing paths are omitted. | |
| mappingMode | No | Default native. | |
| signingSecret | No | Optional HMAC secret (create only); senders send X-Groundbase-Signature. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare destructiveHint=true, but the description adds critical behavioral facts an agent could not infer: create returns the full URL with token exactly ONCE and it cannot be shown again, and delete takes effect immediately. These are exactly the kind of consequences 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?
It's dense and front-loaded: definition first, then the action list, then the two highest-stakes behavioral warnings. No sentence is filler and the warning that the URL can't be shown again is placed prominently.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly spends words on what create returns and what delete does. It's slightly thin on what get/list return, but for a 9-parameter tool with a rich schema, an agent has enough 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 78%, near the high-coverage baseline, and the schema itself documents id, name, isActive, ipAllowlist, mappingJson and signingSecret in detail. The description only paraphrases the action enum and does not add meaning about ipAllowlist, mappingMode, or signingSecret beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and mechanism—'URLs other services POST to so Groundbase creates contacts, deals, tasks'—which immediately distinguishes it from the sibling outbound_webhooks_manage. An agent knows exactly what this tool manages without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It enumerates the action verbs and gives a clear conditional instruction for destructive use ('delete stops the URL accepting posts immediately; confirm first'). What's missing is an explicit pointer to outbound_webhooks_manage for the opposite direction, so it's clear context but not full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoice_items_manageManage invoice itemsADestructiveInspect
Saved invoice items (services / products). list (with price per currency), save (create, or edit by id; prices are decimal strings), delete (invoices keep their lines).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: delete; optional for: save. Edit this item. | |
| name | No | Required to create. | |
| action | Yes | ||
| prices | No | Chosen prices per currency, e.g. { "CAD": "150.00" }; others convert from base. | |
| unitLabel | No | e.g. "hour". | |
| unitPrice | No | In base currency, with its decimal places ("200.00"; JPY "15000"). | |
| description | No | ||
| baseCurrency | No | Create only. ISO 4217, default USD. | |
| defaultTaxRate | No | Percent, e.g. "17.5". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose destructiveHint=true and idempotentHint=false, so the bar is lower; the description still adds real context by stating that deleting an item does not remove lines already on invoices, and that save without id creates versus with id edits. It does not say whether edits are reversible, what happens to items referenced by templates, or anything about permissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence leads with the resource then breaks each action into a parenthetical clause — front-loaded and essentially waste-free. The telegraphic compression makes it dense to parse on first read, which keeps it just under 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 a 9-parameter, nested-object mutation tool with no output schema, the description covers the action semantics and delete side effects but omits what list returns (item shape, currency interpolation), how defaults like baseCurrency apply across actions, and the non-idempotency implication of save. Adequate to invoke, incomplete for confident use.
Complex tools with many parameters or behaviors need more documentation. Simple 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 78%, so the schema already documents id, name, prices, unitPrice, baseCurrency and defaultTaxRate. The description only restates that prices are decimal strings and that save needs an id to edit, adding little beyond the structured fields; it says nothing about the nested prices object's conversion semantics or the relationship between unitPrice and prices.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely ("saved invoice items (services / products)") and enumerates the three supported actions with their effect, which lets an agent separate it from invoices_manage or invoice_payments_manage. It stops short of explicitly stating the boundary against those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action carries its use condition: list returns prices per currency, save is create-or-edit-by-id, delete removes the item but leaves existing invoice lines intact. No exclusions or named alternatives (e.g., editing a line on an existing invoice via invoices_manage) are given, which keeps it a step below 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoice_payments_manageManage invoice paymentsADestructiveInspect
record (a payment taken outside Stripe; emails a receipt, confirm first) or reverse (paymentId; undoes a recorded payment). Card refunds are done in the app.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | ||
| action | Yes | ||
| amount | No | Decimal string in the invoice currency. | |
| method | No | ||
| sendVia | No | How the receipt is sent. Default: their own mailbox, then Resend, then Groundbase's address. | |
| invoiceId | No | ||
| paymentId | No | ||
| reference | No | Cheque number or transfer reference. | |
| receivedAt | No | ISO date. Default now. | |
| sendReceipt | No | Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and openWorldHint=true; the description adds the important unwritten detail that 'record' sends an outbound receipt email (external side effect requiring confirmation) and that 'reverse' undoes a recorded payment, effectively pinpointing which action is destructive. It does not say whether reversal is reversible or what happens to the receipt already sent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with the two actions front-loaded and the exclusion trailing; nothing is wasted. The parenthetical density is high enough that it reads as shorthand, but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with no output schema, the description should say which inputs each action requires (e.g. record needing invoiceId and amount). It covers side effects and the reverse path but leaves the record path's required inputs and any response/return behavior 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 coverage is 50%: amount, sendVia, reference, receivedAt, and sendReceipt are described in the schema, while notes, method, invoiceId, paymentId, and action are not. The description compensates for paymentId ('paymentId; undoes a recorded payment') and the action enum, but leaves invoiceId, amount, and method unaddressed for the record path.
Input schemas describe structure but not intent. Descriptions should explain 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 two specific verbs with their resources and parenthetical semantics: 'record (a payment taken outside Stripe...)' and 'reverse (paymentId; undoes a recorded payment)'. It also scopes out card refunds ('done in the app'), which distinguishes it from invoices_manage and refund-adjacent siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the condition selecting each action and an explicit exclusion boundary ('Card refunds are done in the app'), plus a caution to 'confirm first' before the receipt email fires. It doesn't name a sibling tool as the alternative, but the app-boundary exclusion is a clear when-not signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoice_settingsInvoice settingsAIdempotentInspect
Invoice settings: business details on invoices and receipts, payment instructions, numbering. get, or set (omitted fields unchanged; nextNumber only moves forward).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| nextNumber | No | ||
| businessName | No | ||
| defaultNotes | No | ||
| numberPrefix | No | e.g. "INV-", max 16 chars. | |
| businessEmail | No | ||
| businessPhone | No | ||
| businessTaxId | No | ||
| numberPadding | No | Min digits 1-12. | |
| businessAddress | No | ||
| defaultCurrency | No | ||
| defaultTermsDays | No | ||
| defaultTermsText | No | ||
| paymentInstructions | No | How to pay (bank details, link). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the bar is lower, and the description still adds two non-obvious behaviors: set is a partial merge where omitted fields are preserved, and nextNumber is monotonic ('only moves forward'). What it omits is any statement about what 'get' returns or how numbering interacts with existing invoices.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences: the resource scope first, then the action model and the two behavioral rules in parentheses. No filler, and the most decision-relevant constraints are packed into the trailing clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 14 parameters, no output schema, and thin schema descriptions, an agent still cannot tell what 'get' returns or how most fields behave (required formats, currency codes, whether empty string clears a field). The mutation semantics are well covered; the read-side and per-field details are not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 21% across 14 parameters, so the description carries a real burden. It partially compensates by grouping the parameters into business details, payment instructions, and numbering, and by explaining the semantics of nextNumber and omitted fields — but the majority of parameters (currency, terms, address, prefix/padding) get no additional meaning beyond their names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource (invoice settings) and enumerates the content domains it governs — business details on invoices/receipts, payment instructions, numbering — plus the two supported actions (get/set). It reads clearly as a settings singleton, distinct from invoices_manage and invoices_list, although it never names those siblings 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 get/set pair is stated and the partial-update rule ('omitted fields unchanged') tells the agent how to call a set, but there is no guidance on when to reach for this versus invoices_manage or sending_settings. Usage is implied by the action enum rather than explained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_listList invoicesARead-onlyIdempotentInspect
List invoices (filter by customer, status, text; outstanding totals per currency), or id for one with lines, charges and amount paid. With id: payments (ledger), creditNotes, or recurring. report: aging | revenue | tax, from/to YYYY-MM-DD.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Matches number and customer. | |
| id | No | One invoice. | |
| to | No | ||
| from | No | ||
| limit | No | Default 100. | |
| offset | No | ||
| report | No | ||
| status | No | draft | issued | partially_paid | paid | void | |
| payments | No | With id: its payment ledger. | |
| companyId | No | ||
| contactId | No | ||
| recurring | No | With id: its repeat schedule. | |
| creditNotes | No | With id: its credit notes. | |
| outstanding | No | Only invoices with money still owed. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuine beyond-schema behavior: list mode returns outstanding totals per currency; `id` mode returns lines, charges and amount paid; sub-resource flags (payments/creditNotes/recurring) are only meaningful when `id` is supplied. That is real depth the annotations do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Compact with no filler, but the fragmentary, semicolon-and-parenthetical style ('With id: payments (ledger), creditNotes, or recurring.') makes a three-mode tool harder to parse than a short bulleted breakdown would. Front-loaded, yet the compression costs readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter, three-mode, no-output-schema tool, the description explains the modes and key return payloads but omits how to choose among the several filter parameters, pagination semantics, and what each report actually returns. Adequate as a map, insufficient as a manual.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 57% schema coverage, the description compensates partially: it clarifies that `id` returns lines/charges/amount paid, that payments/creditNotes/recurring are 'with id' modifiers, and that `from`/`to` take YYYY-MM-DD in report mode — detail absent from the schema. But `companyId`, `contactId`, `limit`, `offset` and the exact `q` vs customer-filter distinction remain undocumented in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (invoices) and enumerates three distinct modes: filtered list, single-invoice-by-id, and reports. A reader can distinguish it from invoices_manage, but the telegraphic phrasing ('or `id` for one with lines, charges and amount paid') blurs the boundary between 'list' and 'fetch one' rather than stating it cleanly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 implicitly signals mode selection (use `id` for a single invoice, `report` for aging/revenue/tax, otherwise list with filters), but never states when to prefer this over invoices_manage or invoice_payments_manage, nor any prerequisites. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invoices_manageManage invoicesADestructiveInspect
Invoices. save_draft (create, or edit by id), issue (numbers it; final), send (emails it; confirm), void, public_link (a pay link; revoke), credit_note (amount + reason; final), send_credit_note / void_credit_note (creditNoteId), recurring (frequency + nextRunDate, autoSend emails each; stop). Confirm anything final or sent.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: issue, send, void, public_link, credit_note, recurring; optional for: save_draft. Edit this draft. | |
| to | No | Default: profile billing email, then the contact's email. | |
| stop | No | recurring: end the schedule. | |
| lines | No | itemId (saved item) or name + unitPrice. Decimal strings. taxIds: which of the taxes apply (default all). | |
| notes | No | ||
| taxes | No | [{id?,name,rate}], e.g. GST 5 + QST 9.975 (ids t1,t2…). | |
| terms | No | ||
| action | Yes | ||
| amount | No | credit_note: before tax, e.g. "50.00". | |
| reason | No | credit_note: printed on it. | |
| revoke | No | public_link: turn the link off. | |
| charges | No | Below the subtotal (shipping); negative for a discount or deposit. | |
| dueDate | No | YYYY-MM-DD. Default from profile terms. | |
| endDate | No | recurring: YYYY-MM-DD, or omit for no end. | |
| message | No | A note above the invoice in the email. | |
| sendVia | No | Default: their own mailbox, then Resend, then Groundbase's address. | |
| subject | No | Default: the invoice settings subject. | |
| taxRate | No | credit_note: percent, e.g. "13". | |
| autoSend | No | recurring: email each copy to the customer. Confirm with the user. | |
| currency | No | ISO 4217. Defaults from the billing profile. | |
| companyId | No | ||
| contactId | No | Create: one of contactId/companyId. | |
| frequency | No | ||
| issueDate | No | YYYY-MM-DD. Default today. | |
| nextRunDate | No | recurring: YYYY-MM-DD, today or later. | |
| confirm_paid | No | Void even though payments or credit notes are recorded on it. Only after the user has confirmed. Default false. | |
| creditNoteId | No | Required for: send_credit_note, void_credit_note. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, and idempotentHint=false, so the safety profile is present. The description adds meaningful behavioral context: issue and credit_note are final, send emails the invoice, recurring auto-sends email copies, public_link can be revoked, and final or sent actions require confirmation. It does not explain void's downstream effects or return behavior, but the added confirmation/finality guidance is substantial.
Agents need to know what a tool does to the 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 extremely compact, front-loads the resource, and then lists each action with only the essential distinguishing note. Every phrase earns its place, even with nine actions and 27 parameters behind it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, destructive, nine-action tool, the description covers the full action surface and calls out confirmation for final or sent operations. The detailed param schema and annotations fill most remaining gaps, though the description does not explain return values or some void/send side effects. It is complete enough to call correctly, with minor room for richer context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is high at 81%, so the schema already carries most parameter meaning. The description consolidates action-to-parameter mappings such as credit_note using amount and reason, send_credit_note using creditNoteId, and recurring using frequency and nextRunDate, but those mappings are largely repeated from the parameter descriptions 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?
The description names the resource and enumerates every action with a short verb-level gloss: save_draft creates or edits, issue finalizes, send emails, void, public_link, credit_note, recurring, and stop. This makes the tool's purpose unambiguous even without opening the schema. It does not explicitly distinguish itself from invoices_list, but the action set clearly signals mutation rather than listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parentheticals give clear action-selection context, such as save_draft for create/edit, issue for final numbering, send for emailing, revoke for public_link, and stop for recurring. The closing instruction 'Confirm anything final or sent' is an explicit operational guideline. It does not name sibling alternatives or say when not to use the tool, 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.
meetings_bookBook a meetingAInspect
Book a contact into a meeting type. slots: open times (from/to YYYY-MM-DD optional). book: startAt (ISO) + contactId, or name with email/phone. Prefer an open slot; if the user asks, any future time works, outside hours or notice. Emails them a confirmation (texts if set up); confirm with the user first. A clash returns booked:false + conflicts; retry with allowOverlap only if the user agrees.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | slots: last date, inclusive. | |
| from | No | slots: first date, YYYY-MM-DD in the meeting type's timezone. | |
| name | No | book, no contactId: who. Same-name contacts come back to ask about. | |
| No | |||
| phone | No | ||
| action | Yes | ||
| startAt | No | book: ISO 8601, any future time. | |
| contactId | No | book: the contact. Their email/phone are used. | |
| newContact | No | book: not that contact. | |
| allowOverlap | No | book: over something already on the calendar. | |
| meetingTypeId | Yes | From meeting_types_list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by disclosing the external side effect (an email confirmation is sent, SMS if configured) and the failure shape (a clash returns booked:false + conflicts). It also flags the user-confirmation requirement and the constrained retry path, which an agent could not infer from readOnly:false / destructive:false alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Eleven parameters are covered in five dense sentences with the primary action front-loaded and the mode prefixes ("slots:", "book:") making it scannable. No sentence is filler; the telegraphic style costs a little readability but maximizes information density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-param, non-idempotent, open-world write tool with no output schema, the description covers side effects, conflict handling, and consent requirements. The remaining gap is the success return shape (what a confirmed booking yields) and the exact semantics of newContact, which neither description nor schema fully pins down.
Complex tools with many parameters or behaviors need more documentation. Simple 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 73%, so the schema does most of the work, but the description adds genuinely new semantics: the contactId OR name+email/phone alternative path for identifying the contact, and the from/to date format scoping for slots. It stops short of explaining newContact or the allowOverlap/conflicts interaction in detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Book a contact into a meeting type" is a specific verb+resource, and the description immediately separates the two modes of operation (slots vs book) so an agent knows this tool both reads availability and writes a booking. It does not name the related sibling meeting_types_list/meeting_types_manage, so differentiation from those is left to the schema's "From meeting_types_list" hint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Offers real conditional guidance: prefer an open slot, any future time only if the user asks, allowOverlap only with user agreement, and confirm with the user before proceeding. These are clear when-to/when-not rules for the internal modes, though no alternative tool is named for cases where the booking should not happen here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meeting_types_listList meeting typesARead-onlyIdempotentInspect
List booking meeting types (the public links people book through): name, slug, duration, availability, questions. Also says whether Google Calendar is connected, since its busy times are kept free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, non-destructive, and closed-world, so the bar is lower. The description still adds useful context by naming the returned fields and explaining that Google Calendar connection status is included because busy times are kept free.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core action and resource. The parenthetical gloss and the Google Calendar explanation both earn their place by clarifying what the tool returns.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only list tool with no output schema, the description provides enough detail about the returned content to call it correctly. It could be slightly more complete by noting whether all meeting types are returned or by explicitly contrasting with meeting_types_manage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema itself is trivial and the baseline is 4. The description does not need to explain parameter behavior and appropriately does not attempt to.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists booking meeting types, with a helpful gloss ('the public links people book through') and the key fields returned. It does not explicitly distinguish itself from the sibling meeting_types_manage tool, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb 'List' and the read-only nature of the operation, but there is no explicit guidance on when to use this versus meeting_types_manage or meetings_book. No prerequisites or exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
meeting_types_manageManage meeting typesADestructiveInspect
Booking meeting types (the public links). create (name, slug, and any of the fields update takes), update (changing slug breaks links already shared), delete (the link stops working; bookings stay; confirm first).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: update, delete. | |
| name | No | Required for: create; optional for: update. | |
| slug | No | Required for: create; optional for: update. | |
| action | Yes | ||
| isActive | No | false hides it from booking. | |
| location | No | Used by: create, update. | |
| bufferMin | No | Used by: create, update. Minutes kept free after each booking. | |
| description | No | Used by: create, update. | |
| durationMin | No | Used by: create, update. Minutes. Default 30. | |
| availability | No | Used by: create, update. | |
| locationType | No | Used by: create, update. | |
| maxAdvanceDays | No | Used by: create, update. | |
| minNoticeHours | No | Used by: create, update. | |
| intakeQuestions | No | Used by: create, update. | |
| reminderSmsHours | No | Used by: create, update. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and non-idempotent, and the description adds real consequences the annotations can't convey: slug changes break shared links, deletion kills the public link but leaves bookings intact, and confirmation is required first. This is exactly the blast-radius context an agent needs before mutating.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence with the resource front-loaded and each action's consequence attached inline; no filler and no restatement of the schema. Telegraphic style is a deliberate fit for a three-action manage tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 15 params, a nested object, and no output schema, the description covers the destructive semantics well enough to call safely. The remaining gap is update semantics (full replace vs partial) and the shape of the availability/intakeQuestions objects, which neither schema nor description resolves.
Complex tools with many parameters or behaviors need more documentation. Simple 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 93%, so per-field meaning (bufferMin, maxAdvanceDays, isActive) is already documented in structured data. The description adds one useful structural note — create accepts name, slug, and any field update takes — but adds nothing on the nested availability or intakeQuestions payloads. 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 the resource precisely ('Booking meeting types (the public links)') and enumerates the three operations (create/update/delete), which an agent can readily separate from meeting_types_list or meetings_book. It stops short of naming the sibling list/book tools explicitly, so differentiation is by inference rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Per-action guidance is concrete: update warns that changing slug breaks already-shared links, delete notes the link stops working while bookings persist and instructs to confirm first. It doesn't say when to prefer this over meetings_book or meeting_types_list, but the action-level conditions are clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes_listList notesARead-onlyIdempotentInspect
List the notes on a contact, company or deal (pass exactly one of contactId / companyId / dealId).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Default 50. | |
| dealId | No | ||
| offset | No | ||
| companyId | No | ||
| contactId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered structurally. The description adds the entity-scoping constraint but says nothing about pagination behavior or the shape/cost of the result set, which would be useful for a list endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the resource first and the critical selection rule immediately after, in parentheses. Nothing is redundant and nothing needs reordering.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the agent has no structured signal about what a note object looks like or whether results are paginated; the description does not fill that gap. The core calling contract is complete, but return-value and pagination behavior remain undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20%, so the description must compensate, and it does for the most important part: it explains that the three ID parameters are mutually exclusive and that exactly one must be supplied — a constraint the schema cannot express (no required fields, no oneOf). It leaves limit/offset entirely to the schema, where only limit has a partial note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List') and resource ('notes') plus the exact scope: notes attached to a contact, company, or deal. The parenthetical constraint makes it unambiguous and clearly separates it from the mutating sibling notes_manage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a hard invocation rule — pass exactly one of contactId / companyId / dealId — which tells the agent precisely how to call it. It does not explicitly name an alternative (e.g., notes_manage for creating/updating), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
notes_manageManage notesBDestructiveInspect
Notes on a contact, company or deal. create (body, plus contactId / companyId / dealId), update, delete (confirm first).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: update, delete. | |
| body | No | Required for: create, update. | |
| action | Yes | ||
| dealId | No | ||
| companyId | No | ||
| contactId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and 'confirm first' on delete is consistent with that rather than a contradiction. The description does not say whether deletes are permanent, whether update replaces or merges fields, or what gets returned, so it adds only modest context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the resource and then the actions; nothing is padded. The terseness borders on under-specification but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a destructive multi-action mutation tool with six parameters, a third of them undocumented, and no output schema. Missing are the parent-id exclusivity rule, the permanence of delete, and update semantics — all of which the agent must know 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 only 33%, and the description partially compensates by tying body and the three parent ids to create. It never explains whether one or multiple parent ids may be supplied, nor that id is needed for update/delete (that only appears in 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?
The description names the resource (notes) plus the entities they attach to (contact, company, deal) and enumerates the three actions create/update/delete. That is enough to place it against notes_list, though it never explicitly says 'this is the write counterpart to notes_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?
'delete (confirm first)' gives one concrete procedural cue, and the create parenthetical implies you supply a parent id alongside body. There is no stated boundary against notes_list, and no guidance on when to use update versus delete-and-recreate or on choosing among contactId/companyId/dealId.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
outbound_webhooks_manageManage outbound webhooksADestructiveInspect
Outbound webhooks: Groundbase POSTs to a URL when subscribed events fire. action list | get | create | update | delete. create needs name, url, events and returns the signing secret ONCE (tell the user). create, or a new url, sends CRM data (names, emails, phones) there and emails the owner: confirm the url with the user first. delete stops deliveries and abandons retries; confirm first.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | For get/update/delete. | |
| url | No | Public http(s) URL (use https: the payload is CRM data). Required on create. | |
| name | No | Required on create. | |
| action | Yes | ||
| events | No | Event names, or ["*"] for all: contact|company.created/updated/deleted, contact.status_changed, deal.created/updated/deleted/stage_changed/won/lost, task.created/updated/completed/deleted, note.created, tag.applied/removed, sms.sent/received/delivered/failed, call.completed, voicemail.received, email.sent/received, invoice.issued/paid/voided, payment.recorded, quote.issued/accepted/declined, form.submitted, meeting.booked/rescheduled/cancelled. Slack and Discord webhook URLs get a readable message; others get signed JSON. | |
| isActive | No | Update only; false pauses delivery. | |
| description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and openWorldHint=true, and the description adds real context beyond them: the secret is returned ONCE, CRM data (names, emails, phones) is transmitted to the URL, the owner is emailed, and delete stops deliveries and abandons retries.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what a webhook is, then the action set, then per-action constraints. Dense and telegraphic but essentially every clause carries a decision the agent needs; the compression makes it slightly harder to parse than prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Seven parameters, no output schema, destructive multi-action tool — yet the description covers lifecycle, prerequisites, side effects, and confirmation requirements. Nothing an agent needs to invoke it safely is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 71% schema coverage the schema already documents id, url, name, events, and isActive. The description reinforces which fields create requires (name, url, events) and adds payload-format nuance (Slack/Discord get readable messages, others signed JSON) that the schema also mentions but the summary elevates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (outbound webhooks) and mechanism (Groundbase POSTs to a URL on subscribed events), then enumerates the five actions. It is clearly distinct from inbound_webhooks_manage by the 'outbound' framing plus the POST-to-URL explanation, though it never names the sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit operating rules: confirm the URL with the user before create or a URL change, confirm before delete, and tell the user the signing secret because it is returned only once. These are concrete when/when-not directives rather than inferred guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
phone_statusPhone statusARead-onlyIdempotentInspect
The user's phone numbers (id, number, label, which is the default for texts and calls) and their Twilio balance as Twilio reports it (quote it; do not judge it).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so the safety profile is covered. The description adds real value beyond that: it enumerates the returned fields and gives a presentation directive ('quote it; do not judge it') for the balance, which tells the agent not to editorialize a figure it cannot verify.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the resource front-loaded and the field list in a compact parenthetical. Every clause carries information; there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return values, and it does so at the field level (id, number, label, default-for-texts-and-calls) plus the balance. It stops short of stating the shape of the balance object or whether numbers include unverified/inactive entries, which is a minor remaining gap for a simple read.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. Nothing about inputs needs explaining, and the description correctly spends its words on the return payload instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact resource returned: the user's phone numbers with their fields (id, number, label, default flag) plus the Twilio balance. An agent can tell immediately what data this yields. It lacks an explicit verb and doesn't reference any sibling, but no sibling in the list covers phone numbers or balance, so confusion risk is low.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 no explicit when-to-use or when-not-to-use guidance and no named alternative. Usage is implied by the read-only resource name and the zero-parameter schema, which makes invocation self-evident, but the description itself does nothing to route the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quotes_listList quotesARead-onlyIdempotentInspect
List quotes with counts per status and open value per currency, or pass id for one quote with lines, totals, deposit and acceptance details.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Quote id. Returns that one quote. | |
| limit | No | Default 100. | |
| offset | No | ||
| status | No | draft | open | accepted | declined | void | expired (open but past valid-until) | |
| companyId | No | ||
| contactId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this as read-only, idempotent, non-destructive, and closed-world. The description adds valuable behavioral context about what the list returns (counts per status and open value per currency) and what the single-quote mode includes (lines, totals, deposit, acceptance details).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted language. The list mode and the `id`-based detail mode are both stated compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because there is no output schema, the description usefully explains what both modes return. It is nearly complete for a read-only list/retrieve tool, though it leaves some filter and pagination parameters unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%, so the description should compensate for undocumented parameters. It clarifies `id` behavior, but it does not explain `offset`, `companyId`, or `contactId`, nor does it describe filtering or pagination behavior beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource and distinguishes two modes: listing quotes versus passing `id` to retrieve one quote. It does not explicitly distinguish itself from `quotes_manage`, but the read-only purpose is clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent when to pass `id` for the single-quote mode versus using the list mode. It provides clear context for mode selection but does not explicitly state exclusions or point to `quotes_manage` for writes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
quotes_manageManage quotesADestructiveInspect
Quotes. save_draft (create, or edit by id), issue (numbers it), send (emails it with an accept link; confirm), record_outcome (accepted / declined after a conversation), convert (accepted → draft invoice), void, public_link (the accept link; revoke).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: issue, send, record_outcome, convert, void, public_link; optional for: save_draft. Edit this draft. | |
| to | No | Default: billing email, then the contact's email. | |
| lines | No | itemId (saved item) or name + unitPrice. Decimal strings. taxIds: which of the taxes apply (default all). | |
| notes | No | ||
| taxes | No | [{id?,name,rate}], e.g. GST 5 + QST 9.975 (ids t1,t2…). | |
| terms | No | What the customer agrees to by accepting. | |
| action | Yes | ||
| reason | No | Declined: optional reason. | |
| revoke | No | public_link: turn the link off. | |
| charges | No | Below the subtotal (shipping); negative for a discount or deposit. | |
| message | No | Covering note; same tokens. | |
| outcome | No | ||
| sendVia | No | ||
| subject | No | Tokens {number} {business} {customer} {amount} {due}. | |
| currency | No | ISO 4217. Defaults from the billing profile. | |
| companyId | No | ||
| contactId | No | Create: one of contactId/companyId. | |
| issueDate | No | YYYY-MM-DD. Default today. | |
| validUntil | No | YYYY-MM-DD. Default issue date + 30 days. | |
| confirm_paid | No | Void despite a deposit. | |
| depositAmount | No | e.g. "500.00". Empty string removes. | |
| acceptedByName | No | Accepted: who said yes, e.g. "Dana (by phone)". | |
| depositPercent | No | e.g. "25". Empty string removes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses important behavior: send emails the quote externally with an accept link and requires confirmation, convert creates a draft invoice, and public_link can be revoked. This aligns with the destructive/open-world annotations, though it does not cover permission requirements, rate limits, or return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that front-loads the resource and then lists every action with a compact effect. There is essentially no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 23-parameter action multiplexer with no output schema, it covers the most important selection context: every action and its key side effect. The schema carries parameter details and annotations carry the safety profile, but return values and some per-action prerequisites remain 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 coverage is high at 78%, so the schema already documents most parameters. The description adds material meaning for the central action parameter by explaining what each enum value does, which the schema enum alone does not provide. It does not add much for the other 22 parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource and enumerates all seven lifecycle actions with specific effects: save_draft creates/edits, issue numbers, send emails, record_outcome records acceptance/decline, convert makes a draft invoice, void, and public_link manages the accept link. It is clear enough to distinguish this from a read-only quotes tool, though it never explicitly names quotes_list as the sibling for listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear action-level context: record_outcome is for use after a conversation, convert applies to accepted quotes and produces a draft invoice, send includes a confirmation, and public_link can be revoked. It does not explicitly state when to use this tool versus quotes_list or invoices_manage, so it is clear but lacks exclusions/alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resend_manageResend connectionBInspect
The BYO Resend connection for email campaigns, read-only. Actions: status; domains (verification state; check before choosing from_email). Connecting, disconnecting, test sends and turning on tracking are done in the app (Settings > Email).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states the connection is 'read-only', while annotations declare readOnlyHint=false and idempotentHint=false. That is a direct contradiction of the safety profile an agent relies on, even though the enumerated actions are in fact reads. The otherwise useful disclosure of where the remaining operations live cannot offset a conflicting safety claim.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with no filler, front-loaded with what the connection is before the action list and the off-tool routing note. Slightly dense parenthetical packing, but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema tool this covers the main decision points: available actions, the domains prerequisite, and where the excluded operations live. It still leaves the shape of each response (what status returns, what a domains entry contains) entirely unspecified, which matters since no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the meaning of the single action enum. It does: 'domains (verification state; check before choosing from_email)' explains both what the value returns and when to pick it, and 'status' is at least recognizable in context. Minor gap: it never spells out what status reports.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the specific resource (the BYO Resend connection used for email campaigns) and enumerates the two supported actions, status and domains. An agent can distinguish it from siblings like sending_settings or email_send because the description explicitly says connecting, disconnecting, test sends and tracking happen elsewhere.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete use condition — call domains and check verification state before choosing a from_email — and explicitly redirects the other related operations to the app under Settings > Email. It lacks a 'do not use this for X' exclusion, but the routing guidance is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
saved_views_listList saved viewsARead-onlyIdempotentInspect
List saved views (named filters over contacts, companies, deals or tasks).
| Name | Required | Description | Default |
|---|---|---|---|
| entityType | No | Only views for this record type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is fully covered without the description. The description's real contribution is the domain gloss on what a saved view represents, which is genuinely useful context; it says nothing about ordering, pagination, or whether a default set is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, front-loaded with the verb and resource, with the parenthetical earning its place by defining an ambiguous domain term. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter read list with rich annotations and no output schema, the description covers what the tool is and what the optional filter does. Only minor gaps remain (result ordering, empty-list behavior, relationship to saved_views_manage) that an agent could want.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is documented as 'Only views for this record type' with a four-value enum. The parenthetical in the description lists the same four record types, slightly reinforcing the filter semantics but adding no syntax or default behavior beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List saved views') and adds a clarifying gloss ('named filters over contacts, companies, deals or tasks') that tells an agent what a saved view actually is. The list-vs-manage split with the sibling saved_views_manage is clear from the verb and read-only annotations, though the description never names the sibling 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?
Usage is implied rather than stated: an agent can infer this is the read path and saved_views_manage is the write path. There is no explicit when-to-use guidance, no mention of whether views must be created first, and no exclusion statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
saved_views_manageManage saved viewsADestructiveInspect
Saved views (named filters). create (copy filterJson's shape from saved_views_list), update (rename or change the filter), delete (the records stay).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: update, delete. | |
| name | No | Required for: create; optional for: update. | |
| action | Yes | ||
| entityType | No | ||
| filterJson | No | Used by: create, update. JSON-encoded filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag this as non-read-only and destructive. The description importantly clarifies that delete removes the saved view but 'the records stay,' which prevents a serious misinterpretation of destructiveHint. It does not discuss idempotency or permissions, but with annotations covering the safety profile this is solid added 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?
The description is extremely compact and front-loads the resource definition before breaking down each action. Every phrase carries useful information, including the key deletion clarification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter manage tool with no output schema, the description covers the action set, filterJson creation guidance, and delete semantics adequately. It omits any explanation of entityType, which is the main remaining contextual 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 60%, and the description helps with filterJson by telling the agent to copy its shape from saved_views_list. It does not explain entityType, and id/name requirements are left to the schema. Baseline 3 is appropriate given partial schema coverage and only marginal extra parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource as saved views (named filters) and enumerates the managed actions create, update, and delete. It also references saved_views_list for filter shape, but it does not explicitly draw the full boundary between managing views and listing them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives action-specific hints such as 'rename or change the filter' for update and 'copy filterJson's shape from saved_views_list' for create. However, it does not explicitly state when to choose this tool over saved_views_list or explain prerequisites for each action, leaving usage mostly implied by the action enum.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sending_settingsSending settingsAInspect
Daily cap on campaign EMAILS (not SMS) per day in the account timezone. get: cap, sent_today, remaining_today, domain_caps. set: daily_email_send_cap (null = none, 0 = stop today), account-wide or, with domain, for one domain inside it. Over-cap recipients wait for later days. Use to warm a new domain (~20/day).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| domain | No | set: bare hostname, e.g. 'example.com'. Omit for the account-wide cap. | |
| daily_email_send_cap | No | set: non-negative integer or null. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the effect of null (none) and 0 (stop today), account-wide versus per-domain scoping, and that over-cap recipients wait for later days. It does not discuss permissions or idempotency nuances, but the key behavioral consequences are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core constraint and then packs get/set semantics into a compact line. Every clause carries useful information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still explains what get returns and what set affects, including domain-level behavior. It is nearly complete for a small dual-action settings tool, with only minor auth/permission context 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 67%, and the description compensates well by explaining action outcomes, domain scoping, and the null/0 semantics for daily_email_send_cap. It adds meaningful interpretation beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (daily cap on campaign EMAILS) and operation (get/set), explicitly excluding SMS. It also names the exact fields returned by get and the value written by set, so an agent can distinguish it from siblings like sms_manage or email_send.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use case (warming a new domain at roughly 20/day) and explains get versus set behavior. It does not enumerate alternatives beyond excluding SMS, but the context is strong enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sms_listList textsARead-onlyIdempotentInspect
Read the text conversation with a phone or contactId (oldest first, both directions; matched: false if none), or pass scheduled: true to list texts queued to send.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Conversation only. Default 50. | |
| phone | No | The other party's number, any format. | |
| contactId | No | Or the contact (their primary number is used). | |
| scheduled | No | List pending scheduled texts instead. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior. The description adds useful behavioral context: oldest-first ordering, both directions, a matched:false marker when none exist, and scheduled queue semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted text. It packs modes, ordering, and the no-match indicator into a compact 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 no output schema, the description provides key return context such as ordering and matched:false. It does not describe the response fields or limit behavior, though the schema covers the limit parameter and annotations cover safety.
Complex tools with many parameters or behaviors need more documentation. Simple 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 phone, contactId, scheduled, and limit. The description reinforces the phone/contactId alternative and scheduled mode but adds little syntax or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Read the text conversation,' with clear modes for phone/contactId versus scheduled texts. It implicitly distinguishes listing from sending or managing, but does not explicitly name or differentiate from siblings like sms_send or sms_manage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly explains how to use the tool for conversation history versus scheduled texts. It provides context for both modes but does not mention alternatives or explicit when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sms_manageManage textsADestructiveInspect
cancel_scheduled (a queued text, by id from sms_list scheduled), delete_thread (a whole conversation by phone or contactId; nothing is sent; confirm first).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | ||
| phone | No | ||
| action | Yes | ||
| contactId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds important behavioral detail: delete_thread removes a whole conversation, nothing is sent, and confirmation is required first. It does not explicitly state irreversibility or permission requirements, but it meaningfully supplements the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence fragment with no wasted words, front-loading the two action names and their key semantics. The telegraphic style is efficient despite being terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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-action tool with no output schema and 0% schema description coverage, the description covers the core action mapping but omits permanence of thread deletion, permission requirements, error behavior, and any sense of what the tool returns or confirms. It is minimally adequate but leaves meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning. It usefully maps id to cancel_scheduled and phone/contactId to delete_thread, but it does not define expected formats, clarify the required action selector, or explain when phone versus contactId should be used.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names both supported actions and their resources: cancel_scheduled for a queued text, delete_thread for a whole conversation. It distinguishes itself from sms_list by explaining where the id comes from, though it lacks a top-level statement of the tool's overall purpose beyond 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?
It gives clear usage context: use cancel_scheduled with an id from sms_list scheduled, and use delete_thread with a phone or contactId and confirm first. It does not explicitly exclude sending or point to sms_send as an alternative, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sms_sendSend a textAInspect
Send a text now, or later with scheduledAt. Sends a real message, billed per segment on the user's own Twilio account; confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | ||
| toPhone | Yes | Recipient, E.164 (+1...). | |
| contactId | No | Links the message to this contact's thread. | |
| fromNumber | No | Sending number, E.164. Defaults to the primary. | |
| scheduledAt | No | Future ISO 8601 time. Omit to send now. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false), the description discloses the two facts an agent most needs before firing: this sends a real message and it is billed per segment on the user's own Twilio account, plus a confirm-first requirement. That is meaningful side-effect and cost transparency the annotations cannot encode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler; the primary action is front-loaded and the safety/billing caveat follows immediately. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter, no-output-schema mutation tool, the description covers the essential risk profile (real send, billed, confirm first). The only gap is what a successful call returns (e.g., message identifier or scheduling confirmation), which matters when scheduledAt is used.
Complex tools with many parameters or behaviors need more documentation. Simple 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 80%, and the parameter descriptions already cover E.164 formats, contactId threading, fromNumber defaulting, and scheduledAt semantics. The description only echoes the scheduledAt behavior ('omit to send now') rather than adding syntax, constraints, or edge cases, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Send a text') and immediately qualifies the timing variant (now vs. scheduledAt). This is clearly distinguishable from sms_list and sms_manage, the adjacent SMS siblings, without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states an explicit precondition ('confirm with the user first') and clarifies the scheduling fork ('or later with scheduledAt'). It does not name alternative tools (e.g., email_send) or exclusion criteria, so it falls short of a 5, but the operational context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suppressions_manageManage email suppressionsADestructiveInspect
Who must not be messaged. channel email (unsubscribed / bounced addresses) or sms (numbers that texted STOP); action list, add (emails[] / phones[]) or remove (re-consents one; only with their permission). Confirm adds and removes with the user.
| Name | Required | Description | Default |
|---|---|---|---|
| No | |||
| limit | No | For list. Default 100. | |
| phone | No | For 'remove', or a single 'add'. | |
| action | Yes | ||
| emails | No | For add: up to 5000. | |
| phones | No | For 'add': up to 500 numbers, any format. | |
| search | No | For list: matches the address or contact name. | |
| source | No | Label for 'add'. Default 'imported'; 'stop_keyword' is reserved. | |
| channel | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, so the safety profile is known. The description adds real context beyond that: removing a suppression re-consents the contact for messaging, that permission is required, and adds/removes should be user-confirmed. It does not disclose whether adds are deduplicated, what list returns, or pagination behavior, keeping it out of the top band.
Agents need to know what a tool does to the 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 clauses in one dense line, front-loaded with the scope ('Who must not be messaged') before the mechanics and the confirmation rule last. Every clause carries information. The semicolon-chained fragments read as terse shorthand and cost a little readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter destructive mutation tool with no output schema, the description covers the selection logic, the mutation semantics, and the human-approval requirement. The remaining gap is the list mode's return shape and paging expectations, which the schema hints at (limit 1-500, default 100) but does not fully substitute for an absent output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 67% schema coverage, the schema already documents limit, search, source, phone, emails, and phones. The description adds the channel×action matrix — which container parameter applies to which action — which is genuinely useful. However, the singular 'email' parameter is undocumented in both schema and description, leaving its role (single add? list filter?) ambiguous, so the description does not fully compensate.
Input schemas describe structure but not intent. Descriptions should explain 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 crisp scope statement ('Who must not be messaged') followed by the two channels and their real-world meaning (unsubscribed/bounced addresses, numbers that texted STOP), then enumerates the three actions. An agent immediately knows this is the suppression-list management tool and no sibling overlaps. It loses a point only for the telegraphic, fragment-style phrasing rather than a clean verb+resource sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly maps each action to its input shape (add via emails[]/phones[], remove via phone) and adds an operational rule: removals re-consent the contact and require their permission, and both adds and removes must be confirmed with the user. There is no alternative sibling to route to, so the absence of exclusions is not a gap. Usage guidance is clear, though nothing covers when to prefer list over search or how to page results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tags_listList tagsARead-onlyIdempotentInspect
List the user's tags with their ids.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds only that ids are included in the result, which is genuinely useful given there is no output schema, but says nothing about ordering, pagination, or volume.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, and the key information (tags plus their ids) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-argument list tool, the description covers scope (the user's tags) and the shape of the payload (tags with ids), which partly compensates for the missing output schema. It would be complete with a note on ordering or whether results are bounded.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to explain; baseline is 4. The description correctly signals that no filtering arguments exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ("List the user's tags") with the extra detail that ids are returned. It doesn't name tags_manage as the mutation counterpart, but the naming convention makes the split fairly obvious.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the agent can infer this is the read path versus tags_manage as the write path, but the description never states when to prefer this tool or what it excludes (e.g. no filtering, no search).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tags_manageManage tagsADestructiveInspect
Tags. create, update (rename / recolour), delete (removes it from everyone; confirm first), apply (tagId to contactIds; remove: true takes it off). Applying a tag can start workflows listening for it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: update, delete. | |
| name | No | Required for: create; optional for: update. | |
| color | No | Used by: create, update. Hex, e.g. "#B91C1C". | |
| tagId | No | ||
| action | Yes | ||
| remove | No | Remove the tag instead of adding it. | |
| contactIds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations already flag destructive, non-idempotent, and open-world behavior, the description adds critical context beyond them: delete removes the tag from everyone and should be confirmed first, and applying a tag can start workflows listening for it. This is exactly the kind of side-effect and safety context an agent needs before invoking a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it opens with the resource and immediately lists the actions with the most important qualifiers. There is no filler, and each phrase carries operational meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter destructive management tool with no output schema, the description covers the dangerous action, confirmation guidance, apply semantics, and workflow side effects. It lacks explicit return-value or result information and does not route listing to tags_list, but the schema fills in most parameter details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 57%, and the description compensates by explaining that apply maps tagId to contactIds and remove:true removes the tag, and that update can rename or recolour. It leaves some details to the schema, but adds meaningful semantics for the most complex action.
Input schemas describe structure but not intent. Descriptions should explain non-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 enumerates the four specific actions (create, update, delete, apply) on tags, making the verb and resource clear. It does not explicitly distinguish itself from the sibling tags_list tool for read-only listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives action-level usage context, such as confirming before delete and using remove:true to detach a tag, but it never states when to use this tool versus tags_list or other alternatives. The usage guidance is implied through action descriptions rather than explicit routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_listList tasksBRead-onlyIdempotentInspect
List tasks, events and meetings (default: open, every kind), or id for one. Google Calendar events show as kind event. color_id: 1 Lavender, 2 Sage, 3 Grape, 4 Flamingo, 5 Banana, 6 Tangerine, 7 Peacock, 8 Graphite, 9 Blueberry, 10 Basil, 11 Tomato; null default. from+to adds repeating dates (is_virtual: no item of its own; root_id = the series).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Task id. Returns that one item. | |
| to | No | ISO 8601; due on/before. | |
| from | No | ISO 8601; due on/after. | |
| kind | No | ||
| limit | No | ||
| dealId | No | ||
| offset | No | ||
| status | No | Default open. | |
| contactId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile needs no restating. The description does add real behavioral context beyond them: Google Calendar events surface as kind=event, and from+to expands recurring items where is_virtual/root_id mark series members.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single dense paragraph with the primary purpose and defaults front-loaded; the long color_id enumeration is verbose but carries information absent from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter, zero-required list tool with no output schema, missing pagination (limit/offset) and the relationship-filtering semantics of dealId/contactId are meaningful gaps an agent would have to guess at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 44%, and the description compensates for status/kind/from/to plus the color_id legend, but says nothing about limit, offset, dealId, or contactId, leaving half the parameters undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) plus the resources covered (tasks, events, meetings) and explicitly notes the single-item mode via `id`, which separates it from tasks_manage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb 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 useful default conditions ('default: open, every kind') and the from+to repeating-date caveat, but never states when to use this versus tasks_manage, meetings_book, or the other list siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tasks_manageManage tasksADestructiveInspect
Tasks, events and meetings (the Calendar page in the apps). create (a meeting texts the contact only with textContact: true; ask first), update (status "done" completes; contactId/companyId/dealId relink; moving a meeting re-sends its texts), delete (confirm; repeating tasks need scope; remove_from_google only if the user says).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: update, delete. | |
| kind | No | Used by: create, update. Default task. | |
| color | No | Used by: create, update. Calendar colour, the same palette as Google Calendar; syncs both ways. "default" = the colour of its kind. | |
| dueAt | No | Used by: create, update. ISO 8601, for tasks. | |
| endAt | No | Used by: create, update. ISO 8601. | |
| notes | No | Used by: create, update. | |
| scope | No | Repeating tasks: "occurrence" deletes this date only, "series" the whole series. A series' first task needs one of them. | |
| title | No | Required for: create; optional for: update. | |
| action | Yes | ||
| dealId | No | Used by: create, update. | |
| status | No | ||
| startAt | No | Used by: create, update. ISO 8601, for events/meetings. | |
| location | No | Used by: create, update. | |
| companyId | No | Used by: create, update. | |
| contactId | No | Used by: create, update. | |
| recurrence | No | Used by: create, update. Repeats relative to dueAt. Tasks only. | |
| textContact | No | Meetings: text the contact a confirmation and reminders. Default false. | |
| remove_from_google | No | Default false. True also removes it from Google Calendar: the event, or for scope "occurrence" just that date. Only after the user confirms. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true and non-idempotency, but the description adds real side-effect disclosure the annotations cannot convey: creating a meeting texts the contact, moving a meeting re-sends its texts, status "done" completes the item, and Google Calendar syncs both ways. The only gap is that it never says what the call returns or whether a delete is reversible.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Everything is front-loaded into a single dense sentence with per-action parentheticals, and no clause is filler. The nesting of semicolons inside parentheses makes it harder to parse than it needs to be, but the information density is earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. 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 18-parameter multi-action mutation tool with no output schema, the description covers the risky branches — meeting texts, series scope, Google removal — which is where an agent is most likely to err. Missing is how to obtain the id required for update/delete and how this tool relates to meetings_book for scheduling.
Complex tools with many parameters or behaviors need more documentation. Simple 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 89%, so baseline is 3, and the description still adds semantic weight on top: it explains that status "done" is a completion rather than a label change, that contactId/companyId/dealId act as relinks, and it reinforces the scope/remove_from_google conditions. It doesn't touch the remaining fields (notes, location, color), which the schema already documents well.
Input schemas describe structure but not intent. Descriptions should explain 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 by naming the resource precisely — tasks, events and meetings, explicitly mapped to 'the Calendar page in the apps' — then enumerates the three verbs (create/update/delete) with per-action behavior. An agent can distinguish this from tasks_list without opening a schema, though the description never names the sibling it contrasts with.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete conditional rules: ask first before texting a contact on meeting creation, confirm before delete, remove_from_google only if the user says, repeating tasks need a scope. It stops short of routing to alternatives — notably meetings_book for scheduling and tasks_list for finding ids — so the agent must infer those boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
templates_listList templatesARead-onlyIdempotentInspect
List SMS and/or email templates (name, body, subject), or pass id to fetch one.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Template id. Returns that one template. | |
| type | No | Omit for both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds valuable context beyond that by disclosing what the call returns (name, body, subject) even though no output schema exists, and by noting the id shortcut for single retrieval.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the primary listing behavior, then appends the fetch-one variant. Every clause carries information; nothing is redundant or 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 two-optional-parameter read tool with annotations covering safety and no output schema, the description supplies the return-field summary an agent would otherwise lack. Only minor gap: no mention of ordering, pagination, or result size limits.
Complex tools with many parameters or behaviors need more documentation. Simple 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%: both `id` ('Returns that one template') and `type` ('Omit for both') are already documented in the schema. The description essentially restates these, adding no syntax, format, or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (SMS/email templates) plus the fields returned (name, body, subject), and covers the alternate fetch-one mode via id. Clear enough to distinguish from most siblings, though it never names templates_manage as the write counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: 'pass id to fetch one' tells the agent about the single-item mode, but there is no explicit statement of when to call this versus templates_manage, nor any prerequisite or exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
templates_manageManage templatesADestructiveInspect
Saved message templates (type sms or email; email needs a subject). create, update, delete (confirm first). Merge tags: custom_fields_list with mergeTags.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: update, delete. | |
| body | No | Required for: create; optional for: update. | |
| name | No | Required for: create; optional for: update. | |
| type | No | ||
| action | Yes | ||
| subject | No | Used by: create, update. Email only; required there. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description still adds real value beyond them: the confirmation step before delete, the coupling rule that email templates require a subject while SMS ones do not, and the pointer to custom_fields_list/mergeTags for substitution tokens. It does not state whether deletes are permanent or how errors surface, which keeps it out of 5 territory.
Agents need to know what a tool does to the 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 clauses, front-loaded with the resource definition before the action list and the merge-tag note. The telegraphic style reads as note fragments rather than sentences, but nothing is padded and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, 3-action mutation tool with no output schema, the description covers the essentials an agent needs before calling: what a template is, the type/subject coupling, and the confirm-before-delete rule. Gaps remain around permanence of deletion and partial-update semantics, but nothing critical to correct invocation is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, and the two enums (`type`, `action`) carry no descriptions in the schema at all. The description compensates by explaining the sms/email distinction and the email-implies-subject rule, and by naming the three actions. It stops short of noting that `subject` is ignored for SMS or that `id` is only meaningful for update/delete, though the schema covers the latter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource (saved message templates) and enumerates the supported verbs (create, update, delete), so the CRUD scope is unambiguous. The sibling templates_list exists for reads, and while the description implies it by listing only mutating actions, it never names the sibling 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?
There is one concrete usage instruction — 'delete (confirm first)' — which sets a workflow precondition for the destructive path. Beyond that, the description does not say when to reach for this tool versus templates_list or how update differs from create when fields are partially supplied; guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
time_listList time entriesARead-onlyIdempotentInspect
List time entries (newest first) plus the running timer and per-customer totals (default last 30 days). status "unbilled" = billable, stopped, not on a live invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | ISO 8601, exclusive. | |
| from | No | ISO 8601, inclusive. | |
| limit | No | Default 50. A full page may mean more. | |
| dealId | No | Also fills in the deal's contact and company. | |
| status | No | ||
| companyId | No | ||
| contactId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds real behavioral context beyond that: the result is ordered newest-first and includes not just entries but also the running timer and per-customer totals, plus the default 30-day window.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with the core behavior and response shape front-loaded; no filler and every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter read tool with no output schema, the description tells the agent what comes back (entries, running timer, per-customer totals) and the default window, which is most of what is needed. Minor gaps remain around pagination and the undocumented filter parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 57%; companyId, contactId, and status have no schema descriptions. The description supplies the meaning of the "unbilled" status value and the default date window, but leaves "billed" and the company/contact filters unexplained, so it only partially compensates.
Input schemas describe structure but not intent. Descriptions should explain 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 ("List time entries") and adds scope detail: newest-first ordering, inclusion of the running timer, and per-customer totals. It does not name the sibling time_manage, so the agent must infer that this is the read-only counterpart rather than being told 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 default last-30-days window and the definition of status "unbilled" give useful context for when this tool's output applies. However, there is no explicit statement about when to use this versus time_manage or how to widen the range, so usage is implied rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
time_manageManage time entriesADestructiveInspect
Time tracking. start (the timer, for a contact / company / deal; stops any running one), stop, log (time after the fact), update (edit an entry), delete, bill (entryIds onto a draft invoice), unbill (take one back off).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: update, delete, unbill. | |
| rate | No | Used by: start, log, update. Hourly, decimal string. | |
| action | Yes | ||
| dealId | No | Used by: start, log, update. Also fills in the deal's contact and company. | |
| delete | No | ||
| endedAt | No | ISO 8601. | |
| billable | No | Used by: start, log, update. Default true. | |
| currency | No | Used by: start, log. Default: invoicing currency. | |
| duration | No | Used by: log, update, delete. | |
| entryIds | No | bill: from time_list (status unbilled). | |
| companyId | No | Used by: start, log, update. | |
| contactId | No | Used by: start, log, update. | |
| invoiceId | No | bill: a draft invoice. | |
| startedAt | No | Used by: log, update. ISO 8601. | |
| description | No | Used by: start, log, update. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, readOnlyHint=false, so the risk profile is covered. The description still earns credit for disclosing a side effect annotations cannot express: start 'stops any running one', a non-obvious implicit mutation. It does not state what delete destroys or whether deletions are recoverable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence of telegraphic action glosses with no filler; every clause maps to a distinct action. It is dense to the point of terseness ('bill (entryIds onto a draft invoice)'), leaning on the schema to decode, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 15-parameter, 7-action destructive multiplexer this covers action semantics well, and no output schema exists so return values needn't be described. However, it says nothing about permissions/auth, failure behavior, or the read-side sibling time_list, leaving real gaps for a tool with destructiveHint=true.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 87%, so per-parameter usage ('Used by: start, log, update') is already documented. The description only adds light semantic hints such as 'for a contact / company / deal' for start; it does not explain formats, defaults, or interdependencies beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with the resource ('Time tracking') and then enumerates all seven actions with a short gloss each, so an agent can tell exactly what the tool does. It never names the sibling time_list, which is the main read-side alternative, so sibling differentiation is left implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Each action carries the disambiguating context an agent needs to pick it: start is 'the timer... stops any running one', log is 'time after the fact', update 'edit an entry', bill pushes entryIds 'onto a draft invoice', unbill takes one 'back off'. What's missing is explicit routing to time_list for reading entries and any statement of when not to use a given action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
voicemail_drops_dropDrop a voicemailAInspect
Play a drop onto someone's voicemail via a real Twilio call (hangs up if a person answers), billed at Twilio voice rates on the user's account. US and Canadian numbers only. Give contactId or toPhone. Confirm with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| dropId | Yes | A drop with has_audio. | |
| toPhone | No | E.164, when there is no contact. | |
| contactId | No | Uses the contact's primary phone. | |
| fromNumberId | No | Twilio number id. Default: first active number. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by disclosing the real-world call behavior: it hangs up if a human answers, is billed at Twilio voice rates on the user's account, is geo-limited to US/Canada, and should be user-confirmed. These are exactly the side effects an agent needs before an openWorld, non-idempotent action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, each carrying distinct information (action, side effect, billing, geo scope, targeting, confirmation). Zero redundancy and the critical constraint is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers cost, targeting, geography, and the human-answers edge case, which is nearly everything needed to call safely. It could say what a successful call returns (e.g. call id or status) or how long the drop playback takes, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter is already documented, so the schema does the heavy lifting. The description adds a small amount of routing value by framing contactId vs toPhone as an either/or targeting choice, but adds no format or default details beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and outcome ('Play a drop onto someone's voicemail') plus the mechanism ('via a real Twilio call'), which cleanly separates it from voicemail_drops_list and voicemail_drops_manage (asset CRUD). An agent can identify this as the execution/action tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to supply contactId or toPhone, restricts to US/Canadian numbers, and requires user confirmation before firing. Missing only a direct pointer to siblings (e.g. use voicemail_drops_list to find a drop, voicemail_drops_manage to create audio), so usage context is strong but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
voicemail_drops_listList voicemail dropsARead-onlyIdempotentInspect
List voicemail drops: name, has_audio (only drops with audio can be dropped), duration_ms, source, script_text.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds value beyond that by naming the returned fields and disclosing the business rule that has_audio gates drop eligibility — a behavioral constraint an agent would not otherwise know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with zero filler: verb, resource, then the field list with the one qualifying rule inline. Nothing is front-loaded in the wrong place, and no sentence could be removed without losing 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 parameterless read tool with full annotation coverage, the description supplies the one thing structured data lacks: the shape of the response (name, has_audio, duration_ms, source, script_text). It does not say whether results are paginated, sorted, or capped, which is the only real gap for a list tool with no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The enumerated fields describe the response shape rather than inputs, which is extra value but not parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('List voicemail drops') and enumerates the fields returned, so an agent knows exactly what it retrieves. The 'list' prefix and the sibling names voicemail_drops_manage / voicemail_drops_drop make the read-vs-mutate distinction inferable, but the description never explicitly contrasts itself with those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the 'List' verb; there is no explicit statement of when to use this versus voicemail_drops_manage. The parenthetical 'only drops with audio can be dropped' is genuinely useful cross-tool guidance pointing toward voicemail_drops_drop eligibility, but it is framed as a field note rather than routing instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
voicemail_drops_manageManage voicemail dropsADestructiveInspect
Voicemail drops. create (name; the user records the audio by phone in the app), update (rename), delete (confirm first). On admin accounts only, script makes the audio in Emma's voice, billed per character: confirm the script.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: update, delete. | |
| name | No | Used by: create, update. Default "Untitled drop". | |
| action | Yes | ||
| script | No | Used by: create, update. Up to 2000 chars (~2 min). Inline tags like [warm], [chuckles] work. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag a destructive, non-idempotent write, so the safety baseline is covered. The description adds genuinely non-obvious traits: `script` is restricted to admin accounts and billed per character, and delete requires confirmation. It does not address what delete removes downstream (e.g., in-flight campaigns) or what the call returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very compact and front-loaded by action, with zero filler sentences. The telegraphic parenthetical style ('create (name; the user records the audio by phone in the app)') is dense enough to risk a misread but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the three mutations, the confirmation requirement, the cost-bearing admin path, and has no output schema to explain. However, for a destructive multi-action tool it omits prerequisites such as how to obtain a valid `id` and what happens to existing drops on delete, which an agent needs before calling update or delete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, and the description compensates where it matters: it binds `name`/`script` to create/update, explains that audio originates from a phone recording unless `script` is used, and calls out admin-only plus per-character billing for `script`. The `id` parameter's sourcing (where to get it) is the only real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource ('Voicemail drops') and enumerates the operations the tool performs (create/update/delete), plus a conditional variant (script). An agent can tell this is the CRUD surface for voicemail drops, though it never names the sibling list/drop tools to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Per-action context is implied: create when the user records audio by phone, update only for renaming, delete after confirmation, script only on admin accounts. There is no explicit guidance on when to prefer voicemail_drops_list (to obtain ids) or voicemail_drops_drop (to actually send), so routing between siblings 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.
workflows_listList workflowsARead-onlyIdempotentInspect
List workflows, plus quiet_hours (sends wait for them; null = any time) and daily_limits (and today's count; over it waits for midnight). id for one definition; id + runs: true for its run history (newest first, per-step results).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Workflow id. | |
| runs | No | With id: return run history instead. | |
| limit | No | Runs to return. Default 20. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, read-only, idempotent operation, and the description adds meaningful behavioral context: `quiet_hours` causes sends to wait, `daily_limits` with today’s count causes waits until midnight after the limit, and run history is newest-first with per-step results. It does not describe pagination or general listing behavior, but it is substantially more informative than the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loads the main purpose, then packs the mode conditions and behavioral details into as few words as possible. The parenthetical phrasing around `quiet_hours` and `daily_limits` is dense but still readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does a fair job of explaining the important return modes and some returned fields, including run history ordering. It does not fully describe the top-level list response shape or pagination, but it is adequate for a read-only list tool whose annotations and schema already cover the safety and parameter basics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3. The description still adds meaning beyond the schema by clarifying that `id` retrieves a single definition and that `id` + `runs: true` returns run history ordered newest-first with per-step results. The `limit` parameter is left to the schema, which is acceptable given full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that this is a listing/read tool for workflows and explains the three retrieval modes: all workflows, one definition by `id`, and run history with `id` + `runs: true`. It does not explicitly distinguish itself from siblings such as `workflows_manage` or `workflows_run_now`, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives useful mode-selection guidance (`id` for one definition, `id` + `runs: true` for history), so the usage is more than entirely implied. However, it never says when to choose this tool over `workflows_manage` or `workflows_run_now`, and it provides no exclusions or alternative-tool routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_manageManage workflowsADestructiveInspect
Automations. create (a trigger and steps; active by default and then acts by itself, so confirm), update (isActive false pauses), delete (confirm first).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Required for: update, delete. | |
| name | No | Required for: create; optional for: update. | |
| steps | No | Required for: create; optional for: update. Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } ("cf." prefix optional); move_deal_stage { stage_id, deal_id? }, set_deal_value { value, deal_id? } (default: the run's deal); create_deal { title, value?, stage_id? } → deal_id; set_status { status } (name; "none" clears);delay { delay_seconds | until_time HH:MM | until_date + until_offset_days?, stop_if?: {reply?, meeting?, optout?} } (account tz; stop_if: stop if they did it meanwhile); branch { condition, then: [steps], else: [steps] }. Record steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}} (give steps an id). On 400 INVALID_WORKFLOW, fix what it lists; do not retry as is. | |
| action | Yes | ||
| isActive | No | Used by: create, update. Default true. | |
| condition | No | Used by: create, update. Run is skipped unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. last_contacted_at older_than_days includes never-contacted contacts. | |
| description | No | Used by: create, update. | |
| triggerType | No | Required for: create; optional for: update. | |
| triggerEvent | No | Used by: create, update. Event name, or inbound webhook id. | |
| triggerConfig | No | Used by: create, update. Scheduled only: { recurrence: one_time|hourly|daily|weekly, run_at?, time_of_day?, days_of_week?, minute_of_hour?, timezone?, audience?: { tags: [1-5 names] } }. With audience it runs once per contact carrying any tag (max 500); without, once with no contact. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructive/openWorld/non-idempotent, and the description adds real behavioral context beyond them: a created workflow is active by default and 'acts by itself', so confirmation is warranted, and isActive=false pauses rather than deletes. It stops short of covering what update does to omitted fields or how deletion affects run history.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely compact and front-loaded with the action list; every clause carries information (default active state, pause semantics, confirmation prompts). The telegraphic, fragment-heavy style and the bare 'Automations.' opener cost a point on readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, nested-object mutation tool with no output schema, the description could have said what create returns (e.g. the new workflow id) and how update handles partial payloads. It is rescued by a very rich input schema, but the return/partial-update story is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 90% and the steps/condition/triggerConfig properties are documented in exhaustive detail in the schema itself. The description only echoes 'a trigger and steps' and the isActive pause semantics, adding little parameter-level meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description combines the resource ('Automations'/workflows) with the three specific operations (create, update, delete), so an agent can tell it apart from workflows_list and workflows_run_now. The opening noun 'Automations.' is jargon-ish rather than a verb+scope statement, and no sibling is named explicitly, which keeps it below a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives conditional guidance within the lifecycle ('delete (confirm first)', 'isActive false pauses'), which is genuinely useful. However, it never states when to reach for this tool over workflows_list or workflows_run_now, so the use-vs-alternative dimension is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
workflows_run_nowRun a workflow nowAInspect
Run a workflow now on one existing record, bypassing its trigger. Its steps really execute (texts, emails, webhooks), so confirm with the user.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| entityId | Yes | ||
| entityType | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real value beyond the annotations: it warns that steps actually fire (texts, emails, webhooks) and recommends user confirmation, which is more concrete than openWorldHint=true alone. It omits whether execution is synchronous, what the response returns, and that repeat calls re-execute (annotations carry idempotentHint=false but the description never reinforces it).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the side-effect warning front-loaded right after the action. No filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the most important risk (real outbound side effects, confirm first), which suits a no-output-schema mutation tool. But with three undocumented parameters and no statement of what a call returns or how failures surface, an agent still lacks enough to invoke it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for all three required parameters, so the description is the only source of meaning — and it says only "one existing record." That hints at entityType/entityId but gives no explanation of the workflow `id`, the permitted entity types, or ID formats.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Run a workflow now on one existing record, bypassing its trigger" gives a specific verb (run), resource (workflow), and scope (single existing record, trigger bypassed). It is distinguishable from workflows_manage/workflows_list in practice, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies the manual-execution case by saying it bypasses the trigger, and adds a confirm-with-user caveat. It never states when to prefer workflows_manage or what to do if the record has no matching workflow, so usage is implied rather than spelled out.
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
meetings_book3 fields changed- changed
Input schema / properties / name / descriptionPrevious value: -"book, no contactId: who it is with (a contact is found or made)."New value: +"book, no contactId: who. Same-name contacts come back to ask about." - added
Input schema / properties / newContactAdded value: +{ + "description": "book: not that contact.", + "type": "boolean" +} - changed
Input schema / properties / startAt / descriptionPrevious value: -"book: ISO 8601. Any future time: the user may override the meeting type's hours, notice and booking window."New value: +"book: ISO 8601, any future time."
2 tool updates
- Changed
forms_manage1 field changed- changed
Input schema / properties / fields / descriptionPrevious value: -"[{ key, label, type: text|email|phone|textarea|select|address|date|checkbox|hidden, required?, options? (select), default? (hidden) }]. Keys name, first_name, last_name, email, phone fill the contact. hidden = ?<key>= on the link. Replaces the list."New value: +"[{ key, label, type: text|email|phone|textarea|select|address|date|checkbox|hidden|section, required?, options? (select), default? (hidden), text? (section) }]. Keys name, first_name, last_name, email, phone fill the contact. hidden = ?<key>= on the link. Replaces the list."
- Changed
workflows_manage1 field changed- changed
Input schema / properties / condition / descriptionPrevious value: -"Used by: create, update. Run is skipped unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. entity.last_contacted_at older_than_days N includes contacts never contacted (last_contacted_at empty)."New value: +"Used by: create, update. Run is skipped unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. last_contacted_at older_than_days includes never-contacted contacts."
1 tool update
- Changed
campaigns_manage1 field changed- changed
Input schema / properties / steps / descriptionPrevious value: -"Drip steps (send_mode 'drip'): [{ delay_seconds, content_json, exit_on?, channel? }]. Step 0 sends at start; each later step sends delay_seconds after that recipient's previous actual send. exit_on { reply?, open?, click?, meeting? } skips the rest for a contact who did that. channel overrides the campaign channel for the step."New value: +"Drip steps (send_mode 'drip'): [{ delay_seconds, content_json, exit_on?, channel? }]. Step 0 sends at start; each later step sends delay_seconds after that recipient's previous actual send. exit_on { reply?, open?, click?, meeting?, status? } skips the rest for a contact who did that. channel overrides the campaign channel for the step."
7 tool updates
- Changed
campaigns_manage3 fields changed- changed
Input schema / properties / audience_filter / descriptionPrevious value: -"{ all: [rules], any?: [rules], include_contacts?: [ids] }. all ANDs, any ORs. Rules: {type:\"all_contacts\"}; {type:\"tag\",op:\"has\"|\"has_not\",value:name}; {type:\"behavior\",event:\"campaign_sent\"|\"campaign_opened\"|\"campaign_clicked\"|\"campaign_replied\"|\"campaign_bounced\",campaign_id,within_days?,inverse?}; {type:\"custom_field\",field:key,op:\"equals\"|\"not_equals\"|\"contains\"|\"gt\"|\"lt\",value}; {type:\"last_contacted\",op:\"gt\"|\"lt\",days}. include_contacts alone = exactly those people."New value: +"{ all: [rules], any?: [rules], include_contacts?: [ids] }. all ANDs, any ORs. Rules: {type:\"all_contacts\"}; {type:\"tag\",op:\"has\"|\"has_not\",value:name}; {type:\"behavior\",event:\"campaign_sent\"|\"campaign_opened\"|\"campaign_clicked\"|\"campaign_replied\"|\"campaign_bounced\",campaign_id,within_days?,inverse?}; {type:\"custom_field\",field:key,op:\"equals\"|\"not_equals\"|\"contains\"|\"gt\"|\"lt\",value}; {type:\"last_contacted\",op:\"gt\"|\"lt\",days}; {type:\"status\",op?:\"is_not\",value:[names|\"none\"]}. include_contacts alone = exactly those people." - changed
Input schema / properties / content / descriptionPrevious value: -"Single send. Email: { subject, preheader?, from_name?, from_email?, reply_to?, blocks: [{ type, props }] }; block types text {html}, header {html, level 1-3}, image {src, alt, width}, button {text, url, bgColor?}, divider {color?}, spacer {height}. from_email must be on a domain verified in Resend (resend_manage domains) or it fails per recipient at send time. reply_to should be a mailbox connected in Groundbase, or drip reply-exit cannot see replies. SMS: { body, media_urls? }. Merge tags like {{first_name}}, {{cf.<key>}} work in any string. Newsletter: content.kind 'newsletter' (one email, sent once). Extra blocks: section_header {title}; agent_card {photoUrl, name, title, phone, email, website, brokerage, note}; listing_card {imageUrl, status, price, address, beds, baths, sqft, url, buttonText}; market_stats {title, stats:[{label,value,change}], footnote}; quote {quote, author, role, avatarUrl}; footer {businessName, businessAddress, tagline, unsubText}. It will not send until the footer has a real business name and mailing address and no [bracketed] or $— placeholder is left anywhere; the refusal names the first one."New value: +"Single send. Email: { subject, preheader?, from_name?, from_email?, reply_to?, blocks: [{ type, props }] }; block types text {html}, header {html, level 1-3}, image {src, alt, width}, button {text, url, bgColor?}, divider {color?}, spacer {height}. from_email: a domain verified in Resend (resend_manage domains). reply_to: a mailbox connected in Groundbase, so drip reply-exit sees replies. SMS: { body, media_urls? }. Merge tags like {{first_name}}, {{cf.<key>}} work in any string. Newsletter: content.kind 'newsletter' (one email, sent once). Extra blocks: section_header {title}; agent_card {photoUrl, name, title, phone, email, website, brokerage, note}; listing_card {imageUrl, status, price, address, beds, baths, sqft, url, buttonText}; market_stats {title, stats:[{label,value,change}], footnote}; quote {quote, author, role, avatarUrl}; footer {businessName, businessAddress, tagline, unsubText}. Refused until the footer has a business name and mailing address and no [bracketed] or $— placeholder is left; the refusal names the first." - changed
Input schema / properties / enrolment_mode / descriptionPrevious value: -"'once' (default) fixes its audience at start. 'ongoing' keeps sending until stop and takes new entrants (filter re-run every 5 min, add_recipients, workflow add_to_campaign)."New value: +"'once' (default) fixes its audience at start. 'ongoing' keeps sending until stop and takes new entrants (re-checked every 5 min)."
- Changed
companies_manage1 field changed- changed
Input schema / properties / deletedAt / descriptionPrevious value: -"restore: a deleted_at from the deleted list (undoes that whole delete)."New value: +"restore: a deleted_at (undoes that whole delete)."
- Changed
contacts_list4 fields changed- changed
Input schema / properties / duplicates / descriptionPrevious value: -"List groups of live contacts sharing an email or phone instead."New value: +"Groups sharing an email or phone instead." - changed
Input schema / properties / id / descriptionPrevious value: -"Contact id. Returns that one contact; other filters ignored."New value: +"One contact by id." - added
Input schema / properties / statusAdded value: +{ + "description": "Status name or id, or none.", + "type": "string" +} - changed
Input schema / properties / unsubscribed / descriptionPrevious value: -"Opted out of any channel / email / texts, or none (for an audience)."New value: +"Opted out of any / email / sms, or none."
- Changed
contacts_manage4 fields changed- changed
Input schema / properties / deletedAt / descriptionPrevious value: -"restore: a deleted_at from the deleted list (undoes that whole delete)."New value: +"restore: a deleted_at (undoes that whole delete)." - changed
Input schema / properties / set / descriptionPrevious value: -"bulk_update: { city?, source?, position?, companyId? }."New value: +"bulk_update: { city?, source?, position?, companyId?, status? }." - added
Input schema / properties / set / properties / statusAdded value: +{ + "type": "string" +} - added
Input schema / properties / statusAdded value: +{ + "description": "Used by: create, update. Status name; default if omitted.", + "type": "string" +}
- Changed
deals_manage1 field changed- changed
Input schema / properties / deletedAt / descriptionPrevious value: -"restore: a deleted_at from the deleted list (undoes that whole delete)."New value: +"restore: a deleted_at (undoes that whole delete)."
- Changed
outbound_webhooks_manage1 field changed- changed
Input schema / properties / events / descriptionPrevious value: -"Event names, or [\"*\"] for all: contact|company.created/updated/deleted, deal.created/updated/deleted/stage_changed/won/lost, task.created/updated/completed/deleted, note.created, tag.applied/removed, sms.sent/received/delivered/failed, call.completed, voicemail.received, email.sent/received, invoice.issued/paid/voided, payment.recorded, quote.issued/accepted/declined, form.submitted, meeting.booked/rescheduled/cancelled. Slack and Discord webhook URLs get a readable message; others get signed JSON."New value: +"Event names, or [\"*\"] for all: contact|company.created/updated/deleted, contact.status_changed, deal.created/updated/deleted/stage_changed/won/lost, task.created/updated/completed/deleted, note.created, tag.applied/removed, sms.sent/received/delivered/failed, call.completed, voicemail.received, email.sent/received, invoice.issued/paid/voided, payment.recorded, quote.issued/accepted/declined, form.submitted, meeting.booked/rescheduled/cancelled. Slack and Discord webhook URLs get a readable message; others get signed JSON."
- Changed
workflows_manage1 field changed- changed
Input schema / properties / steps / descriptionPrevious value: -"Required for: create; optional for: update. Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } (\"cf.\" prefix optional); move_deal_stage { stage_id, deal_id? }, set_deal_value { value, deal_id? } (default: the run's deal); create_deal { title, value?, stage_id? } → deal_id;delay { delay_seconds | until_time HH:MM | until_date + until_offset_days?, stop_if?: {reply?, meeting?, optout?} } (account tz; stop_if: stop if they did it meanwhile); branch { condition, then: [steps], else: [steps] }. Record steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}} (give steps an id). On 400 INVALID_WORKFLOW, fix what it lists; do not retry as is."New value: +"Required for: create; optional for: update. Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } (\"cf.\" prefix optional); move_deal_stage { stage_id, deal_id? }, set_deal_value { value, deal_id? } (default: the run's deal); create_deal { title, value?, stage_id? } → deal_id; set_status { status } (name; \"none\" clears);delay { delay_seconds | until_time HH:MM | until_date + until_offset_days?, stop_if?: {reply?, meeting?, optout?} } (account tz; stop_if: stop if they did it meanwhile); branch { condition, then: [steps], else: [steps] }. Record steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}} (give steps an id). On 400 INVALID_WORKFLOW, fix what it lists; do not retry as is."
3 tool updates
- Changed
billing_profiles_manage1 field changed- added
Input schema / properties / taxExemptAdded value: +{ + "type": "boolean" +}
- Changed
invoices_manage7 fields changed- changed
Input schema / properties / charges / descriptionPrevious value: -"Charges below the subtotal (shipping, rush fee); a negative amount for a deposit or discount."New value: +"Below the subtotal (shipping); negative for a discount or deposit." - removed
Input schema / properties / charges / items / properties / amount / descriptionRemoved value: -"Decimal string." - changed
Input schema / properties / lines / descriptionPrevious value: -"Line items: itemId (saved item, priced in this currency) or name + unitPrice for a one-off. Amounts are decimal strings."New value: +"itemId (saved item) or name + unitPrice. Decimal strings. taxIds: which of the taxes apply (default all)." - removed
Input schema / properties / lines / items / properties / quantity / descriptionRemoved value: -"e.g. \"1.5\"." - added
Input schema / properties / lines / items / properties / taxIdsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - removed
Input schema / properties / lines / items / properties / taxRate / descriptionRemoved value: -"Percent, e.g. \"17.5\". Defaults from the item." - added
Input schema / properties / taxesAdded value: +{ + "description": "[{id?,name,rate}], e.g. GST 5 + QST 9.975 (ids t1,t2…).", + "items": { + "type": "object" + }, + "type": "array" +}
- Changed
quotes_manage7 fields changed- changed
Input schema / properties / charges / descriptionPrevious value: -"Charges below the subtotal (shipping, rush fee); a negative amount for a deposit or discount."New value: +"Below the subtotal (shipping); negative for a discount or deposit." - removed
Input schema / properties / charges / items / properties / amount / descriptionRemoved value: -"Decimal string." - changed
Input schema / properties / lines / descriptionPrevious value: -"Line items: itemId (saved item, priced in this currency) or name + unitPrice for a one-off. Amounts are decimal strings."New value: +"itemId (saved item) or name + unitPrice. Decimal strings. taxIds: which of the taxes apply (default all)." - removed
Input schema / properties / lines / items / properties / quantity / descriptionRemoved value: -"e.g. \"1.5\"." - added
Input schema / properties / lines / items / properties / taxIdsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - removed
Input schema / properties / lines / items / properties / taxRate / descriptionRemoved value: -"Percent, e.g. \"17.5\". Defaults from the item." - added
Input schema / properties / taxesAdded value: +{ + "description": "[{id?,name,rate}], e.g. GST 5 + QST 9.975 (ids t1,t2…).", + "items": { + "type": "object" + }, + "type": "array" +}
2 tool updates
- Changed
deal_stages_manage1 field changed- added
Input schema / properties / pipelineIdAdded value: +{ + "type": "string" +}
- Changed
deals_list4 fields changed- changed
Input schema / properties / deleted / descriptionPrevious value: -"List recently deleted deals instead (to restore)."New value: +"Recently deleted (to restore)." - changed
Input schema / properties / id / descriptionPrevious value: -"Deal id. Returns that one deal."New value: +"One deal." - added
Input schema / properties / pipelineIdAdded value: +{ + "type": "string" +} - changed
Input schema / properties / search / descriptionPrevious value: -"Matches title, contact and company name."New value: +"Title, contact or company."
7 tool updates
- Changed
companies_manage2 fields changed- changed
Input schema / properties / deletedAt / descriptionPrevious value: -"restore: undo one delete, everything it removed (its deleted_at from the deleted list)."New value: +"restore: a deleted_at from the deleted list (undoes that whole delete)." - changed
Input schema / properties / ids / descriptionPrevious value: -"restore: the deleted records to bring back."New value: +"restore: deleted ids."
- Changed
contacts_manage2 fields changed- changed
Input schema / properties / deletedAt / descriptionPrevious value: -"restore: undo one delete, everything it removed (its deleted_at from the deleted list)."New value: +"restore: a deleted_at from the deleted list (undoes that whole delete)." - changed
Input schema / properties / ids / descriptionPrevious value: -"Required for: bulk_update; optional for: restore. restore: the deleted records to bring back."New value: +"Required for: bulk_update; optional for: restore. restore: deleted ids."
- Changed
deal_stages_manage3 fields changed- changed
Input schema / properties / id / descriptionPrevious value: -"Required for: delete; optional for: update. Stage to rename/recolour."New value: +"Required for: delete; optional for: update." - changed
Input schema / properties / order / descriptionPrevious value: -"All stage ids in the new order. A partial list leaves the rest unplaced."New value: +"Every stage id, in order." - added
Input schema / properties / probabilityAdded value: +{ + "description": "Used by: create, update. Win %, for the forecast.", + "type": [ + "integer", + "null" + ] +}
- Changed
deals_manage3 fields changed- changed
Input schema / properties / deletedAt / descriptionPrevious value: -"restore: undo one delete, everything it removed (its deleted_at from the deleted list)."New value: +"restore: a deleted_at from the deleted list (undoes that whole delete)." - changed
Input schema / properties / ids / descriptionPrevious value: -"restore: the deleted records to bring back."New value: +"restore: deleted ids." - added
Input schema / properties / lostReasonAdded value: +{ + "type": "string" +}
- Changed
forms_manage4 fields changed- changed
Input schema / properties / fields / descriptionPrevious value: -"[{ key, label, type: text|email|phone|textarea|select|address, required?, options? (select) }]. Keys name, first_name, last_name, email, phone fill the contact. Replaces the list."New value: +"[{ key, label, type: text|email|phone|textarea|select|address|date|checkbox|hidden, required?, options? (select), default? (hidden) }]. Keys name, first_name, last_name, email, phone fill the contact. hidden = ?<key>= on the link. Replaces the list." - added
Input schema / properties / redirectUrlAdded value: +{ + "description": "After submit, go here (\"\" = successMessage).", + "type": "string" +} - changed
Input schema / properties / style / descriptionPrevious value: -"Appearance: { button_color, background_color, text_color: \"#rrggbb\", font: system|serif|rounded|mono }. {} resets to the default look. Replaces the whole style."New value: +"Colours \"#rrggbb\". {} = default look. Replaces the style." - changed
Input schema / properties / templateId / descriptionPrevious value: -"For create, from action templates. Default: a simple contact form."New value: +"From action templates."
- Changed
invoices_list6 fields changed- added
Input schema / properties / fromAdded value: +{ + "type": "string" +} - changed
Input schema / properties / id / descriptionPrevious value: -"Invoice id. Returns that one invoice."New value: +"One invoice." - changed
Input schema / properties / payments / descriptionPrevious value: -"With id: return the payment ledger (incl. reversed payments)."New value: +"With id: its payment ledger." - changed
Input schema / properties / recurring / descriptionPrevious value: -"With id: its repeat schedule (null if none)."New value: +"With id: its repeat schedule." - added
Input schema / properties / reportAdded value: +{ + "enum": [ + "aging", + "revenue", + "tax" + ], + "type": "string" +} - added
Input schema / properties / toAdded value: +{ + "type": "string" +}
- Changed
workflows_manage3 fields changed- changed
Input schema / properties / condition / descriptionPrevious value: -"Used by: create, update. Skip the run (status skipped) unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. entity.last_contacted_at older_than_days N includes contacts never contacted (last_contacted_at empty)."New value: +"Used by: create, update. Run is skipped unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. entity.last_contacted_at older_than_days N includes contacts never contacted (last_contacted_at empty)." - changed
Input schema / properties / steps / descriptionPrevious value: -"Required for: create; optional for: update. Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending campaigns only); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } (\"cf.\" prefix optional); delay { delay_seconds, stop_if?: { reply?, meeting?, optout? } } (stop_if ends the run if the contact did that during the wait; top-level waits over 60s); branch { condition, then: [steps], else: [steps] }. Record-targeting steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}}; give steps an explicit id to keep those references stable. On 400 INVALID_WORKFLOW, fix what the message lists rather than retrying."New value: +"Required for: create; optional for: update. Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } (\"cf.\" prefix optional); move_deal_stage { stage_id, deal_id? }, set_deal_value { value, deal_id? } (default: the run's deal); create_deal { title, value?, stage_id? } → deal_id;delay { delay_seconds | until_time HH:MM | until_date + until_offset_days?, stop_if?: {reply?, meeting?, optout?} } (account tz; stop_if: stop if they did it meanwhile); branch { condition, then: [steps], else: [steps] }. Record steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}} (give steps an id). On 400 INVALID_WORKFLOW, fix what it lists; do not retry as is." - changed
Input schema / properties / triggerConfig / descriptionPrevious value: -"Used by: create, update. Scheduled only: { recurrence: one_time|hourly|daily|weekly, run_at?, time_of_day?, days_of_week?, minute_of_hour?, timezone?, audience?: { tags: [1-5 names] } }. With audience it runs once per contact carrying any tag (max 500, else the fire fails); without, once with no contact."New value: +"Used by: create, update. Scheduled only: { recurrence: one_time|hourly|daily|weekly, run_at?, time_of_day?, days_of_week?, minute_of_hour?, timezone?, audience?: { tags: [1-5 names] } }. With audience it runs once per contact carrying any tag (max 500); without, once with no contact."
1 tool update
- Changed
tasks_manage1 field changed- changed
Input schema / properties / scope / descriptionPrevious value: -"Repeating tasks: \"occurrence\" deletes this date only, \"series\" the whole series. A series' first task takes \"series\" only (to skip its date, change the start date)."New value: +"Repeating tasks: \"occurrence\" deletes this date only, \"series\" the whole series. A series' first task needs one of them."
1 tool update
- Changed
quotes_manage1 field changed- added
Input schema / properties / confirm_paidAdded value: +{ + "description": "Void despite a deposit.", + "type": "boolean" +}
24 tool updates
- Changed
activity_list2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Default 50."New value: +"Default 50. A full page may mean more." - added
Input schema / properties / offsetAdded value: +{ + "description": "For the next page.", + "minimum": 0, + "type": "integer" +}
- Changed
addresses_manage11 fields changed- added
Input schema / properties / addressId / descriptionAdded value: +"Required for: update, delete." - added
Input schema / properties / city / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / companyId / descriptionAdded value: +"Used by: list, create, update, delete." - added
Input schema / properties / contactId / descriptionAdded value: +"Used by: list, create, update, delete." - added
Input schema / properties / country / descriptionAdded value: +"Used by: create, update." - changed
Input schema / properties / is_primary / descriptionPrevious value: -"Make this the primary address (demotes the old one)."New value: +"Used by: create, update. Make this the primary address (demotes the old one)." - changed
Input schema / properties / label / descriptionPrevious value: -"e.g. 'home', 'office'."New value: +"Used by: create, update. e.g. 'home', 'office'." - added
Input schema / properties / notes / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / postal_code / descriptionAdded value: +"Used by: create, update." - changed
Input schema / properties / province / descriptionPrevious value: -"State, province or region."New value: +"Used by: create, update. State, province or region." - added
Input schema / properties / street / descriptionAdded value: +"Used by: create, update."
- Changed
billing_profiles_manage3 fields changed- added
Input schema / properties / companyId / descriptionAdded value: +"Used by: list, save." - added
Input schema / properties / contactId / descriptionAdded value: +"Used by: list, save." - changed
Input schema / properties / id / descriptionPrevious value: -"Edit this profile. Omit to create."New value: +"Required for: delete; optional for: save. Edit this profile."
- Changed
calls_list4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Default 100, max 500."New value: +"Default 100. A full page may mean more." - added
Input schema / properties / limit / maximumAdded value: +500 - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer"
- Changed
companies_manage8 fields changed- added
Input schema / properties / city / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / country / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / id / descriptionAdded value: +"Required for: update, delete." - added
Input schema / properties / industry / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / name / descriptionAdded value: +"Required for: create; optional for: update." - added
Input schema / properties / notes / descriptionAdded value: +"Used by: create, update." - changed
Input schema / properties / state / descriptionPrevious value: -"State or province."New value: +"Used by: create, update. State or province." - changed
Input schema / properties / website / descriptionPrevious value: -"Include https://."New value: +"Used by: create, update. Include https://."
- Changed
contacts_manage9 fields changed- added
Input schema / properties / companyId / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / email / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / firstName / descriptionAdded value: +"Required for: create; optional for: update." - added
Input schema / properties / id / descriptionAdded value: +"Required for: update, delete." - changed
Input schema / properties / ids / descriptionPrevious value: -"restore: the deleted records to bring back."New value: +"Required for: bulk_update; optional for: restore. restore: the deleted records to bring back." - added
Input schema / properties / lastName / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / notes / descriptionAdded value: +"Used by: create, update." - changed
Input schema / properties / phone / descriptionPrevious value: -"Normalised to E.164."New value: +"Used by: create, update. Normalised to E.164." - changed
Input schema / properties / position / descriptionPrevious value: -"Job title."New value: +"Used by: create, update. Job title."
- Changed
custom_fields_manage5 fields changed- added
Input schema / properties / entityType / descriptionAdded value: +"Required for: create, set_value." - changed
Input schema / properties / fieldKey / descriptionPrevious value: -"snake_case, max 60 chars."New value: +"Required for: set_value; optional for: create. snake_case, max 60 chars." - added
Input schema / properties / id / descriptionAdded value: +"Required for: update, delete." - changed
Input schema / properties / name / descriptionPrevious value: -"Label, e.g. \"Loan amount\"."New value: +"Required for: create; optional for: update. Label, e.g. \"Loan amount\"." - changed
Input schema / properties / options / descriptionPrevious value: -"Required for type select."New value: +"Used by: create, update. Required for type select."
- Changed
deal_stages_manage3 fields changed- changed
Input schema / properties / color / descriptionPrevious value: -"Hex, e.g. \"#0EA5E9\"."New value: +"Used by: create, update. Hex, e.g. \"#0EA5E9\"." - changed
Input schema / properties / id / descriptionPrevious value: -"Stage to rename/recolour."New value: +"Required for: delete; optional for: update. Stage to rename/recolour." - added
Input schema / properties / name / descriptionAdded value: +"Required for: create; optional for: update."
- Changed
deals_manage8 fields changed- changed
Input schema / properties / closeAt / descriptionPrevious value: -"Expected close date, YYYY-MM-DD or ISO 8601."New value: +"Used by: create, update. Expected close date, YYYY-MM-DD or ISO 8601." - added
Input schema / properties / companyId / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / contactId / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / id / descriptionAdded value: +"Required for: update, delete." - added
Input schema / properties / notes / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / stageId / descriptionAdded value: +"Required for: create; optional for: update." - added
Input schema / properties / title / descriptionAdded value: +"Required for: create; optional for: update." - changed
Input schema / properties / valueCents / descriptionPrevious value: -"In the account's default currency (deals have no currency of their own)."New value: +"Used by: create, update. In the account's default currency (deals have no currency of their own)."
- Changed
invoice_items_manage1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Edit this item. Omit to create."New value: +"Required for: delete; optional for: save. Edit this item."
- Changed
invoices_manage2 fields changed- added
Input schema / properties / creditNoteId / descriptionAdded value: +"Required for: send_credit_note, void_credit_note." - changed
Input schema / properties / id / descriptionPrevious value: -"Edit this draft. Omit to create."New value: +"Required for: issue, send, void, public_link, credit_note, recurring; optional for: save_draft. Edit this draft."
- Changed
meeting_types_manage13 fields changed- added
Input schema / properties / availability / descriptionAdded value: +"Used by: create, update." - changed
Input schema / properties / bufferMin / descriptionPrevious value: -"Minutes kept free after each booking."New value: +"Used by: create, update. Minutes kept free after each booking." - added
Input schema / properties / description / descriptionAdded value: +"Used by: create, update." - changed
Input schema / properties / durationMin / descriptionPrevious value: -"Minutes. Default 30."New value: +"Used by: create, update. Minutes. Default 30." - added
Input schema / properties / id / descriptionAdded value: +"Required for: update, delete." - added
Input schema / properties / intakeQuestions / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / location / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / locationType / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / maxAdvanceDays / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / minNoticeHours / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / name / descriptionAdded value: +"Required for: create; optional for: update." - added
Input schema / properties / reminderSmsHours / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / slug / descriptionAdded value: +"Required for: create; optional for: update."
- Changed
notes_manage2 fields changed- added
Input schema / properties / body / descriptionAdded value: +"Required for: create, update." - added
Input schema / properties / id / descriptionAdded value: +"Required for: update, delete."
- Changed
quotes_manage1 field changed- changed
Input schema / properties / id / descriptionPrevious value: -"Edit this draft. Omit to create."New value: +"Required for: issue, send, record_outcome, convert, void, public_link; optional for: save_draft. Edit this draft."
- Changed
saved_views_manage3 fields changed- changed
Input schema / properties / filterJson / descriptionPrevious value: -"JSON-encoded filter."New value: +"Used by: create, update. JSON-encoded filter." - added
Input schema / properties / id / descriptionAdded value: +"Required for: update, delete." - added
Input schema / properties / name / descriptionAdded value: +"Required for: create; optional for: update."
- Changed
suppressions_manage4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"For list. Default 100, max 500."New value: +"For list. Default 100." - added
Input schema / properties / limit / maximumAdded value: +500 - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer"
- Changed
tags_manage3 fields changed- changed
Input schema / properties / color / descriptionPrevious value: -"Hex, e.g. \"#B91C1C\"."New value: +"Used by: create, update. Hex, e.g. \"#B91C1C\"." - added
Input schema / properties / id / descriptionAdded value: +"Required for: update, delete." - added
Input schema / properties / name / descriptionAdded value: +"Required for: create; optional for: update."
- Changed
tasks_list2 fields changed- added
Input schema / properties / status / descriptionAdded value: +"Default open." - changed
Input schema / properties / status / enumPrevious value: -[ - "open", - "done" -]New value: +[ + "open", + "done", + "all" +]
- Changed
tasks_manage13 fields changed- changed
Input schema / properties / color / descriptionPrevious value: -"Calendar colour, the same palette as Google Calendar; syncs both ways. \"default\" = the colour of its kind."New value: +"Used by: create, update. Calendar colour, the same palette as Google Calendar; syncs both ways. \"default\" = the colour of its kind." - added
Input schema / properties / companyId / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / contactId / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / dealId / descriptionAdded value: +"Used by: create, update." - changed
Input schema / properties / dueAt / descriptionPrevious value: -"ISO 8601, for tasks."New value: +"Used by: create, update. ISO 8601, for tasks." - changed
Input schema / properties / endAt / descriptionPrevious value: -"ISO 8601."New value: +"Used by: create, update. ISO 8601." - added
Input schema / properties / id / descriptionAdded value: +"Required for: update, delete." - changed
Input schema / properties / kind / descriptionPrevious value: -"Default task."New value: +"Used by: create, update. Default task." - added
Input schema / properties / location / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / notes / descriptionAdded value: +"Used by: create, update." - changed
Input schema / properties / recurrence / descriptionPrevious value: -"Repeats relative to dueAt. Tasks only."New value: +"Used by: create, update. Repeats relative to dueAt. Tasks only." - changed
Input schema / properties / startAt / descriptionPrevious value: -"ISO 8601, for events/meetings."New value: +"Used by: create, update. ISO 8601, for events/meetings." - added
Input schema / properties / title / descriptionAdded value: +"Required for: create; optional for: update."
- Changed
templates_manage4 fields changed- added
Input schema / properties / body / descriptionAdded value: +"Required for: create; optional for: update." - added
Input schema / properties / id / descriptionAdded value: +"Required for: update, delete." - added
Input schema / properties / name / descriptionAdded value: +"Required for: create; optional for: update." - changed
Input schema / properties / subject / descriptionPrevious value: -"Email only; required there."New value: +"Used by: create, update. Email only; required there."
- Changed
time_list4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Default 50, max 500."New value: +"Default 50. A full page may mean more." - added
Input schema / properties / limit / maximumAdded value: +500 - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer"
- Changed
time_manage10 fields changed- changed
Input schema / properties / billable / descriptionPrevious value: -"Default true."New value: +"Used by: start, log, update. Default true." - added
Input schema / properties / companyId / descriptionAdded value: +"Used by: start, log, update." - added
Input schema / properties / contactId / descriptionAdded value: +"Used by: start, log, update." - changed
Input schema / properties / currency / descriptionPrevious value: -"Default: invoicing currency."New value: +"Used by: start, log. Default: invoicing currency." - changed
Input schema / properties / dealId / descriptionPrevious value: -"Also fills in the deal's contact and company."New value: +"Used by: start, log, update. Also fills in the deal's contact and company." - added
Input schema / properties / description / descriptionAdded value: +"Used by: start, log, update." - added
Input schema / properties / duration / descriptionAdded value: +"Used by: log, update, delete." - added
Input schema / properties / id / descriptionAdded value: +"Required for: update, delete, unbill." - changed
Input schema / properties / rate / descriptionPrevious value: -"Hourly, decimal string."New value: +"Used by: start, log, update. Hourly, decimal string." - changed
Input schema / properties / startedAt / descriptionPrevious value: -"ISO 8601."New value: +"Used by: log, update. ISO 8601."
- Changed
voicemail_drops_manage3 fields changed- added
Input schema / properties / id / descriptionAdded value: +"Required for: update, delete." - changed
Input schema / properties / name / descriptionPrevious value: -"Default \"Untitled drop\"."New value: +"Used by: create, update. Default \"Untitled drop\"." - changed
Input schema / properties / script / descriptionPrevious value: -"Up to 2000 chars (~2 min). Inline tags like [warm], [chuckles] work."New value: +"Used by: create, update. Up to 2000 chars (~2 min). Inline tags like [warm], [chuckles] work."
- Changed
workflows_manage9 fields changed- changed
Input schema / properties / condition / descriptionPrevious value: -"Skip the run (status skipped) unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. entity.last_contacted_at older_than_days N includes contacts never contacted (last_contacted_at empty)."New value: +"Used by: create, update. Skip the run (status skipped) unless true. { all|any: [{ field, op, value }] }. Fields: entity.<column>, cf.<field_key>, trigger.event|entity_type|entity_id, trigger.payload.<key> (not payload.<key>). Ops: equals, not_equals, contains, not_contains, starts_with, ends_with, is_set, is_not_empty, is_empty, includes_tag, greater_than, greater_or_equal, less_than, less_or_equal, older_than_days, newer_than_days. entity.last_contacted_at older_than_days N includes contacts never contacted (last_contacted_at empty)." - added
Input schema / properties / description / descriptionAdded value: +"Used by: create, update." - added
Input schema / properties / id / descriptionAdded value: +"Required for: update, delete." - changed
Input schema / properties / isActive / descriptionPrevious value: -"Default true."New value: +"Used by: create, update. Default true." - added
Input schema / properties / name / descriptionAdded value: +"Required for: create; optional for: update." - changed
Input schema / properties / steps / descriptionPrevious value: -"Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending campaigns only); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } (\"cf.\" prefix optional); delay { delay_seconds, stop_if?: { reply?, meeting?, optout? } } (stop_if ends the run if the contact did that during the wait; top-level waits over 60s); branch { condition, then: [steps], else: [steps] }. Record-targeting steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}}; give steps an explicit id to keep those references stable. On 400 INVALID_WORKFLOW, fix what the message lists rather than retrying."New value: +"Required for: create; optional for: update. Ordered steps, each { id?, type, config: {...} }. Types and config: send_sms { to?, body }; send_email { to?, subject, body_html?, body_text? } (blank to = the run's contact); add_to_campaign { campaign_id } (ongoing, sending campaigns only); apply_tag / remove_tag { tag_name }; create_note { body }; create_task { title, description?, due_at?, due_in_days?, kind?, location?, contact_id? }; fire_webhook { url, method?, headers?, body? }; update_field { field, value } (first_name, last_name, email, phone, position, city, source, notes, primary_phone, company_id); set_custom_field { field_key, value } (\"cf.\" prefix optional); delay { delay_seconds, stop_if?: { reply?, meeting?, optout? } } (stop_if ends the run if the contact did that during the wait; top-level waits over 60s); branch { condition, then: [steps], else: [steps] }. Record-targeting steps also take entity_type/entity_id. Strings support {{first_name}}, {{trigger.event}}, {{steps.<id>.output.<key>}}; give steps an explicit id to keep those references stable. On 400 INVALID_WORKFLOW, fix what the message lists rather than retrying." - changed
Input schema / properties / triggerConfig / descriptionPrevious value: -"Scheduled only: { recurrence: one_time|hourly|daily|weekly, run_at?, time_of_day?, days_of_week?, minute_of_hour?, timezone?, audience?: { tags: [1-5 names] } }. With audience it runs once per contact carrying any tag (max 500, else the fire fails); without, once with no contact."New value: +"Used by: create, update. Scheduled only: { recurrence: one_time|hourly|daily|weekly, run_at?, time_of_day?, days_of_week?, minute_of_hour?, timezone?, audience?: { tags: [1-5 names] } }. With audience it runs once per contact carrying any tag (max 500, else the fire fails); without, once with no contact." - changed
Input schema / properties / triggerEvent / descriptionPrevious value: -"Event name, or inbound webhook id."New value: +"Used by: create, update. Event name, or inbound webhook id." - added
Input schema / properties / triggerType / descriptionAdded value: +"Required for: create; optional for: update."
1 tool update
- Changed
campaigns_manage1 field changed- changed
Input schema / properties / audience_filter / descriptionPrevious value: -"{ all: [rules], any?: [rules] }. Rules: { type: \"all_contacts\" } or { type: \"tag\", op: \"has\"|\"has_not\", value: \"<tag name>\" }. all[] ANDs, any[] ORs."New value: +"{ all: [rules], any?: [rules], include_contacts?: [ids] }. all ANDs, any ORs. Rules: {type:\"all_contacts\"}; {type:\"tag\",op:\"has\"|\"has_not\",value:name}; {type:\"behavior\",event:\"campaign_sent\"|\"campaign_opened\"|\"campaign_clicked\"|\"campaign_replied\"|\"campaign_bounced\",campaign_id,within_days?,inverse?}; {type:\"custom_field\",field:key,op:\"equals\"|\"not_equals\"|\"contains\"|\"gt\"|\"lt\",value}; {type:\"last_contacted\",op:\"gt\"|\"lt\",days}. include_contacts alone = exactly those people."
1 tool update
- Changed
invoice_payments_manage2 fields changed- added
Input schema / properties / sendVia / descriptionAdded value: +"How the receipt is sent. Default: their own mailbox, then Resend, then Groundbase's address." - changed
Input schema / properties / sendVia / enumPrevious value: -[ - "smtp", - "resend" -]New value: +[ + "smtp", + "resend", + "groundbase" +]
3 tool updates
- Changed
email_read4 fields changed- added
Input schema / properties / beforeAdded value: +{ + "description": "For older conversations: the `next_before` from the previous answer.", + "type": "string" +} - added
Input schema / properties / limit / maximumAdded value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer"
- Changed
quotes_list2 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Default 100.", + "maximum": 500, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "minimum": 0, + "type": "integer" +}
- Changed
resend_manage5 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "status", - "domains", - "disconnect", - "test_send", - "enable_tracking" -]New value: +[ + "status", + "domains" +] - removed
Input schema / properties / htmlRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / subjectRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / textRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / toRemoved value: -{ - "description": "test_send recipient.", - "type": "string" -}
1 tool update
- Changed
forms_manage1 field changed- added
Input schema / properties / styleAdded value: +{ + "description": "Appearance: { button_color, background_color, text_color: \"#rrggbb\", font: system|serif|rounded|mono }. {} resets to the default look. Replaces the whole style.", + "properties": { + "background_color": { + "type": "string" + }, + "button_color": { + "type": "string" + }, + "font": { + "enum": [ + "system", + "serif", + "rounded", + "mono" + ], + "type": "string" + }, + "text_color": { + "type": "string" + } + }, + "type": "object" +}
1 tool update
- Changed
tasks_manage1 field changed- added
Input schema / properties / colorAdded value: +{ + "description": "Calendar colour, the same palette as Google Calendar; syncs both ways. \"default\" = the colour of its kind.", + "enum": [ + "Lavender", + "Sage", + "Grape", + "Flamingo", + "Banana", + "Tangerine", + "Peacock", + "Graphite", + "Blueberry", + "Basil", + "Tomato", + "default" + ], + "type": "string" +}
105 tool updates
- Removed
addresses_create - Removed
addresses_delete - Removed
addresses_list - Added
addresses_manage - Removed
addresses_update - Removed
billing_profiles_list - Added
billing_profiles_manage - Removed
billing_profiles_save - Removed
companies_create - Removed
companies_delete - Changed
companies_list1 field changed- added
Input schema / properties / deletedAdded value: +{ + "description": "List recently deleted companies instead (to restore).", + "type": "boolean" +}
- Added
companies_manage - Removed
companies_update - Removed
contacts_create - Removed
contacts_delete - Changed
contacts_list6 fields changed- added
Input schema / properties / companyIdAdded value: +{ + "description": "Only contacts at this company.", + "type": "string" +} - added
Input schema / properties / deletedAdded value: +{ + "description": "List recently deleted contacts instead.", + "type": "boolean" +} - added
Input schema / properties / duplicatesAdded value: +{ + "description": "List groups of live contacts sharing an email or phone instead.", + "type": "boolean" +} - added
Input schema / properties / sortAdded value: +{ + "description": "recent = last contacted. Default name.", + "enum": [ + "name", + "created", + "updated", + "recent" + ], + "type": "string" +} - added
Input schema / properties / tagAdded value: +{ + "description": "Only contacts with this tag (name or id).", + "type": "string" +} - added
Input schema / properties / unsubscribedAdded value: +{ + "description": "Opted out of any channel / email / texts, or none (for an audience).", + "enum": [ + "any", + "email", + "sms", + "none" + ], + "type": "string" +}
- Added
contacts_manage - Removed
contacts_update - Removed
custom_fields_create - Removed
custom_fields_delete - Changed
custom_fields_list1 field changed- added
Input schema / properties / mergeTagsAdded value: +{ + "description": "List merge tags instead.", + "type": "boolean" +}
- Added
custom_fields_manage - Removed
custom_fields_set_value - Removed
custom_fields_update - Changed
dashboard_summary1 field changed- added
Input schema / properties / pipelineAdded value: +{ + "description": "Per-stage open deals instead.", + "type": "boolean" +}
- Removed
deal_stages_create - Added
deal_stages_manage - Removed
deal_stages_update - Removed
deals_create - Removed
deals_delete - Changed
deals_list1 field changed- added
Input schema / properties / deletedAdded value: +{ + "description": "List recently deleted deals instead (to restore).", + "type": "boolean" +}
- Added
deals_manage - Removed
deals_update - Removed
email_accounts_list - Removed
email_get_thread - Removed
email_list_threads - Added
email_read - Removed
email_suppressions_manage - Added
email_thread_update - Removed
invoice_items_list - Added
invoice_items_manage - Removed
invoice_items_save - Added
invoice_payments_manage - Removed
invoice_payments_record - Removed
invoice_payments_reverse - Added
invoice_settings - Removed
invoice_settings_get - Removed
invoice_settings_update - Removed
invoices_issue - Changed
invoices_list7 fields changed- added
Input schema / properties / companyIdAdded value: +{ + "type": "string" +} - added
Input schema / properties / contactIdAdded value: +{ + "type": "string" +} - added
Input schema / properties / creditNotesAdded value: +{ + "description": "With id: its credit notes.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Default 100.", + "maximum": 500, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / qAdded value: +{ + "description": "Matches number and customer.", + "type": "string" +} - added
Input schema / properties / recurringAdded value: +{ + "description": "With id: its repeat schedule (null if none).", + "type": "boolean" +}
- Added
invoices_manage - Removed
invoices_save_draft - Removed
invoices_send - Removed
invoices_void - Removed
meeting_types_create - Removed
meeting_types_delete - Added
meeting_types_manage - Removed
meeting_types_update - Removed
merge_tags_list - Removed
notes_create - Removed
notes_delete - Added
notes_manage - Removed
notes_update - Added
phone_status - Removed
quotes_convert - Removed
quotes_issue - Added
quotes_manage - Removed
quotes_record_outcome - Removed
quotes_save_draft - Removed
quotes_send - Removed
quotes_void - Removed
saved_views_create - Removed
saved_views_delete - Added
saved_views_manage - Removed
sms_cancel_scheduled - Changed
sms_list1 field changed- added
Input schema / properties / contactIdAdded value: +{ + "description": "Or the contact (their primary number is used).", + "type": "string" +}
- Added
sms_manage - Removed
sms_optouts - Added
suppressions_manage - Removed
tags_apply - Removed
tags_create - Removed
tags_delete - Added
tags_manage - Removed
tags_update - Removed
tasks_create - Removed
tasks_delete - Added
tasks_manage - Removed
tasks_update - Removed
templates_create - Removed
templates_delete - Added
templates_manage - Removed
templates_update - Removed
time_log - Added
time_manage - Removed
time_timer - Removed
time_update - Removed
twilio_balance_get - Removed
voicemail_drops_create - Removed
voicemail_drops_delete - Added
voicemail_drops_manage - Removed
voicemail_drops_update - Removed
workflows_create - Removed
workflows_delete - Added
workflows_manage - Removed
workflows_update
Publisher details
- Operator
- Groundbase
- Operator website
- https://groundbasecrm.com
- Vendor relationship
- First-party
- Documentation
- https://groundbasecrm.com/mcp
- Trust center
- Not applicable
- Restrictions
- Requires a Groundbase account. $9/mo flat, 14-day free trial. OAuth or API key.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRemote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.MIT
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs115 npm58 PyPIMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1623 npm1MIT

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