Skip to main content
Glama

Server Details

Connect AI assistants to your Wayfront agency workspace. Manage clients, orders, services, forms, and support tickets; review invoices and subscriptions; and search Wayfront documentation. Uses OAuth 2.1 and respects the connected user's workspace permissions.

Ownership verified
Status
Healthy
Uptime
99.8% over 41 days
OAuth
Works in Glama
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.8/5.0

Scored across 51 tools

Disambiguation4/5

The naming convention clearly separates read and write operations (e.g., client-read vs client-write), and most tools have distinct resources. However, some tools like invoice-tool, subscription-tool, and log-tool combine list and show actions under a single tool, which could confuse an agent that expects separate read tools. Additionally, team-tool and team-management-tool have similar names but different purposes, requiring careful reading to distinguish.

Naming Consistency4/5

The majority of tools use a consistent kebab-case verb_noun pattern (e.g., client-read, order-write, pipeline-item-read). However, several tools deviate: invoice-tool, subscription-tool, log-tool, team-tool, team-management-tool use a noun-tool pattern, and staff-directory and workspace-info use noun-only names. This mix is mostly readable but not fully consistent.

Tool Count3/5

With 51 tools, the set is quite large and may overwhelm an agent. While the domain is broad (CRM, orders, tickets, pipelines, settings, etc.), the count is on the high end; some consolidation (e.g., merging similar read/write pairs or combining query tools) could reduce cognitive load without losing functionality.

Completeness4/5

The toolset covers a wide range of operations across multiple domains with both read and write capabilities. However, there are some gaps: for example, no delete for clients, orders, tickets, or forms; no bulk operations; and some resources (e.g., coupons) only have read/write but not full lifecycle. These gaps are minor but could cause issues in edge cases.

Available Tools

57 tools
automation-readAutomation Read ToolA
Read-only
Inspect

List a pipeline's automation rules and the catalog of supported triggers, conditions, actions and references. Requires pipeline_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.
pipeline_idYesThe pipeline the automation belongs to. Required for every action.

TDQS

A4.2/5.0
Behavior4/5

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

The description's 'List' wording aligns with the readOnlyHint and destructiveHint annotations, and it does not contradict them. It adds functional context about the catalog, though it does not discuss permissions or rate limits; annotations already cover the primary side-effect profile.

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

Conciseness5/5

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

The description is a single, focused sentence that communicates the tool's purpose and key requirement without redundancy or unnecessary detail.

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

Completeness4/5

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

Given the lack of an output schema, mentioning the automation rules and the supported catalog gives a reasonable sense of what will be returned. It could be more explicit about output shape or filtering, but it is sufficient for a simple read/list operation.

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

Parameters3/5

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

The schema already provides clear descriptions for both parameters, including the enum action and the meaning of pipeline_id. The description reinforces that pipeline_id is required but adds little beyond the schema's existing parameter documentation.

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

Purpose5/5

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

Clearly states the tool lists a pipeline's automation rules and the supported catalog of triggers, conditions, actions, and references. The read-only intent is unambiguous and easily distinguished from the sibling automation-write tool.

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

Usage Guidelines4/5

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

Explicitly notes that pipeline_id is required for every action, which gives necessary invocation guidance. It does not explicitly mention when not to use it or contrast with automation-write, but the read-only wording and sibling name make the appropriate use clear.

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

automation-writeAutomation Write ToolA
Destructive
Inspect

Create, update, toggle or delete pipeline automation rules. Every action requires pipeline_id. Read automation-read first for supported triggers, conditions and actions. Active rules can trigger downstream writes, webhooks or Slack messages. Status-sync-managed rules cannot be edited.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoRule name. Required for "create"/"update".
actionYesAction to perform.
actionsNoAction list ({type, params}). Valid types + their params come from the "list" catalog. At least one action is required for "create"/"update".
conditionsNoCondition list ({field, operator, value}); all must pass (AND). Use fields/operators from the "list" catalog for the chosen trigger. Pass an empty array for no conditions.
pipeline_idYesThe pipeline the automation belongs to. Required for every action.
automation_idNoAutomation ID. Required for "update", "toggle", and "delete". Use "list" to discover IDs.
trigger_eventNoThe trigger event slug (e.g. "order.status.changed"). Must be valid for the pipeline type — see the "list" catalog. Required for "create"/"update".
description_cacheNoOptional human-readable summary of the rule (use real names, not IDs).

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses important side effects (downstream writes, webhooks, Slack messages) and a restriction (status-sync-managed rules cannot be edited), going beyond the annotations' destructiveHint. This gives the agent a clear picture of consequences.

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

Conciseness5/5

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

The description is concise and well-structured, using a few short sentences. It states the core function, key requirements, and important caveats without unnecessary elaboration.

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

Completeness4/5

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

For a write tool with no output schema, the description covers the essential context: it lists supported actions, mentions the need to read the catalog, and highlights side effects and edit restrictions. It does not describe return values, but that is a minor gap for this tool type.

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

Parameters3/5

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

Schema description coverage is 100% and the description does not add much beyond it. It reiterates that pipeline_id is required and references the 'list' catalog, but these details already exist in the parameter descriptions. The baseline for high coverage is 3, and no significant extra meaning is added.

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

Purpose5/5

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

The description explicitly states the tool's function with a specific verb ('Create, update, toggle or delete') and a clear resource ('pipeline automation rules'). This distinguishes it from the sibling automation-read tool.

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

Usage Guidelines4/5

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

The description advises reading automation-read first for supported triggers/conditions/actions, giving a clear usage order. While it doesn't explicitly say 'use this when you need to modify automations', the intent is obvious and the guidance is helpful.

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

client-custom-field-readClient Custom Field Read ToolA
Read-only
Inspect

List client custom-field definitions, IDs, types and options.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds the specific output scope (definitions, IDs, types, options), which provides useful behavioral 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.

Conciseness5/5

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

A single, front-loaded sentence that is entirely relevant and contains no filler. Every word earns its place.

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

Completeness5/5

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

For a simple read-only list tool with one parameter and no output schema, the description fully conveys what the tool does and what it returns. No critical information is missing for an agent to call it correctly.

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

Parameters3/5

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

The single parameter 'action' has 100% schema coverage with an enum description ('Action to perform.'). The description does not add any additional meaning beyond the schema, so the baseline score of 3 applies.

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

Purpose5/5

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

The description states a clear verb ('List') and a specific resource ('client custom-field definitions'), and enumerates the exact data returned (IDs, types, options). This distinguishes it from the sibling 'client-custom-field-write' and other read tools.

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

Usage Guidelines4/5

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

The name and description make the use case obvious—reading custom-field definitions. While no explicit exclusions or alternative tools are named, the distinction from the write counterpart is implicit and sufficient for an agent to select it.

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

client-custom-field-writeClient Custom Field Write ToolA
Destructive
Inspect

Set or clear a client custom-field value. Requires client_id, field_id and value; null clears the value. Discover definitions with client-custom-field-read. File-type fields cannot be set through MCP.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueNoValue to set. For checkboxes use "1" for checked or "0" to uncheck. For dropdowns use one of the field's items. Pass null or omit to clear any field.
actionYesAction to perform.
field_idNoCustom field ID. Required for "set" action. Use "list" to discover available field IDs.
client_idNoClient ID. Required for "set" action.

TDQS

A4.4/5.0
Behavior4/5

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

Openly describes modifying/clearing data and notes that file-type fields cannot be set via MCP, which is consistent with destructiveHint=true. It does not mention irreversibility, but the destructive nature is conveyed.

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

Conciseness5/5

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

Three concise sentences with no filler; each sentence adds necessary operational context.

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

Completeness4/5

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

Covers required inputs, clear/update semantics, read-tool discovery, and a key limitation. No return-value details are provided, but no output schema exists and this is a write operation.

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

Parameters4/5

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

All parameters have descriptive schema text, and value encoding for checkboxes, dropdowns, and null-clearing is explained in detail. There is a slight inconsistency between the required array and the prose requirements, but the field-level descriptions compensate.

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

Purpose5/5

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

Description states a specific action ('Set or clear') on a specific resource ('client custom-field value') and points to the read tool for discovering definitions, so its purpose is unambiguous.

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

Usage Guidelines4/5

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

Provides usage details: required identifiers, null-clearing behavior, and the file-type-field limitation. It does not explicitly discuss alternative write tools for unsupported fields, but the guidance is clear enough.

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

client-readClient Read ToolB
Read-only
Inspect

List or show visible client accounts with filtering, sorting and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, email, role, role_id, accounts.id, status_id, managers, manager_id, pipelineItems, optin, created_at, updated_at.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, email, role, role_id, accounts.id, status_id, managers, manager_id, pipelineItems, optin, created_at, updated_at. Status filter key is "status_id" (numeric IDs, not string names): 1=Contact, 2=Lead, 3=Client, 4=Client Team. Marketing opt-in filter key is "optin": 1=opted in, 0=opted out (shows the "Outreach opt-out" badge), use the $null operator for never answered.
client_idNoClient ID. Required for "show" action.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the 'visible' qualifier, which implies some accounts may be hidden, but does not explain the mechanism or consequences. It does not contradict annotations.

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

Conciseness5/5

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

A single sentence that is front-loaded with the core action and resource, and includes the key capabilities (filtering, sorting, pagination). No waste, every word earns its place.

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

Completeness4/5

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

For a read-only tool with a fully described schema (6 params, nested filters, enums), the description is adequate. It does not explain return formats, but no output schema exists and the action semantics (list vs show) are implicit in parameter names and schema descriptions. The 'visible' nuance is a small gap.

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

Parameters3/5

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

Schema coverage is 100% with detailed descriptions for all parameters, including enums, defaults, and filter field examples. The description's mention of filtering, sorting, and pagination adds no meaning beyond what the schema already provides, so it stays at baseline.

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

Purpose4/5

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

The description states the verb (list/show) and resource (client accounts) clearly, and mentions filtering, sorting, and pagination. It is specific enough to differentiate from client-write (which mutates) and client-custom-field-read (different resource), though it does not explicitly name siblings.

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

Usage Guidelines2/5

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

No guidance on when to use this tool vs alternatives. The description does not mention client-write, client-custom-field-read, or other read tools, nor any conditions that would favor one over the other. The 'visible client accounts' phrase hints at a scope but is not actionable.

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

client-writeClient Write ToolA
Destructive
Inspect

Create or update a client account. "create" requires email; welcome_email defaults to true and can send an external welcome email. "update" is a partial update of an existing client's profile: omitted fields are left untouched, and an explicit null clears a field (email cannot be cleared).

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoClient note. Max 65535 characters. For "create" and "update"; omit to leave untouched on "update", null to clear.
emailNoClient email address. Required for "create". Optional for "update" — cannot be cleared to null.
optinNoMarketing opt-in flag. For "create" and "update"; omit to leave untouched on "update", null to clear.
phoneNoClient phone number. Max 64 characters. For "create" and "update"; omit to leave untouched on "update", null to clear.
actionYesAction to perform.
name_fNoClient first name. Max 64 characters. For "create" and "update"; omit to leave untouched on "update", null to clear.
name_lNoClient last name. Max 64 characters. For "create" and "update"; omit to leave untouched on "update", null to clear.
tax_idNoClient tax ID. Max 255 characters. For "create" and "update"; omit to leave untouched on "update", null to clear.
addressNoAddress: line_1, city, state, postcode, country (2-letter code). For "create" and "update". On "update", provided fields are merged into the existing address (or a new address is created if none exists); omit the whole object to leave the address untouched — null is also treated as untouched, not cleared.
balanceNoOptional starting client balance. "create" only.
companyNoClient company name. Max 255 characters. For "create" and "update"; omit to leave untouched on "update", null to clear.
client_idNoClient id. Required for "update".
status_idNoClient status ID. For "create" and "update"; omit to use the model default on "create" or leave untouched on "update". Cannot be null or empty.
stripe_idNoStripe customer ID. Must be unique. For "create" and "update"; omit to leave untouched on "update", null to clear.
created_atNoOptional creation date/time. "create" only.
welcome_emailNoWhether to send the welcome email. Defaults to true. "create" only.
referrer_user_idNoReferring client ID. Must be a different client. For "create" and "update"; omit to leave untouched on "update", null to clear.

TDQS

A4.3/5.0
Behavior4/5

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

The description discloses important behavioral traits: welcome_email defaults to true and can send an external email, update is partial with omitted fields untouched, null clears fields, and email cannot be cleared. It also notes address merge behavior. Annotations already indicate destructiveHint=true, so the description adds meaningful context beyond that. It doesn't mention side effects like email sending beyond welcome_email, but the key behaviors 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.

Conciseness4/5

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

The description is compact and front-loaded with the core purpose. It packs significant behavioral detail into a few sentences without redundancy. It could be slightly more structured, but it earns its place with high information density.

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

Completeness4/5

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

Given the tool's complexity (17 params, nested address object, two actions with different requirements), the description covers the critical semantics: create vs update, null clearing, email constraints, and address merging. It doesn't explain return values, but there is no output schema and the description focuses on invocation semantics. It is complete enough for an agent to call the tool correctly in most cases.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents all parameters. The description adds value by explaining the create/update distinction and the null-clearing semantics, which are not fully obvious from the schema alone. It also clarifies the address merge behavior and email constraints. This goes beyond 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.

Purpose5/5

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

The description clearly states the tool creates or updates a client account, and distinguishes the two actions with their key semantics. It names the resource (client account) and the specific operations, making it easy to differentiate from sibling read tools like client-read.

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

Usage Guidelines4/5

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

The description explains when to use 'create' vs 'update' and highlights important constraints like email being required for create and not clearable on update. It doesn't explicitly name alternative tools, but the action enum and per-field notes provide clear usage context. It could be improved by explicitly stating when to prefer client-write over other write tools.

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

company-readCompany Read ToolA
Read-only
Inspect

List or show client companies (client teams). A company groups client accounts that collaborate: members with collaborate_on_new_orders/collaborate_on_new_tickets are added as collaborators on the company owner's new orders/tickets, and members with access_invoices can see invoices belonging to the owner. The owner decides whose invoices members with invoice access see. "list" supports the standard filters/sort/limit/page plus client_id, which finds the companies a given client belongs to, whether as a member or as the owner. "show" returns the owner, whether the owner is also a member (owner_is_member), and every member with their three flags.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, name, owner_id, created_at, updated_at.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, name, owner_id, created_at, updated_at.
client_idNoFilter "list" to companies where this client is a member or the owner.
company_idNoCompany id. Required for "show" actions.

TDQS

A4.5/5.0
Behavior5/5

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

The description discloses meaningful behavioral context beyond the readOnlyHint and destructiveHint annotations: collaboration flags, invoice visibility rules, owner_is_member behavior, and what show returns. This gives an agent a realistic model of the tool's domain effects without contradicting the annotations.

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

Conciseness4/5

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

The description is information-dense but well-structured, front-loading the purpose before explaining domain rules and action-specific details. It is longer than average, but the added context about collaboration and invoice visibility earns its place for a domain with nested semantics.

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

Completeness4/5

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

There is no output schema, so the description must carry return-value information. It explicitly states what show returns and implies list returns standard company records. Given the tool's moderate complexity and 7 parameters, the description is largely complete, though list output details are not fully spelled out.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value by explaining that client_id finds companies where the client is a member or owner, that company_id is required for show, and by clarifying which parameters apply to which action. This is helpful semantic context beyond the raw field descriptions.

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

Purpose5/5

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

The description opens with a specific verb and resource: "List or show client companies (client teams)." It distinguishes the two actions, list and show, and explains the core concept of a company grouping client accounts. This clearly separates it from the sibling company-write tool.

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

Usage Guidelines4/5

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

The description provides concrete guidance on when to use each action: list for filtered queries including finding companies by client_id, show for retrieving owner and member details. It does not explicitly name company-write as the mutation alternative, but the readOnly annotation and sibling naming make the boundary clear.

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

company-writeCompany Write ToolA
Destructive
Inspect

Create, update or delete client companies (client teams) and their membership. Companies have no unique name — call company-read "list" with client_id first to check whether a client already belongs to a team before creating a new one. "add_member" requires an existing client account (create one with client-write first) and defaults collaborate_on_new_orders/collaborate_on_new_tickets to true, access_invoices to false, and share_existing_subscriptions to false. "update_member" changes only the flags supplied. "remove_member" of the current owner requires new_owner_client_id, unless they are the company's only member. Every ownership change ("create"/"update" with owner_client_id, "remove_member" with new_owner_client_id) decides whose invoices members with access_invoices can see and who manages the team in the portal, and shares the new owner's existing subscriptions with members who collaborate on orders. "delete" permanently deletes the team, its memberships, pipeline cards and SEO reporting data and cannot be undone; former members keep access to orders, tickets and subscriptions they already collaborate on (use "remove_member" first to revoke it) but lose access to the owner's invoices.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoCompany name. Max 255 characters, not unique — call company-read "list" with client_id first. Required for "create", optional for "update".
actionYesAction to perform.
client_idNoClient ID of the member. Required for "add_member", "update_member" and "remove_member". Must already exist — create the client with client-write first.
company_idNoCompany ID. Required for "update", "add_member", "update_member", "remove_member" and "delete".
access_invoicesNoWhether the member can see invoices belonging to the company owner. "add_member" defaults to false.
owner_client_idNoClient ID to set as the company owner. For "create", optional; the owner is attached as a member with all three flags false. For "update", moves ownership to an existing member of the company — cannot be cleared to null. Changes whose invoices members with access_invoices can see and who manages the team, and shares the new owner's existing subscriptions with members who collaborate on orders.
new_owner_client_idNoClient ID of an existing other member to become the new owner. Required by "remove_member" when removing the current owner while other members remain. Shares the new owner's existing subscriptions with members who collaborate on orders.
collaborate_on_new_ordersNoWhether the member is added as a collaborator on the owner's new orders. "add_member" defaults to true.
collaborate_on_new_ticketsNoWhether the member is added as a collaborator on the owner's new tickets. "add_member" defaults to true.
share_existing_subscriptionsNoFor "add_member" only. When true, this client's existing subscriptions are shared with company members who collaborate on orders, so they can submit requests. Defaults to false. Only set true when the user explicitly asks to share the client's existing subscriptions with the team.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false and destructiveHint=true. The description adds substantial behavioral detail: the non-unique name caveat, default flag values for add_member, the system-wide side effects of ownership changes (invoice visibility, portal management, subscription sharing), and the permanent, irreversible nature of delete including what data is destroyed. This goes well beyond the annotations.

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

Conciseness4/5

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

The description is a single dense paragraph that front-loads the purpose but then packs many behavioral rules into run-on sentences. Every claim is relevant and the length is justified for a six-action tool, but it would be more scannable with bullet points or clearer segmentation.

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

Completeness5/5

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

For a complex write tool with six actions and 10 parameters, the description covers the essential preconditions (company-read first, client-write first), action-specific requirements (new_owner_client_id), default values, side effects, and the irreversible delete outcome. No output schema exists, but the tool is a write operation and return-value details are not essential for correct invocation.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3. The description adds cross-parameter meaning beyond the schema by explaining how owner_client_id and new_owner_client_id affect invoice visibility and subscription sharing, and that update_member changes only the flags supplied. This elevates the agent's understanding of the parameters' interactions.

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

Purpose5/5

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

The description opens with a specific verb set and resource: 'Create, update or delete client companies (client teams) and their membership.' It mentions the sibling company-read tool and instructs calling it first, clearly distinguishing write behavior from read behavior.

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

Usage Guidelines5/5

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

It explicitly tells the agent to call company-read 'list' with client_id first to check for existing teams, and to create a client with client-write before add_member. It also explains when new_owner_client_id is required for remove_member and how update_member differs from add_member, giving clear 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.

coupon-readCoupon Read ToolA
Read-only
Inspect

List or show discount coupons with filtering, sorting and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, code, description, type, discounts, date_expires, new_customers, single_use, single_quantity, duration, is_cart_total, used_count, min_cart_amount, created_at, updated_at, deleted_at, coupons.id, coupons.code, coupons.description, coupons.type, coupons.discounts, coupons.date_expires, coupons.new_customers, coupons.single_use, coupons.single_quantity, coupons.duration, coupons.is_cart_total, coupons.used_count, coupons.min_cart_amount, coupons.created_at, coupons.updated_at, coupons.deleted_at, affiliate.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, code, description, type, discounts, date_expires, new_customers, single_use, single_quantity, duration, is_cart_total, used_count, min_cart_amount, created_at, updated_at, deleted_at, coupons.id, coupons.code, coupons.description, coupons.type, coupons.discounts, coupons.date_expires, coupons.new_customers, coupons.single_use, coupons.single_quantity, coupons.duration, coupons.is_cart_total, coupons.used_count, coupons.min_cart_amount, coupons.created_at, coupons.updated_at, coupons.deleted_at, affiliate.
coupon_idNoCoupon id. Required for "show" actions.

TDQS

A3.6/5.0
Behavior4/5

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

The annotations already establish read-only and non-destructive behavior, and the description adds concrete behavioral details about list/show actions, filtering, sorting, and pagination. There is no contradiction between the description and annotations.

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

Conciseness5/5

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

The main description is a single, front-loaded sentence that states the resource, actions, and key capabilities. The longer field lists live in the schema and do not bloat the prose description.

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

Completeness4/5

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

Given the absence of an output schema, the description adequately conveys that the tool returns coupon data and supports pagination. It does not spell out the exact response shape or error behavior, but the core context for invoking the tool is present.

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

Parameters3/5

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

The schema already describes all parameters, so the baseline is 3. The description adds available field lists and a filter example, but much of this repeats the schema and the 'Purity filter' phrasing is unclear, providing only marginal additional meaning.

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

Purpose4/5

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

The description clearly identifies the tool as reading discount coupons via 'list' or 'show' actions and mentions filtering, sorting, and pagination. It does not explicitly distinguish itself from the sibling coupon-write tool, though the name and actions make the read purpose evident.

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

Usage Guidelines2/5

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

The description gives no guidance on when to use this tool versus coupon-write or other read-oriented sibling tools. It lacks explicit context such as 'use for read-only coupon access' or 'use coupon-write for modifications.'

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

coupon-writeCoupon Write ToolA
Destructive
Inspect

Create or update discount coupons. Requires coupon permission. Creation requires a unique code, type and discounts; percentage discounts cannot exceed 100. Updates replace supplied discount collections and can affect what clients pay.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoCoupon code (max 32, unique). Required for "create", optional for "update".
typeNoDiscount type: "percentage" (amount is 0–100 percent) or "fixed" (amount is a monetary value). Required for "create".
actionYesAction to perform.
durationNoWhether the discount applies for the full subscription duration. Optional.
coupon_idNoCoupon id. Required when updating an existing record.
discountsNoDiscount rules. Required for "create". Each entry has an "amount" and optional "services".
single_useNoAllow each customer to use the coupon only once. Optional.
descriptionNoInternal description of the coupon. Optional.
date_expiresNoExpiry date-time (e.g. "2026-12-31 23:59:59"). Optional; pass null on "update" to clear.
is_cart_totalNoFixed coupons only: take the amount off the eligible cart subtotal once, spread across the eligible items, instead of off every eligible item and quantity. Ignored (forced false) for percentage coupons. Optional.
new_customersNoRestrict the coupon to customers with no prior paid invoices. Optional.
min_cart_amountNoMinimum cart total required to use the coupon. Optional; pass null on "update" to clear.
single_quantityNoApply the discount to a single quantity only. Optional.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already indicate write and destructive behavior. The description adds useful context by explicitly warning that updates replace supplied discounts and can affect what clients pay, which goes beyond the raw schema.

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

Conciseness5/5

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

The description is compact, front-loaded with the core action, and packs essential operational details into two sentences without unnecessary filler.

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

Completeness5/5

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

Despite having no output schema, the description covers the necessary context: permissions, required inputs, update behavior, and financial impact. It is sufficiently complete for an agent to decide when and how to invoke the tool.

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

Parameters5/5

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

Schema coverage is 100% and the description adds meaningful constraints not obvious from types alone, such as 'required for create', 'pass null on update to clear', percentage limits, and fixed-coupon behavior. This strongly supports correct parameter usage.

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

Purpose5/5

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

Description clearly states the tool creates or updates discount coupons, distinguishing it from the read-only sibling coupon-read. The verb and resource are specific and unambiguous.

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

Usage Guidelines4/5

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

Mentions required coupon permission, creation requirements (unique code, type, discounts), and warns that updates replace discount collections. It does not explicitly say 'use coupon-read for retrieval', but the create/update framing makes the intended usage clear.

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

deal-activity-readDeal Activity Read ToolA
Read-only
Inspect

List logged and scheduled activities for a deal. Requires deal_id; supports filtering, sorting and pagination. Only activities visible to the authenticated staff member are returned.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number. Default 1.
sortNoSort fields. Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, user_id, deal_id, author_id, content, scheduled_at, completed_at, completed_by, assigned_to, created_at, updated_at, activities.id, activities.user_id, activities.deal_id, activities.author_id, activities.content, activities.scheduled_at, activities.completed_at, activities.completed_by, activities.assigned_to, activities.created_at, activities.updated_at, user, deal, author, assignee, completedBy, audits.
limitNoResults per page. Default 20, max 100.
actionYesAction to perform.
deal_idYesDeal id. Required for all actions.
filtersNoPurity filter object. Keys are field names, values are operator objects. Example: {"status":{"$eq":"active"}}. Available fields: id, user_id, deal_id, author_id, content, scheduled_at, completed_at, completed_by, assigned_to, created_at, updated_at, activities.id, activities.user_id, activities.deal_id, activities.author_id, activities.content, activities.scheduled_at, activities.completed_at, activities.completed_by, activities.assigned_to, activities.created_at, activities.updated_at, user, deal, author, assignee, completedBy, audits.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish the safe read-only profile, so the bar is lower. The description adds a non-obvious behavioral constraint: results are scoped to activities visible to the authenticated staff member, which is meaningful auth-driven filtering not captured in annotations.

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

Conciseness5/5

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

Two tight sentences, front-loading purpose then the required parameter and capabilities. No filler or redundancy.

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

Completeness4/5

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

For a read-list tool with full schema coverage, no output schema, and annotations carrying the safety profile, the definition covers purpose, required input, capabilities, and the visibility caveat. The return shape and total-count behavior are left unspecified but not critical.

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

Parameters3/5

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

Schema description coverage is 100%, with pagination defaults, sort syntax, filter operators, and the action enum all documented in the schema itself. The description only restates that filtering/sorting/pagination exist and that deal_id is required, adding no syntax beyond the schema. Baseline 3 applies.

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

Purpose4/5

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

States a specific verb (list) and resource (logged and scheduled activities for a deal), which distinguishes it from deal-activity-write and user-activity-read by the 'read' scope and 'deal' target. It does not name a sibling explicitly, but the resource is unmistakable.

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

Usage Guidelines3/5

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

It gives a clear precondition ('Requires deal_id') and notes filtering/sorting/pagination support, which implies read-and-inspect use. However, it never states when to prefer this over user-activity-read or how it relates to deal-activity-write, leaving routing to inference.

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

deal-activity-writeDeal Activity Write ToolA
Destructive
Inspect

Create, update, delete or complete deal activities. Requires deal_id; update/delete/complete also require activity_id belonging to this deal and visible to you. Create and update require content. Create accepts scheduled_at and assigned_to for a follow-up; update can reschedule/reassign pending activities and preserves omitted scheduling fields. Delete permanently removes the activity from the deal and contact. Activities also appear on the contact and changes use the normal permissions and history logs.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.
contentNoActivity content/notes (plain text, max 10000 chars). Required for "create" and "update".
deal_idYesDeal id. Required for all actions.
activity_idNoActivity ID. Required for "update", "delete" and "complete".
assigned_toNoOptional staff assignee for scheduled activities. On update, omit to preserve or pass null to unassign.
scheduled_atNoOptional future date/time (ISO 8601). Create without it logs a completed activity. Update only accepts it for a pending activity; omit to preserve the due date.

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (destructiveHint=true, readOnlyHint=false), the description discloses that delete permanently removes the activity from both the deal and contact, that update preserves omitted scheduling fields, and that changes flow through normal permissions and history logs. This is meaningful mutation and side-effect context an agent needs before acting.

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

Conciseness4/5

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

Five dense sentences, all front-loaded around the action requirements and then the behavior notes; each sentence carries distinct information with no filler. It is slightly long but nothing reads as redundant.

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

Completeness5/5

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

With no output schema needed and annotations covering the safety profile, the description still covers all four actions, their parameter requirements, scheduling behavior, and delete side effects, leaving nothing an agent needs to invoke it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so per-field meaning is already documented; the description still adds cross-action semantics, e.g. that update only accepts scheduled_at for a pending activity and can reschedule/reassign, and that a create without scheduled_at logs a completed activity. This goes slightly beyond the per-parameter schema text.

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

Purpose4/5

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

The description opens with a specific set of verbs (create, update, delete, complete) acting on a clear resource (deal activities), so the tool's function is unambiguous. It does not explicitly distinguish itself from the deal-activity-read sibling, relying on the write/read naming convention instead, which keeps it from a full 5.

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

Usage Guidelines4/5

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

It gives clear conditional guidance tied to actions: deal_id always required, activity_id required for update/delete/complete, content required for create/update, and scheduling fields only apply on create/update. It stops short of naming alternatives or stating when not to use this tool versus the read counterpart.

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

deal-message-readDeal Message Read ToolA
Read-only
Inspect

List client-facing messages in a deal conversation. Requires deal_id; supports filtering, sorting and pagination. Conversation ticket permissions apply. An unstarted conversation returns an empty list; staff notes are activities.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number. Default 1.
sortNoSort fields. Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, review, media.
limitNoResults per page. Default 20, max 100.
actionYesAction to perform.
deal_idYesDeal id. Required for all actions.
filtersNoPurity filter object. Keys are field names, values are operator objects. Example: {"status":{"$eq":"active"}}. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, review, media.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, non-destructive, and closed-world behavior. The description adds meaningful context beyond that: conversation ticket permissions are required, an unstarted conversation returns an empty list, and staff notes are excluded because they are activities. This adds auth and edge-case transparency, though no rate-limit or pagination behavior beyond the schema.

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

Conciseness5/5

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

Four short sentences, front-loaded with the core purpose and required parameter. The permission note and empty-list edge case follow logically, and every sentence carries useful information.

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

Completeness4/5

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

For a 6-parameter list tool with nested filters and no output schema, the description covers the key non-schema behaviors: permissions, empty-conversation return, and staff-note exclusion. It does not describe the returned message shape, but with rich sort/filter field lists in the schema and no output schema, that omission is minor.

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

Parameters3/5

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

Schema description coverage is 100%, so parameters are already fully documented. The description reiterates that deal_id is required and that filtering, sorting, and pagination are supported, but adds no syntax or semantic detail beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource: 'List client-facing messages in a deal conversation.' It distinguishes itself from deal-message-write by being a read, and from deal-activity-read by noting 'staff notes are activities.' An agent can identify the tool's purpose without opening the schema.

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

Usage Guidelines4/5

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

Gives clear context: requires deal_id, supports filtering/sorting/pagination, and conversation ticket permissions apply. The clause 'staff notes are activities' implicitly routes staff-note queries to deal-activity-read. It stops short of explicitly naming that alternative or other sibling message tools, so it is not a full when/when-not guide.

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

deal-message-writeDeal Message Write ToolA
Destructive
Inspect

Create, update or delete client-facing messages on a deal. Requires deal_id; update/delete also require message_id from that deal. Create/update require message (plain text or HTML, max 65535 chars). Create starts/restores the conversation with normal outreach gates and notifications; each successful create sends a separate message, including repeated text. Update edits your own message; delete follows normal message permissions. Edits/deletions change the stored conversation and cannot recall or change emails already delivered. Internal notes belong in deal-activity-write; staff-only messages are rejected.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
deal_idYesDeal ID. Required for all actions.
messageNoClient-facing message body (plain text or HTML, max 65535 chars). Required for create/update.
message_idNoMessage ID belonging to this deal. Required for update/delete.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare non-readOnly, destructive, and open-world, yet the description adds genuinely new behavioral context: creates trigger outreach gates and notifications, each create emits a separate message even for repeated text, updates are limited to your own message, and edits/deletes cannot recall already-delivered email. That last point is exactly the kind of irreversibility detail an agent needs before calling a destructive tool.

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

Conciseness4/5

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

Front-loaded with purpose and then layered by increasing specificity, with no filler sentences. It loses a point only because the parameter-requirement sentence duplicates what the schema and its required[] array already state.

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

Completeness5/5

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

For a four-parameter mutation tool with no output schema but with annotations covering the safety profile, the description supplies everything needed to call it correctly: ownership limits, notification side effects, non-recall of delivered mail, and routing for out-of-scope content. Nothing material is missing.

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

Parameters3/5

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

Schema description coverage is already 75% and the schema documents all four parameters, including the action-conditional requirements. The description largely restates those same facts (deal_id required everywhere, message_id for update/delete, message max 65535 chars) without adding format or validation detail beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

The first sentence gives a specific verb set (create/update/delete) and a specific resource (client-facing messages on a deal), which cleanly separates it from the read sibling deal-message-read. It further disambiguates from deal-activity-write by explicitly stating that internal notes belong there.

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

Usage Guidelines5/5

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

It states when to use it (client-facing messages, with create/update/delete variants), when not to use it (internal notes -> deal-activity-write; staff-only messages are rejected outright), and the per-action parameter preconditions. The routing rule to the alternative sibling is explicit rather than inferred.

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

deal-readDeal Read ToolA
Read-only
Inspect

List or show sales deals. Multiple deals can belong to the same contact (user_id), including opportunities whose end-client is not known. List supports filters, sorting, pagination and an optional pipeline_id. Responses include visible pipeline card IDs for pipeline-item-write moves. Deal values require invoice access. Use deal-activity-read and deal-message-read with deal_id to read its activities and conversation.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, user_id, company_id, owner_id, created_by, service_id, title, status, expected_close_date, closed_at, created_at, updated_at.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
deal_idNoDeal id. Required for "show" actions.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, user_id, company_id, owner_id, created_by, service_id, title, status, expected_close_date, closed_at, created_at, updated_at. Deal status values are open, won and lost. Monetary fields are not filterable or sortable.
pipeline_idNoFor list, restrict to deals on this visible sales pipeline.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely non-obvious context: responses include visible pipeline card IDs usable by pipeline-item-write, and monetary values are access-gated by invoice permissions. No pagination limits or failure modes are described, keeping it short of a 5.

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

Conciseness4/5

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

Roughly four sentences, front-loaded with the verb/resource and then the cross-tool routing. Sentences are information-dense but slightly cramped, packing data-model, permissions, return values, and siblings together with no explicit separation.

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

Completeness4/5

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

For a read-only tool with full schema coverage and no output schema, the description covers the notable extras an agent needs: the parent/child relationship with contacts, the pipeline_id correlation to pipeline-item-write, and the invoice-access requirement for deal values. It omits return shape and pagination envelope details, but these are minor for a read tool.

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

Parameters3/5

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

Schema coverage is 100% and each parameter already carries its own description, sort syntax, and filter examples, so the schema does the heavy lifting. The description only reinforces that list supports filters, sorting, pagination and an optional pipeline_id, adding no syntax or semantics beyond the schema. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb pair (list/show) on a named resource (sales deals) and clarifies the data model: multiple deals can belong to the same contact. An agent can distinguish this read tool from deal-write, deal-activity-read, and deal-message-read without opening schemas.

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

Usage Guidelines4/5

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

Explicitly routes activity and conversation reads to deal-activity-read and deal-message-read with deal_id, and notes deal values require invoice access. It does not explicitly state when to choose 'show' over 'list' beyond the schema's id requirement, so it falls short of full when/when-not guidance.

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

deal-writeDeal Write ToolA
Destructive
Inspect

Create, partially update, mark_won, mark_lost or reopen sales deals. Create requires user_id, pipeline_id, stage_id, title and either value or service_id; it creates the deal and first pipeline card together. Separate opportunities under one contact are allowed. Update preserves omitted fields, can reassign user_id to another active client contact, and accepts null to clear company_id, owner_id, service_id, value or expected_close_date. Reassignment moves existing activities and the conversation to the new contact while invoices retain their original client. Closed deals lock value and service. Closing a deal also closes its conversation ticket and can trigger configured integrations. Use pipeline-item-write to move cards and deal-activity-write with deal_id to record deal activities. Use deal-message-write to send client-facing messages. Does not delete deals.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoOptional first private activity, max 10000 characters. Create only; requires permission to create activities for the contact.
titleNoOpportunity title, max 255 characters. Required for create; optional for update.
valueNoNonnegative decimal amount, e.g. "1250.00". Requires invoice access. Create requires value or service_id; zero is allowed. Null clears on update. Locked once closed.
actionYes
deal_idNoRequired for update, mark_won, mark_lost and reopen.
user_idNoExisting active client contact ID. Required for create; optional on update to reassign the deal and its conversation while preserving history. Multiple deals may use the same contact.
owner_idNoStaff owner ID. Create defaults to the authenticated user; null unassigns on update.
stage_idNoStage in that pipeline. Required for create. Move existing cards with pipeline-item-write.
company_idNoOptional company owned by or containing the contact. Null clears it on update. An unknown end-client does not require a company.
service_idNoOptional active service. Supplies the price/currency when value is omitted. Required on create without invoice access. Null clears on update. Locked once closed.
lost_reasonNoOptional reason for mark_lost, max 255 characters.
pipeline_idNoVisible sales pipeline ID. Required for create.
expected_close_dateNoOptional date, YYYY-MM-DD. Null clears on update.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already flag this as a destructive, non-read-only, open-world write. The description adds substantial context beyond them: create also builds the first pipeline card, update preserves omitted fields and accepts null to clear, reassignment moves activities and the conversation while invoices keep their original client, closed deals lock value and service, and closing a deal closes its conversation ticket and can fire integrations. These side effects are exactly what an agent needs and are not derivable from annotations.

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

Conciseness4/5

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

Front-loaded with the action list, then prerequisites, then side effects, then sibling routing, then the delete boundary. Every sentence is functional, though the dense run-on enumeration of required fields and null-clearing rules makes it a heavy read with little visual structure.

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

Completeness5/5

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

For a 13-parameter multi-action mutation tool with no output schema, the description covers required inputs, side effects, state locks, reassignment consequences, integration triggers, and sibling alternatives. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 92%, so the baseline is 3. The description goes further by stating cross-parameter constraints the per-field schema cannot express – create requires user_id/pipeline_id/stage_id/title plus either value or service_id, and the null-clearing/locking rules for company_id, owner_id, service_id, and value on update.

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

Purpose5/5

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

The opening sentence names the exact resource (sales deals) and enumerates every action the tool supports (create, update, mark_won, mark_lost, reopen). It also explicitly distinguishes itself from pipeline-item-write, deal-activity-write, and deal-message-write, so an agent can route without opening the sibling schemas.

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

Usage Guidelines5/5

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

Gives concrete when-to-use conditions for each action, including create prerequisites (user_id, pipeline_id, stage_id, title, and either value or service_id) and the boundary 'Does not delete deals.' It also names the alternatives and the conditions that select them (pipeline-item-write to move cards, deal-activity-write with deal_id, deal-message-write for client messages).

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

form-folder-readForm Folder Read ToolA
Read-only
Inspect

List or show form folders with filtering, sorting and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, parent_id, name, type, description, sort_order, created_at, updated_at, form_folders.id, form_folders.parent_id, form_folders.name, form_folders.type, form_folders.description, form_folders.sort_order, form_folders.created_at, form_folders.updated_at, forms, parent, children.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, parent_id, name, type, description, sort_order, created_at, updated_at, form_folders.id, form_folders.parent_id, form_folders.name, form_folders.type, form_folders.description, form_folders.sort_order, form_folders.created_at, form_folders.updated_at, forms, parent, children.
form_folder_idNoForm folder ID. Required for "show".

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint true and destructiveHint false, and the description 'List or show' is consistent with no side effects. There is no contradiction, though the description adds no additional behavioral 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.

Conciseness5/5

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

The description is a single clear sentence, and parameter descriptions are concise without redundant fluff. No unnecessary text is present.

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

Completeness4/5

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

For a simple read tool, the description adequately covers actions and parameter usage, including defaults and action-specific requirements. There is no output schema, so return format is not needed, and the read-only annotation and sibling naming add sufficient context.

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

Parameters4/5

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

Schema description coverage is 100%, and descriptions clarify action-specific applicability, such as 'Required for show' and 'for list'. The filter description includes an example and the sort description explains the :asc/:desc syntax, adding useful meaning beyond basic schema.

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

Purpose5/5

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

The description explicitly states the verb 'List or show' and the resource 'form folders', along with filtering, sorting, and pagination. The title 'Read Tool' distinguishes it from the sibling form-folder-write tool.

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

Usage Guidelines3/5

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

The description implies usage for read operations but does not explicitly state when to use this tool versus alternatives such as form-folder-write. The read-only annotation and sibling naming provide context, but no explicit 'use this when' guidance is given.

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

form-folder-writeForm Folder Write ToolAInspect

Create a form folder. Requires name and type. A parent folder must have the same type; nesting is limited to five levels. To file a form, use form-write with folder_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoFolder name (max 64). Required for "create".
typeNoThe form type this folder organizes (order, contact, intake, onboarding). Required for "create".
actionYesAction to perform.
parent_idNoOptional parent folder ID to nest this folder under. Must be the same type and no deeper than 5 levels. For "create".
descriptionNoOptional folder description (max 1000). For "create".
form_folder_idNoForm folder ID. Required for "show".

TDQS

A4.4/5.0
Behavior4/5

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

Discloses key behavioral constraints: parent folder must match type and nesting max 5 levels. No contradiction with annotations; readOnlyHint false and destructiveHint false align with a create operation.

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

Conciseness5/5

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

Three short sentences, no filler. All sentences add value.

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

Completeness4/5

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

Covers creation constraints and points to form-write for filing, enough for a simple create tool without output schema. The presence of form_folder_id for 'show' in schema while action only lists create creates minor ambiguity.

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

Parameters4/5

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

Schema covers all 6 params with descriptions; description reinforces that name/type are required for create and explains parent_id constraints. form_folder_id is described but action enum only supports create, a minor ambiguity.

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

Purpose5/5

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

Clearly states the tool creates a form folder and distinguishes it from form-write by saying filing forms goes there. Names the resource and action precisely.

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

Usage Guidelines4/5

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

Explains required inputs (name, type), parent same type, and 5-level nesting limit, plus directs to form-write for filing. Could more explicitly state when to use this vs read tool, but context is strong.

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

form-readForm Read ToolA
Read-only
Inspect

List or show forms and their fields and linked services. Lists support filtering, sorting and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, folder_id, access_key, type, name, info, public, custom_code, redirect_url, coupon, created_at, updated_at, forms.id, forms.folder_id, forms.access_key, forms.type, forms.name, forms.info, forms.public, forms.custom_code, forms.redirect_url, forms.coupon, forms.created_at, forms.updated_at, form_fields, services, assignedServices, folder, onboarding_forms, rules, logs.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, folder_id, access_key, type, name, info, public, custom_code, redirect_url, coupon, created_at, updated_at, forms.id, forms.folder_id, forms.access_key, forms.type, forms.name, forms.info, forms.public, forms.custom_code, forms.redirect_url, forms.coupon, forms.created_at, forms.updated_at, form_fields, services, assignedServices, folder, onboarding_forms, rules, logs.
form_idNoForm id. Required for "show" actions.

TDQS

A4/5.0
Behavior4/5

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

The description adds context about the data returned ('forms and their fields and linked services') and mentions filtering/sorting/pagination. Since the annotations already declare readOnlyHint, openWorldHint, and destructiveHint, the description provides a bit more behavior insight without needing to repeat safety flags.

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

Conciseness5/5

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

The description is a single concise sentence that front-loads the main purpose ('List or show forms') and follows with key details. No fluff or redundant information, making it easy to parse quickly.

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

Completeness4/5

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

The description gives a reasonable idea of what to expect (forms, fields, linked services) and mentions list capabilities. Since there is no output schema, the description provides enough context for an agent to understand the tool's scope, though it lacks details on the response structure or difference between list/show responses.

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

Parameters3/5

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

The input schema provides descriptions for all parameters (100% coverage per context), including detailed examples for sort and filters. The tool description itself does not add extra meaning beyond the schema, but the schema is already clear, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool's purpose: 'List or show forms and their fields and linked services.' It uses specific verbs (list/show) and identifies the resource (forms), making it easy to distinguish from write tools like form-write.

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

Usage Guidelines3/5

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

The description mentions that 'Lists support filtering, sorting and pagination,' giving some usage guidance for the list action. However, it does not explicitly state when to use this tool versus alternatives (e.g., form-write for modifications) or provide conditions for when not to use it.

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

form-writeForm Write ToolA
Destructive
Inspect

Create or update forms. Creation requires type, name and the full initial fields list. Updating fields replaces the full list and deletes omitted fields; preserve existing field IDs. Omit fields to change form settings only. Order/contact forms require email, and order forms require a service-bearing field. Field edits are blocked for forms with white-labeled services.

ParametersJSON Schema
NameRequiredDescriptionDefault
infoNoForm description/instructions shown to users. Optional.
nameNoForm name. Required for "create", optional for "update".
typeNoForm type. Required for "create".
actionYesAction to perform.
couponNoEnable coupon field on order forms. Only applicable to order forms.
fieldsNoForm fields. Required for "create" (min 1). For "update": include id to edit, omit id to create new, fields not listed are deleted.
form_idNoForm id. Required when updating an existing record.
folder_idNoFolder ID to organize the form. Set to null to remove the form from all folders; omit to leave it unchanged. The folder must match the form type.
access_keyNoURL-safe access key for the form. Optional, auto-generated if not provided.
redirect_urlNoRedirect URL after contact form submission. Only applicable to contact forms.
has_sidebar_linkNoShow link in client portal sidebar. Only for order and onboarding forms.

TDQS

A4.7/5.0
Behavior5/5

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

Clearly discloses destructive behavior: 'Updating fields replaces the full list and deletes omitted fields; preserve existing field IDs.' Also notes 'Field edits are blocked for forms with white-labeled services.' These details go beyond the annotations (destructiveHint) by explaining exactly what happens, making behavior fully transparent.

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

Conciseness5/5

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

The description is five sentences, with the primary purpose stated first ('Create or update forms.'). Each subsequent sentence adds a distinct, necessary detail without redundancy or fluff.

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

Completeness5/5

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

For a tool with 11 parameters and nested field objects, the description covers key behavioral rules (replacement/deletion semantics, form-type requirements, white-label blocking) while relying on the fully covered schema for parameter details. It provides sufficient context for correct invocation without over-explaining.

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

Parameters4/5

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

Schema descriptions already cover all 11 parameters, so baseline is 3. The description adds cross-parameter semantics such as 'Creation requires type, name and the full initial fields list' (conditional requirements) and 'Order/contact forms require email' (domain rules not obvious from individual parameter descriptions), providing additional meaning beyond the schema.

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

Purpose5/5

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

The description opens with 'Create or update forms,' which clearly names the verb and resource. It distinguishes this write tool from siblings like form-read and form-folder-write by focusing on form creation/update operations.

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

Usage Guidelines4/5

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

Provides usage guidance such as 'Creation requires type, name and the full initial fields list' and 'Omit fields to change form settings only.' It also notes domain rules like order forms requiring a service-bearing field. However, it does not explicitly state when not to use this tool versus alternatives, though the context makes it inferable.

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

get-wayfront-docGet Wayfront Doc ToolA
Read-only
Inspect

Retrieve a current Wayfront help-center document using a document_id returned by search-wayfront-docs. Returns the canonical source URL and bounded document content.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_idYesDocument ID returned by search-wayfront-docs. Do not guess IDs.

TDQS

A4.5/5.0
Behavior4/5

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

While annotations already indicate read-only and non-destructive behavior, the description adds transparency by specifying what is returned (canonical source URL and bounded document content), which is not covered by annotations.

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

Conciseness5/5

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

The description is concise, using two sentences to convey the action, the input, and the output. No unnecessary details or redundancy.

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

Completeness4/5

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

The description provides the key contextual details: the source of the ID, the action, and the return type. It could be slightly more explicit about what 'bounded document content' entails (e.g., size limits or format), but it is sufficient for an agent to use the tool correctly.

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

Parameters5/5

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

The single parameter document_id is well described as an ID returned by search-wayfront-docs, with a warning not to guess IDs. This fully covers the parameter's meaning and source.

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

Purpose5/5

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

The description clearly states the action (retrieve) and the resource (Wayfront help-center document), and distinguishes it from the related search tool by specifying that it uses a document_id from search-wayfront-docs.

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

Usage Guidelines4/5

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

The phrase 'using a document_id returned by search-wayfront-docs' implies the correct workflow (search first, then retrieve), providing context on when to use this tool. However, it does not explicitly name alternatives or state when not to use it, but the guidance is sufficient.

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

invoice-toolInvoice ToolA
Read-only
Inspect

Query invoices. Actions: "list" — query invoices with filtering, sorting, pagination. "show" — get a single invoice by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, number, number_prefix, user_id, deal_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, billing_account_id, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.deal_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, invoices.billing_account_id, audits, subscription, subscription_payment, user, deal, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, number, number_prefix, user_id, deal_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, billing_account_id, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.deal_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, invoices.billing_account_id, audits, subscription, subscription_payment, user, deal, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs. Status filter key is "status" (numeric IDs, not string names): 0=abandoned, 1=paid, 6=partially_paid, 5=payment_pending, 8=refund, 4=refunded, 3=unpaid, 7=void.
invoice_idNoInvoice id. Required for "show" actions.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safe-read profile is covered without the description. The description is consistent with those hints (“Query invoices”) but adds no behavioral detail such as pagination limits, filter operator semantics, or what is returned. With annotations carrying the safety burden, a 3 is appropriate.

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

Conciseness5/5

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

Two short sentences, purpose front-loaded, then the actions enumerated inline. No filler or repetition; every clause carries information.

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

Completeness4/5

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

For a read-only query tool with 100% schema coverage, no output schema, and annotations covering the safety profile, the description covers the essentials an agent needs to pick the right action. It could note that the result set is paginated/filterable in a way that matters for query planning, but nothing critical is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the schema already documents page, sort, limit, filters (with the full field list and status ID mapping) and invoice_id. The description names filtering/sorting/pagination but adds no syntax, operator, or format detail beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb (query) and resource (invoices), and breaks the tool into its two concrete actions, list and show, each with a one-line scope. An agent can tell the two modes apart immediately. It does not differentiate itself from sibling tools, though no sibling covers invoices, so the gap is minor.

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

Usage Guidelines3/5

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

The action descriptions imply when to use list (filtering/sorting/pagination) versus show (single record by ID), which is real usage guidance. However, there is no explicit when-not guidance, no prerequisites, and no routing to alternatives among the many sibling read/write tools.

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

log-toolLog ToolA
Read-only
Inspect

List logs. Action: "list" — query logs with Purity filtering, sorting, pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, loggable_type, loggable_id, user_id, owner_id, event, data, created_at, updated_at, logs.id, logs.loggable_type, logs.loggable_id, logs.user_id, logs.owner_id, logs.event, logs.data, logs.created_at, logs.updated_at, user, loggable.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, loggable_type, loggable_id, user_id, owner_id, event, data, created_at, updated_at, logs.id, logs.loggable_type, logs.loggable_id, logs.user_id, logs.owner_id, logs.event, logs.data, logs.created_at, logs.updated_at, user, loggable.

TDQS

A4.2/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true and destructiveHint=false, and the description is consistent with a read-only listing operation. The description adds no additional behavioral details beyond what the annotations provide.

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

Conciseness5/5

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

The description is concise and efficiently communicates the tool's purpose and key capabilities without unnecessary detail.

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

Completeness4/5

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

The description provides enough context for invoking a list operation, including filter and sort field lists. It does not describe the return shape, but for a straightforward list operation this is not a significant omission.

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

Parameters4/5

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

All parameters have descriptions, and the filter parameter includes an example and a list of available fields. The sort parameter also enumerates valid fields. This goes beyond basic schema coverage and helps clarify how to construct queries.

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

Purpose5/5

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

The description clearly states the tool's purpose: listing logs. It identifies the resource ('logs') and the action ('list'), and distinguishes it from sibling tools by the specific log-domain focus.

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

Usage Guidelines4/5

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

The description conveys usage context by explaining that the tool supports filtering, sorting, and pagination for log queries. It does not explicitly compare to alternatives, but the purpose is clear enough for an agent to know when to invoke it.

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

order-message-readOrder Message Read ToolA
Read-only
Inspect

List messages for a visible order, including whether each message is staff-only. Requires order_number; supports filtering, sorting and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number. Default 1.
sortNoSort fields. Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, review, media.
limitNoResults per page. Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object. Keys are field names, values are operator objects. Example: {"status":{"$eq":"active"}}. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, review, media.
order_numberYesOrder number. Required for all actions.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only safety is covered. The description adds useful behavioral context beyond the schema: the 'visible order' precondition, the staff-only field in results, and support for filtering, sorting, and pagination. It does not contradict the annotations.

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

Conciseness5/5

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

The description is one concise, front-loaded sentence that states the main action first, then the key prerequisite and capabilities. No filler or redundancy; every clause contributes useful information.

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

Completeness3/5

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

The description gives a workable overview for a basic list call, but it does not define what makes an order 'visible' nor describe the output shape beyond the staff-only flag. With no output schema, some return-structure information would help; still, the rich parameter schema compensates partially.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all parameters in detail. The description adds a high-level statement about requiring order_number and supporting pagination/sorting/filtering, but it does not explain parameter meanings beyond what the schema provides. Baseline 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb and resource — 'List messages for a visible order' — and adds a distinguishing detail: 'including whether each message is staff-only.' This clearly separates it from write siblings like order-message-write and from ticket-message-read by scoping to orders.

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

Usage Guidelines3/5

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

The description implies the use case (reading messages for a specific order) and states a prerequisite ('Requires order_number'), but it does not explicitly contrast with alternatives such as ticket-message-read or order-message-write. Usage context is present, but when-not-to-use guidance is absent.

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

order-message-writeOrder Message Write ToolA
Destructive
Inspect

Post a message to an order. Requires order_number and message. staff_only defaults to true; false can notify the client. The normal notification, webhook and broadcast pipeline runs; sent messages cannot be recalled.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.
messageNoMessage body (plain text or HTML). Required for "create" action.
staff_onlyNoIf true, message is only visible to staff. Defaults to true for "create".
order_numberYesOrder number. Required for all actions.

TDQS

A4.6/5.0
Behavior5/5

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

The description goes beyond the annotations by warning that sent messages cannot be recalled and that the normal notification, webhook, and broadcast pipeline will run. This makes side effects and irreversibility explicit.

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

Conciseness5/5

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

The description is compact and well-structured: three sentences cover purpose, requirements, defaults, side effects, and irreversibility without unnecessary filler or repetition.

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

Completeness4/5

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

For a simple write tool with no output schema and no nested objects, the description includes the necessary purpose, inputs, defaults, and side effects. It does not address error conditions or return behavior, but these are not critical given the tool's simplicity.

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

Parameters4/5

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

The schema already covers all four parameters with descriptions, and the tool description adds meaningful context around order_number, message, and staff_only behavior. It does not add validation details, but the provided semantics are sufficient for basic usage.

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

Purpose5/5

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

The description clearly states the action: 'Post a message to an order.' It identifies the resource, the operation, and the required inputs, leaving no ambiguity about the tool's primary purpose.

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

Usage Guidelines4/5

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

It provides practical usage details such as requiring order_number and message, the staff_only default, and the client-notification behavior when set to false. It does not explicitly contrast with read-only alternatives, but the write-oriented purpose is clear enough.

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

order-readOrder Read ToolA
Read-only
Inspect

List or show visible orders with filtering, sorting and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, number, user_id, invoice_id, subscription_id, service_id, service, date_started, date_due, next_task_due_at, nearest_due_at, date_completed, status, price, quantity, deadline, note, sort_order, last_message_at, created_at, updated_at, provider_order_id, provider_status, provider_error, deleted_at, orders.id, orders.number, orders.user_id, orders.invoice_id, orders.subscription_id, orders.service_id, orders.service, orders.date_started, orders.date_due, orders.next_task_due_at, orders.nearest_due_at, orders.date_completed, orders.status, orders.price, orders.quantity, orders.deadline, orders.note, orders.sort_order, orders.last_message_at, orders.created_at, orders.updated_at, orders.provider_order_id, orders.provider_status, orders.provider_error, orders.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, user, signedAgreements, invoice, options, subscription, order_service, order_status, forms, addons, tickets, tasks, workflowSteps, media, linkedOrdersAsSource, linkedOrdersAsTarget, trackedTimes, pipelineItems, tags, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, number, user_id, invoice_id, subscription_id, service_id, service, date_started, date_due, next_task_due_at, nearest_due_at, date_completed, status, price, quantity, deadline, note, sort_order, last_message_at, created_at, updated_at, provider_order_id, provider_status, provider_error, deleted_at, orders.id, orders.number, orders.user_id, orders.invoice_id, orders.subscription_id, orders.service_id, orders.service, orders.date_started, orders.date_due, orders.next_task_due_at, orders.nearest_due_at, orders.date_completed, orders.status, orders.price, orders.quantity, orders.deadline, orders.note, orders.sort_order, orders.last_message_at, orders.created_at, orders.updated_at, orders.provider_order_id, orders.provider_status, orders.provider_error, orders.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, user, signedAgreements, invoice, options, subscription, order_service, order_status, forms, addons, tickets, tasks, workflowSteps, media, linkedOrdersAsSource, linkedOrdersAsTarget, trackedTimes, pipelineItems, tags, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications. Status filter key is "status" (numeric IDs, not string names): 1=Pending, 2=Submitted, 3=Complete, 4=Canceled, 5=Working.
order_numberNoOrder number. Required for "show" actions.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered by structured data. The description adds the 'visible orders' scoping nuance, which is useful, but says nothing about access restrictions, return volume, or how pagination interacts with large result sets.

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

Conciseness5/5

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

A single front-loaded sentence with no filler; the core capability is stated immediately and nothing is redundant.

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

Completeness4/5

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

There is no output schema, but the rich 100%-covered input schema (including nested filter objects and the status ID legend) carries most of the load for a read tool. The description is adequate for invocation, though it could have noted the list-vs-show behavior or result shape since no output schema exists.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter (page, limit, sort, action, filters, order_number) is already documented in the schema with examples and enumerated values. The description's generic mention of filtering/sorting/pagination restates the schema rather than adding syntax or format detail, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb pair ('List or show') and resource ('orders') and mentions the operational modes (filtering, sorting, pagination). It is clear what the tool does, but it does not differentiate itself from siblings like order-write or order-message-read, nor does it explain the list-vs-show distinction that the action enum implies.

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

Usage Guidelines3/5

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

'visible orders' hints at the scope and the description implies the two actions, but there is no explicit when-to-use guidance, no statement of when to prefer order-write or the order-message/order-task siblings, and no prerequisites (e.g., permissions needed to see certain orders).

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

order-task-readOrder Task Read ToolA
Read-only
Inspect

List visible tasks for an order. Requires order_number; supports filtering, sorting and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number. Default 1.
sortNoSort fields. Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, name, description, deadline, order_id, sort_order, workflow_step_id, is_public, for_client, is_complete, is_ready, completed_by, due_at, completed_at, created_at, updated_at, tasks.id, tasks.name, tasks.description, tasks.deadline, tasks.order_id, tasks.sort_order, tasks.workflow_step_id, tasks.is_public, tasks.for_client, tasks.is_complete, tasks.is_ready, tasks.completed_by, tasks.due_at, tasks.completed_at, tasks.created_at, tasks.updated_at, workflowStep, order, user, employees.
limitNoResults per page. Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object. Keys are field names, values are operator objects. Example: {"status":{"$eq":"active"}}. Available fields: id, name, description, deadline, order_id, sort_order, workflow_step_id, is_public, for_client, is_complete, is_ready, completed_by, due_at, completed_at, created_at, updated_at, tasks.id, tasks.name, tasks.description, tasks.deadline, tasks.order_id, tasks.sort_order, tasks.workflow_step_id, tasks.is_public, tasks.for_client, tasks.is_complete, tasks.is_ready, tasks.completed_by, tasks.due_at, tasks.completed_at, tasks.created_at, tasks.updated_at, workflowStep, order, user, employees.
order_numberYesOrder number. Required for all actions.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already provide readOnlyHint=true and destructiveHint=false. The description adds the nuance of 'visible tasks,' implying some tasks may be hidden, which is not covered by annotations. It also mentions filtering, sorting, and pagination, giving behavioral context beyond the safety profile. No contradictions.

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

Conciseness5/5

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

One concise sentence with the core purpose front-loaded. Zero waste. Every word earns its place.

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

Completeness4/5

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

Given the simple read-only nature and the rich schema covering all params, the description is sufficient. It lacks explicit return format details, but with no output schema and the tool being a list operation, the expected response is clear from context. The 'visible' filter is a minor behavioral note not fully elaborated but acceptable.

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

Parameters3/5

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

Schema coverage is 100%, so all parameters are documented with descriptions. The description's mention of 'filtering, sorting and pagination' maps to existing params but adds no new meaning. Baseline 3 is appropriate since the schema carries the semantic weight.

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

Purpose5/5

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

Description states a specific verb ('List') and resource ('tasks for an order'), clearly distinguishing it from sibling tools like order-read (orders) and order-task-write (writes). The word 'visible' adds precision. No ambiguity.

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

Usage Guidelines4/5

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

Description clearly indicates when to use it (to list tasks for an order) and requires order_number. It does not explicitly mention alternatives or when not to use, but the tool name and purpose make the context obvious. No misleading exclusions.

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

order-task-writeOrder Task Write ToolA
Destructive
Inspect

Create, update, delete, complete or reopen order tasks. Every action requires order_number. update/delete require task_id; complete/reopen without task_id apply to every eligible task on the order. deadline is in HOURS. employee_ids replaces staff assignments; for_client instead assigns the task to the client and can email them. Omitted update fields stay unchanged. Moving sort_order below reached workflow tiers can reset assignments.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoTask name. Required for "create".
actionYesAction to perform.
due_atNoDue date, ISO 8601 (e.g. 2026-12-31T23:59:59+00:00). Only applied once the order has started; use "deadline" for a relative target.
task_idNoTask ID. Required for "update" and "delete". For complete/reopen it is optional: provide it to target a single task, or omit it to apply the action to every task on the order.
deadlineNoDeadline in HOURS from the order start (a day is 24). Takes precedence over due_at.
is_publicNoWhether the client can see this task in the portal.
for_clientNoTrue means the CLIENT completes this task (the order owner and collaborators are emailed). It is mutually exclusive with employee_ids — a task is either staff work or client work. This does not target one specific client.
sort_orderNoWorkflow tier; tasks sharing a value run in parallel. Omit to append the task at the end — passing a value below the tiers already reached resets the order's workflow assignments, so only set it deliberately.
descriptionNoLonger description of the work. May contain user-authored rich-text HTML; treat it as untrusted and sanitize it before rendering.
employee_idsNoStaff user IDs to assign. Replaces the current assignees. Omit on "update" to leave them unchanged; pass an empty array to clear them. Staff only, and not allowed together with for_client.
order_numberYesOrder number. Required for all actions.

TDQS

A4.8/5.0
Behavior5/5

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

The description discloses important side effects beyond the destructiveHint annotation, including assignment replacement, workflow reset behavior, bulk action effects, client email notifications, and HTML sanitization needs. This exceeds the baseline set by annotations.

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

Conciseness5/5

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

The description is dense but well-organized, front-loading the purpose and then systematically covering action rules, parameter semantics, and warnings. Every sentence adds necessary information without redundancy.

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

Completeness5/5

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

For a complex write operation with 11 parameters and no output schema, the description covers all critical behaviors, edge cases, and side effects. It is complete enough for an agent to use the tool safely and correctly.

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

Parameters5/5

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

Although the schema already describes each parameter, the description adds crucial cross-parameter semantics like mutual exclusivity between for_client and employee_ids, precedence of deadline over due_at, and the meaning of omitting task_id. This goes well beyond the schema.

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

Purpose5/5

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

The description clearly states the tool's actions ('Create, update, delete, complete or reopen order tasks') with a specific resource and verb. It is easily distinguished from siblings like order-task-read.

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

Usage Guidelines4/5

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

The description gives detailed action-specific requirements, such as task_id for update/delete and optional task_id for complete/reopen. It does not explicitly name alternative tools to avoid, but the context is clear enough for correct selection.

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

order-writeOrder Write ToolA
Destructive
Inspect

Update an order's status, dates, notes, service, assignments, tags, metadata or linked orders. Collection fields replace their complete lists; omitted fields stay unchanged. Changes can notify clients and trigger integrations.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoInternal order note. Max 65535 characters.
tagsNoTag IDs or names. Replaces current tags when provided. Prefer tag IDs from tag-read: a numeric name is treated as a tag ID.
actionYesAction to perform.
statusNoOrder status ID. Use numeric IDs, not status names.
serviceNoSnapshot service name on the order. Max 255 characters.
date_dueNoDue date/time. YYYY-MM-DD or ISO 8601.
metadataNoMetadata key/value map. Empty values delete that metadata key.
employeesNoEmployee/staff user IDs to assign, sent with action "update". Replaces the whole assignee list, so include everyone who should stay assigned. Roles limited to self-assignment can only add or remove their own ID. Assignees need order access. To find staff IDs by name, use staff-directory with assignable_to "order".
created_atNoCreation date/time. YYYY-MM-DD or ISO 8601.
service_idNoService ID to associate with the order.
date_startedNoStarted date/time. YYYY-MM-DD or ISO 8601.
order_numberNoOrder number. Required when updating an existing record.
linked_ordersNoOrder numbers to link bidirectionally. Replaces current linked orders when provided.
date_completedNoCompleted date/time. YYYY-MM-DD or ISO 8601.

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=true, so the write/irreversible nature is known. The description still adds real value beyond them: collection fields replace their complete lists, omitted fields remain unchanged, and changes can notify clients and trigger integrations.

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

Conciseness5/5

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

Three compact sentences, front-loaded with the scope of the update, then the two rules that matter most (replace semantics, omitted-field preservation), then side effects. No filler.

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

Completeness4/5

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

For a 14-parameter mutation tool with no output schema, the description covers the operation scope and the key replacement behavior. It omits permission/access requirements and any statement of what the response returns, though annotations cover the safety profile.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter already documents its format, limits, and replacement semantics (e.g., tags, employees, linked_orders all note 'replaces'). The description's field list restates what the schema carries rather than adding new syntax or constraint detail, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb (Update) and resource (an order), then enumerates the updatable facets (status, dates, notes, service, assignments, tags, metadata, linked orders). An agent can distinguish this from order-read at a glance. It stops short of naming sibling tools, so it is clear but not maximally differentiated.

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

Usage Guidelines2/5

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

No when-to-use or when-not-to-use guidance is offered. The mention that changes 'can notify clients and trigger integrations' hints at caution but never states prerequisites, permissions, or which alternative tools to consider when a narrower write is needed.

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

pipeline-item-readPipeline Item Read ToolB
Read-only
Inspect

List or show accessible pipeline cards with filtering, sorting and pagination. Item types in filters accept user, company or order.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: pipeline_id, pipeline_stage_id, itemable_type, itemable_id.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: pipeline_id, pipeline_stage_id, itemable_type, itemable_id.
pipeline_item_idNoPipeline item id. Required for "show", "remove", and "move".

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds the word 'accessible', implying permission-scoped results, and clarifies allowed item types in filters. These are useful but modest additions; it does not disclose return format or pagination behavior beyond what schema provides.

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

Conciseness5/5

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

A single sentence conveys the core purpose and the most important filter nuance. It is front-loaded with the verb and resource, and every phrase earns its place with no redundancy.

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

Completeness3/5

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

The tool has 6 parameters and a nested filters object, but the schema is rich enough to carry most details. The description omits the distinction between list and show and the requirement for pipeline_item_id in show, both of which are in the schema. Given no output schema, some return-format guidance could help, but the description is adequate for basic invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so parameters are already documented. The description adds one meaningful detail: that item types in filters accept user, company, or order, which clarifies the filter values for itemable_type. This is a small increment over the schema, keeping it at baseline 3.

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

Purpose4/5

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

The description states a clear verb+resource ('List or show accessible pipeline cards') and mentions key capabilities (filtering, sorting, pagination). It does not explicitly distinguish itself from sibling read tools like pipeline-read, but the name and phrasing make the target resource unambiguous.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. It does not mention pipeline-item-write for mutations or pipeline-read for pipeline-level reads. The description implies a read operation but offers no exclusions or alternate routes.

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

pipeline-item-writePipeline Item Write ToolA
Destructive
Inspect

Add, remove or move pipeline cards. add requires pipeline_id, stage_id, itemable_type and itemable_ref; remove requires pipeline_item_id; move requires pipeline_item_id and stage_id. Sales pipelines accept users, companies and deals; production pipelines accept orders. Changes can trigger configured automations.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.
stage_idNoPipeline stage id. Required for "add" and "move".
sort_orderNoOptional 0-based position within the destination stage for "move". Defaults to top.
pipeline_idNoPipeline id. Required for "add".
itemable_refNoEntity reference. Required for "add". Orders use order number; users, companies and deals use id.
itemable_typeNoType of entity to add. Required for "add". Sales pipelines accept user, company or deal; production pipelines accept order. For "list" filters, user/company/order/deal aliases are accepted.
pipeline_item_idNoPipeline item id. Required for "show", "remove", and "move".

TDQS

A4.4/5.0
Behavior4/5

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

The description adds valuable side-effect context with 'Changes can trigger configured automations,' going beyond the destructiveHint annotation. It could further disclose irreversibility or external consequences, but this is already meaningful behavioral transparency.

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

Conciseness5/5

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

Three dense sentences cover the main operation, per-action requirements, domain constraints, and side effects without redundancy. The key verb phrase is front-loaded, and every sentence earns its place.

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

Completeness4/5

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

The description fully covers all three actions, their parameter dependencies, and entity-type restrictions, which is sufficient for a structured mutation tool with complete schema descriptions. Minor gaps like response behavior or sort_order effects are already handled by the schema or are not critical for invocation.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description enhances this by mapping required parameters to each action and clarifying itemable_ref semantics: orders use order numbers while users, companies, and deals use IDs.

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

Purpose5/5

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

The description clearly states the tool's action: add, remove, or move pipeline cards, with distinct verbs and a specific resource. It is immediately distinguishable from the sibling pipeline-item-read tool and does not rely on the title alone.

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

Usage Guidelines4/5

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

It provides action-specific required parameters and pipeline type compatibility, making usage conditions clear. It does not explicitly contrast with pipeline-item-read, but the mutation actions themselves make the intended use obvious.

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

pipeline-readPipeline Read ToolA
Read-only
Inspect

List or show accessible sales or production pipelines and their stages. Lists support filtering, sorting and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, name, type, owner_id, is_default, visibility.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, name, type, owner_id, is_default, visibility.
pipeline_idNoPipeline id. Required for "show" actions.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the description is not burdened with safety disclosure. It adds useful behavioral context by noting 'accessible' pipelines (permission filtering) and that lists support filtering/sorting/pagination. This goes beyond the annotations without contradicting them.

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

Conciseness5/5

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

Two concise sentences with no filler. The purpose is stated first, followed by a summary of list behavior. Every word earns its place.

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

Completeness3/5

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

For a read-only tool with full schema coverage and safety annotations, the description is adequate. However, it lacks details on the return format (no output schema) and does not clarify what 'show' returns versus 'list'. The absence of output schema info leaves the agent guessing about response shape, which is a minor gap.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters already have clear definitions. The description summarizes list capabilities but does not add meaning beyond the schema. Since the schema handles parameter documentation, the baseline 3 is appropriate.

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

Purpose5/5

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

The description states a specific verb ('List or show') and a clear resource ('accessible sales or production pipelines and their stages'), and distinguishes between the two actions. It is unambiguous and differentiates the read tool from its write counterpart by its name and content.

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

Usage Guidelines3/5

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

The description implies usage for reading pipelines but does not explicitly state when to use this tool over alternatives (e.g., pipeline-write for modifications). It mentions list capabilities (filtering, sorting, pagination) but offers no explicit when-not-to-use or guidance for choosing between 'list' and 'show' beyond the schema.

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

pipeline-writePipeline Write ToolA
Destructive
Inspect

Create or update pipeline structure. Creation requires type, name and stages. Updating stages edits supplied IDs and adds entries without IDs; omitted stages are preserved, not deleted. Cards are managed through pipeline-item-write.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoPipeline name. Required for "create", optional for "update".
typeNoPipeline type: "sales" or "production". Required for "create".
actionYesAction to perform.
stagesNoPipeline stages. Required for "create" (min 1). For "update": listed stages are edited (with id) or added (without id).
is_defaultNoWhether this is the default pipeline for its type. Optional.
visibilityNoWho can see the pipeline: "all_staff" (default), "specific_staff" (see visible_user_ids), or "specific_roles" (see visible_role_ids).
pipeline_idNoPipeline id. Required when updating an existing record.
visible_role_idsNoRole IDs that can see the pipeline. Only used when visibility is "specific_roles".
visible_user_idsNoStaff user IDs that can see the pipeline. Only used when visibility is "specific_staff".

TDQS

A4.5/5.0
Behavior4/5

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

The description discloses a key side effect: omitted stages are preserved and never deleted, and explicitly routes card changes elsewhere. It does not contradict the destructiveHint annotation, though it does not elaborate on other potential destructive effects or result/error behavior.

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

Conciseness5/5

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

The description is three compact sentences, front-loaded with the main purpose, and avoids repeating detailed field descriptions already covered by the schema.

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

Completeness4/5

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

For a 9-parameter write tool with nested stages, the description covers the most important behavioral context: create requirements, update semantics, stage preservation, and scope separation from pipeline-item-write. It is complete enough for normal use, though it does not touch on return values or failure modes.

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

Parameters5/5

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

The description adds meaningful cross-parameter semantics not present in the schema alone: creation requires type/name/stages, pipeline_id is required for updates, stage id presence means edit vs add, and omitted stages are preserved. This significantly clarifies the nested stage behavior.

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

Purpose5/5

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

The description opens with a specific verb-resource pair, 'Create or update pipeline structure', and clarifies that cards belong to a separate tool, distinguishing it from pipeline-item-write. The create/update action is unambiguous.

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

Usage Guidelines4/5

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

It states when creation is needed (requires type, name, stages), how updates affect stages, and redirects card management to pipeline-item-write. It does not explicitly contrast with pipeline-read, but the write purpose is clear enough.

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

search-wayfront-docsSearch Wayfront Docs ToolA
Read-only
Inspect

Search current customer-facing Wayfront help-center documentation. Use for product setup, recommended workflows, form/service behavior, limitations, and interface handoffs. Returns excerpts, source links, and document IDs for get-wayfront-doc.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results. Defaults to 5; maximum 10.
queryYesNatural-language question about using or configuring Wayfront.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare read-only and non-destructive behavior. Description adds that it returns excerpts, source links, and document IDs, which is consistent and provides useful output expectations.

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

Conciseness5/5

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

Two concise sentences efficiently cover purpose, usage scenarios, and output format. No fluff or redundant information.

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

Completeness5/5

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

For a simple search tool with two parameters and no output schema, the description is complete: it communicates what it searches, why to use it, and what it returns, making it self-sufficient.

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

Parameters3/5

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

Schema descriptions fully cover both parameters: query as a natural-language question, limit with default and max. The description adds no extra parameter details beyond the schema, so baseline holds.

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

Purpose5/5

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

Clearly states the verb 'Search' and resource 'customer-facing Wayfront help-center documentation'. Distinguishes from sibling get-wayfront-doc by noting document IDs are returned for that tool.

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

Usage Guidelines4/5

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

Lists specific use cases (product setup, workflows, behavior, limitations, handoffs) and implies the companion tool for retrieval. Could be more explicit about when not to use, but the given topics are sufficient for typical selection.

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

service-readService Read ToolA
Read-only
Inspect

List or show services, or get_task_templates for a service's current reusable checklist and template IDs. Lists support filtering, sorting and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, intake_form_id, is_taxable, name, description, image, recurring, price, max_active_requests, pretty_price, currency, f_price, f_period_l, f_period_t, r_price, r_period_l, r_period_t, recurring_action, multi_order, request_orders, option_categories, option_variants, deadline, public, sort_order, braintree_plan_id, group_quantities, folder_id, metadata, hoth_product_key, hoth_package_name, created_at, updated_at, provider_id, provider_service_id, deleted_at, services.id, services.intake_form_id, services.is_taxable, services.name, services.description, services.image, services.recurring, services.price, services.max_active_requests, services.pretty_price, services.currency, services.f_price, services.f_period_l, services.f_period_t, services.r_price, services.r_period_l, services.r_period_t, services.recurring_action, services.multi_order, services.request_orders, services.option_categories, services.option_variants, services.deadline, services.public, services.sort_order, services.braintree_plan_id, services.group_quantities, services.folder_id, services.metadata, services.hoth_product_key, services.hoth_package_name, services.created_at, services.updated_at, services.provider_id, services.provider_service_id, services.deleted_at, orders, invoice_items, addons, parent_services, folder, reseller_provider, tasks, workflowSteps, intakeForm, onboardingForms, addon_orders, getFieldsAttribute, employees, audits, morphMetadata, media, logs.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, intake_form_id, is_taxable, name, description, image, recurring, price, max_active_requests, pretty_price, currency, f_price, f_period_l, f_period_t, r_price, r_period_l, r_period_t, recurring_action, multi_order, request_orders, option_categories, option_variants, deadline, public, sort_order, braintree_plan_id, group_quantities, folder_id, metadata, hoth_product_key, hoth_package_name, created_at, updated_at, provider_id, provider_service_id, deleted_at, services.id, services.intake_form_id, services.is_taxable, services.name, services.description, services.image, services.recurring, services.price, services.max_active_requests, services.pretty_price, services.currency, services.f_price, services.f_period_l, services.f_period_t, services.r_price, services.r_period_l, services.r_period_t, services.recurring_action, services.multi_order, services.request_orders, services.option_categories, services.option_variants, services.deadline, services.public, services.sort_order, services.braintree_plan_id, services.group_quantities, services.folder_id, services.metadata, services.hoth_product_key, services.hoth_package_name, services.created_at, services.updated_at, services.provider_id, services.provider_service_id, services.deleted_at, orders, invoice_items, addons, parent_services, folder, reseller_provider, tasks, workflowSteps, intakeForm, onboardingForms, addon_orders, getFieldsAttribute, employees, audits, morphMetadata, media, logs.
service_idNoService id. Required for "show" actions.

TDQS

A4/5.0
Behavior4/5

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

The description is consistent with the readOnlyHint and destructiveHint annotations; it only describes read operations and does not imply side effects. It does not add extra behavioral details like auth or rate limits, but the annotations already cover the core read-only nature.

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

Conciseness5/5

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

The description is one concise sentence that enumerates the valid actions and highlights the key list capability. It avoids unnecessary prose and front-loads the main purpose.

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

Completeness4/5

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

Given the lack of an output schema, the description covers the main operations and the list capabilities. It could be slightly more explicit about the differing outputs of 'show' vs 'get_task_templates', but the action enum and parameter descriptions fill most gaps.

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

Parameters3/5

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

The schema provides detailed descriptions for most parameters, including the action enum, filter example, and sortable fields. The description adds little beyond those schema details, and the phrase 'Purity filter object' appears to be a typo that could slightly confuse, though the example mitigates it.

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

Purpose5/5

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

The description clearly states the three read actions ('list', 'show', 'get_task_templates') and the resource type (services). It is readily distinguishable from the sibling service-write tool.

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

Usage Guidelines3/5

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

The description notes that list supports filtering, sorting, and pagination, but it does not explicitly say when to use this read tool versus the sibling service-write alternative. Action-specific requirements are left to the parameter descriptions rather than stated as usage guidance.

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

service-writeService Write ToolA
Destructive
Inspect

Create or update services and sync_task_templates. Pricing, recurrence and renewal settings affect future delivery. sync_task_templates replaces the full checklist: read service-read action get_task_templates first and retain IDs that should remain. Deadlines are in HOURS, not days. Relationship collections replace their full lists; omitted fields stay unchanged.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoService name. Required for "create".
priceNoOne-time price. Used when recurring=0.
actionYesAction to perform.
publicNoWhether service is publicly visible. Defaults to true.
f_priceNoTrial/setup fee price. Used when recurring=2.
r_priceNoRecurring price. Used when recurring>0.
currencyNo3-letter currency code (e.g. USD, EUR). Required for "create".
deadlineNoDelivery deadline in HOURS (a day is 24 hours — e.g. 3 days = 72). Convert any day-based request to hours before sending.
metadataNoArray of metadata objects with "title" and "value" keys.
employeesNoArray of staff/team member user IDs to assign to this service. Client accounts are rejected.
folder_idNoService folder ID for organization. The folder must exist. Set to null to remove the service from its folder; omit to leave it unchanged.
recurringNoPricing type. Required for "create". 0 = one-time, 1 = recurring, 2 = trial/setup fee + recurring, 3 = recurring (other).
f_period_lNoTrial/setup fee period length (1-99). Required when recurring=2.
f_period_tNoTrial/setup fee period type: D (days), W (weeks), M (months), Y (years). Required when recurring=2.
is_taxableNoWhether tax applies to this service. Defaults to true.
r_period_lNoRecurring period length (1-99). Required when recurring>0.
r_period_tNoRecurring period type: D (days), W (weeks), M (months), Y (years). Required when recurring>0.
service_idNoService id. Required when updating an existing record.
descriptionNoService description. Max 2000 characters.
multi_orderNoMax orders per client (0 = unlimited).
intake_form_idNoIntake form ID to associate with this service.
request_ordersNoEnable request-based ordering. 0 = disabled.
task_templatesNoFor "sync_task_templates": the FULL replacement list of task templates for the service — this overwrites the existing list, it does not append. Each item supports id (for an existing template on this service), name, description, deadline (in HOURS — a day is 24 hours, so "3 days" = 72; convert day-based requests to hours), sort_order, is_public, for_client, and employee_ids (staff/team member user IDs only; client accounts are rejected). To keep an existing template, call get_task_templates first and include its id here; any existing template whose id you omit is deleted. Pass an empty array to remove all templates.
parent_servicesNoArray of parent service IDs (makes this service an add-on).
group_quantitiesNoGroup quantities on order forms.
recurring_actionNoWhat happens on renewal (only when recurring>0). 0 = reopen the same order, 1 = create new order(s), 2 = reset/allow service requests, 3 = no action.
max_active_requestsNoMax active requests at once. Only when request_orders > 0.
onboarding_form_idsNoArray of onboarding form IDs to attach.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and openWorldHint=true, but the description adds the crucial detail about what is destroyed: sync_task_templates replaces the full checklist, relationship collections replace their full lists, and any omitted template whose ID you drop is deleted. It also notes omitted fields stay unchanged and that pricing/recurrence/renewal affect future delivery, which annotations do not convey.

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

Conciseness4/5

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

Five tight sentences, each carrying a distinct constraint (write scope, future-delivery effects, checklist replacement, deadline units, list-replacement semantics), with the most important write-vs-read routing first. Slightly telegraphic in places but no filler.

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

Completeness4/5

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

For a 28-parameter destructive write tool with no output schema, the description covers the highest-risk gotchas: full-list replacement, deletion of omitted templates, unit conversion, and partial-update semantics. It leaves unaddressed things like auth/permission requirements and the shape of success responses, which a caller may still need.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3; the description goes beyond it by calling out the replacement-and-retention workflow for task_templates and re-emphasizing the hours-vs-days conversion for deadline. It does not add new per-field detail beyond what the schema already documents for the remaining 26 parameters.

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

Purpose5/5

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

States specific verbs and resources: create/update services plus a third action sync_task_templates, all front-loaded in the first sentence. It also names the sibling service-read and its get_task_templates action, so an agent can distinguish read vs write and pick the right tool without opening a schema.

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

Usage Guidelines4/5

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

Gives concrete sequencing guidance: read service-read action get_task_templates first and retain IDs that should remain before calling sync_task_templates. It also flags the unit trap (deadlines in HOURS, not days). No explicit exclusions or when-not-use cases are stated, but the context is clear.

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

settings-readSettings Read ToolA
Read-only
Inspect

View current workspace branding and business settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already indicate read-only, non-destructive, and non-open-world behavior. The description adds no further side-effect or behavioral detail beyond the obvious 'View' action, so it meets but does not exceed the baseline.

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

Conciseness5/5

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

The description is a single concise sentence with no filler, redundant wording, or unnecessary detail. It is well-structured and immediately understandable.

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

Completeness4/5

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

For a simple read-only tool with no output schema, the description gives enough context about what is being viewed. It could slightly improve by mentioning that no other actions are supported, but the enum already conveys this.

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

Parameters3/5

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

The only parameter 'action' has full schema coverage with an enum of ['view'] and a generic description. The tool description adds no additional semantic detail beyond what the schema already makes clear.

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

Purpose5/5

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

Description clearly states the tool's function with a specific verb ('View') and resource ('current workspace branding and settings'), and it is easily distinguished from the sibling 'settings-write' tool.

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

Usage Guidelines3/5

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

The description implies read-only usage but does not explicitly state when to prefer this tool over alternatives such as 'settings-write' or 'workspace-info'. No direct when-to-use or when-not-to-use guidance is provided.

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

settings-writeSettings Write ToolA
Destructive
Inspect

Update workspace name, colors, timezone, contact link, currency, business information, email sender display name and logos. Logo URLs must be public images. Does not connect Stripe, set a custom domain or sending email address, or switch live mode.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.
currencyNoDefault currency as an uppercase ISO-4217 code, e.g. "USD". For "update".
logo_urlNoPublic URL of a PNG/JPEG/GIF logo to import. For "update".
timezoneNoIANA timezone, e.g. "America/New_York". For "update".
from_nameNoSender name shown on client order/ticket message-reply notification emails. (General transactional emails use the workspace name.) For "update".
site_nameNoWorkspace name (max 64). For "update".
accent_colorNoBrand accent color as hex, e.g. "#387FFF". For "update".
contact_linkNoPublic contact URL shown to clients. For "update".
business_infoNoBusiness name/address block shown on invoices. For "update".
primary_colorNoBrand primary color as hex, e.g. "#1A1E34". For "update".
logo_inverse_urlNoPublic URL of a PNG/JPEG/GIF inverse (light) logo for dark sidebars. For "update".

TDQS

A4/5.0
Behavior3/5

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

The annotations already indicate destructiveHint=true and readOnlyHint=false, so the description doesn't need to restate mutation. It adds useful constraints about logo URLs and excluded actions, but does not detail potential overwrite or irreversible side effects. No contradiction with annotations.

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

Conciseness5/5

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

The description is a single concise sentence that lists the affected fields and includes important constraints and exclusions without unnecessary detail or repetition.

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

Completeness4/5

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

Given the simple update semantics and full schema parameter descriptions, the description provides enough context for an agent to invoke the tool correctly. It includes practical exclusions and URL constraints; a return-value description is not necessary since no output schema is declared.

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

Parameters3/5

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

The schema already covers 100% of parameters with examples and constraints, so the baseline is 3. The description reinforces the logo URL requirement and adds exclusion context, but does not significantly extend the parameter-level meaning beyond what the schema provides.

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

Purpose5/5

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

The description uses the specific verb 'Update' and enumerates the exact workspace settings affected (name, colors, timezone, contact link, currency, business information, email sender name, logos). This clearly distinguishes it from the sibling settings-read tool.

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

Usage Guidelines4/5

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

The description clearly implies this tool is for modifying workspace settings, and explicitly lists what it does not do (connect Stripe, set custom domain/sending email, switch live mode). This gives useful exclusionary guidance, though it does not explicitly say 'use settings-read to view settings'.

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

slack-readSlack Read ToolA
Read-only
Inspect

View notification settings and available events for an already-connected Slack workspace.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.

TDQS

A4/5.0
Behavior3/5

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

The description aligns with readOnlyHint and destructiveHint annotations, confirming no side effects. It does not add details about return format or error conditions, but the annotations already cover the key behavioral aspects.

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

Conciseness5/5

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

The description is a single, focused sentence that immediately conveys the tool's purpose with no unnecessary verbiage. It is optimally concise.

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

Completeness4/5

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

The description is adequate for a simple read operation. It specifies the subject (notification settings and events) and the scope (already-connected Slack workspace). Absence of an output schema is acceptable given the tool's simplicity, though it could clarify the exact return payload.

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

Parameters3/5

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

The only parameter 'action' has an enum of ['view'] with a generic description 'Action to perform.' While the schema fully specifies the allowed value, the description adds minimal context beyond what is already evident from the enum.

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

Purpose5/5

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

The description clearly states the tool's function: viewing notification settings and available events for a connected Slack workspace. It distinguishes it from the sibling slack-write tool by focusing on read-only actions.

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

Usage Guidelines4/5

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

The description implies usage for read-only inspection of Slack configuration. It does not explicitly state when to avoid using it, but the read-only nature is obvious from the verb 'view' and the annotation, making it sufficient for typical use.

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

slack-writeSlack Write ToolA
Destructive
Inspect

Update notification events and channels for an already-connected Slack workspace. Only listed events change; others remain unchanged. Slack must be connected and licensed. Connecting Slack requires the Wayfront interface.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.
eventsNoPer-event notification settings to change. Only the listed events are updated; others are left unchanged. Required for "update".

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutating nature is known. The description adds valuable behavioral context beyond that: it specifies the partial update semantics (only listed events change) and the dependency on connection/licensing, which are not captured in annotations. This helps an agent anticipate side effects and failure conditions.

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

Conciseness5/5

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

The description is three concise sentences: purpose, behavior, and prerequisite. It is front-loaded with the main action, then clarifies scope and requirements. Every sentence earns its place without redundancy or filler.

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

Completeness4/5

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

For a write tool with two parameters (one required) and no output schema, the description covers the essential aspects: what it updates, how partial updates work, and prerequisites. It does not mention error handling or post-update confirmation, but those are not typically required for a mutation tool. The annotations already signal destructiveness, so nothing critical is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents both 'action' and 'events' (including nested event fields). The description does not add new parameter-level meaning; it only reiterates the partial update behavior that the schema already hints at via the events description. Baseline 3 is appropriate given full schema coverage.

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

Purpose5/5

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

The description clearly states the verb 'Update' and the resource 'notification events and channels' for an already-connected Slack workspace, making its purpose unambiguous. It also adds the partial-update behavior ('Only listed events change; others remain unchanged') which distinguishes it from a full overwrite and implicitly from the read sibling.

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

Usage Guidelines4/5

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

It provides clear context for when to use the tool (updating Slack notifications for a connected workspace) and prerequisites (Slack must be connected and licensed, connecting requires the Wayfront interface). It does not explicitly name alternatives like slack-read, but the context is sufficient for an agent to infer when to use it.

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

staff-directoryStaff DirectoryA
Read-only
Inspect

Find colleagues by name to get their staff user IDs, for example for the "employees" list on ticket-write or order-write. Available to every staff member. Returns each match's ID, first and last name, role, and is_you (true for your own account). Use "assignable_to" to list only staff whose role can access tickets or orders. For full team member details, use team-tool; for invitations and role changes, use team-management-tool.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum results. Defaults to 20; maximum 50. "has_more" is true when more staff match.
searchNoName to look for, up to 100 characters. Every word must match the first or last name, in any order. Omit to list staff alphabetically.
assignable_toNoOnly return staff whose role can access this record type, so they can be assigned to it.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior that annotations cannot: the access scope ('Available to every staff member') and the exact return payload (ID, first/last name, role, is_you). It does not discuss pagination beyond what the schema's limit field already explains, so it falls short of a 5.

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

Conciseness5/5

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

Purpose is front-loaded in the first clause, followed by access scope, return shape, a parameter hint, and sibling routing. Four sentences, each carrying distinct information with no repetition of the name or title.

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

Completeness5/5

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 enumerates the return fields so the agent knows what comes back, plus access scope and sibling alternatives. For a zero-required-param read lookup this is complete enough to call correctly without further inference.

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

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3 — the schema already documents limit, search, and assignable_to thoroughly. The description restates the assignable_to behavior ('list only staff whose role can access tickets or orders') and frames its purpose via the ticket-write/order-write example, but adds no format or syntax detail beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ('Find colleagues by name to get their staff user IDs') and names the two most confusable siblings, team-tool and team-management-tool, with the boundary between them. An agent can distinguish this lookup tool from the team-management siblings without opening any schema.

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

Usage Guidelines5/5

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

Explicitly routes the agent: use this tool for staff IDs (e.g. the employees list on ticket-write/order-write), use team-tool for full member details, and team-management-tool for invitations and role changes. It also gives the selection condition for assignable_to. When-to-use and when-to-prefer-alternatives are both covered.

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

subscription-toolSubscription ToolA
Read-only
Inspect

Query subscriptions. Actions: "list" — query subscriptions with filtering, sorting, pagination. "show" — get a single subscription by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, user_id, number, name, status, processor_id, current_period_end, canceled_at, created_at, updated_at, deleted_at, reseller_processor_key, billing_account_id, subscriptions.id, subscriptions.user_id, subscriptions.number, subscriptions.name, subscriptions.status, subscriptions.processor_id, subscriptions.current_period_end, subscriptions.canceled_at, subscriptions.created_at, subscriptions.updated_at, subscriptions.deleted_at, subscriptions.reseller_processor_key, subscriptions.billing_account_id, invoice, user, invoices, payments, subscription_services, orders, audits, collaborators, logs.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, user_id, number, name, status, processor_id, current_period_end, canceled_at, created_at, updated_at, deleted_at, reseller_processor_key, billing_account_id, subscriptions.id, subscriptions.user_id, subscriptions.number, subscriptions.name, subscriptions.status, subscriptions.processor_id, subscriptions.current_period_end, subscriptions.canceled_at, subscriptions.created_at, subscriptions.updated_at, subscriptions.deleted_at, subscriptions.reseller_processor_key, subscriptions.billing_account_id, invoice, user, invoices, payments, subscription_services, orders, audits, collaborators, logs.
subscription_idNoSubscription id. Required for "show" actions.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the read-only, safe, closed-world profile is covered without the description. The description confirms this is a query-only tool but adds no behavioral context beyond what annotations and the schema already convey (no rate limits, no return-shape caveats), which is the expected lower bar when annotations carry the safety load.

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

Conciseness5/5

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

Two terse sentences, front-loaded with the overall purpose and immediately followed by the action breakdown. Every clause earns its place with no filler or repetition.

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

Completeness4/5

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

For a multi-action read tool whose params are fully documented by the schema and whose safety profile is carried by annotations, the description names both actions and their scope adequately. No output schema exists, but the return values are simple query results, so little is missing; a note on pagination defaults or filters syntax would have pushed it higher.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents page, sort, limit, filters, and subscription_id in detail. The description adds no parameter-level detail (no format, constraint, or interaction notes) beyond the schema, so the baseline 3 for high coverage applies.

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

Purpose4/5

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

The description gives a specific verb+resource (query subscriptions) and enumerates the two actions with their distinct behaviors (list = filtered/paginated query, show = single by ID). It is clear and self-contained, but it does not differentiate itself from any sibling (e.g., other read tools), which is what would be needed for a 5.

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

Usage Guidelines3/5

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

The action descriptions imply when each mode applies (list for many, show for one by ID), but there is no explicit when-to-use guidance, no mention of alternatives, and no exclusivity/condition statements. Usage is inferable only from the action split, so it lands at the minimum-viable implied level.

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

tag-readTag Read ToolA
Read-only
Inspect

List workspace tags and their IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.

TDQS

A3.8/5.0
Behavior3/5

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

The readOnlyHint and destructiveHint annotations already communicate safety, and the description is consistent with them. However, the description adds little beyond the annotation, such as pagination, ordering, or error behavior.

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

Conciseness5/5

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

The description is a single clear sentence that is immediately understandable and front-loaded with the primary action and resource.

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

Completeness4/5

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

For a simple read-only list tool with no output schema, the description adequately states what is returned (tags and IDs). It is complete enough for basic usage, though it omits potential details like ordering or filtering.

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

Parameters3/5

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

The schema covers the single parameter with an enum and description, so coverage is high. The tool description reinforces that 'action' is 'list', but it does not add substantial parameter-specific meaning beyond the schema.

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

Purpose5/5

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

The description clearly states the action ('List'), the resource ('workspace tags'), and the expected output ('their IDs'). It is specific and easily distinguished from sibling tools like tag-write.

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

Usage Guidelines3/5

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

The description implies a read-only usage by saying 'List', and the annotation reinforces this, but it does not explicitly mention when to use this tool versus alternatives such as tag-write.

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

tag-writeTag Write ToolAInspect

Create a workspace tag. Requires name and tag-management permission. Optional sort_order controls display order.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoTag name. Required for "create".
actionYesAction to perform.
sort_orderNoDisplay order of the tag. Optional for "create".

TDQS

A4.5/5.0
Behavior4/5

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

Read-only and destructive hints are already provided by annotations, so the description only needs to add context. It proactively mentions the required permission and the fact that this is a create operation, which is useful behavioral information.

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

Conciseness5/5

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

The description is two short sentences with no redundant or filler content. It front-loads the primary purpose and then provides key usage details efficiently.

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

Completeness4/5

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

The description is adequate for the simple create operation and covers permission and key parameters. It does not describe return values, but no output schema is present and this is not essential for deciding when or how to call the tool.

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

Parameters5/5

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

Every parameter has a schema description, and the tool description adds practical meaning: name is required for creation, sort_order is optional and controls display order, and action is fixed to 'create'. This clarifies how to actually invoke the tool.

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

Purpose5/5

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

The description clearly states the tool creates a workspace tag, using a specific verb and resource. This distinguishes it from tag-read and other write tools for different resources.

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

Usage Guidelines4/5

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

The description specifies required inputs (name) and the required permission (tag-management). It does not explicitly differentiate from tag-read, but the create action and resource make the primary use case clear.

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

team-management-toolTeam Management ToolA
Destructive
Inspect

Manage team members and roles. Actions: "create" — invite a new staff member (emails them their login). "update" — reassign an existing staff member to a different role (changes their permissions). "create_role" — create a new permission set / role (admin only). Reading team members stays in the team query tool. You can only assign or create roles whose permissions do not exceed your own, and only the workspace owner can manage admin accounts.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoName of the new role. Required for "create_role".
emailNoNew staff member's email address. Required for "create".
formsNoPermission level 0-9 for forms. For "create_role".
actionYes"create" invites a staff member; "update" reassigns a staff member's role; "create_role" creates a new permission set.
name_fNoFirst name. Optional for "create".
name_lNoLast name. Optional for "create".
clientsNoPermission level 0-9 for clients. For "create_role".
couponsNoPermission level 0-9 for coupons. For "create_role".
role_idNoRole (permission set) ID to assign. Required for "create" and "update". Use the team query tool to discover role IDs.
user_idNoExisting staff member's user ID whose role to change. Required for "update".
servicesNoPermission level 0-9 for services. For "create_role".
messagingNoPermission level 0-9 for messaging. For "create_role".
affiliatesNoPermission level 0-9 for affiliates. For "create_role".
order_accessNoPermission level 0-9 for order_access. For "create_role".
rank_trackingNoPermission level 0-9 for rank_tracking. For "create_role".
settings_logsNoGrant access to settings_logs. For "create_role".
settings_tagsNoGrant access to settings_tags. For "create_role".
settings_teamNoGrant access to settings_team. For "create_role".
ticket_accessNoPermission level 0-9 for ticket_access. For "create_role".
welcome_emailNoWhether to email the new staff member their login. Defaults to true. For "create".
invoice_accessNoPermission level 0-9 for invoice_access. For "create_role".
settings_emailsNoGrant access to settings_emails. For "create_role".
settings_ordersNoGrant access to settings_orders. For "create_role".
dashboard_accessNoPermission level 0-9 for dashboard_access. For "create_role".
order_managementNoPermission level 0-9 for order_management. For "create_role".
settings_companyNoGrant access to settings_company. For "create_role".
settings_modulesNoGrant access to settings_modules. For "create_role".
settings_sidebarNoGrant access to settings_sidebar. For "create_role".
settings_ticketsNoGrant access to settings_tickets. For "create_role".
settings_accountsNoGrant access to settings_accounts. For "create_role".
settings_languageNoGrant access to settings_language. For "create_role".
settings_messagesNoGrant access to settings_messages. For "create_role".
settings_paymentsNoGrant access to settings_payments. For "create_role".
ticket_managementNoPermission level 0-9 for ticket_management. For "create_role".
invoice_managementNoPermission level 0-9 for invoice_management. For "create_role".
settings_dashboardNoGrant access to settings_dashboard. For "create_role".
settings_templatesNoGrant access to settings_templates. For "create_role".
time_tracking_manageNoGrant time-tracking management. For "create_role".
settings_integrationsNoGrant access to settings_integrations. For "create_role".
settings_saved_repliesNoGrant access to settings_saved_replies. For "create_role".

TDQS

A4.3/5.0
Behavior4/5

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

Describes side effects for each action: 'emails them their login' for create, 'changes their permissions' for update, and 'creates a new permission set' for create_role. It also mentions the constraint that roles cannot exceed your own permissions. While it doesn't dwell on potential destructive consequences, the actions are inherently non-destructive (no delete) and the description covers the key impacts. No contradiction with the destructiveHint annotation.

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

Conciseness4/5

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

The description is compact, using three sentences to cover all actions and key constraints. While it could be formatted with bullet points for clarity, it remains efficient and avoids redundancy. No filler or unnecessary wording.

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

Completeness4/5

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

Provides sufficient context for correct usage: it identifies the three actions, points to the team query tool for reading and role IDs, states admin/owner restrictions, and clarifies the welcome email default. Given the tool's complexity (40 parameters), the description covers the essential operational context without needing to explain every permission field.

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

Parameters3/5

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

Schema description coverage is 100% — every parameter has a description with relevant 'For "action"' qualifiers. The description text adds no extra parameter-level detail beyond what the schema already provides, but it does reinforce the role_id lookup via the team query tool. Baseline 3 applies because schema fully covers parameter semantics.

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

Purpose5/5

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

Clearly states the tool's purpose ('Manage team members and roles') and enumerates the three distinct actions (create, update, create_role) with specific verbs. It also distinguishes itself from the read side by noting that reading team members belongs in the team query tool.

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

Usage Guidelines5/5

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

Provides explicit guidance on when to use this tool versus alternatives: reading team members is delegated to the team query tool, and role IDs are to be discovered via that query tool. Also states usage restrictions (admin-only for create_role, workspace-owner-only for admin accounts) and notes the welcome_email default.

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

team-toolTeam ToolB
Read-only
Inspect

Query team members. Actions: "list" — query team members with filtering, sorting, pagination. "show" — get a single team member by user ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, email, role, role_id, accounts.id, status_id, managers, manager_id, pipelineItems, optin, created_at, updated_at.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, email, role, role_id, accounts.id, status_id, managers, manager_id, pipelineItems, optin, created_at, updated_at. Role filter key is "role_id" (numeric IDs, not string names): 1=Admin, 2=Manager, 3=Contractor.
user_idNoUser id. Required for "show" actions.

TDQS

B3.4/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, covering the safety profile. The description adds no behavioral detail beyond what the schema already exposes (action enum). It does not disclose any rate limits, permissions, or response characteristics beyond the read-only nature, which is already known from annotations.

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

Conciseness5/5

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

Two sentences with zero wasted words. The core purpose is front-loaded, and the action breakdown is immediately clear. Structure is exemplary.

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

Completeness4/5

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

For a read-only tool with complete schema documentation and no output schema, the description covers the two actions and their parameter associations sufficiently. It could mention that it is the read-only counterpart to team-management-tool, but that is not essential for correct invocation. Overall, the agent has enough to call the tool correctly.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description adds a high-level mapping: 'filtering, sorting, pagination' aligns with filters, sort, page, and limit; 'get a single team member by user ID' aligns with user_id. However, this is mostly a paraphrase of the schema descriptions and adds little new meaning.

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

Purpose5/5

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

The description states a specific verb ('Query') and resource ('team members'), and immediately distinguishes two actions with distinct purposes ('list' with filtering/sorting/pagination, 'show' with user ID lookup). This clearly identifies the tool's function and separates it from write-oriented siblings like team-management-tool.

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

Usage Guidelines2/5

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

No explicit guidance on when to use this tool versus alternatives. The description does not mention team-management-tool or any other sibling, nor does it provide exclusions or conditions. The agent must infer from the action names and context.

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

template-readTemplate Read ToolA
Read-only
Inspect

List workspace Twig templates, optionally filtered by name_prefix or search, or show one template's full source.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.
searchNoSearch templates by name or content for "list". Can be combined with name_prefix.
name_prefixNoFilter templates by name prefix for "list" (e.g. "email.", "public.", "custom."). Use the normalized name without the "portal." prefix.
template_nameNoTemplate name (e.g. "email.invoice_paid") or a raw design-scoped db_name. Required for "show".

TDQS

A3.6/5.0
Behavior4/5

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

The description is consistent with the readOnlyHint annotation and clearly states that it lists templates or returns full source, implying no destructive behavior. It adds useful context about the template type and source exposure, though it does not mention potential output size or permissions.

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

Conciseness5/5

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

The description is a single, focused sentence that efficiently conveys both capabilities and optional filters. There is no redundant wording or unnecessary detail.

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

Completeness4/5

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

For a read-only tool with no output schema, the description gives enough context about what actions are available and what the 'show' action returns. It does not describe the list output format in detail, but the purpose is clear and the parameter schema fills most remaining gaps.

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

Parameters3/5

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

The input schema already covers all parameters with clear descriptions, and the tool description restates the action-based filtering and show behavior. Since schema coverage is 100%, the description adds moderate context but does not significantly deepen parameter meaning beyond what is already provided.

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

Purpose4/5

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

The description clearly identifies the resource as workspace Twig templates and states the two supported actions: listing and showing full source. It does not explicitly differentiate itself from template-write or other read tools, but the action set and resource are specific enough.

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

Usage Guidelines2/5

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

The description explains filtering and the show action, but it does not say when to prefer this tool over sibling tools such as template-write or other read tools. There is no explicit 'use this for read-only operations' guidance in the description itself.

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

template-writeTemplate Write ToolA
Destructive
Inspect

Update or reset workspace Twig templates used by client pages and outgoing emails. update replaces the full source, so read template-read action show first and preserve the intended content. Invalid Twig syntax is rejected. reset removes the override; resetting a custom page permanently deletes it. No version history is available.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoFull replacement Twig source for "update". Read template-read action show first and preserve the intended content.
actionYesAction to perform.
is_activeNoWhether the template is enabled for "update". Omit to keep its current value. Emails with is_active false are not sent.
template_nameNoTemplate name (e.g. "email.invoice_paid") or a raw design-scoped db_name. Required for "update" and "reset".

TDQS

A4.7/5.0
Behavior5/5

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

The description clearly discloses destructive behavior by stating that reset permanently deletes a custom page and that no version history exists. It also notes validation behavior (invalid Twig syntax rejected), consistent with the destructiveHint annotation.

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

Conciseness5/5

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

The description is compact and front-loaded, stating the core purpose first and then adding necessary warnings and usage guidance in four sentences. Every sentence contributes operational or safety-relevant information.

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

Completeness5/5

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

Given the destructive action and lack of an output schema, the description provides the essential context: intended use, required read-before-write flow, reset consequences, syntax validation, and absence of version history. It is complete enough for an agent to invoke the tool safely.

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

Parameters3/5

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

The input schema already provides full coverage of all parameters with detailed descriptions, including action enum semantics, data as full replacement source, template_name requirements, and is_active behavior. The description text itself does not add additional parameter-level meaning beyond that schema coverage.

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

Purpose5/5

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

The description clearly states the tool updates or resets workspace Twig templates used by client pages and emails, making its purpose and resource type explicit. It also distinguishes itself from template-read and other write tools by naming update and reset actions.

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

Usage Guidelines5/5

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

It gives explicit instructions to read template-read first before updating to preserve intended content, and explains when to use update versus reset. It also warns that resetting a custom page permanently deletes it and that invalid Twig syntax is rejected.

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

ticket-message-readTicket Message Read ToolA
Read-only
Inspect

List messages for a visible support ticket, including whether each message is staff-only. Requires ticket_number; supports filtering, sorting and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number. Default 1.
sortNoSort fields. Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, review, media.
limitNoResults per page. Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object. Keys are field names, values are operator objects. Example: {"status":{"$eq":"active"}}. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, review, media.
ticket_numberYesTicket number. Required for all actions.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already cover read-only and non-destructive behavior; the description adds useful context about visibility (only visible tickets) and staff-only content. It does not add richer behavioral detail like auth requirements, output shape, or how staff-only messages are treated, so it stays at the baseline-plus level.

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

Conciseness5/5

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

A single front-loaded sentence states the action, scope, and capabilities with no filler. Every clause earns its place.

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

Completeness4/5

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

For a read-only list tool with six schema-described parameters and no output schema, the description covers the essential preconditions, scope, and capabilities. A slightly richer mention of return structure or why visibility matters would make it fully complete.

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

Parameters3/5

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

Schema description coverage is 100%, so parameters are already documented in the input schema. The description adds only that ticket_number is needed and that filtering/sorting/pagination are supported, which adds no meaning beyond the schema.

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

Purpose5/5

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

The description names a specific verb and resource: "List messages for a visible support ticket", and adds the staff-only distinction. This clearly separates it from read/list siblings and from the write counterpart by focusing on 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.

Usage Guidelines3/5

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

It states the hard prerequisite that ticket_number is required and says filtering, sorting, and pagination are supported, which implies when this tool is appropriate. It does not explicitly tell the agent when to prefer this over ticket-message-write or order-message-read, leaving destination decision to inference.

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

ticket-message-writeTicket Message Write ToolA
Destructive
Inspect

Post a message to a support ticket. Requires ticket_number and message. staff_only defaults to true; false can notify the client. The normal notification, webhook and broadcast pipeline runs; sent messages cannot be recalled.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.
messageNoMessage body (plain text or HTML). Required for "create" action.
staff_onlyNoIf true, message is only visible to staff. Defaults to true for "create".
ticket_numberYesTicket number. Required for all actions.

TDQS

A3.9/5.0
Behavior4/5

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

The description adds meaningful behavioral context beyond the annotations: messages cannot be recalled, and the normal notification, webhook, and broadcast pipeline runs. This is consistent with destructiveHint and readOnlyHint.

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

Conciseness5/5

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

The description is brief and direct, conveying essential behavior and side effects in three sentences without unnecessary filler or repetition.

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

Completeness3/5

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

The description covers inputs and side effects, but since there is no output schema, it does not indicate what the tool returns on success or failure. This leaves some ambiguity in expected outcomes for an agent.

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

Parameters3/5

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

All parameters are described in the schema, and the description adds useful context for staff_only and message. However, there is an inconsistency: the schema lists message as not required while the description says it is required for the only allowed action value, which could confuse an agent.

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

Purpose5/5

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

The description clearly states the tool's purpose with a specific verb ('Post') and object ('a message to a support ticket'), making it easy to distinguish from related read/write ticket tools.

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

Usage Guidelines3/5

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

The description explains required inputs and side effects, but it does not explicitly contrast with sibling tools such as ticket-message-read or ticket-write, or state when this tool should be preferred over them.

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

ticket-readTicket Read ToolA
Read-only
Inspect

List or show visible support tickets with filtering, sorting and pagination.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number for "list". Default 1.
sortNoSort fields for "list". Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, number, user_id, order_id, date_closed, date_snoozed, subject, status, note, last_message_at, source, created_at, updated_at, deleted_at, tickets.id, tickets.number, tickets.user_id, tickets.order_id, tickets.date_closed, tickets.date_snoozed, tickets.subject, tickets.status, tickets.note, tickets.last_message_at, tickets.source, tickets.created_at, tickets.updated_at, tickets.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, tags, user, signedAgreements, employee, ticket_status, forms, order, media, deal, latestClientFacingMessage, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications.
limitNoResults per page for "list". Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object for "list". Keys are field names, values are operator objects. Example: {"status":{"$eq":1}}. Available fields: id, number, user_id, order_id, date_closed, date_snoozed, subject, status, note, last_message_at, source, created_at, updated_at, deleted_at, tickets.id, tickets.number, tickets.user_id, tickets.order_id, tickets.date_closed, tickets.date_snoozed, tickets.subject, tickets.status, tickets.note, tickets.last_message_at, tickets.source, tickets.created_at, tickets.updated_at, tickets.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, tags, user, signedAgreements, employee, ticket_status, forms, order, media, deal, latestClientFacingMessage, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications. Status filter key is "status" (numeric IDs, not string names): 1=Open, 2=Closed, 3=Pending, 4=Spam, 5=Snoozed.
ticket_numberNoTicket number. Required for "show" actions.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safe-read profile is covered. The description adds only the 'visible tickets' scoping and pagination support, without detail on auth requirements or any pagination/result behavior beyond the schema.

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

Conciseness5/5

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

A single front-loaded sentence naming the primary action and resource first, then the supporting capabilities. No filler or repetition.

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

Completeness4/5

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

With full schema coverage and annotations, and no output schema to explain, the description is largely sufficient for a read tool. It is slightly thin for a dual-action tool (list vs show) whose action-specific requirements live only in the schema.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents action, filters, sort, limit, page and ticket_number (including the status ID mapping and show-requires-ticket_number). The description's generic 'filtering, sorting and pagination' wording adds little beyond that, so baseline 3 applies.

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

Purpose4/5

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

States a specific verb pair and resource ('List or show visible support tickets'), which is stronger than a restated name. It scopes to 'visible' tickets, but does not distinguish itself from siblings it could be confused with, notably ticket-message-read or ticket-write.

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

Usage Guidelines3/5

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

The mention of filtering, sorting and pagination implies the typical read use case, and 'list' vs 'show' is implied by the action verbs. However, it never states when to use this instead of ticket-message-read (for ticket messages) or ticket-write, and sets no exclusions.

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

ticket-writeTicket Write ToolA
Destructive
Inspect

Create or update support tickets. Creation can send an initial client-facing message. Updates can replace assignments, tags and metadata. Sent messages cannot be recalled.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoTicket note. Empty HTML-only values are stored as an empty string. Max 255 characters.
tagsNoTag IDs or names. Replaces current tags when provided. Prefer tag IDs from tag-read: a numeric name is treated as a tag ID.
orderNoOrder number to associate with the ticket. Pass a number to associate; omit to leave unchanged. Dissociation is not supported via this field.
actionYesAction to perform.
statusNoTicket status ID. Use numeric IDs, not status names.
messageNoOptional first client-facing message to post on the new ticket in the same "create" call. Requires the workspace to be on a paid plan with a configured custom domain; omit it to create the ticket without messaging the client.
subjectNoTicket subject. Max 65535 characters.
user_idNoClient user ID the ticket belongs to. Required for "create".
metadataNoMetadata key/value map. Empty values delete that metadata key.
employeesNoEmployee/staff user IDs to assign, sent with action "update". Replaces the whole assignee list, so include everyone who should stay assigned. Roles limited to self-assignment can only add or remove their own ID. Assignees need ticket access. To find staff IDs by name, use staff-directory with assignable_to "ticket".
ticket_numberNoTicket number. Required when updating an existing record.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false; the description adds concrete consequences beyond them: 'Sent messages cannot be recalled' and that updates 'replace' assignments, tags and metadata (full-list overwrite). It stops short of stating permission/auth requirements for the different actions.

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

Conciseness4/5

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

Three short sentences, front-loaded with the verb/resource, then mode-specific behavior, then the irreversibility warning. Every sentence carries information; no padding or redundancy.

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

Completeness4/5

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

For an 11-parameter mutation tool with no output schema and full schema coverage, the description supplies the behavioral essentials (action modes, replace semantics, message irreversibility). Missing only auth/permission context and error behavior, which keeps it off a 5.

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

Parameters3/5

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

Schema description coverage is 100%, so parameters like ticket_number, user_id, message and employees are already well documented inline. The description only reinforces replace semantics for assignments/tags/metadata, adding marginal value over the schema baseline.

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

Purpose4/5

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

States specific verbs (create, update) and the resource (support tickets), with the two action modes distinguished up front. It does not name sibling tools like ticket-message-write or ticket-read to sharpen the boundary, so it stops short of a 5.

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

Usage Guidelines3/5

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

Implies usage via the two action modes and notes optional messaging on create, but gives no explicit when-to-use/when-not guidance or alternatives (e.g., use ticket-message-write for follow-up messages). A reader must infer the boundaries from sibling names.

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

user-activity-readUser Activity Read ToolA
Read-only
Inspect

List CRM activities for a client. Requires user_id; supports filtering, sorting and pagination. To read one deal's activities, filter by deal_id (for example {"deal_id":{"$eq":123}}). Responses include deal_id; null means a contact-only activity.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number. Default 1.
sortNoSort fields. Append :asc or :desc for direction (default :asc). Example: ["created_at:desc"]. Available fields: id, user_id, deal_id, author_id, content, scheduled_at, completed_at, completed_by, assigned_to, created_at, updated_at, activities.id, activities.user_id, activities.deal_id, activities.author_id, activities.content, activities.scheduled_at, activities.completed_at, activities.completed_by, activities.assigned_to, activities.created_at, activities.updated_at, user, deal, author, assignee, completedBy, audits.
limitNoResults per page. Default 20, max 100.
actionYesAction to perform.
filtersNoPurity filter object. Keys are field names, values are operator objects. Example: {"status":{"$eq":"active"}}. Available fields: id, user_id, deal_id, author_id, content, scheduled_at, completed_at, completed_by, assigned_to, created_at, updated_at, activities.id, activities.user_id, activities.deal_id, activities.author_id, activities.content, activities.scheduled_at, activities.completed_at, activities.completed_by, activities.assigned_to, activities.created_at, activities.updated_at, user, deal, author, assignee, completedBy, audits.
user_idYesUser id. Required for all actions.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already establish the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), so the bar is lower. The description goes beyond them by disclosing response semantics that no structured field captures: responses carry deal_id and a null deal_id means a contact-only activity. It omits pagination limits/total counts, which the schema partially covers for inputs.

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

Conciseness4/5

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

Three short sentences, front-loaded with the core purpose and requirement, and the optional detail (deal_id filter, null semantics) comes after. 'Supports filtering, sorting and pagination' is mild filler given the schema, but overall the text is tight and wastes little.

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

Completeness4/5

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

There is no output schema, so the description carries the return-value burden and does address it by explaining the deal_id field and its null meaning. Combined with the read-only annotations and fully documented inputs, an agent has enough to invoke it correctly, though coverage of pagination results and total counts is thin.

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

Parameters3/5

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

Schema description coverage is 100%, so all six parameters are already documented, including filter operators and sortable fields; baseline is 3. The description repeats 'filtering, sorting and pagination' and gives a filter example that the schema already supplies, adding only marginal meaning.

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

Purpose4/5

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

States a specific verb and resource ('List CRM activities') and the required key ('for a client', user_id), so an agent can tell it is a read tool scoped to a user. It does not, however, name its obvious siblings (deal-activity-read, user-activity-write), and the advice to filter by deal_id to read a deal's activities blurs the boundary with deal-activity-read rather than sharpening it.

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

Usage Guidelines4/5

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

Gives a clear when-to-use context (listing a client's activities) and a concrete filtering recipe for the deal-scoped case, which is genuinely actionable. It stops short of stating when NOT to use this tool or pointing to the dedicated deal-activity-read sibling, so alternatives are only implied.

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

user-activity-writeUser Activity Write ToolB
Destructive
Inspect

Create CRM activity entries or complete scheduled activities. Requires user_id. create requires content and accepts an optional deal_id belonging to that contact, so the activity appears on both the contact and the deal. complete requires activity_id. Entries and completions are attributed to the authenticated user.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.
contentNoActivity content/notes (plain text, max 10000 chars). Required for "create" action.
deal_idNoOptional for create: attach the activity to this deal, which must belong to user_id. Omit or pass null for a contact-only activity.
user_idYesUser id. Required for all actions.
activity_idNoActivity ID. Required for "complete".
assigned_toNoOptional staff user ID to assign. Only used when scheduled_at is provided.
scheduled_atNoOptional future scheduled date/time for "create" (ISO 8601). If omitted, the activity is logged as completed.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=true, and openWorldHint=false, so the agent knows this is a destructive write within a closed system. The description adds that entries are attributed to the authenticated user and that deal_id must belong to the contact, which is useful beyond the annotations. It does not mention what happens to existing data on completion or whether completion is reversible, which is important for a destructive tool.

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

Conciseness4/5

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

The description is three sentences, each front-loaded with the action or constraint. It wastes little space, though it could be slightly tighter by merging the first two sentences. Every sentence adds value about required fields and attribution.

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

Completeness3/5

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

For a write tool with seven parameters, no output schema, and destructive annotations, the description covers required fields and attribution but omits important behavioral details such as whether completing an activity is reversible, what the response includes, or error behavior when deal_id doesn't belong to the user. It is adequate but has clear gaps for a destructive mutation.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents all parameters including enum values and conditional requirements. The description reinforces the conditional requirements (create requires content, complete requires activity_id) and adds the constraint that deal_id must belong to user_id, which is not in the schema. However, it does not elaborate on parameters like assigned_to or scheduled_at beyond what the schema says.

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

Purpose4/5

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

The description clearly states a specific verb pair (create/complete) on CRM activity entries, and the title and name align. It doesn't explicitly contrast with the sibling user-activity-read or deal-activity-write, but the mirror to user-activity-read is implied by the name. It's clearly a write tool for user activities.

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

Usage Guidelines3/5

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

The description explains what each action requires (create needs content, complete needs activity_id), which implicitly guides usage. However, it does not state when to choose this tool over the sibling user-activity-read or deal-activity-write, nor does it warn about exclusions or prerequisites beyond the required parameters.

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

webhook-readWebhook Read ToolA
Read-only
Inspect

List configured outbound workspace webhooks without contacting their destinations.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already mark readOnlyHint true and destructiveHint false; description adds that it does not contact destinations, providing additional behavioral context beyond annotations.

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

Conciseness5/5

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

One concise sentence with no redundancy; clearly structured and easy to parse.

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

Completeness5/5

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

Sufficient for a simple list operation; no missing critical information like side effects (explicitly noted) or required input (action=list).

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

Parameters3/5

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

Schema covers 100% of parameters (one 'action' parameter with description), but tool description does not add further meaning to the parameter; baseline of 3 is appropriate.

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

Purpose5/5

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

Clearly states it lists configured outbound workspace webhooks, a read operation, which distinguishes it from webhook-write and other write tools.

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

Usage Guidelines4/5

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

Implicitly indicates use for listing webhooks, but does not explicitly contrast with alternatives like webhook-write; still clear from the verb 'List'.

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

webhook-writeWebhook Write ToolA
Destructive
Inspect

Create, enable, disable or delete outbound webhooks. create requires a destination URL and event slugs and creates one webhook per event. Active webhooks send workspace data to that URL. Other actions require webhook_id. See the Wayfront webhook API documentation: https://wayfront.com/help/knowledgebase/webhooks.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoDestination URL (http/https) that will receive the event POSTs. Required for "create".
noteNoOptional label/description for the webhook. For "create".
actionYesAction to perform.
eventsNoOne or more namespaced event slugs to subscribe, e.g. ["order.created", "invoice.paid"]. Required for "create". One webhook row is created per event.
is_activeNoWhether the webhook is active on creation. Defaults to true. For "create".
webhook_idNoWebhook ID. Required for "enable", "disable", and "delete". Use "list" to discover IDs.

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the destructiveHint annotation, the description adds behavioral details: creates one webhook per event, active webhooks send workspace data to the URL, and other actions require webhook_id. This gives the agent a clearer picture of side effects without contradicting the annotation.

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

Conciseness5/5

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

The description is concise and front-loaded with the action list. Every sentence adds value: action overview, per-action requirements, and a documentation link. No superfluous wording.

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

Completeness4/5

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

Given the tool's complexity (multiple actions with different parameter requirements), the description covers all necessary context: what each action does, required parameters, and a link to more detailed docs. It does not explain output or error behavior, but no output schema exists and this is not essential for correct invocation.

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

Parameters3/5

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

The schema descriptions already cover all parameters (100% coverage), including the one-row-per-event note for events and the default for is_active. The description repeats some of this information (create requires URL/events, other actions need webhook_id) but adds no new semantic value beyond what the schema provides. Baseline 3 applies given high schema coverage.

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

Purpose5/5

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

The description clearly states the tool's four actions (create, enable, disable, delete) and the resource (outbound webhooks). It distinguishes from the sibling webhook-read tool by focusing on mutations, and the verb list is specific and unambiguous.

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

Usage Guidelines4/5

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

The description provides explicit usage conditions for each action: create requires a destination URL and event slugs, enable/disable/delete require webhook_id. It notes the one-webhook-per-event behavior and points to external documentation. It does not explicitly name alternatives (e.g., webhook-read for reads), but the mutation focus is clear enough for an agent to select this tool appropriately.

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

workspace-infoWorkspace Info ToolA
Read-only
Inspect

Identify the connected Wayfront workspace and authenticated staff account, and summarize the role-level actions available through MCP. Use this when workspace identity, permissions, or connection type matters. Record visibility and some actions remain subject to module and record-specific policies.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations indicate readOnly, non-destructive, and not open-world. The description adds useful behavioral context about summarizing role-level actions and subjection to policies, without contradicting the annotations.

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

Conciseness5/5

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

The description is two concise sentences with no redundant or vague wording. It front-loads the core function and then provides usage guidance and caveats efficiently.

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

Completeness5/5

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

For a zero-parameter tool with no output schema, the description fully covers what it does, when to use it, and important limitations. No critical context is missing.

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

Parameters4/5

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

The tool has no parameters, so the description does not need to explain parameter behavior. The description appropriately focuses on the tool's purpose and output rather than input details.

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

Purpose5/5

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

The description clearly states the tool identifies the connected Wayfront workspace and authenticated staff account, and summarizes role-level actions. This is a specific, distinct purpose compared to sibling tools focused on records, messages, or settings.

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

Usage Guidelines5/5

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

Explicitly says 'Use this when workspace identity, permissions, or connection type matters,' providing direct guidance on when to select this tool over siblings. The caveat about record visibility and policies adds practical context for use.

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. 4 tool updates
    • Changeddeal-activity-write6 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "create",
        -  "complete"
        -]New value: +[
        +  "create",
        +  "update",
        +  "delete",
        +  "complete"
        +]
      • changedInput schema / properties / activity_id / description
        Previous value: -"Activity ID. Required for \"complete\"."New value: +"Activity ID. Required for \"update\", \"delete\" and \"complete\"."
      • changedInput schema / properties / assigned_to / description
        Previous value: -"Optional staff user ID to assign. Only used when scheduled_at is provided."New value: +"Optional staff assignee for scheduled activities. On update, omit to preserve or pass null to unassign."
      • changedInput schema / properties / assigned_to / type
        Previous value: -"integer"New value: +[
        +  "integer",
        +  "null"
        +]
      • changedInput schema / properties / content / description
        Previous value: -"Activity content/notes (plain text, max 10000 chars). Required for \"create\" action."New value: +"Activity content/notes (plain text, max 10000 chars). Required for \"create\" and \"update\"."
      • changedInput schema / properties / scheduled_at / description
        Previous value: -"Optional future scheduled date/time for \"create\" (ISO 8601). If omitted, the activity is logged as completed."New value: +"Optional future date/time (ISO 8601). Create without it logs a completed activity. Update only accepts it for a pending activity; omit to preserve the due date."
    • Changeddeal-message-write4 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "create"
        -]New value: +[
        +  "create",
        +  "update",
        +  "delete"
        +]
      • changedInput schema / properties / message / description
        Previous value: -"Client-facing message body (plain text or HTML, max 65535 chars)."New value: +"Client-facing message body (plain text or HTML, max 65535 chars). Required for create/update."
      • addedInput schema / properties / message_id
        Added value: +{
        +  "description": "Message ID belonging to this deal. Required for update/delete.",
        +  "type": "integer"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "action",
        -  "deal_id",
        -  "message"
        -]New value: +[
        +  "action",
        +  "deal_id"
        +]
    • Changedinvoice-tool2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, number, number_prefix, user_id, deal_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.deal_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, audits, subscription, subscription_payment, user, deal, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs. Status filter key is \"status\" (numeric IDs, not string names): 0=abandoned, 1=paid, 6=partially_paid, 5=payment_pending, 8=refund, 4=refunded, 3=unpaid, 7=void."New value: +"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, number, number_prefix, user_id, deal_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, billing_account_id, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.deal_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, invoices.billing_account_id, audits, subscription, subscription_payment, user, deal, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs. Status filter key is \"status\" (numeric IDs, not string names): 0=abandoned, 1=paid, 6=partially_paid, 5=payment_pending, 8=refund, 4=refunded, 3=unpaid, 7=void."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, number, number_prefix, user_id, deal_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.deal_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, audits, subscription, subscription_payment, user, deal, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs."New value: +"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, number, number_prefix, user_id, deal_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, billing_account_id, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.deal_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, invoices.billing_account_id, audits, subscription, subscription_payment, user, deal, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs."
    • Changedsubscription-tool2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, user_id, number, name, status, processor_id, current_period_end, canceled_at, created_at, updated_at, deleted_at, reseller_processor_key, subscriptions.id, subscriptions.user_id, subscriptions.number, subscriptions.name, subscriptions.status, subscriptions.processor_id, subscriptions.current_period_end, subscriptions.canceled_at, subscriptions.created_at, subscriptions.updated_at, subscriptions.deleted_at, subscriptions.reseller_processor_key, invoice, user, invoices, payments, subscription_services, orders, audits, collaborators, logs."New value: +"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, user_id, number, name, status, processor_id, current_period_end, canceled_at, created_at, updated_at, deleted_at, reseller_processor_key, billing_account_id, subscriptions.id, subscriptions.user_id, subscriptions.number, subscriptions.name, subscriptions.status, subscriptions.processor_id, subscriptions.current_period_end, subscriptions.canceled_at, subscriptions.created_at, subscriptions.updated_at, subscriptions.deleted_at, subscriptions.reseller_processor_key, subscriptions.billing_account_id, invoice, user, invoices, payments, subscription_services, orders, audits, collaborators, logs."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, number, name, status, processor_id, current_period_end, canceled_at, created_at, updated_at, deleted_at, reseller_processor_key, subscriptions.id, subscriptions.user_id, subscriptions.number, subscriptions.name, subscriptions.status, subscriptions.processor_id, subscriptions.current_period_end, subscriptions.canceled_at, subscriptions.created_at, subscriptions.updated_at, subscriptions.deleted_at, subscriptions.reseller_processor_key, invoice, user, invoices, payments, subscription_services, orders, audits, collaborators, logs."New value: +"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, number, name, status, processor_id, current_period_end, canceled_at, created_at, updated_at, deleted_at, reseller_processor_key, billing_account_id, subscriptions.id, subscriptions.user_id, subscriptions.number, subscriptions.name, subscriptions.status, subscriptions.processor_id, subscriptions.current_period_end, subscriptions.canceled_at, subscriptions.created_at, subscriptions.updated_at, subscriptions.deleted_at, subscriptions.reseller_processor_key, subscriptions.billing_account_id, invoice, user, invoices, payments, subscription_services, orders, audits, collaborators, logs."
  2. 5 tool updates
    • Addeddeal-activity-read
    • Addeddeal-activity-write
    • Addeddeal-message-read
    • Addeddeal-message-write
    • Changeddeal-write1 field changed
      • changedInput schema / properties / user_id / description
        Previous value: -"Existing client contact ID. Required for create; cannot be changed later. Multiple deals may use the same contact."New value: +"Existing active client contact ID. Required for create; optional on update to reassign the deal and its conversation while preserving history. Multiple deals may use the same contact."
  3. 3 tool updates
    • Addeddeal-read
    • Addeddeal-write
    • Changeduser-activity-write1 field changed
      • addedInput schema / properties / deal_id
        Added value: +{
        +  "description": "Optional for create: attach the activity to this deal, which must belong to user_id. Omit or pass null for a contact-only activity.",
        +  "type": [
        +    "integer",
        +    "null"
        +  ]
        +}
  4. 2 tool updates
    • Changedorder-read2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, number, user_id, invoice_id, subscription_id, service_id, service, date_started, date_due, next_task_due_at, nearest_due_at, date_completed, status, price, quantity, deadline, note, sort_order, last_message_at, created_at, updated_at, provider_order_id, provider_status, provider_error, deleted_at, orders.id, orders.number, orders.user_id, orders.invoice_id, orders.subscription_id, orders.service_id, orders.service, orders.date_started, orders.date_due, orders.next_task_due_at, orders.nearest_due_at, orders.date_completed, orders.status, orders.price, orders.quantity, orders.deadline, orders.note, orders.sort_order, orders.last_message_at, orders.created_at, orders.updated_at, orders.provider_order_id, orders.provider_status, orders.provider_error, orders.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, user, invoice, options, subscription, order_service, order_status, forms, addons, tickets, tasks, workflowSteps, media, linkedOrdersAsSource, linkedOrdersAsTarget, trackedTimes, pipelineItems, tags, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications. Status filter key is \"status\" (numeric IDs, not string names): 1=Pending, 2=Submitted, 3=Complete, 4=Canceled, 5=Working."New value: +"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, number, user_id, invoice_id, subscription_id, service_id, service, date_started, date_due, next_task_due_at, nearest_due_at, date_completed, status, price, quantity, deadline, note, sort_order, last_message_at, created_at, updated_at, provider_order_id, provider_status, provider_error, deleted_at, orders.id, orders.number, orders.user_id, orders.invoice_id, orders.subscription_id, orders.service_id, orders.service, orders.date_started, orders.date_due, orders.next_task_due_at, orders.nearest_due_at, orders.date_completed, orders.status, orders.price, orders.quantity, orders.deadline, orders.note, orders.sort_order, orders.last_message_at, orders.created_at, orders.updated_at, orders.provider_order_id, orders.provider_status, orders.provider_error, orders.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, user, signedAgreements, invoice, options, subscription, order_service, order_status, forms, addons, tickets, tasks, workflowSteps, media, linkedOrdersAsSource, linkedOrdersAsTarget, trackedTimes, pipelineItems, tags, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications. Status filter key is \"status\" (numeric IDs, not string names): 1=Pending, 2=Submitted, 3=Complete, 4=Canceled, 5=Working."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, number, user_id, invoice_id, subscription_id, service_id, service, date_started, date_due, next_task_due_at, nearest_due_at, date_completed, status, price, quantity, deadline, note, sort_order, last_message_at, created_at, updated_at, provider_order_id, provider_status, provider_error, deleted_at, orders.id, orders.number, orders.user_id, orders.invoice_id, orders.subscription_id, orders.service_id, orders.service, orders.date_started, orders.date_due, orders.next_task_due_at, orders.nearest_due_at, orders.date_completed, orders.status, orders.price, orders.quantity, orders.deadline, orders.note, orders.sort_order, orders.last_message_at, orders.created_at, orders.updated_at, orders.provider_order_id, orders.provider_status, orders.provider_error, orders.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, user, invoice, options, subscription, order_service, order_status, forms, addons, tickets, tasks, workflowSteps, media, linkedOrdersAsSource, linkedOrdersAsTarget, trackedTimes, pipelineItems, tags, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications."New value: +"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, number, user_id, invoice_id, subscription_id, service_id, service, date_started, date_due, next_task_due_at, nearest_due_at, date_completed, status, price, quantity, deadline, note, sort_order, last_message_at, created_at, updated_at, provider_order_id, provider_status, provider_error, deleted_at, orders.id, orders.number, orders.user_id, orders.invoice_id, orders.subscription_id, orders.service_id, orders.service, orders.date_started, orders.date_due, orders.next_task_due_at, orders.nearest_due_at, orders.date_completed, orders.status, orders.price, orders.quantity, orders.deadline, orders.note, orders.sort_order, orders.last_message_at, orders.created_at, orders.updated_at, orders.provider_order_id, orders.provider_status, orders.provider_error, orders.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, user, signedAgreements, invoice, options, subscription, order_service, order_status, forms, addons, tickets, tasks, workflowSteps, media, linkedOrdersAsSource, linkedOrdersAsTarget, trackedTimes, pipelineItems, tags, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications."
    • Changedticket-read2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, number, user_id, order_id, date_closed, date_snoozed, subject, status, note, last_message_at, source, created_at, updated_at, deleted_at, tickets.id, tickets.number, tickets.user_id, tickets.order_id, tickets.date_closed, tickets.date_snoozed, tickets.subject, tickets.status, tickets.note, tickets.last_message_at, tickets.source, tickets.created_at, tickets.updated_at, tickets.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, tags, user, employee, ticket_status, forms, order, media, deal, latestClientFacingMessage, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications. Status filter key is \"status\" (numeric IDs, not string names): 1=Open, 2=Closed, 3=Pending, 4=Spam, 5=Snoozed."New value: +"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, number, user_id, order_id, date_closed, date_snoozed, subject, status, note, last_message_at, source, created_at, updated_at, deleted_at, tickets.id, tickets.number, tickets.user_id, tickets.order_id, tickets.date_closed, tickets.date_snoozed, tickets.subject, tickets.status, tickets.note, tickets.last_message_at, tickets.source, tickets.created_at, tickets.updated_at, tickets.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, tags, user, signedAgreements, employee, ticket_status, forms, order, media, deal, latestClientFacingMessage, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications. Status filter key is \"status\" (numeric IDs, not string names): 1=Open, 2=Closed, 3=Pending, 4=Spam, 5=Snoozed."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, number, user_id, order_id, date_closed, date_snoozed, subject, status, note, last_message_at, source, created_at, updated_at, deleted_at, tickets.id, tickets.number, tickets.user_id, tickets.order_id, tickets.date_closed, tickets.date_snoozed, tickets.subject, tickets.status, tickets.note, tickets.last_message_at, tickets.source, tickets.created_at, tickets.updated_at, tickets.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, tags, user, employee, ticket_status, forms, order, media, deal, latestClientFacingMessage, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications."New value: +"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, number, user_id, order_id, date_closed, date_snoozed, subject, status, note, last_message_at, source, created_at, updated_at, deleted_at, tickets.id, tickets.number, tickets.user_id, tickets.order_id, tickets.date_closed, tickets.date_snoozed, tickets.subject, tickets.status, tickets.note, tickets.last_message_at, tickets.source, tickets.created_at, tickets.updated_at, tickets.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, tags, user, signedAgreements, employee, ticket_status, forms, order, media, deal, latestClientFacingMessage, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications."
  5. 3 tool updates
    • Changedorder-write2 fields changed
      • changedInput schema / properties / employees / description
        Previous value: -"Employee/staff user IDs to assign, sent with action \"update\". Replaces the whole assignee list, so include everyone who should stay assigned. Roles limited to self-assignment can only add or remove their own ID. Assignees need order access."New value: +"Employee/staff user IDs to assign, sent with action \"update\". Replaces the whole assignee list, so include everyone who should stay assigned. Roles limited to self-assignment can only add or remove their own ID. Assignees need order access. To find staff IDs by name, use staff-directory with assignable_to \"order\"."
      • changedInput schema / properties / tags / description
        Previous value: -"Tag names or IDs. Replaces current tags when provided."New value: +"Tag IDs or names. Replaces current tags when provided. Prefer tag IDs from tag-read: a numeric name is treated as a tag ID."
    • Addedstaff-directory
    • Changedticket-write2 fields changed
      • changedInput schema / properties / employees / description
        Previous value: -"Employee/staff user IDs to assign, sent with action \"update\". Replaces the whole assignee list, so include everyone who should stay assigned. Roles limited to self-assignment can only add or remove their own ID. Assignees need ticket access."New value: +"Employee/staff user IDs to assign, sent with action \"update\". Replaces the whole assignee list, so include everyone who should stay assigned. Roles limited to self-assignment can only add or remove their own ID. Assignees need ticket access. To find staff IDs by name, use staff-directory with assignable_to \"ticket\"."
      • changedInput schema / properties / tags / description
        Previous value: -"Tag names or IDs. Replaces current tags when provided."New value: +"Tag IDs or names. Replaces current tags when provided. Prefer tag IDs from tag-read: a numeric name is treated as a tag ID."
  6. 2 tool updates
    • Changedorder-write1 field changed
      • changedInput schema / properties / employees / description
        Previous value: -"Employee/staff user IDs to assign. Replaces current assignments when provided."New value: +"Employee/staff user IDs to assign, sent with action \"update\". Replaces the whole assignee list, so include everyone who should stay assigned. Roles limited to self-assignment can only add or remove their own ID. Assignees need order access."
    • Changedticket-write1 field changed
      • changedInput schema / properties / employees / description
        Previous value: -"Employee/staff user IDs to assign. Replaces current assignments when provided."New value: +"Employee/staff user IDs to assign, sent with action \"update\". Replaces the whole assignee list, so include everyone who should stay assigned. Roles limited to self-assignment can only add or remove their own ID. Assignees need ticket access."
  7. 1 tool update
    • Changedservice-write2 fields changed
      • changedInput schema / properties / employees / description
        Previous value: -"Array of employee/staff user IDs to assign to this service."New value: +"Array of staff/team member user IDs to assign to this service. Client accounts are rejected."
      • changedInput schema / properties / task_templates / description
        Previous value: -"For \"sync_task_templates\": the FULL replacement list of task templates for the service — this overwrites the existing list, it does not append. Each item supports id (for an existing template on this service), name, description, deadline (in HOURS — a day is 24 hours, so \"3 days\" = 72; convert day-based requests to hours), sort_order, is_public, for_client, and employee_ids. To keep an existing template, call get_task_templates first and include its id here; any existing template whose id you omit is deleted. Pass an empty array to remove all templates."New value: +"For \"sync_task_templates\": the FULL replacement list of task templates for the service — this overwrites the existing list, it does not append. Each item supports id (for an existing template on this service), name, description, deadline (in HOURS — a day is 24 hours, so \"3 days\" = 72; convert day-based requests to hours), sort_order, is_public, for_client, and employee_ids (staff/team member user IDs only; client accounts are rejected). To keep an existing template, call get_task_templates first and include its id here; any existing template whose id you omit is deleted. Pass an empty array to remove all templates."
  8. 4 tool updates
    • Changedinvoice-tool2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, number, number_prefix, user_id, deal_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.deal_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, audits, subscription, subscription_payment, user, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs. Status filter key is \"status\" (numeric IDs, not string names): 0=abandoned, 1=paid, 6=partially_paid, 5=payment_pending, 8=refund, 4=refunded, 3=unpaid, 7=void."New value: +"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, number, number_prefix, user_id, deal_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.deal_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, audits, subscription, subscription_payment, user, deal, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs. Status filter key is \"status\" (numeric IDs, not string names): 0=abandoned, 1=paid, 6=partially_paid, 5=payment_pending, 8=refund, 4=refunded, 3=unpaid, 7=void."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, number, number_prefix, user_id, deal_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.deal_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, audits, subscription, subscription_payment, user, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs."New value: +"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, number, number_prefix, user_id, deal_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.deal_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, audits, subscription, subscription_payment, user, deal, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs."
    • Changedpipeline-item-write3 fields changed
      • changedInput schema / properties / itemable_ref / description
        Previous value: -"Entity reference. Required for \"add\". Orders use order number; users and companies use id."New value: +"Entity reference. Required for \"add\". Orders use order number; users, companies and deals use id."
      • changedInput schema / properties / itemable_type / description
        Previous value: -"Type of entity to add. Required for \"add\". Sales pipelines accept user or company; production pipelines accept order. For \"list\" filters, user/company/order aliases are accepted."New value: +"Type of entity to add. Required for \"add\". Sales pipelines accept user, company or deal; production pipelines accept order. For \"list\" filters, user/company/order/deal aliases are accepted."
      • changedInput schema / properties / itemable_type / enum
        Previous value: -[
        -  "user",
        -  "company",
        -  "order"
        -]New value: +[
        +  "user",
        +  "company",
        +  "order",
        +  "deal"
        +]
    • Changedticket-read2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, number, user_id, order_id, date_closed, date_snoozed, subject, status, note, last_message_at, source, created_at, updated_at, deleted_at, tickets.id, tickets.number, tickets.user_id, tickets.order_id, tickets.date_closed, tickets.date_snoozed, tickets.subject, tickets.status, tickets.note, tickets.last_message_at, tickets.source, tickets.created_at, tickets.updated_at, tickets.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, tags, user, employee, ticket_status, forms, order, media, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications. Status filter key is \"status\" (numeric IDs, not string names): 1=Open, 2=Closed, 3=Pending, 4=Spam, 5=Snoozed."New value: +"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, number, user_id, order_id, date_closed, date_snoozed, subject, status, note, last_message_at, source, created_at, updated_at, deleted_at, tickets.id, tickets.number, tickets.user_id, tickets.order_id, tickets.date_closed, tickets.date_snoozed, tickets.subject, tickets.status, tickets.note, tickets.last_message_at, tickets.source, tickets.created_at, tickets.updated_at, tickets.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, tags, user, employee, ticket_status, forms, order, media, deal, latestClientFacingMessage, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications. Status filter key is \"status\" (numeric IDs, not string names): 1=Open, 2=Closed, 3=Pending, 4=Spam, 5=Snoozed."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, number, user_id, order_id, date_closed, date_snoozed, subject, status, note, last_message_at, source, created_at, updated_at, deleted_at, tickets.id, tickets.number, tickets.user_id, tickets.order_id, tickets.date_closed, tickets.date_snoozed, tickets.subject, tickets.status, tickets.note, tickets.last_message_at, tickets.source, tickets.created_at, tickets.updated_at, tickets.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, tags, user, employee, ticket_status, forms, order, media, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications."New value: +"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, number, user_id, order_id, date_closed, date_snoozed, subject, status, note, last_message_at, source, created_at, updated_at, deleted_at, tickets.id, tickets.number, tickets.user_id, tickets.order_id, tickets.date_closed, tickets.date_snoozed, tickets.subject, tickets.status, tickets.note, tickets.last_message_at, tickets.source, tickets.created_at, tickets.updated_at, tickets.deleted_at, employees, audits, rating, ratings, followers, morphMetadata, tags, user, employee, ticket_status, forms, order, media, deal, latestClientFacingMessage, collaborators, filledFormFields, logs, messages, scheduledMessages, notifications."
    • Changeduser-activity-read2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Purity filter object. Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":\"active\"}}. Available fields: id, user_id, deal_id, author_id, content, scheduled_at, completed_at, completed_by, assigned_to, created_at, updated_at, activities.id, activities.user_id, activities.deal_id, activities.author_id, activities.content, activities.scheduled_at, activities.completed_at, activities.completed_by, activities.assigned_to, activities.created_at, activities.updated_at, user, author, assignee, completedBy, audits."New value: +"Purity filter object. Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":\"active\"}}. Available fields: id, user_id, deal_id, author_id, content, scheduled_at, completed_at, completed_by, assigned_to, created_at, updated_at, activities.id, activities.user_id, activities.deal_id, activities.author_id, activities.content, activities.scheduled_at, activities.completed_at, activities.completed_by, activities.assigned_to, activities.created_at, activities.updated_at, user, deal, author, assignee, completedBy, audits."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort fields. Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, deal_id, author_id, content, scheduled_at, completed_at, completed_by, assigned_to, created_at, updated_at, activities.id, activities.user_id, activities.deal_id, activities.author_id, activities.content, activities.scheduled_at, activities.completed_at, activities.completed_by, activities.assigned_to, activities.created_at, activities.updated_at, user, author, assignee, completedBy, audits."New value: +"Sort fields. Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, deal_id, author_id, content, scheduled_at, completed_at, completed_by, assigned_to, created_at, updated_at, activities.id, activities.user_id, activities.deal_id, activities.author_id, activities.content, activities.scheduled_at, activities.completed_at, activities.completed_by, activities.assigned_to, activities.created_at, activities.updated_at, user, deal, author, assignee, completedBy, audits."
  9. 2 tool updates
    • Changedinvoice-tool2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, number, number_prefix, user_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, audits, subscription, subscription_payment, user, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs. Status filter key is \"status\" (numeric IDs, not string names): 0=abandoned, 1=paid, 6=partially_paid, 5=payment_pending, 8=refund, 4=refunded, 3=unpaid, 7=void."New value: +"Purity filter object for \"list\". Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":1}}. Available fields: id, number, number_prefix, user_id, deal_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.deal_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, audits, subscription, subscription_payment, user, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs. Status filter key is \"status\" (numeric IDs, not string names): 0=abandoned, 1=paid, 6=partially_paid, 5=payment_pending, 8=refund, 4=refunded, 3=unpaid, 7=void."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, number, number_prefix, user_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, audits, subscription, subscription_payment, user, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs."New value: +"Sort fields for \"list\". Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, number, number_prefix, user_id, deal_id, status, date_due, date_paid, billing_at, credit, subtotal_converted, total_converted, subtotal, total, tax, tax_name, tax_percent, currency, reason, note, user_data, ip_address, user_agent, sender_address, recurring, recurring_generated, coupon_id, transaction_id, stripe_invoice_id, billing_reason, payment_intent_id, loc_confirm, paysys, stripe_payment_mode, allowed_payment_integrations, partial_payment, employee_id, created_at, updated_at, pretty_number, invoices.id, invoices.number, invoices.number_prefix, invoices.user_id, invoices.deal_id, invoices.status, invoices.date_due, invoices.date_paid, invoices.billing_at, invoices.credit, invoices.subtotal_converted, invoices.total_converted, invoices.subtotal, invoices.total, invoices.tax, invoices.tax_name, invoices.tax_percent, invoices.currency, invoices.reason, invoices.note, invoices.user_data, invoices.ip_address, invoices.user_agent, invoices.sender_address, invoices.recurring, invoices.recurring_generated, invoices.coupon_id, invoices.transaction_id, invoices.stripe_invoice_id, invoices.billing_reason, invoices.payment_intent_id, invoices.loc_confirm, invoices.paysys, invoices.stripe_payment_mode, invoices.allowed_payment_integrations, invoices.partial_payment, invoices.employee_id, invoices.created_at, invoices.updated_at, invoices.pretty_number, audits, subscription, subscription_payment, user, invoice_items, orders, invoice_sender_address, billing_address, coupon, employee, clientTags, logs."
    • Changeduser-activity-read2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Purity filter object. Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":\"active\"}}. Available fields: id, user_id, author_id, content, scheduled_at, completed_at, completed_by, assigned_to, created_at, updated_at, activities.id, activities.user_id, activities.author_id, activities.content, activities.scheduled_at, activities.completed_at, activities.completed_by, activities.assigned_to, activities.created_at, activities.updated_at, user, author, assignee, completedBy, audits."New value: +"Purity filter object. Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":\"active\"}}. Available fields: id, user_id, deal_id, author_id, content, scheduled_at, completed_at, completed_by, assigned_to, created_at, updated_at, activities.id, activities.user_id, activities.deal_id, activities.author_id, activities.content, activities.scheduled_at, activities.completed_at, activities.completed_by, activities.assigned_to, activities.created_at, activities.updated_at, user, author, assignee, completedBy, audits."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort fields. Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, author_id, content, scheduled_at, completed_at, completed_by, assigned_to, created_at, updated_at, activities.id, activities.user_id, activities.author_id, activities.content, activities.scheduled_at, activities.completed_at, activities.completed_by, activities.assigned_to, activities.created_at, activities.updated_at, user, author, assignee, completedBy, audits."New value: +"Sort fields. Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, deal_id, author_id, content, scheduled_at, completed_at, completed_by, assigned_to, created_at, updated_at, activities.id, activities.user_id, activities.deal_id, activities.author_id, activities.content, activities.scheduled_at, activities.completed_at, activities.completed_by, activities.assigned_to, activities.created_at, activities.updated_at, user, author, assignee, completedBy, audits."
  10. 1 tool update
    • Changedcompany-write2 fields changed
      • changedInput schema / properties / new_owner_client_id / description
        Previous value: -"Client ID of an existing other member to become the new owner. Required by \"remove_member\" when removing the current owner while other members remain."New value: +"Client ID of an existing other member to become the new owner. Required by \"remove_member\" when removing the current owner while other members remain. Shares the new owner's existing subscriptions with members who collaborate on orders."
      • changedInput schema / properties / owner_client_id / description
        Previous value: -"Client ID to set as the company owner. For \"create\", optional; the owner is attached as a member with all three flags false. For \"update\", moves ownership to an existing member of the company — cannot be cleared to null. Changes whose invoices members with access_invoices can see and who manages the team."New value: +"Client ID to set as the company owner. For \"create\", optional; the owner is attached as a member with all three flags false. For \"update\", moves ownership to an existing member of the company — cannot be cleared to null. Changes whose invoices members with access_invoices can see and who manages the team, and shares the new owner's existing subscriptions with members who collaborate on orders."
  11. 1 tool update
    • Changedcompany-write1 field changed
      • addedInput schema / properties / share_existing_subscriptions
        Added value: +{
        +  "description": "For \"add_member\" only. When true, this client's existing subscriptions are shared with company members who collaborate on orders, so they can submit requests. Defaults to false. Only set true when the user explicitly asks to share the client's existing subscriptions with the team.",
        +  "type": "boolean"
        +}
  12. 1 tool update
    • Changedcompany-write2 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "create",
        -  "update",
        -  "add_member",
        -  "update_member",
        -  "remove_member"
        -]New value: +[
        +  "create",
        +  "update",
        +  "add_member",
        +  "update_member",
        +  "remove_member",
        +  "delete"
        +]
      • changedInput schema / properties / company_id / description
        Previous value: -"Company ID. Required for \"update\", \"add_member\", \"update_member\" and \"remove_member\"."New value: +"Company ID. Required for \"update\", \"add_member\", \"update_member\", \"remove_member\" and \"delete\"."
  13. 3 tool updates
    • Changedclient-write26 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "create"
        -]New value: +[
        +  "create",
        +  "update"
        +]
      • changedInput schema / properties / address / description
        Previous value: -"Optional address: line_1, city, state, postcode, country (2-letter code)."New value: +"Address: line_1, city, state, postcode, country (2-letter code). For \"create\" and \"update\". On \"update\", provided fields are merged into the existing address (or a new address is created if none exists); omit the whole object to leave the address untouched — null is also treated as untouched, not cleared."
      • changedInput schema / properties / balance / description
        Previous value: -"Optional starting client balance."New value: +"Optional starting client balance. \"create\" only."
      • changedInput schema / properties / client_id / description
        Previous value: -"User id. Required when updating an existing record."New value: +"Client id. Required for \"update\"."
      • changedInput schema / properties / company / description
        Previous value: -"Client company name. Max 255 characters."New value: +"Client company name. Max 255 characters. For \"create\" and \"update\"; omit to leave untouched on \"update\", null to clear."
      • changedInput schema / properties / company / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedInput schema / properties / created_at / description
        Previous value: -"Optional creation date/time for \"create\"."New value: +"Optional creation date/time. \"create\" only."
      • changedInput schema / properties / email / description
        Previous value: -"Client email address. Required for \"create\"."New value: +"Client email address. Required for \"create\". Optional for \"update\" — cannot be cleared to null."
      • changedInput schema / properties / name_f / description
        Previous value: -"Client first name. Max 64 characters."New value: +"Client first name. Max 64 characters. For \"create\" and \"update\"; omit to leave untouched on \"update\", null to clear."
      • changedInput schema / properties / name_f / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedInput schema / properties / name_l / description
        Previous value: -"Client last name. Max 64 characters."New value: +"Client last name. Max 64 characters. For \"create\" and \"update\"; omit to leave untouched on \"update\", null to clear."
      • changedInput schema / properties / name_l / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedInput schema / properties / note / description
        Previous value: -"Optional client note. Max 65535 characters."New value: +"Client note. Max 65535 characters. For \"create\" and \"update\"; omit to leave untouched on \"update\", null to clear."
      • changedInput schema / properties / note / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedInput schema / properties / optin / description
        Previous value: -"Optional marketing opt-in flag."New value: +"Marketing opt-in flag. For \"create\" and \"update\"; omit to leave untouched on \"update\", null to clear."
      • changedInput schema / properties / optin / type
        Previous value: -"boolean"New value: +[
        +  "boolean",
        +  "null"
        +]
      • changedInput schema / properties / phone / description
        Previous value: -"Client phone number. Max 64 characters."New value: +"Client phone number. Max 64 characters. For \"create\" and \"update\"; omit to leave untouched on \"update\", null to clear."
      • changedInput schema / properties / phone / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedInput schema / properties / referrer_user_id / description
        Previous value: -"Optional referring client/user ID."New value: +"Referring client ID. Must be a different client. For \"create\" and \"update\"; omit to leave untouched on \"update\", null to clear."
      • changedInput schema / properties / referrer_user_id / type
        Previous value: -"integer"New value: +[
        +  "integer",
        +  "null"
        +]
      • changedInput schema / properties / status_id / description
        Previous value: -"Optional client status ID. Omit to use the model default."New value: +"Client status ID. For \"create\" and \"update\"; omit to use the model default on \"create\" or leave untouched on \"update\". Cannot be null or empty."
      • changedInput schema / properties / stripe_id / description
        Previous value: -"Optional Stripe customer ID. Must be unique."New value: +"Stripe customer ID. Must be unique. For \"create\" and \"update\"; omit to leave untouched on \"update\", null to clear."
      • changedInput schema / properties / stripe_id / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedInput schema / properties / tax_id / description
        Previous value: -"Client tax ID. Max 255 characters."New value: +"Client tax ID. Max 255 characters. For \"create\" and \"update\"; omit to leave untouched on \"update\", null to clear."
      • changedInput schema / properties / tax_id / type
        Previous value: -"string"New value: +[
        +  "string",
        +  "null"
        +]
      • changedInput schema / properties / welcome_email / description
        Previous value: -"Whether to send the welcome email. Defaults to true."New value: +"Whether to send the welcome email. Defaults to true. \"create\" only."
    • Addedcompany-read
    • Addedcompany-write
  14. 2 tool updates
    • Changedorder-message-read2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Purity filter object. Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":\"active\"}}. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, media."New value: +"Purity filter object. Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":\"active\"}}. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, review, media."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort fields. Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, media."New value: +"Sort fields. Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, review, media."
    • Changedticket-message-read2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Purity filter object. Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":\"active\"}}. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, media."New value: +"Purity filter object. Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":\"active\"}}. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, review, media."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort fields. Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, media."New value: +"Sort fields. Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, review, media."
  15. 2 tool updates
    • Changedorder-message-read2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Purity filter object. Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":\"active\"}}. Available fields: id, user_id, order_id, ticket_id, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, media."New value: +"Purity filter object. Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":\"active\"}}. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, media."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort fields. Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, order_id, ticket_id, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, media."New value: +"Sort fields. Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, media."
    • Changedticket-message-read2 fields changed
      • changedInput schema / properties / filters / description
        Previous value: -"Purity filter object. Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":\"active\"}}. Available fields: id, user_id, order_id, ticket_id, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, media."New value: +"Purity filter object. Keys are field names, values are operator objects. Example: {\"status\":{\"$eq\":\"active\"}}. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, media."
      • changedInput schema / properties / sort / description
        Previous value: -"Sort fields. Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, order_id, ticket_id, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, media."New value: +"Sort fields. Append :asc or :desc for direction (default :asc). Example: [\"created_at:desc\"]. Available fields: id, user_id, order_id, ticket_id, reviewed_media_id, review_action, date_seen, ip_address, message, staff_only, via, is_auto_generated, email_id, created_at, updated_at, messages.id, messages.user_id, messages.order_id, messages.ticket_id, messages.reviewed_media_id, messages.review_action, messages.date_seen, messages.ip_address, messages.message, messages.staff_only, messages.via, messages.is_auto_generated, messages.email_id, messages.created_at, messages.updated_at, user, order, ticket, notifications, reactions, media."
  16. 48 tool updates
    • First observedautomation-read
    • First observedautomation-write
    • First observedclient-custom-field-read
    • First observedclient-custom-field-write
    • First observedclient-read
    • First observedclient-write
    • First observedcoupon-read
    • First observedcoupon-write
    • First observedform-folder-read
    • First observedform-folder-write
    • First observedform-read
    • First observedform-write
    • First observedget-wayfront-doc
    • First observedinvoice-tool
    • First observedlog-tool
    • First observedorder-message-read
    • First observedorder-message-write
    • First observedorder-read
    • First observedorder-task-read
    • First observedorder-task-write
    • First observedorder-write
    • First observedpipeline-item-read
    • First observedpipeline-item-write
    • First observedpipeline-read
    • First observedpipeline-write
    • First observedsearch-wayfront-docs
    • First observedservice-read
    • First observedservice-write
    • First observedsettings-read
    • First observedsettings-write
    • First observedslack-read
    • First observedslack-write
    • First observedsubscription-tool
    • First observedtag-read
    • First observedtag-write
    • First observedteam-management-tool
    • First observedteam-tool
    • First observedtemplate-read
    • First observedtemplate-write
    • First observedticket-message-read
    • First observedticket-message-write
    • First observedticket-read
    • First observedticket-write
    • First observeduser-activity-read
    • First observeduser-activity-write
    • First observedwebhook-read
    • First observedwebhook-write
    • First observedworkspace-info

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Perplexity for social: ask what competitors are running across social and get answers grounded in real ad and creative data, not guesses.
    2
    Apache 2.0
  • A
    license
    A
    quality
    C
    maintenance
    Enables 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.
    16
    11 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Browse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources